[Scummvm-git-logs] scummvm master -> f19ed73519c0f3ed81b9f69ca1e66b93c1cd6d7f

sev- noreply at scummvm.org
Mon Mar 6 13:33:32 UTC 2023


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
f19ed73519 TESTBED: Switch to CheckboxWidgets for Testbed (#4769)


Commit: f19ed73519c0f3ed81b9f69ca1e66b93c1cd6d7f
    https://github.com/scummvm/scummvm/commit/f19ed73519c0f3ed81b9f69ca1e66b93c1cd6d7f
Author: ChengZhang Dong (55007715+Dio990521 at users.noreply.github.com)
Date: 2023-03-06T14:33:20+01:00

Commit Message:
TESTBED: Switch to CheckboxWidgets for Testbed (#4769)

The Testbed used ListWidget and double-clickable text to select options, which is illogical and unfriendly for users. Now they are replaced with ScrollContainerWidget and CheckboxWidget.

Changed paths:
    engines/testbed/config.cpp
    engines/testbed/config.h


diff --git a/engines/testbed/config.cpp b/engines/testbed/config.cpp
index 808e828fd42..5496b716611 100644
--- a/engines/testbed/config.cpp
+++ b/engines/testbed/config.cpp
@@ -27,72 +27,101 @@
 #include "testbed/config.h"
 #include "testbed/fs.h"
 
+#include "gui/widgets/scrollcontainer.h"
+#include "gui/gui-manager.h"
+#include "gui/ThemeEval.h"
+
 namespace Testbed {
 
 TestbedOptionsDialog::TestbedOptionsDialog(Common::Array<Testsuite *> &tsList, TestbedConfigManager *tsConfMan) :
-		GUI::Dialog("TestbedOptions"),
+	GUI::Dialog(0, 0, 0, 0),
 		_testbedConfMan(tsConfMan) {
-
-	new GUI::StaticTextWidget(this, "TestbedOptions.Headline", Common::U32String("Select Testsuites to Execute"));
-	new GUI::StaticTextWidget(this, "TestbedOptions.Info", Common::U32String("Use Doubleclick to select/deselect"));
+	_testContainerDisplay = new GUI::ScrollContainerWidget(this, 0, 0, 0, 0);
+	_testContainerDisplay->setBackgroundType(GUI::ThemeEngine::kWidgetBackgroundNo);
 
 	// Construct a String Array
 	Common::Array<Testsuite *>::const_iterator iter;
 	Common::U32String description;
 	uint selected = 0;
-
 	for (iter = tsList.begin(); iter != tsList.end(); iter++) {
 		_testSuiteArray.push_back(*iter);
 		description = (*iter)->getDescription();
+		GUI::CheckboxWidget *checkbox;
+		checkbox = new GUI::CheckboxWidget(_testContainerDisplay, 0, 0, 0, 0, description, Common::U32String());
 		if ((*iter)->isEnabled()) {
-			_testSuiteDescArray.push_back(GUI::ListWidget::getThemeColor(GUI::ThemeEngine::kFontColorNormal) + description + "(selected)");
+			checkbox->setState(true);
 			selected++;
 		} else {
-			_testSuiteDescArray.push_back(GUI::ListWidget::getThemeColor(GUI::ThemeEngine::kFontColorAlternate) + description);
+			checkbox->setState(false);
 		}
+		_testSuiteCheckboxArray.push_back(checkbox);
 	}
 
-	_testListDisplay = new TestbedListWidget(this, "TestbedOptions.List", _testSuiteArray);
-	_testListDisplay->setNumberingMode(GUI::kListNumberingOff);
-	_testListDisplay->setList(_testSuiteDescArray);
-
-	// This list shouldn't be editable
-	_testListDisplay->setEditable(false);
+	_messageText = new GUI::StaticTextWidget(this, 0, 0, 0, 0, Common::U32String("Select Testsuites to Execute"), Graphics::kTextAlignLeft);
 
 	if (selected > (tsList.size() - selected)) {
-		_selectButton = new GUI::ButtonWidget(this, "TestbedOptions.SelectAll", Common::U32String("Deselect All"), Common::U32String(), kTestbedDeselectAll, 0);
+		_selectButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, Common::U32String("Deselect All"), Common::U32String(), kTestbedDeselectAll, 0);
 	} else {
-		_selectButton = new GUI::ButtonWidget(this, "TestbedOptions.SelectAll", Common::U32String("Select All"), Common::U32String(), kTestbedSelectAll, 0);
+		_selectButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, Common::U32String("Select All"), Common::U32String(), kTestbedSelectAll, 0);
 	}
-	new GUI::ButtonWidget(this, "TestbedOptions.RunTests", Common::U32String("Run tests"), Common::U32String(), GUI::kCloseCmd);
-	new GUI::ButtonWidget(this, "TestbedOptions.Quit", Common::U32String("Exit Testbed"), Common::U32String(), kTestbedQuitCmd);
+	_runTestButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, Common::U32String("Run tests"), Common::U32String(), GUI::kCloseCmd);
+	_quitButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, Common::U32String("Exit Testbed"), Common::U32String(), kTestbedQuitCmd);
+
+	reflowLayout();
 }
 
 TestbedOptionsDialog::~TestbedOptionsDialog() {}
 
