From 06cd9b6d1645d449738417a08f236bd48731c0db Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Sun, 5 Sep 2021 20:00:19 +0100 Subject: [PATCH] AGS: Move the engine options into the engine plugin --- engines/ags/detection.cpp | 105 ----------------------------- engines/ags/detection.h | 2 - engines/ags/dialogs.cpp | 138 ++++++++++++++++++++++++++++++++++++++ engines/ags/metaengine.h | 2 + engines/ags/module.mk | 1 + 5 files changed, 141 insertions(+), 107 deletions(-) create mode 100644 engines/ags/dialogs.cpp diff --git a/engines/ags/detection.cpp b/engines/ags/detection.cpp index 51aa26e9cf1..75e25dadde0 100644 --- a/engines/ags/detection.cpp +++ b/engines/ags/detection.cpp @@ -30,10 +30,6 @@ #include "ags/detection.h" #include "ags/detection_tables.h" -#include "gui/ThemeEval.h" -#include "gui/widget.h" -#include "gui/widgets/popup.h" - namespace AGS3 { static const char *const HEAD_SIG = "CLIB\x1a"; @@ -65,103 +61,6 @@ static bool isAGSFile(Common::File &f) { return false; } -class AGSOptionsWidget : public GUI::OptionsContainerWidget { -public: - explicit AGSOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain); - - // OptionsContainerWidget API - void load() override; - bool save() override; - -private: - // OptionsContainerWidget API - void defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const override; - - GUI::PopUpWidget *_langPopUp; - Common::StringArray _traFileNames; - - GUI::CheckboxWidget *_forceTextAACheckbox; -}; - -AGSOptionsWidget::AGSOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain) : - OptionsContainerWidget(boss, name, "AGSGameOptionsDialog", false, domain) { - - // Language - GUI::StaticTextWidget *textWidget = new GUI::StaticTextWidget(widgetsBoss(), _dialogLayout + ".translation_desc", _("Game language:"), _("Language to use for multilingual games")); - textWidget->setAlign(Graphics::kTextAlignRight); - - _langPopUp = new GUI::PopUpWidget(widgetsBoss(), _dialogLayout + ".translation"); - _langPopUp->appendEntry(_(""), (uint32) - 1); - - Common::String path = ConfMan.get("path", _domain); - Common::FSDirectory dir(path); - Common::ArchiveMemberList traFileList; - dir.listMatchingMembers(traFileList, "*.tra"); - - int i = 0; - for (Common::ArchiveMemberList::iterator iter = traFileList.begin(); iter != traFileList.end(); ++iter) { - Common::String traFileName = (*iter)->getName(); - traFileName.erase(traFileName.size() - 4); // remove .tra extension - _traFileNames.push_back(traFileName); - _langPopUp->appendEntry(traFileName, i++); - } - - // Force font antialiasing - _forceTextAACheckbox = new GUI::CheckboxWidget(widgetsBoss(), _dialogLayout + ".textAA", _("Force antialiased text"), _("Use antialiasing to draw text even if the game does not ask for it")); -} - -void AGSOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const { - layouts.addDialog(layoutName, overlayedLayout); - layouts.addLayout(GUI::ThemeLayout::kLayoutVertical).addPadding(16, 16, 16, 16); - - layouts.addLayout(GUI::ThemeLayout::kLayoutHorizontal).addPadding(0, 0, 0, 0); - layouts.addWidget("translation_desc", "OptionsLabel"); - layouts.addWidget("translation", "PopUp").closeLayout(); - - layouts.addWidget("textAA", "Checkbox"); - - layouts.closeLayout().closeDialog(); -} - -void AGSOptionsWidget::load() { - Common::ConfigManager::Domain *gameConfig = ConfMan.getDomain(_domain); - if (!gameConfig) - return; - - uint32 curLangIndex = (uint32) - 1; - Common::String curLang; - gameConfig->tryGetVal("translation", curLang); - if (!curLang.empty()) { - for (uint i = 0; i < _traFileNames.size(); ++i) { - if (_traFileNames[i].equalsIgnoreCase(curLang)) { - curLangIndex = i; - break; - } - } - } - _langPopUp->setSelectedTag(curLangIndex); - - Common::String forceTextAA; - gameConfig->tryGetVal("force_text_aa", forceTextAA); - if (!forceTextAA.empty()) { - bool val; - if (parseBool(forceTextAA, val)) - _forceTextAACheckbox->setState(val); - } -} - -bool AGSOptionsWidget::save() { - uint langIndex = _langPopUp->getSelectedTag(); - if (langIndex < _traFileNames.size()) - ConfMan.set("translation", _traFileNames[langIndex], _domain); - else - ConfMan.removeKey("translation", _domain); - - ConfMan.setBool("force_text_aa", _forceTextAACheckbox->getState(), _domain); - - return true; -} - } // namespace AGS3 const DebugChannelDef AGSMetaEngineDetection::debugFlagList[] = { @@ -293,8 +192,4 @@ ADDetectedGame AGSMetaEngineDetection::fallbackDetect(const FileMap &allFiles, c return ADDetectedGame(); } -GUI::OptionsContainerWidget *AGSMetaEngineDetection::buildEngineOptionsWidgetStatic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const { - return new AGS3::AGSOptionsWidget(boss, name, target); -} - REGISTER_PLUGIN_STATIC(AGS_DETECTION, PLUGIN_TYPE_ENGINE_DETECTION, AGSMetaEngineDetection); diff --git a/engines/ags/detection.h b/engines/ags/detection.h index dbadb90866e..f4078521aa9 100644 --- a/engines/ags/detection.h +++ b/engines/ags/detection.h @@ -94,8 +94,6 @@ public: bool canPlayUnknownVariants() const override { return true; } - - GUI::OptionsContainerWidget *buildEngineOptionsWidgetStatic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override; }; #endif diff --git a/engines/ags/dialogs.cpp b/engines/ags/dialogs.cpp new file mode 100644 index 00000000000..828251b661e --- /dev/null +++ b/engines/ags/dialogs.cpp @@ -0,0 +1,138 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/config-manager.h" +#include "common/file.h" +#include "common/md5.h" +#include "common/str-array.h" +#include "common/translation.h" +#include "common/util.h" +#include "ags/metaengine.h" + +#include "gui/ThemeEval.h" +#include "gui/widget.h" +#include "gui/widgets/popup.h" + +namespace AGS3 { + +class AGSOptionsWidget : public GUI::OptionsContainerWidget { +public: + explicit AGSOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain); + + // OptionsContainerWidget API + void load() override; + bool save() override; + +private: + // OptionsContainerWidget API + void defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const override; + + GUI::PopUpWidget *_langPopUp; + Common::StringArray _traFileNames; + + GUI::CheckboxWidget *_forceTextAACheckbox; +}; + +AGSOptionsWidget::AGSOptionsWidget(GuiObject *boss, const Common::String &name, const Common::String &domain) : + OptionsContainerWidget(boss, name, "AGSGameOptionsDialog", false, domain) { + + // Language + GUI::StaticTextWidget *textWidget = new GUI::StaticTextWidget(widgetsBoss(), _dialogLayout + ".translation_desc", _("Game language:"), _("Language to use for multilingual games")); + textWidget->setAlign(Graphics::kTextAlignRight); + + _langPopUp = new GUI::PopUpWidget(widgetsBoss(), _dialogLayout + ".translation"); + _langPopUp->appendEntry(_(""), (uint32) - 1); + + Common::String path = ConfMan.get("path", _domain); + Common::FSDirectory dir(path); + Common::ArchiveMemberList traFileList; + dir.listMatchingMembers(traFileList, "*.tra"); + + int i = 0; + for (Common::ArchiveMemberList::iterator iter = traFileList.begin(); iter != traFileList.end(); ++iter) { + Common::String traFileName = (*iter)->getName(); + traFileName.erase(traFileName.size() - 4); // remove .tra extension + _traFileNames.push_back(traFileName); + _langPopUp->appendEntry(traFileName, i++); + } + + // Force font antialiasing + _forceTextAACheckbox = new GUI::CheckboxWidget(widgetsBoss(), _dialogLayout + ".textAA", _("Force antialiased text"), _("Use antialiasing to draw text even if the game does not ask for it")); +} + +void AGSOptionsWidget::defineLayout(GUI::ThemeEval &layouts, const Common::String &layoutName, const Common::String &overlayedLayout) const { + layouts.addDialog(layoutName, overlayedLayout); + layouts.addLayout(GUI::ThemeLayout::kLayoutVertical).addPadding(16, 16, 16, 16); + + layouts.addLayout(GUI::ThemeLayout::kLayoutHorizontal).addPadding(0, 0, 0, 0); + layouts.addWidget("translation_desc", "OptionsLabel"); + layouts.addWidget("translation", "PopUp").closeLayout(); + + layouts.addWidget("textAA", "Checkbox"); + + layouts.closeLayout().closeDialog(); +} + +void AGSOptionsWidget::load() { + Common::ConfigManager::Domain *gameConfig = ConfMan.getDomain(_domain); + if (!gameConfig) + return; + + uint32 curLangIndex = (uint32) - 1; + Common::String curLang; + gameConfig->tryGetVal("translation", curLang); + if (!curLang.empty()) { + for (uint i = 0; i < _traFileNames.size(); ++i) { + if (_traFileNames[i].equalsIgnoreCase(curLang)) { + curLangIndex = i; + break; + } + } + } + _langPopUp->setSelectedTag(curLangIndex); + + Common::String forceTextAA; + gameConfig->tryGetVal("force_text_aa", forceTextAA); + if (!forceTextAA.empty()) { + bool val; + if (parseBool(forceTextAA, val)) + _forceTextAACheckbox->setState(val); + } +} + +bool AGSOptionsWidget::save() { + uint langIndex = _langPopUp->getSelectedTag(); + if (langIndex < _traFileNames.size()) + ConfMan.set("translation", _traFileNames[langIndex], _domain); + else + ConfMan.removeKey("translation", _domain); + + ConfMan.setBool("force_text_aa", _forceTextAACheckbox->getState(), _domain); + + return true; +} + +} // namespace AGS3 + +GUI::OptionsContainerWidget *AGSMetaEngine::buildEngineOptionsWidgetDynamic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const { + return new AGS3::AGSOptionsWidget(boss, name, target); +} diff --git a/engines/ags/metaengine.h b/engines/ags/metaengine.h index 4297e7142bc..76e9062ede8 100644 --- a/engines/ags/metaengine.h +++ b/engines/ags/metaengine.h @@ -52,6 +52,8 @@ public: */ Common::String getSavegameFile(int saveGameIdx, const char *target = nullptr) const override; + GUI::OptionsContainerWidget *buildEngineOptionsWidgetDynamic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override; + /** * Determine whether the engine supports the specified MetaEngine feature. * diff --git a/engines/ags/module.mk b/engines/ags/module.mk index e3f945268cb..dab643747ff 100644 --- a/engines/ags/module.mk +++ b/engines/ags/module.mk @@ -2,6 +2,7 @@ MODULE := engines/ags MODULE_OBJS = \ ags.o \ + dialogs.o \ events.o \ game_scanner.o \ globals.o \