diff options
author | Filippos Karapetis | 2012-02-27 22:50:01 +0200 |
---|---|---|
committer | Johannes Schickel | 2012-03-19 20:32:34 +0100 |
commit | c84cd8dee83fe42263f82ae3bb603360b99e0b0a (patch) | |
tree | c9e2b3328dc198620b3d0cc77d2ae6802a866562 /gui/launcher.cpp | |
parent | be8c557645bf73e96a463c60bd0422b39a3edfef (diff) | |
download | scummvm-rg350-c84cd8dee83fe42263f82ae3bb603360b99e0b0a.tar.gz scummvm-rg350-c84cd8dee83fe42263f82ae3bb603360b99e0b0a.tar.bz2 scummvm-rg350-c84cd8dee83fe42263f82ae3bb603360b99e0b0a.zip |
GUI: Add per-engine and per-game options
Diffstat (limited to 'gui/launcher.cpp')
-rw-r--r-- | gui/launcher.cpp | 59 |
1 files changed, 51 insertions, 8 deletions
diff --git a/gui/launcher.cpp b/gui/launcher.cpp index a3e4925848..1670c2da88 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -145,11 +145,28 @@ protected: CheckboxWidget *_globalMIDIOverride; CheckboxWidget *_globalMT32Override; CheckboxWidget *_globalVolumeOverride; + + ExtraGuiOptions _engineOptions; }; EditGameDialog::EditGameDialog(const String &domain, const String &desc) : OptionsDialog(domain, "GameOptions") { - + // Retrieve all game specific options. + const EnginePlugin *plugin = 0; + // To allow for game domains without a gameid. + // TODO: Is it intentional that this is still supported? + String gameId(ConfMan.get("gameid", domain)); + if (gameId.empty()) + gameId = domain; + // Retrieve the plugin, since we need to access the engine's MetaEngine + // implementation. + EngineMan.findGame(gameId, &plugin); + if (plugin) { + _engineOptions = (*plugin)->getExtraGuiOptions(domain); + } else { + warning("Plugin for target \"%s\" not found! Game specific settings might be missing", domain.c_str()); + } + // GAME: Path to game data (r/o), extra data (r/o), and save data (r/w) String gamePath(ConfMan.get("path", _domain)); String extraPath(ConfMan.get("extrapath", _domain)); @@ -208,7 +225,16 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // - // 2) The graphics tab + // 2) The engine tab (shown only if there are custom engine options) + // + if (_engineOptions.size() > 0) { + tab->addTab(_("Engine")); + + addEngineControls(tab, "GameOptions_Engine.", _engineOptions); + } + + // + // 3) The graphics tab // _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); @@ -220,7 +246,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addGraphicControls(tab, "GameOptions_Graphics."); // - // 3) The audio tab + // 4) The audio tab // tab->addTab(_("Audio")); @@ -233,7 +259,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addSubtitleControls(tab, "GameOptions_Audio."); // - // 4) The volume tab + // 5) The volume tab // if (g_system->getOverlayWidth() > 320) tab->addTab(_("Volume")); @@ -248,7 +274,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) addVolumeControls(tab, "GameOptions_Volume."); // - // 5) The MIDI tab + // 6) The MIDI tab // if (!_guioptions.contains(GUIO_NOMIDI)) { tab->addTab(_("MIDI")); @@ -262,7 +288,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // - // 6) The MT-32 tab + // 7) The MT-32 tab // if (!_guioptions.contains(GUIO_NOMIDI)) { tab->addTab(_("MT-32")); @@ -276,7 +302,7 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // - // 7) The Paths tab + // 8) The Paths tab // if (g_system->getOverlayWidth() > 320) tab->addTab(_("Paths")); @@ -311,7 +337,6 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) _savePathClearButton = addClearButton(tab, "GameOptions_Paths.SavePathClearButton", kCmdSavePathClear); - // Activate the first tab tab->setActiveTab(0); _tabWidget = tab; @@ -386,6 +411,19 @@ 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); + } const Common::PlatformDescription *p = Common::g_platforms; const Common::Platform platform = Common::parsePlatform(ConfMan.get("platform", _domain)); @@ -429,6 +467,11 @@ void EditGameDialog::close() { ConfMan.removeKey("platform", _domain); 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); + } } OptionsDialog::close(); } |