+void TestbedOptionsDialog::reflowLayout() {
+
+	// Calculate all sizes for widgets
+	uint16 lineHeight = g_gui.xmlEval()->getVar("Globals.Line.Height");
+	int16 overlayWidth = g_system->getOverlayWidth();
+	int16 overlayHeight = g_system->getOverlayHeight();
+	uint16 yPos = lineHeight * 2;
+	uint16 xPos = lineHeight;
+	uint16 padding = 32;
+
+	// handle the low res
+	if (overlayHeight < 500) {
+		xPos = xPos / 2;
+		padding = 16;
+	}
+
+	uint16 buttonHeight = lineHeight * 2;
+	uint16 buttonWidth = lineHeight * 5;
+	uint16 dialogWidth = overlayWidth - padding * 2;
+	uint16 dialogHeight = overlayHeight - padding * 2;
+	uint16 buttonPosY = dialogHeight - buttonHeight - lineHeight;
+	uint16 containerWidth = dialogWidth - padding;
+	uint16 containerHeight = dialogHeight - padding - lineHeight * 4 - buttonHeight;
+
+	this->resize(padding, padding, dialogWidth, dialogHeight, false);
+
+	_testContainerDisplay->setSize(containerWidth, containerHeight);
+	_testContainerDisplay->setPos(0, lineHeight * 3);
+
+	for (auto &iter : _testSuiteCheckboxArray) {
+		iter->setPos(xPos, (&iter - _testSuiteCheckboxArray.begin()) * lineHeight * 2);
+		iter->setSize(containerWidth - padding - xPos, lineHeight * 1.5f);
+	}
+
+	_messageText->setPos(xPos, lineHeight);
+	_messageText->setSize(containerWidth - padding - xPos, lineHeight);
+	_selectButton->setPos(xPos, buttonPosY);
+	_selectButton->setSize(buttonWidth, buttonHeight);
+	_runTestButton->setPos(dialogWidth - padding * 2 - buttonWidth * 2, buttonPosY);
+	_runTestButton->setSize(buttonWidth, buttonHeight);
+	_quitButton->setPos(dialogWidth - padding - buttonWidth, buttonPosY);
+	_quitButton->setSize(buttonWidth, buttonHeight);
+
+	Dialog::reflowLayout();
+}
+
 void TestbedOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
 	Testsuite *ts;
 	Common::WriteStream *ws;
 	switch (cmd) {
-	case GUI::kListItemDoubleClickedCmd:
-		ts  = _testSuiteArray[_testListDisplay->getSelected()];
-		if (ts) {
-			// Toggle status
-			if (ts->isEnabled()) {
-				ts->enable(false);
-			} else {
-				ts->enable(true);
-			}
-
-			// Now render status
-			if (ts->isEnabled()) {
-				_testListDisplay->markAsSelected(_testListDisplay->getSelected());
-			} else {
-				_testListDisplay->markAsDeselected(_testListDisplay->getSelected());
-			}
-		}
-		break;
-
 	case kTestbedQuitCmd:
 		Engine::quitGame();
 		close();
@@ -102,11 +131,7 @@ void TestbedOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd,
 		_selectButton->setLabel("Select All");
 		_selectButton->setCmd(kTestbedSelectAll);
 		for (uint i = 0; i < _testSuiteArray.size(); i++) {
-			_testListDisplay->markAsDeselected(i);
-			ts  = _testSuiteArray[i];
-			if (ts) {
-				ts->enable(false);
-			}
+			_testSuiteCheckboxArray[i]->setState(false);
 		}
 		break;
 
@@ -114,15 +139,24 @@ void TestbedOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd,
 		_selectButton->setLabel("Deselect All");
 		_selectButton->setCmd(kTestbedDeselectAll);
 		for (uint i = 0; i < _testSuiteArray.size(); i++) {
-			_testListDisplay->markAsSelected(i);
-			ts  = _testSuiteArray[i];
-			if (ts) {
-				ts->enable(true);
-			}
+			_testSuiteCheckboxArray[i]->setState(true);
 		}
 		break;
+
 	case GUI::kCloseCmd:
 		// This is final selected state, write it to config file.
+		for (uint i = 0; i < _testSuiteCheckboxArray.size(); i++) {
+			ts = _testSuiteArray[i];
+			if (_testSuiteCheckboxArray[i]->getState()) {
+				if (ts) {
+					ts->enable(true);
+				}
+			} else {
+				if (ts) {
+					ts->enable(false);
+				}
+			}
+		}
 		ws = _testbedConfMan->getConfigWriteStream();
 		if (ws) {
 			_testbedConfMan->writeTestbedConfigToStream(ws);
diff --git a/engines/testbed/config.h b/engines/testbed/config.h
index b28b51adfad..41ef7803c6c 100644
--- a/engines/testbed/config.h
+++ b/engines/testbed/config.h
@@ -66,40 +66,24 @@ private:
 	void parseConfigFile();
 };
 
-class TestbedListWidget : public GUI::ListWidget {
-public:
-	TestbedListWidget(GUI::Dialog *boss, const Common::String &name, Common::Array<Testsuite *> tsArray) : GUI::ListWidget(boss, name), _testSuiteArray(tsArray) {}
-
-	void markAsSelected(int i) {
-		if (!_list[i].encode().contains("selected")) {
-			_list[i] = GUI::ListWidget::getThemeColor(GUI::ThemeEngine::kFontColorNormal) + _testSuiteArray[i]->getDescription() + " (selected)";
-		}
-		draw();
-	}
-
-	void markAsDeselected(int i) {
-		if (_list[i].encode().contains("selected")) {
-			_list[i] = GUI::ListWidget::getThemeColor(GUI::ThemeEngine::kFontColorAlternate) +
-					_testSuiteArray[i]->getDescription();
-		}
-		draw();
-	}
-
-private:
-	Common::Array<Testsuite *>	_testSuiteArray;
-};
-
 class TestbedOptionsDialog : public GUI::Dialog {
 public:
 	TestbedOptionsDialog(Common::Array<Testsuite *> &tsList, TestbedConfigManager *tsConfMan);
 	~TestbedOptionsDialog() override;
 	void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
+	void reflowLayout() override;
 
 private:
-	GUI::ButtonWidget	*_selectButton;
+	GUI::ButtonWidget *_selectButton;
+	GUI::ButtonWidget *_runTestButton;
+	GUI::ButtonWidget *_quitButton;
+	GUI::StaticTextWidget *_messageText;
+	GUI::ScrollContainerWidget *_testContainerDisplay;
+	Common::Array<GUI::CheckboxWidget *> _testSuiteCheckboxArray;
+
 	Common::Array<Testsuite *> _testSuiteArray;
 	Common::U32StringArray _testSuiteDescArray;
-	TestbedListWidget *_testListDisplay;
+
 	TestbedConfigManager *_testbedConfMan;
 };
 




More information about the Scummvm-git-logs mailing list