From 1b0c29cb015e00d26db44391f994867f15d26f53 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 15 Aug 2008 11:05:25 +0000 Subject: [PATCH] Added popup widget in Options menu to change GUI renderer on the fly. svn-id: r33898 --- gui/ThemeRenderer.cpp | 8 +++++++- gui/ThemeRenderer.h | 6 +++++- gui/newgui.cpp | 17 ++++++++++++----- gui/newgui.h | 4 +++- gui/options.cpp | 16 +++++++++++++++- gui/options.h | 2 +- gui/theme.h | 1 + gui/themes/default.inc | 3 +++ gui/themes/scummclassic.zip | Bin 28291 -> 28494 bytes gui/themes/scummclassic/classic_layout.stx | 3 +++ gui/themes/scummodern.zip | Bin 122557 -> 123017 bytes gui/themes/scummodern/scummodern_layout.stx | 3 +++ .../scummodern/scummodern_layout_320.stx | 3 +++ gui/themes/scummtheme.py | 2 +- 14 files changed, 57 insertions(+), 11 deletions(-) diff --git a/gui/ThemeRenderer.cpp b/gui/ThemeRenderer.cpp index f0189109442..f33e1526305 100644 --- a/gui/ThemeRenderer.cpp +++ b/gui/ThemeRenderer.cpp @@ -43,6 +43,12 @@ namespace GUI { using namespace Graphics; +const char *ThemeRenderer::rendererModeLabels[] = { + "Disabled GFX", + "Stardard Renderer (16bpp)", + "Antialiased Renderer (16bpp)" +}; + const ThemeRenderer::DrawDataInfo ThemeRenderer::kDrawDataDefaults[] = { {kDDMainDialogBackground, "mainmenu_bg", true, kDDNone}, {kDDSpecialColorBackground, "special_bg", true, kDDNone}, @@ -256,7 +262,7 @@ void ThemeRenderer::setGraphicsMode(GraphicsMode mode) { break; default: - return; + error("Invalid graphics mode"); } freeRenderer(); diff --git a/gui/ThemeRenderer.h b/gui/ThemeRenderer.h index 2b77121da0c..e8f6d76ee25 100644 --- a/gui/ThemeRenderer.h +++ b/gui/ThemeRenderer.h @@ -212,9 +212,12 @@ public: enum GraphicsMode { kGfxDisabled = 0, /** No GFX */ kGfxStandard16bit, /** 2BPP with the standard (aliased) renderer. */ - kGfxAntialias16bit /** 2BPP with the optimized AA renderer. */ + kGfxAntialias16bit, /** 2BPP with the optimized AA renderer. */ + kGfxMAX }; + static const char *rendererModeLabels[]; + /** Default constructor */ ThemeRenderer(Common::String fileName, GraphicsMode mode); @@ -487,6 +490,7 @@ protected: const Common::String &getThemeName() const { return _themeName; } const Common::String &getThemeFileName() const { return _themeFileName; } + int getThemeRenderer() const { return _graphicsMode; } /** * Initializes the drawing screen surfaces, _screen and _backBuffer. diff --git a/gui/newgui.cpp b/gui/newgui.cpp index 2fa0dc8620e..d90431503dd 100644 --- a/gui/newgui.cpp +++ b/gui/newgui.cpp @@ -58,8 +58,6 @@ void GuiObject::reflowLayout() { if (!g_gui.xmlEval()->getWidgetData(_name, _x, _y, _w, _h)) { warning("Could not load widget position for '%s'", _name.c_str()); } - - return; if (_x < 0) error("Widget <%s> has x < 0: %d", _name.c_str(), _x); @@ -96,8 +94,11 @@ NewGui::NewGui() : _redrawStatus(kRedrawDisabled), if (themefile != "builtin" && !themefile.hasSuffix(".zip")) themefile += ".zip"; + + ConfMan.registerDefault("gui_renderer", 2); + ThemeRenderer::GraphicsMode gfxMode = (ThemeRenderer::GraphicsMode)ConfMan.getInt("gui_renderer"); - loadNewTheme(themefile); + loadNewTheme(themefile, gfxMode); _themeChange = false; } @@ -105,8 +106,14 @@ NewGui::~NewGui() { delete _theme; } -bool NewGui::loadNewTheme(const Common::String &filename) { +bool NewGui::loadNewTheme(const Common::String &filename, ThemeRenderer::GraphicsMode gfx) { + if (_theme && filename == _theme->getThemeFileName() && gfx == _theme->getThemeRenderer()) + return true; + Common::String oldTheme = (_theme != 0) ? _theme->getThemeFileName() : ""; + + if (gfx == ThemeRenderer::kGfxDisabled) + gfx = (ThemeRenderer::GraphicsMode)ConfMan.getInt("gui_renderer"); if (_theme) _theme->disable(); @@ -119,7 +126,7 @@ bool NewGui::loadNewTheme(const Common::String &filename) { delete _theme; _theme = 0; - _theme = new ThemeRenderer(filename, GUI::ThemeRenderer::kGfxAntialias16bit); + _theme = new ThemeRenderer(filename, gfx); if (!_theme) return (!oldTheme.empty() ? loadNewTheme(oldTheme) : false); diff --git a/gui/newgui.h b/gui/newgui.h index b7ef589f070..cc9e6b9f3cd 100644 --- a/gui/newgui.h +++ b/gui/newgui.h @@ -33,6 +33,8 @@ #include "gui/theme.h" #include "gui/widget.h" +#include "gui/ThemeRenderer.h" + class OSystem; namespace GUI { @@ -76,7 +78,7 @@ public: bool isActive() const { return ! _dialogStack.empty(); } - bool loadNewTheme(const Common::String &file); + bool loadNewTheme(const Common::String &file, ThemeRenderer::GraphicsMode gfx = ThemeRenderer::kGfxDisabled); Theme *theme() { return _theme; } ThemeEval *xmlEval() { return _theme->evaluator(); } diff --git a/gui/options.cpp b/gui/options.cpp index 6377bd6377b..05b0f790a2d 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -724,9 +724,16 @@ GlobalOptionsDialog::GlobalOptionsDialog() new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", "Theme:", kChooseThemeCmd, 0); _curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName()); + int labelWidth = g_gui.xmlEval()->getVar("Globals.TabLabelWidth"); - + + _rendererPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.Renderer", "GUI Renderer:", labelWidth); + + for (int i = 1; i < GUI::ThemeRenderer::kGfxMAX; ++i) { + _rendererPopUp->appendEntry(GUI::ThemeRenderer::rendererModeLabels[i], i); + } + _autosavePeriodPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.AutosavePeriod", "Autosave:", labelWidth); for (int i = 0; savePeriodLabels[i]; i++) { @@ -799,6 +806,8 @@ void GlobalOptionsDialog::open() { if (value == savePeriodValues[i]) _autosavePeriodPopUp->setSelected(i); } + + _rendererPopUp->setSelected(ConfMan.getInt("gui_renderer") - 1); } void GlobalOptionsDialog::close() { @@ -828,6 +837,11 @@ void GlobalOptionsDialog::close() { #endif ConfMan.setInt("autosave_period", _autosavePeriodPopUp->getSelectedTag(), _domain); + + if ((int)_rendererPopUp->getSelectedTag() != ConfMan.getInt("gui_renderer")) { + g_gui.loadNewTheme(g_gui.theme()->getThemeFileName(), (GUI::ThemeRenderer::GraphicsMode)_rendererPopUp->getSelectedTag()); + ConfMan.setInt("gui_renderer", _rendererPopUp->getSelectedTag(), _domain); + } } OptionsDialog::close(); } diff --git a/gui/options.h b/gui/options.h index af13663b296..39f2918ce2e 100644 --- a/gui/options.h +++ b/gui/options.h @@ -170,7 +170,7 @@ protected: // Misc controls // StaticTextWidget *_curTheme; - + PopUpWidget *_rendererPopUp; PopUpWidget *_autosavePeriodPopUp; }; diff --git a/gui/theme.h b/gui/theme.h index 4c1ab2e195f..f4709067eff 100644 --- a/gui/theme.h +++ b/gui/theme.h @@ -310,6 +310,7 @@ public: virtual const Common::String &getThemeFileName() const = 0; virtual const Common::String &getThemeName() const = 0; + virtual int getThemeRenderer() const = 0; /** * Checks if the theme renderer supports drawing of images. diff --git a/gui/themes/default.inc b/gui/themes/default.inc index d87a1f5632f..55d1211e249 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -704,6 +704,9 @@ "height = 'Globals.Line.Height' " "/> " " " +" " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 653f789baf0bfe16c8a7a7484816f43ace76cd8d..334d2a2274d2c753e6d93f2b674828904f5da0b9 100644 GIT binary patch delta 356 zcmZp^%Xsb{qeOr=Gm8iV2ox^mvz$M5j`3nS28P9Q8zs&#Pi9w22}#aLEH2JW)`!yZ z>1h>u#U&LADqIR$3M!r{Rto4c#>N(A779iN1{S&o7P^Ke3WgR|CdO7q=1~eEiFx_i zr3#zhFxyG-{z~PyJf$c%U(cU`L2t9UoC!-jx@9?umHDM5IP61`By1(fxm=r{Db?$8 z1f}Msq!y(XO*V+u-<%qdB+G~D^~qOr_2p3<=g+_(1P&tzSkic5vT~liqFx>YLx_i~ auWOKVfHx}}NRpX>nPC$H14COLNGSl0LuIxA delta 275 zcmX?ikFohKqeOr=Gm8iV2<)B3XBqHtO2%hd28PeF8zs&#bEt4BXep?8rfi?0y;h5Z>Agf~BzGhwOEPf0Dx( + diff --git a/gui/themes/scummodern.zip b/gui/themes/scummodern.zip index 1cd84717092bee0beb23b66eb29f3441664a5970..3c68cc7df35a8db72544bda3b8ff7f701dd936b7 100644 GIT binary patch delta 571 zcmdnHm%Z~Kd&3sS#U^}(OZhBCr>!t9)MQ{N)ZD(&gz-G{^nygj%wYZE?&lD>KERx2?7G@R-Mg|5Jx&{`yh9(Mz7FH(4Rz~Jg3L%Mk z`Prok+dC{6IaGOnrSe)Ow>1R6_xwpr+GV(EQKYxVrsRUZoO+R#((MSO$XdM_B zL>UlZNuyQVbdh_E%8D4?MJQre(x^P2aeD4NMycsV_ZYR9e&3xw?;fKhThKj51_lNI DxZ?Nl*yO{11gaa;;o`dnQ4S_;9*rMbCbz6v23skx~N5xzbOX_+~xAX$Aa1>gLX z)S^6y-1G;F8RfTgB{QB<*v{R;s3Z+`tGCGty%n|$3@dE6ThC{_hUC`Uiy7nPr*pS3 zI!-&wD7*dqVaAOREeP*T@4L@vq=4cb2L=XF1_W5r*cLne!F@($MUX0lWeg0G2t^D_ z8UyArPIs8kC^g;g0i%|p{vAe!5D!;h*C6KrZ&o&tN=^n&21O + diff --git a/gui/themes/scummodern/scummodern_layout_320.stx b/gui/themes/scummodern/scummodern_layout_320.stx index 07ea81371f7..a84fa97cd74 100644 --- a/gui/themes/scummodern/scummodern_layout_320.stx +++ b/gui/themes/scummodern/scummodern_layout_320.stx @@ -325,6 +325,9 @@ height = 'Globals.Line.Height' /> + diff --git a/gui/themes/scummtheme.py b/gui/themes/scummtheme.py index 202372cfea5..da0b88cf61d 100644 --- a/gui/themes/scummtheme.py +++ b/gui/themes/scummtheme.py @@ -6,7 +6,7 @@ import os import zipfile def buildTheme(themeName): - if not os.path.isdir(themeName): + if not os.path.isdir(themeName) or not os.path.isfile(os.path.join(themeName, "THEMERC")): print "Invalid theme name: " + themeName return