Added popup widget in Options menu to change GUI renderer on the fly.

svn-id: r33898
This commit is contained in:
Vicent Marti 2008-08-15 11:05:25 +00:00
parent 8e60e6c558
commit 1b0c29cb01
14 changed files with 57 additions and 11 deletions

View file

@ -43,6 +43,12 @@ namespace GUI {
using namespace Graphics; using namespace Graphics;
const char *ThemeRenderer::rendererModeLabels[] = {
"Disabled GFX",
"Stardard Renderer (16bpp)",
"Antialiased Renderer (16bpp)"
};
const ThemeRenderer::DrawDataInfo ThemeRenderer::kDrawDataDefaults[] = { const ThemeRenderer::DrawDataInfo ThemeRenderer::kDrawDataDefaults[] = {
{kDDMainDialogBackground, "mainmenu_bg", true, kDDNone}, {kDDMainDialogBackground, "mainmenu_bg", true, kDDNone},
{kDDSpecialColorBackground, "special_bg", true, kDDNone}, {kDDSpecialColorBackground, "special_bg", true, kDDNone},
@ -256,7 +262,7 @@ void ThemeRenderer::setGraphicsMode(GraphicsMode mode) {
break; break;
default: default:
return; error("Invalid graphics mode");
} }
freeRenderer(); freeRenderer();

View file

@ -212,9 +212,12 @@ public:
enum GraphicsMode { enum GraphicsMode {
kGfxDisabled = 0, /** No GFX */ kGfxDisabled = 0, /** No GFX */
kGfxStandard16bit, /** 2BPP with the standard (aliased) renderer. */ 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 */ /** Default constructor */
ThemeRenderer(Common::String fileName, GraphicsMode mode); ThemeRenderer(Common::String fileName, GraphicsMode mode);
@ -487,6 +490,7 @@ protected:
const Common::String &getThemeName() const { return _themeName; } const Common::String &getThemeName() const { return _themeName; }
const Common::String &getThemeFileName() const { return _themeFileName; } const Common::String &getThemeFileName() const { return _themeFileName; }
int getThemeRenderer() const { return _graphicsMode; }
/** /**
* Initializes the drawing screen surfaces, _screen and _backBuffer. * Initializes the drawing screen surfaces, _screen and _backBuffer.

View file

@ -58,8 +58,6 @@ void GuiObject::reflowLayout() {
if (!g_gui.xmlEval()->getWidgetData(_name, _x, _y, _w, _h)) { if (!g_gui.xmlEval()->getWidgetData(_name, _x, _y, _w, _h)) {
warning("Could not load widget position for '%s'", _name.c_str()); warning("Could not load widget position for '%s'", _name.c_str());
} }
return;
if (_x < 0) if (_x < 0)
error("Widget <%s> has x < 0: %d", _name.c_str(), _x); 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")) if (themefile != "builtin" && !themefile.hasSuffix(".zip"))
themefile += ".zip"; themefile += ".zip";
ConfMan.registerDefault("gui_renderer", 2);
ThemeRenderer::GraphicsMode gfxMode = (ThemeRenderer::GraphicsMode)ConfMan.getInt("gui_renderer");
loadNewTheme(themefile); loadNewTheme(themefile, gfxMode);
_themeChange = false; _themeChange = false;
} }
@ -105,8 +106,14 @@ NewGui::~NewGui() {
delete _theme; 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() : ""; Common::String oldTheme = (_theme != 0) ? _theme->getThemeFileName() : "";
if (gfx == ThemeRenderer::kGfxDisabled)
gfx = (ThemeRenderer::GraphicsMode)ConfMan.getInt("gui_renderer");
if (_theme) if (_theme)
_theme->disable(); _theme->disable();
@ -119,7 +126,7 @@ bool NewGui::loadNewTheme(const Common::String &filename) {
delete _theme; delete _theme;
_theme = 0; _theme = 0;
_theme = new ThemeRenderer(filename, GUI::ThemeRenderer::kGfxAntialias16bit); _theme = new ThemeRenderer(filename, gfx);
if (!_theme) if (!_theme)
return (!oldTheme.empty() ? loadNewTheme(oldTheme) : false); return (!oldTheme.empty() ? loadNewTheme(oldTheme) : false);

View file

@ -33,6 +33,8 @@
#include "gui/theme.h" #include "gui/theme.h"
#include "gui/widget.h" #include "gui/widget.h"
#include "gui/ThemeRenderer.h"
class OSystem; class OSystem;
namespace GUI { namespace GUI {
@ -76,7 +78,7 @@ public:
bool isActive() const { return ! _dialogStack.empty(); } 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; } Theme *theme() { return _theme; }
ThemeEval *xmlEval() { return _theme->evaluator(); } ThemeEval *xmlEval() { return _theme->evaluator(); }

View file

@ -724,9 +724,16 @@ GlobalOptionsDialog::GlobalOptionsDialog()
new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", "Theme:", kChooseThemeCmd, 0); new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", "Theme:", kChooseThemeCmd, 0);
_curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName()); _curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName());
int labelWidth = g_gui.xmlEval()->getVar("Globals.TabLabelWidth"); 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); _autosavePeriodPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.AutosavePeriod", "Autosave:", labelWidth);
for (int i = 0; savePeriodLabels[i]; i++) { for (int i = 0; savePeriodLabels[i]; i++) {
@ -799,6 +806,8 @@ void GlobalOptionsDialog::open() {
if (value == savePeriodValues[i]) if (value == savePeriodValues[i])
_autosavePeriodPopUp->setSelected(i); _autosavePeriodPopUp->setSelected(i);
} }
_rendererPopUp->setSelected(ConfMan.getInt("gui_renderer") - 1);
} }
void GlobalOptionsDialog::close() { void GlobalOptionsDialog::close() {
@ -828,6 +837,11 @@ void GlobalOptionsDialog::close() {
#endif #endif
ConfMan.setInt("autosave_period", _autosavePeriodPopUp->getSelectedTag(), _domain); 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(); OptionsDialog::close();
} }

View file

@ -170,7 +170,7 @@ protected:
// Misc controls // Misc controls
// //
StaticTextWidget *_curTheme; StaticTextWidget *_curTheme;
PopUpWidget *_rendererPopUp;
PopUpWidget *_autosavePeriodPopUp; PopUpWidget *_autosavePeriodPopUp;
}; };

View file

@ -310,6 +310,7 @@ public:
virtual const Common::String &getThemeFileName() const = 0; virtual const Common::String &getThemeFileName() const = 0;
virtual const Common::String &getThemeName() const = 0; virtual const Common::String &getThemeName() const = 0;
virtual int getThemeRenderer() const = 0;
/** /**
* Checks if the theme renderer supports drawing of images. * Checks if the theme renderer supports drawing of images.

View file

@ -704,6 +704,9 @@
"height = 'Globals.Line.Height' " "height = 'Globals.Line.Height' "
"/> " "/> "
"</layout> " "</layout> "
"<widget name = 'Renderer' "
"type = 'PopUp' "
"/> "
"<widget name = 'AutosavePeriod' " "<widget name = 'AutosavePeriod' "
"type = 'PopUp' " "type = 'PopUp' "
"/> " "/> "

Binary file not shown.

View file

@ -456,6 +456,9 @@
height = 'Globals.Line.Height' height = 'Globals.Line.Height'
/> />
</layout> </layout>
<widget name = 'Renderer'
type = 'PopUp'
/>
<widget name = 'AutosavePeriod' <widget name = 'AutosavePeriod'
type = 'PopUp' type = 'PopUp'
/> />

Binary file not shown.

View file

@ -343,6 +343,9 @@
height = 'Globals.Line.Height' height = 'Globals.Line.Height'
/> />
</layout> </layout>
<widget name = 'Renderer'
type = 'PopUp'
/>
<widget name = 'AutosavePeriod' <widget name = 'AutosavePeriod'
type = 'PopUp' type = 'PopUp'
/> />

View file

@ -325,6 +325,9 @@
height = 'Globals.Line.Height' height = 'Globals.Line.Height'
/> />
</layout> </layout>
<widget name = 'Renderer'
type = 'PopUp'
/>
<widget name = 'AutosavePeriod' <widget name = 'AutosavePeriod'
type = 'PopUp' type = 'PopUp'
/> />

View file

@ -6,7 +6,7 @@ import os
import zipfile import zipfile
def buildTheme(themeName): 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 print "Invalid theme name: " + themeName
return return