From bcfb7145fac9a712595e81efd5eaf2bd1230ddac Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Sun, 22 Mar 2020 15:19:56 +0100 Subject: [PATCH] GUI: Allow engines to define a fully custom tab in the edit game dialog By implementing MetaEngine::buildEngineOptionsWidget, engines can instantiate a container widget that will be shown in the Engine tab of the edit game dialog. The default implementation retains the existing behavior and shows the extra GUI options. --- base/main.cpp | 5 +- engines/dialogs.cpp | 55 ++++++++++++++++++ engines/dialogs.h | 19 ++++++ engines/metaengine.cpp | 17 ++++++ engines/metaengine.h | 29 +++++++++ gui/ThemeEngine.h | 2 +- gui/dialog.cpp | 4 ++ gui/dialog.h | 5 +- gui/editgamedialog.cpp | 42 ++++++------- gui/editgamedialog.h | 3 +- gui/options.cpp | 18 +----- gui/options.h | 8 --- gui/themes/default.inc | 34 ++++++++++- gui/themes/scummclassic.zip | Bin 161672 -> 162892 bytes gui/themes/scummclassic/THEMERC | 2 +- gui/themes/scummclassic/classic_layout.stx | 20 ++++++- .../scummclassic/classic_layout_lowres.stx | 20 ++++++- gui/themes/scummmodern.zip | Bin 291737 -> 292957 bytes gui/themes/scummmodern/THEMERC | 2 +- gui/themes/scummmodern/scummmodern_layout.stx | 20 ++++++- .../scummmodern/scummmodern_layout_lowres.stx | 20 ++++++- gui/themes/scummremastered.zip | Bin 289785 -> 291005 bytes gui/themes/scummremastered/THEMERC | 2 +- .../scummremastered/remastered_layout.stx | 20 ++++++- .../remastered_layout_lowres.stx | 20 ++++++- 25 files changed, 300 insertions(+), 67 deletions(-) diff --git a/base/main.cpp b/base/main.cpp index 8ab43d0e12c..063da86bd3c 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -185,10 +185,7 @@ static Common::Error runGame(const Plugin *plugin, OSystem &system, const Common // Set default values for all of the custom engine options // Apparently some engines query them in their constructor, thus we // need to set this up before instance creation. - const ExtraGuiOptions engineOptions = metaEngine.getExtraGuiOptions(Common::String()); - for (uint i = 0; i < engineOptions.size(); i++) { - ConfMan.registerDefault(engineOptions[i].configOption, engineOptions[i].defaultState); - } + metaEngine.registerDefaultSettings(target); err = metaEngine.createInstance(&system, &engine); } diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index aaf30c8abf5..cc22223d9fe 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -358,4 +358,59 @@ void ConfigDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 } } +ExtraGuiOptionsWidget::ExtraGuiOptionsWidget(GuiObject *containerBoss, const Common::String &name, const Common::String &domain, const ExtraGuiOptions &options) : + OptionsContainerWidget(containerBoss, name, dialogLayout(domain), false, domain), + _options(options) { + + // Note: up to 7 engine options can currently fit on screen (the most that + // can fit in a 320x200 screen with the classic theme). + // TODO: Increase this number by including the checkboxes inside a scroll + // widget. The appropriate number of checkboxes will need to be added to + // the theme files. + + uint i = 1; + ExtraGuiOptions::const_iterator iter; + for (iter = _options.begin(); iter != _options.end(); ++iter, ++i) { + Common::String id = Common::String::format("%d", i); + _checkboxes.push_back(new CheckboxWidget(widgetsBoss(), + _dialogLayout + ".customOption" + id + "Checkbox", _(iter->label), _(iter->tooltip))); + } +} + +ExtraGuiOptionsWidget::~ExtraGuiOptionsWidget() { +} + +Common::String ExtraGuiOptionsWidget::dialogLayout(const Common::String &domain) { + if (ConfMan.getActiveDomainName().equals(domain)) { + return "GlobalConfig_Engine_Container"; + } else { + return "GameOptions_Engine_Container"; + } +} + +void ExtraGuiOptionsWidget::load() { + // Set the state of engine-specific checkboxes + for (uint j = 0; j < _options.size(); ++j) { + // The default values for engine-specific checkboxes are not set when + // ScummVM starts, as this would require us to load and poll all of the + // engine plugins on startup. Thus, we set the state of each custom + // option checkbox to what is specified by the engine plugin, and + // update it only if a value has been set in the configuration of the + // currently selected game. + bool isChecked = _options[j].defaultState; + if (ConfMan.hasKey(_options[j].configOption, _domain)) + isChecked = ConfMan.getBool(_options[j].configOption, _domain); + _checkboxes[j]->setState(isChecked); + } +} + +bool ExtraGuiOptionsWidget::save() { + // Set the state of engine-specific checkboxes + for (uint i = 0; i < _options.size(); i++) { + ConfMan.setBool(_options[i].configOption, _checkboxes[i]->getState(), _domain); + } + + return true; +} + } // End of namespace GUI diff --git a/engines/dialogs.h b/engines/dialogs.h index cfe3349f28d..85105854f54 100644 --- a/engines/dialogs.h +++ b/engines/dialogs.h @@ -25,6 +25,7 @@ #include "gui/dialog.h" #include "gui/options.h" +#include "gui/widget.h" class Engine; @@ -95,6 +96,24 @@ public: void handleCommand(CommandSender *sender, uint32 cmd, uint32 data) override; }; +class ExtraGuiOptionsWidget : public OptionsContainerWidget { +public: + ExtraGuiOptionsWidget(GuiObject *widgetsBoss, const Common::String &name, const Common::String &domain, const ExtraGuiOptions &options); + ~ExtraGuiOptionsWidget() override; + + // OptionsContainerWidget API + void load() override; + bool save() override; + +private: + typedef Common::Array CheckboxWidgetList; + + static Common::String dialogLayout(const Common::String &domain); + + ExtraGuiOptions _options; + CheckboxWidgetList _checkboxes; +}; + } // End of namespace GUI #endif diff --git a/engines/metaengine.cpp b/engines/metaengine.cpp index 02275308e57..a46faf29e45 100644 --- a/engines/metaengine.cpp +++ b/engines/metaengine.cpp @@ -30,6 +30,8 @@ #include "common/system.h" #include "common/translation.h" +#include "engines/dialogs.h" + #include "graphics/palette.h" #include "graphics/scaler.h" #include "graphics/managed_surface.h" @@ -336,6 +338,21 @@ SaveStateList MetaEngine::listSaves(const char *target, bool saveMode) const { return saveList; } +void MetaEngine::registerDefaultSettings(const Common::String &target) const { + const ExtraGuiOptions engineOptions = getExtraGuiOptions(target); + for (uint i = 0; i < engineOptions.size(); i++) { + ConfMan.registerDefault(engineOptions[i].configOption, engineOptions[i].defaultState); + } +} + +GUI::OptionsContainerWidget *MetaEngine::buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const { + const ExtraGuiOptions engineOptions = getExtraGuiOptions(target); + if (engineOptions.empty()) { + return nullptr; + } + + return new GUI::ExtraGuiOptionsWidget(boss, name, target, engineOptions); +} void MetaEngine::removeSaveState(const char *target, int slot) const { if (!hasFeature(kSavesUseExtendedFormat)) diff --git a/engines/metaengine.h b/engines/metaengine.h index 5f5c2b8c1c9..5775a67c6ac 100644 --- a/engines/metaengine.h +++ b/engines/metaengine.h @@ -48,6 +48,11 @@ namespace Graphics { struct Surface; } +namespace GUI { +class GuiObject; +class OptionsContainerWidget; +} + /** * Per-game extra GUI options structure. * Currently, this can only be used for options with checkboxes. @@ -190,6 +195,30 @@ public: return ExtraGuiOptions(); } + /** + * Register the default values for the settings the engine uses into the + * configuration manager. + * + * @param target name of a config manager target + */ + virtual void registerDefaultSettings(const Common::String &target) const; + + /** + * Return a GUI widget container for configuring the specified target options. + * + * The returned widget is shown in the Engine tab in the edit game dialog. + * Engines can build custom options dialogs, but by default a simple widget + * allowing to configure the extra GUI options is used. + * + * Engines that don't want to have an Engine tab in the edit game dialog + * can return nullptr. + * + * @param boss the widget / dialog the returned widget is a child of + * @param name the name the returned widget must use + * @param target name of a config manager target + */ + virtual GUI::OptionsContainerWidget *buildEngineOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const; + /** * Return the maximum save slot that the engine supports. * diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h index fd71734debf..a852bfcbe11 100644 --- a/gui/ThemeEngine.h +++ b/gui/ThemeEngine.h @@ -37,7 +37,7 @@ #include "graphics/pixelformat.h" -#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.35" +#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.8.36" class OSystem; diff --git a/gui/dialog.cpp b/gui/dialog.cpp index 8ca61a676e9..1cea4a6f81c 100644 --- a/gui/dialog.cpp +++ b/gui/dialog.cpp @@ -358,6 +358,10 @@ void Dialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { case kCloseCmd: close(); break; + case kCloseWithResultCmd: + setResult(data); + close(); + break; default: break; } diff --git a/gui/dialog.h b/gui/dialog.h index eac99746eea..bd9fb36f4e0 100644 --- a/gui/dialog.h +++ b/gui/dialog.h @@ -42,8 +42,9 @@ class Widget; // Some "common" commands sent to handleCommand() enum { - kCloseCmd = 'clos', - kOKCmd = 'ok ' + kCloseWithResultCmd = 'clsr', + kCloseCmd = 'clos', + kOKCmd = 'ok ' }; class Dialog : public GuiObject { diff --git a/gui/editgamedialog.cpp b/gui/editgamedialog.cpp index a141fa105cc..2aa6ec3d86a 100644 --- a/gui/editgamedialog.cpp +++ b/gui/editgamedialog.cpp @@ -105,15 +105,13 @@ EditGameDialog::EditGameDialog(const String &domain) : OptionsDialog(domain, "GameOptions") { EngineMan.upgradeTargetIfNecessary(domain); - // Retrieve all game specific options. + _engineOptions = nullptr; // Retrieve the plugin, since we need to access the engine's MetaEngine // implementation. const Plugin *plugin = nullptr; QualifiedGameDescriptor qgd = EngineMan.findTarget(domain, &plugin); - if (plugin) { - _engineOptions = plugin->get().getExtraGuiOptions(domain); - } else { + if (!plugin) { warning("Plugin for target \"%s\" not found! Game specific settings might be missing", domain.c_str()); } @@ -175,12 +173,21 @@ EditGameDialog::EditGameDialog(const String &domain) } // - // 2) The engine tab (shown only if there are custom engine options) + // 2) The engine tab (shown only if the engine implements one or there are custom engine options) // - if (_engineOptions.size() > 0) { - tab->addTab(_("Engine"), "GameOptions_Engine"); - addEngineControls(tab, "GameOptions_Engine.", _engineOptions); + if (plugin) { + int tabId = tab->addTab(_("Engine"), "GameOptions_Engine"); + + const MetaEngine &metaEngine = plugin->get(); + metaEngine.registerDefaultSettings(_domain); + _engineOptions = metaEngine.buildEngineOptionsWidget(tab, "GameOptions_Engine.Container", _domain); + + if (_engineOptions) { + _engineOptions->setParentDialog(this); + } else { + tab->removeTab(tabId); + } } // @@ -404,18 +411,8 @@ void EditGameDialog::open() { _langPopUp->setEnabled(false); } - // Set the state of engine-specific checkboxes - for (uint j = 0; j < _engineOptions.size(); ++j) { - // The default values for engine-specific checkboxes are not set when - // ScummVM starts, as this would require us to load and poll all of the - // engine plugins on startup. Thus, we set the state of each custom - // option checkbox to what is specified by the engine plugin, and - // update it only if a value has been set in the configuration of the - // currently selected game. - bool isChecked = _engineOptions[j].defaultState; - if (ConfMan.hasKey(_engineOptions[j].configOption, _domain)) - isChecked = ConfMan.getBool(_engineOptions[j].configOption, _domain); - _engineCheckboxes[j]->setState(isChecked); + if (_engineOptions) { + _engineOptions->load(); } const Common::PlatformDescription *p = Common::g_platforms; @@ -459,9 +456,8 @@ void EditGameDialog::apply() { else ConfMan.set("platform", Common::getPlatformCode(platform), _domain); - // Set the state of engine-specific checkboxes - for (uint i = 0; i < _engineOptions.size(); i++) { - ConfMan.setBool(_engineOptions[i].configOption, _engineCheckboxes[i]->getState(), _domain); + if (_engineOptions) { + _engineOptions->save(); } OptionsDialog::apply(); diff --git a/gui/editgamedialog.h b/gui/editgamedialog.h index 8832865e512..47df4c64780 100644 --- a/gui/editgamedialog.h +++ b/gui/editgamedialog.h @@ -26,6 +26,7 @@ #include "engines/game.h" #include "gui/dialog.h" #include "gui/options.h" +#include "gui/widget.h" namespace GUI { @@ -90,7 +91,7 @@ protected: CheckboxWidget *_globalMT32Override; CheckboxWidget *_globalVolumeOverride; - ExtraGuiOptions _engineOptions; + OptionsContainerWidget *_engineOptions; }; } // End of namespace GUI diff --git a/gui/options.cpp b/gui/options.cpp index 8e62b71d06f..7ce11c557cf 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -269,7 +269,7 @@ void OptionsDialog::build() { // Keymapper options if (_keymapperWidget) { - _keymapperWidget->build(); + _keymapperWidget->load(); } // Graphic options @@ -1404,22 +1404,6 @@ void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &pre _enableVolumeSettings = true; } -void OptionsDialog::addEngineControls(GuiObject *boss, const Common::String &prefix, const ExtraGuiOptions &engineOptions) { - // Note: up to 7 engine options can currently fit on screen (the most that - // can fit in a 320x200 screen with the classic theme). - // TODO: Increase this number by including the checkboxes inside a scroll - // widget. The appropriate number of checkboxes will need to be added to - // the theme files. - - uint i = 1; - ExtraGuiOptions::const_iterator iter; - for (iter = engineOptions.begin(); iter != engineOptions.end(); ++iter, ++i) { - Common::String id = Common::String::format("%d", i); - _engineCheckboxes.push_back(new CheckboxWidget(boss, - prefix + "customOption" + id + "Checkbox", _(iter->label), _(iter->tooltip))); - } -} - bool OptionsDialog::loadMusicDeviceSetting(PopUpWidget *popup, Common::String setting, MusicType preferredType) { if (!popup || !popup->isEnabled()) return true; diff --git a/gui/options.h b/gui/options.h index 2ec441df3e8..0d97bd7a9dc 100644 --- a/gui/options.h +++ b/gui/options.h @@ -61,8 +61,6 @@ class RadiobuttonGroup; class RadiobuttonWidget; class OptionsDialog : public Dialog { - typedef Common::Array CheckboxWidgetList; - public: OptionsDialog(const Common::String &domain, int x, int y, int w, int h); OptionsDialog(const Common::String &domain, const Common::String &name); @@ -105,7 +103,6 @@ protected: // The default value is the launcher's non-scaled talkspeed value. When SCUMM uses the widget, // it uses its own scale void addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal = 255); - void addEngineControls(GuiObject *boss, const Common::String &prefix, const ExtraGuiOptions &engineOptions); void setGraphicSettingsState(bool enabled); void setShaderSettingsState(bool enabled); @@ -243,11 +240,6 @@ protected: // Common::String _guioptions; Common::String _guioptionsString; - - // - // Engine-specific controls - // - CheckboxWidgetList _engineCheckboxes; }; diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 7e36996d45b..4f831dd7ae1 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1969,7 +1969,12 @@ const char *defaultXML1 = "" "" "" "" -"" +"" +"" +"" +"" +"" +"" "" "" "" "" +"" +"" +"" +"" +"" +"" +"" +"" +"" +"" "" "" "" @@ -3772,7 +3787,12 @@ const char *defaultXML1 = "" "" "" "" -"" +"" +"" +"" +"" +"" +"" "" "" "" "" +"" +"" +"" +"" +"" +"" +"" +"" +"" +"" "" "" "" diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 15040dfe639cdd06f45cabfa1c059fae1fd130ae..f51df566aa24432d6130072b234e2602afa7100d 100644 GIT binary patch delta 853 zcmeBp&w1ttr%-@5Gm8iV2<)va3wUyJf9ymd6-Kj(<~l4lqi6eVOy9!?W^7jH2eLMI z*aU2TE-T2#qGRP5u=$Vn%5c7|6=eZYT@2Qomlzm0FKyo3yu5Mp{{sz^<9~Crx#p#3 z=A}+IJj$p7Wlz5F)p@ejEYax?t}*g#7r(~n#WZ=rFM;i{9E{Icr#D_@l$rjZkdbxz z%x8=fCO=rtHa+hdBRkxjS&S0XHFv z=fbxM7!Z1uTc)i&$H1`m-1d%OMy)3NJ~Eje@Q+ae?xj!cz#uR^K$}T&Vh7)LBLyZwZg7-sch_e6!VQkI?e^wO7kD6|!Y)h} z0uZKu2-60BhyvymCTRfGvq0kXhK^wH$$^Gle-rWcklse!dkpIyS_0M<4A zK8OWM3e%NKnJm$g!t|_CCL;yZ&}3kc1Sd8Kv83@z==43MOzMg#egXPN97WX*6{hKe z3QQ8yWy+W!zL>64#w5l3S05}cJUyn2Nf6?qLXh}ZYlyg&xn5dwa)37@lL#{;k%R1c zsJDI-hX4Zu2#cZEbJBx}AtN=XEXmMlI&T@1G{n2VKt{4gGEI*QVG^Hyz69t5P(GM$ WSI#8Gv@>IRR5_Cd+qDWNpiux>_$Y$_ delta 595 zcmX@}gR|p3r%-@5Gm8iV2>7o{4fy*#=h{Re6-LvE<~l4U$xXf+)A#U!8JpGlfvnH7 z%KbM#mlfn=IWoD;fAb&hmEl6-Kz;XasV-f5o`C^`g&3wgR56KcKHc2kIC=jczsU}> z_@`fBXXM#l$;RlwG5zc##?)yi7 zJx-9Z!G#ZGw2$O@1>Z9a48CW!zX@g3Y62Q*IsJkjBlmWJn~cI7+kwV?bp$(c`!N+J zM{Wp{+koi{Hy_BkM>T!e=JPNx%;%YYL4`?TGKU=Bc4Hf+1w0Ui*FBgl1o%K+opN~6 z#|C}|h6euW4?UQ~CwuVoZFh=fYUBs|di(JVCTRfJiRR1zCh@+TkXbw`U3ej9u%_POm>cYg3k(yJM zWN0+~Vil7#L~0*Uipeo#`mJgv6|j-I@ARI%1cnR&R4U-0&Pze)I901Ur B#;gDU diff --git a/gui/themes/scummclassic/THEMERC b/gui/themes/scummclassic/THEMERC index 2bea7c2a2a0..4b1ab88179d 100644 --- a/gui/themes/scummclassic/THEMERC +++ b/gui/themes/scummclassic/THEMERC @@ -1 +1 @@ -[SCUMMVM_STX0.8.35:ScummVM Classic Theme:No Author] +[SCUMMVM_STX0.8.36:ScummVM Classic Theme:No Author] diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index ddd246e64e6..31193b6206d 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -1124,7 +1124,13 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 9b7aaca79c4..05161624490 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -1134,7 +1134,13 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 55845bb8515644043ab3a7307dd3c2fae4805f94..b015aa9b901550f26fb4a3eca1dcaceea1c277d1 100644 GIT binary patch delta 1335 zcmbu9TSyd97{|vspR2gK7cZ@=C|g)0UJ5VkB{fYHORFi$yyc>{skwK}OIBD$h!w0_ z9STDvLwfMR7Mh0yH+pOZMc=X#350rR1G5K%n%Q$^MWbFCIKz+s_kI8G9L_iMXifdz zs}ASN5kxZL!}oM@8*Z6xC_EuRKa`aOqfZp69Sx4zXbv=##FkYaVp|wa(TqZi!<)qta z-#pE;-K(N`9;aSK@?_)LDuuZD`)`K7^(h&qPdTC**NjX>DMmJ(A+Fx(E+z5VaBFEz z!~*r{w=VJ4rGP4O8vgBSz=vX=EkCu7JwST#D~W6-g5=zz9Is7bv#uzd-JRU9veDpK zWEjsPUq8tX^y3vRx+5#GG`Cue_+TtbkoeRxD#q@76o`+{vMTKTi9-36O>~UK&RC@4 zpQoUuz(8Lep7tUQURh)VF_(v&*p`mMBp1Ok8Y}16Ffk+xGSEg_=HFvc4EDsM5P$6R z7nFl_c|yBu>Bw55z9rna*W{|KSYQ}&#o>lYHVRibK+ebYp!%EtIzk54H6b}JJd2|I zM>rDvKl|Qtl;Mq7r2Wh0v9Nig*jL8i1Gr6ZM^grL#`w$SK!=Q9ItO&h_?%iePlkqn z+zdt(EX_L(YJ(Kt731tS&=YdBK^~zOZBR&PLnLw9ajr?yuA3l(L|>X9m(aRjOEyC$ z(Trv|L}1BvBA;QlGM12cS_@1E~FbI!T%mz6g^D+6>| z0zr)MoOr0$JviWuY!8U`Qnx3^LQ-XO?(o?-B7%|YL?xjK?@>P*YYXPl>Mck9NKUj; zij}Jh<&=Gzp#zEnvkRqM^N}KnojP7F#ndN@CDeJkRARsD&q%Sd>MR*m>9c*6QMWGV zlyuH?wLm&I;nFDRIq%*Sg`ZITwHF;LPJf1R`nwgqq3*$8Kld+}??~gY!=LJWdloL` z1WrpjEyh{SIO|nF|Arf1@cNJ~%5sA-Y$EmIKJH`H1YWu?=X2rlY;uENDBrso<=D7k znqdsnTxmahr3JOSNFL^Q5P!^!BXaKNIyuIoYa3B;WeH?<3x4teJ&r9AId~_wXOs29$$JUy;=EX^dS)Alb8%a~M z;FyX-KZuf>UneC#9Ph9qRX>*l(hRs%9Y{mqZWMzw1@3nll+dPfr8S@@KAwHRaU;Zw zExjDyv;bAi*QPg0DG%@v#wUxz0 z2cJ4)h6qY7n?Ws-W>n{6k3eQyU?(LF7LP`c1yX42odq%|+F^w(iYf&ptR>#th%H$` zMcLgpPfb-D=)Qo&j4wPA3$Q#Ix`-=QzJOdigwfP$yGP`<-BZAv9a1S9RtJZ~rNE*( zNdIRi@NOMwqJ%y9J2i%h6mK5=^ffKi<60fii-)leh)COd6d0?%+)`;ssHipRv|elw zp|@3N>Ok1r{TeyL2(N6DQk51jIUt - + + + + + + + + + + + + + + + + + + + diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index f85df8647c1..854e673136f 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -1133,7 +1133,13 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/gui/themes/scummremastered.zip b/gui/themes/scummremastered.zip index 7907630550fef8167290db9cb5008e022e55dd32..2e795a95780c4f02d94a8df35e3cb822622258c0 100644 GIT binary patch delta 1304 zcmbVMTSyd97#`>Ru8Xdh^~Nd^i>PF2h3R@pbZs+BF(!+=gqf~;nXSAo<}J{CkuY-~ z>LA?|>LEzfRyqVq78DT}i7N(yV)#-NNZCVT*vy<6ZF`7lVU~~Y`~L6z%lUSGENG{e zwV_-Qf^bIsJZWp;T%%tXU7>M423NWP20Qk1WDwg)Tj|J0-&FLtait0^ej*}@%9s-KvdW0;va^6W0#+jC=y?ZRDQC_t58XXEQE z*tNt);fKEwPs5N2b6Vt!M+qB(xp<@@rZrT^;^|=&LNp1;M~N}p$!zUMQ`V>=}qEd^(U9&(MT5dhd=fOpNq)pkMd8A2j1Z2kgogkMBv;Oc)Tuh>yRQYhOMv&6esWvwcs^ zg$Az3hYd&cEhGKVO$S7)`;Q17XMF=6w?J5;$d_NyJCr=FSKgPC)LY}M!)JMj+$q{K v0%O6T5snw0KreeqnP9)jJI!_}TraviCyy;D;bC5GcP)N%4&qhOb`bbqgBh^F delta 1066 zcmZuwYe*DP6rP=Xl7(Gd*VNLiG)&NZgtVJ4R?Upc&_%=4FjIG9W?gqzUC_uM*@8q= zC_;xMDkF)4#7A`hSSmz>g}Gn|MT-6?`XN0GDhg_5?#zbKzziSXcg}atoOAD^W%G{( zbELhLKoloGwZl$31ap@AB9nBMzP(l$8-w!E)-S@gw_T+%Eyl- znN`l6RcmDGjLi-VZ7Z%-bGr^4SJgKa4JubyrK#6zPB3-sltUE-vB3U49sq`#+}?nvkR+QK(ULwYaV`Yr}JP7KoN8~phI4#$x)9HG1kCwCGft@}m} z^Ej1GOz8MRV({e=5`l}ud^G))Oa?aKAssj|?Hw^<#$A$wH`_=Uc7Eb_Ved2EOm}CJ zz<#C9DtTt{d0duP - + + + + + + + + + + + + + + + + + + + diff --git a/gui/themes/scummremastered/remastered_layout_lowres.stx b/gui/themes/scummremastered/remastered_layout_lowres.stx index 99b30636252..f1ab411db53 100644 --- a/gui/themes/scummremastered/remastered_layout_lowres.stx +++ b/gui/themes/scummremastered/remastered_layout_lowres.stx @@ -1133,7 +1133,13 @@ - + + + + + + + + + + + + + + + + + + +