aboutsummaryrefslogtreecommitdiff
path: root/gui/options.cpp
diff options
context:
space:
mode:
authorMax Horn2003-11-05 12:25:42 +0000
committerMax Horn2003-11-05 12:25:42 +0000
commit297ddb370b450c925cbe9a04aefb575d57a34efa (patch)
tree869d74e6c5a89134ef34f136c25bd64e1bb5032f /gui/options.cpp
parent0dfd0e44148333257cf37e5e82ed902de3ac68a2 (diff)
downloadscummvm-rg350-297ddb370b450c925cbe9a04aefb575d57a34efa.tar.gz
scummvm-rg350-297ddb370b450c925cbe9a04aefb575d57a34efa.tar.bz2
scummvm-rg350-297ddb370b450c925cbe9a04aefb575d57a34efa.zip
refactored common code into a new class OptionsDialog; various fixes and cleanup to the launcher/option dialogs
svn-id: r11152
Diffstat (limited to 'gui/options.cpp')
-rw-r--r--gui/options.cpp367
1 files changed, 215 insertions, 152 deletions
diff --git a/gui/options.cpp b/gui/options.cpp
index 0ab7d5fc0e..80e82844bb 100644
--- a/gui/options.cpp
+++ b/gui/options.cpp
@@ -29,24 +29,13 @@
#include "backends/fs/fs.h"
#include "base/gameDetector.h"
#include "common/config-manager.h"
+#include "common/scaler.h"
#include "sound/mididrv.h"
#if (!( defined(__DC__) || defined(__GP32__)) && !defined(_MSC_VER))
#include <unistd.h>
#endif
-/*
- _____ _ _ _ _ _
-|_ _| |__ (_)___ (_)___ __ _ __| |_ _ _ __ ___ _ __ ___ _ _| |
- | | | '_ \| / __| | / __| / _` | / _` | | | | '_ ` _ \| '_ ` _ \| | | | |
- | | | | | | \__ \ | \__ \ | (_| | | (_| | |_| | | | | | | | | | | | |_| |_|
- |_| |_| |_|_|___/ |_|___/ \__,_| \__,_|\__,_|_| |_| |_|_| |_| |_|\__, (_)
- |___/
-
-This just looks like an option dialog, but it doesn't change any actual settings currently!
-
-*/
-
// TODO - allow changing options for:
// - the save path (use _browser!)
// - music & graphics driver (but see also the comments on EditGameDialog
@@ -55,119 +44,241 @@ This just looks like an option dialog, but it doesn't change any actual settings
// - aspect ratio, language, platform, subtitles, debug mode/level, cd drive, joystick, multi midi, native mt32
enum {
- kMasterVolumeChanged = 'mavc',
+ kMasterVolumeChanged = 'mavc',
kMusicVolumeChanged = 'muvc',
kSfxVolumeChanged = 'sfvc',
- kChooseSaveDirCmd = 'chos',
- kOKCmd = 'ok '
+ kChooseSaveDirCmd = 'chos'
};
-GlobalOptionsDialog::GlobalOptionsDialog(GameDetector &detector)
- : Dialog(10, 20, 320 - 2 * 10, 200 - 2 * 20) {
+OptionsDialog::OptionsDialog(const String &domain, int x, int y, int w, int h)
+ : Dialog(x, y, w, h),
+ _domain(domain),
+ _gfxPopUp(0), _fullscreenCheckbox(0), _aspectCheckbox(0),
+ _multiMidiCheckbox(0), _mt32Checkbox(0),
+ _masterVolumeSlider(0), _masterVolumeLabel(0),
+ _musicVolumeSlider(0), _musicVolumeLabel(0),
+ _sfxVolumeSlider(0), _sfxVolumeLabel(0) {
- const int vBorder = 5;
- int yoffset;
+}
- // The tab widget
- TabWidget *tab = new TabWidget(this, 0, vBorder, _w, _h - 24 - 2*vBorder);
+void OptionsDialog::open() {
+ Dialog::open();
+
+ // Reset result value
+ setResult(0);
+
+ // FIXME - disable GFX popup for now
+ _gfxPopUp->setSelected(0);
+ _gfxPopUp->setEnabled(false);
- //
- // 1) The graphics tab
- //
- tab->addTab("Graphics");
- yoffset = vBorder;
+ // Fullscreen setting
+ _fullscreenCheckbox->setState(ConfMan.getBool("fullscreen", _domain));
+
+ // Aspect ratio setting
+ _aspectCheckbox->setState(ConfMan.getBool("aspect_ratio", _domain));
+
+ // Music driver
+ const MidiDriverDescription *md = getAvailableMidiDrivers();
+ const int midiDriver = parseMusicDriver(ConfMan.get("music_driver", _domain));
+ int i = 0;
+ while (md->name && md->id != midiDriver) {
+ i++;
+ md++;
+ }
+ _midiPopUp->setSelected(md->name ? i : 0);
+
+ // Multi midi setting
+ _multiMidiCheckbox->setState(ConfMan.getBool("multi_midi", _domain));
+
+ // Native mt32 setting
+ _mt32Checkbox->setState(ConfMan.getBool("native_mt32", _domain));
+
+ int vol;
+
+ vol = ConfMan.getInt("master_volume", _domain);
+ _masterVolumeSlider->setValue(vol);
+ _masterVolumeLabel->setValue(vol);
+
+ vol = ConfMan.getInt("music_volume", _domain);
+ _musicVolumeSlider->setValue(vol);
+ _musicVolumeLabel->setValue(vol);
+
+ vol = ConfMan.getInt("sfx_volume", _domain);
+ _sfxVolumeSlider->setValue(vol);
+ _sfxVolumeLabel->setValue(vol);
+}
+
+void OptionsDialog::close() {
+ if (getResult()) {
+ if (_fullscreenCheckbox) {
+ ConfMan.set("fullscreen", _fullscreenCheckbox->getState(), _domain);
+ ConfMan.set("aspect_ratio", _aspectCheckbox->getState(), _domain);
+ }
+
+ if (_masterVolumeSlider) {
+ ConfMan.set("master_volume", _masterVolumeSlider->getValue(), _domain);
+ ConfMan.set("music_volume", _musicVolumeSlider->getValue(), _domain);
+ ConfMan.set("sfx_volume", _sfxVolumeSlider->getValue(), _domain);
+ }
- // The GFX mode popup & a label
+ if (_multiMidiCheckbox) {
+ ConfMan.set("multi_midi", _multiMidiCheckbox->getState(), _domain);
+ ConfMan.set("native_mt32", _mt32Checkbox->getState(), _domain);
+
+ const MidiDriverDescription *md = getAvailableMidiDrivers();
+ while (md->name && md->id != (int)_midiPopUp->getSelectedTag())
+ md++;
+ if (md->name)
+ ConfMan.set("music_driver", md->name, _domain);
+ else
+ ConfMan.removeKey("music_driver", _domain);
+ }
+
+ // Save config file
+ ConfMan.flushToDisk();
+ }
+
+ Dialog::close();
+}
+
+void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
+ switch (cmd) {
+ case kMasterVolumeChanged:
+ _masterVolumeLabel->setValue(_masterVolumeSlider->getValue());
+ _masterVolumeLabel->draw();
+ break;
+ case kMusicVolumeChanged:
+ _musicVolumeLabel->setValue(_musicVolumeSlider->getValue());
+ _musicVolumeLabel->draw();
+ break;
+ case kSfxVolumeChanged:
+ _sfxVolumeLabel->setValue(_sfxVolumeSlider->getValue());
+ _sfxVolumeLabel->draw();
+ break;
+ case kOKCmd:
+ setResult(1);
+ close();
+ break;
+ default:
+ Dialog::handleCommand(sender, cmd, data);
+ }
+}
+
+int OptionsDialog::addGraphicControls(GuiObject *boss, int yoffset) {
+ const int x = 10;
+ const int w = _w - 2 * 10;
+
+ // The GFX mode popup
// TODO - add an API to query the list of available GFX modes, and to get/set the mode
- _gfxPopUp = new PopUpWidget(tab, 5, yoffset, 280, kLineHeight, "Graphics mode: ", 100);
+ _gfxPopUp = new PopUpWidget(boss, x-5, yoffset, w+5, kLineHeight, "Graphics mode: ", 100);
yoffset += 16;
- // Ender: We don't really want a <default> here at all, we want to setSelected to the current global
+ // FIXME: For the GlobalOptionsDialog, we don't want a <default> here;
+ // rather, we want to setSelected to the current global
_gfxPopUp->appendEntry("<default>");
_gfxPopUp->appendEntry("");
- _gfxPopUp->appendEntry("Normal (no scaling)");
- _gfxPopUp->appendEntry("2x");
- _gfxPopUp->appendEntry("3x");
- _gfxPopUp->appendEntry("2xSAI");
- _gfxPopUp->appendEntry("Super2xSAI");
- _gfxPopUp->appendEntry("SuperEagle");
- _gfxPopUp->appendEntry("AdvMAME2x");
- _gfxPopUp->appendEntry("AdvMAME3x");
- _gfxPopUp->appendEntry("hq2x");
- _gfxPopUp->appendEntry("hq3x");
- _gfxPopUp->appendEntry("TV2x");
- _gfxPopUp->appendEntry("DotMatrix");
- _gfxPopUp->setSelected(0);
-
- // FIXME - disable GFX popup for now
- _gfxPopUp->setEnabled(false);
-
-#if 1
- // TODO: Aspect ratio setting
- // TODO: Fullscreen setting
- _fullscreenCheckbox = new CheckboxWidget(tab, 10, yoffset, 280, 16, "Fullscreen mode");
- _fullscreenCheckbox->setState(ConfMan.getBool("fullscreen"));
+ _gfxPopUp->appendEntry("Normal (no scaling)", GFX_NORMAL);
+ _gfxPopUp->appendEntry("2x", GFX_DOUBLESIZE);
+ _gfxPopUp->appendEntry("3x", GFX_TRIPLESIZE);
+ _gfxPopUp->appendEntry("2xSAI", GFX_2XSAI);
+ _gfxPopUp->appendEntry("Super2xSAI", GFX_SUPER2XSAI);
+ _gfxPopUp->appendEntry("SuperEagle", GFX_SUPEREAGLE);
+ _gfxPopUp->appendEntry("AdvMAME2x", GFX_ADVMAME2X);
+ _gfxPopUp->appendEntry("AdvMAME3x", GFX_ADVMAME3X);
+ _gfxPopUp->appendEntry("hq2x", GFX_HQ2X);
+ _gfxPopUp->appendEntry("hq3x", GFX_HQ3X);
+ _gfxPopUp->appendEntry("TV2x", GFX_TV2X);
+ _gfxPopUp->appendEntry("DotMatrix", GFX_DOTMATRIX);
+
+ // Fullscreen checkbox
+ _fullscreenCheckbox = new CheckboxWidget(boss, x, yoffset, w, 16, "Fullscreen mode");
yoffset += 16;
- _aspectCheckbox = new CheckboxWidget(tab, 10, yoffset, 280, 16, "Aspect ratio correction");
- _aspectCheckbox->setState(ConfMan.getBool("aspect_ratio"));
+ // Aspect ratio checkbox
+ _aspectCheckbox = new CheckboxWidget(boss, x, yoffset, w, 16, "Aspect ratio correction");
yoffset += 16;
-#endif
+ return yoffset;
+}
- //
- // 2) The audio tab
- //
- tab->addTab("Audio");
- yoffset = vBorder;
+int OptionsDialog::addMIDIControls(GuiObject *boss, int yoffset) {
+ const int x = 10;
+ const int w = _w - 20;
// The MIDI mode popup & a label
- _midiPopUp = new PopUpWidget(tab, 5, yoffset, 280, kLineHeight, "Music driver: ", 100);
+ _midiPopUp = new PopUpWidget(boss, x-5, yoffset, w+5, kLineHeight, "Music driver: ", 100);
yoffset += 16;
// Populate it
const MidiDriverDescription *md = getAvailableMidiDrivers();
- const int midiDriver = parseMusicDriver(ConfMan.get("music_driver"));
- int midiSelected = 0, i = 0;
while (md->name) {
_midiPopUp->appendEntry(md->description, md->id);
- if (md->id == midiDriver)
- midiSelected = i;
- i++;
md++;
}
- _midiPopUp->setSelected(midiSelected);
+ // Multi midi setting
+ _multiMidiCheckbox = new CheckboxWidget(boss, x, yoffset, w, 16, "Mixed Adlib/MIDI mode");
+ yoffset += 16;
+
+ // Native mt32 setting
+ _mt32Checkbox = new CheckboxWidget(boss, x, yoffset, w, 16, "True Roland MT-32 (disable GM emulation)");
+ yoffset += 16;
+
+ return yoffset;
+}
+
+int OptionsDialog::addVolumeControls(GuiObject *boss, int yoffset) {
// Volume controllers
- _masterVolumeSlider = new SliderWidget(tab, 5, yoffset, 185, 12, "Master volume: ", 100, kMasterVolumeChanged);
- _masterVolumeLabel = new StaticTextWidget(tab, 200, yoffset+2, 24, 16, "100%", kTextAlignLeft);
+ _masterVolumeSlider = new SliderWidget(boss, 5, yoffset, 185, 12, "Master volume: ", 100, kMasterVolumeChanged);
+ _masterVolumeLabel = new StaticTextWidget(boss, 200, yoffset+2, 24, kLineHeight, "100%", kTextAlignLeft);
_masterVolumeSlider->setMinValue(0); _masterVolumeSlider->setMaxValue(255);
_masterVolumeLabel->setFlags(WIDGET_CLEARBG);
yoffset += 16;
- _musicVolumeSlider = new SliderWidget(tab, 5, yoffset, 185, 12, "Music volume: ", 100, kMusicVolumeChanged);
- _musicVolumeLabel = new StaticTextWidget(tab, 200, yoffset+2, 24, 16, "100%", kTextAlignLeft);
+ _musicVolumeSlider = new SliderWidget(boss, 5, yoffset, 185, 12, "Music volume: ", 100, kMusicVolumeChanged);
+ _musicVolumeLabel = new StaticTextWidget(boss, 200, yoffset+2, 24, kLineHeight, "100%", kTextAlignLeft);
_musicVolumeSlider->setMinValue(0); _musicVolumeSlider->setMaxValue(255);
_musicVolumeLabel->setFlags(WIDGET_CLEARBG);
yoffset += 16;
- _sfxVolumeSlider = new SliderWidget(tab, 5, yoffset, 185, 12, "SFX volume: ", 100, kSfxVolumeChanged);
- _sfxVolumeLabel = new StaticTextWidget(tab, 200, yoffset+2, 24, 16, "100%", kTextAlignLeft);
+ _sfxVolumeSlider = new SliderWidget(boss, 5, yoffset, 185, 12, "SFX volume: ", 100, kSfxVolumeChanged);
+ _sfxVolumeLabel = new StaticTextWidget(boss, 200, yoffset+2, 24, kLineHeight, "100%", kTextAlignLeft);
_sfxVolumeSlider->setMinValue(0); _sfxVolumeSlider->setMaxValue(255);
_sfxVolumeLabel->setFlags(WIDGET_CLEARBG);
yoffset += 16;
-
- // Multi midi setting
- _multiMidiCheckbox = new CheckboxWidget(tab, 10, yoffset, 280, 16, "Mixed Adlib/MIDI mode");
- _multiMidiCheckbox->setState(ConfMan.getBool("multi_midi"));
- yoffset += 16;
- // Native mt32 setting
- _mt32Checkbox = new CheckboxWidget(tab, 10, yoffset, 280, 16, "True Roland MT-32 (disable GM emulation)");
- _mt32Checkbox->setState(ConfMan.getBool("native_mt32"));
- yoffset += 16;
+ return yoffset;
+}
+
+#pragma mark -
+
+GlobalOptionsDialog::GlobalOptionsDialog(GameDetector &detector)
+ : OptionsDialog(Common::ConfigManager::kApplicationDomain, 10, 20, 320 - 2 * 10, 200 - 2 * 20) {
+
+ const int vBorder = 5;
+ int yoffset;
+
+ // The tab widget
+ TabWidget *tab = new TabWidget(this, 0, vBorder, _w, _h - 24 - 2*vBorder);
+
+ //
+ // 1) The graphics tab
+ //
+ tab->addTab("Graphics");
+ yoffset = vBorder;
+ yoffset = addGraphicControls(tab, yoffset);
+
+
+ //
+ // 2) The audio tab
+ //
+ tab->addTab("Audio");
+ yoffset = vBorder;
+ yoffset = addMIDIControls(tab, yoffset);
+ yoffset = addVolumeControls(tab, yoffset);
// TODO: cd drive setting
+
//
// 3) The miscellaneous tab
@@ -180,33 +291,19 @@ GlobalOptionsDialog::GlobalOptionsDialog(GameDetector &detector)
new StaticTextWidget(tab, 5, yoffset+2, 100, kLineHeight, "Savegame path: ", kTextAlignRight);
_savePath = new StaticTextWidget(tab, 105, yoffset+2, 180, kLineHeight, "/foo/bar", kTextAlignLeft);
new ButtonWidget(tab, 105, yoffset+14, 64, 16, "Choose...", kChooseSaveDirCmd, 0);
-
-// TODO: set _savePath to the current save path
- Common::String dir(ConfMan.get("savepath"));
- if (!dir.isEmpty()) {
- _savePath->setLabel(dir);
- } else {
- // Default to the current directory...
- char buf[256];
- getcwd(buf, sizeof(buf));
- _savePath->setLabel(buf);
- }
#endif
// TODO: joystick setting
+
+ // Activate the first tab
+ tab->setActiveTab(0);
- //
// Add OK & Cancel buttons
- //
addButton(_w - 2 * (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd, 0);
addButton(_w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd, 0);
// Create file browser dialog
_browser = new BrowserDialog("Select directory for savegames");
-
-
- // Activate the first tab
- tab->setActiveTab(0);
}
GlobalOptionsDialog::~GlobalOptionsDialog() {
@@ -214,21 +311,27 @@ GlobalOptionsDialog::~GlobalOptionsDialog() {
}
void GlobalOptionsDialog::open() {
- Dialog::open();
-
- int vol;
-
- vol = ConfMan.getInt("master_volume");
- _masterVolumeSlider->setValue(vol);
- _masterVolumeLabel->setValue(vol);
+ OptionsDialog::open();
- vol = ConfMan.getInt("music_volume");
- _musicVolumeSlider->setValue(vol);
- _musicVolumeLabel->setValue(vol);
+#if !( defined(__DC__) || defined(__GP32__) )
+ // Set _savePath to the current save path
+ Common::String dir(ConfMan.get("savepath", _domain));
+ if (!dir.isEmpty()) {
+ _savePath->setLabel(dir);
+ } else {
+ // Default to the current directory...
+ char buf[256];
+ getcwd(buf, sizeof(buf));
+ _savePath->setLabel(buf);
+ }
+#endif
+}
- vol = ConfMan.getInt("sfx_volume");
- _sfxVolumeSlider->setValue(vol);
- _sfxVolumeLabel->setValue(vol);
+void GlobalOptionsDialog::close() {
+ if (getResult()) {
+ // TODO: Savepath
+ }
+ OptionsDialog::close();
}
void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
@@ -241,47 +344,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3
// TODO - we should check if the directory is writeable before accepting it
}
break;
- case kMasterVolumeChanged:
- _masterVolumeLabel->setValue(_masterVolumeSlider->getValue());
- _masterVolumeLabel->draw();
- break;
- case kMusicVolumeChanged:
- _musicVolumeLabel->setValue(_musicVolumeSlider->getValue());
- _musicVolumeLabel->draw();
- break;
- case kSfxVolumeChanged:
- _sfxVolumeLabel->setValue(_sfxVolumeSlider->getValue());
- _sfxVolumeLabel->draw();
- break;
- case kOKCmd: {
- setResult(1);
- // TODO: All these settings should take effect immediately.
- // There are two ways to ensure that:
- // 1) Add code here which pushes the changes on to the mixer/backend
- // 2) Implement the ConfigManager callback API; then, let the mixer/backend
- // and any other interested parties register for notifications sent
- // whenever these config values change.
- ConfMan.set("master_volume", _masterVolumeSlider->getValue());
- ConfMan.set("music_volume", _musicVolumeSlider->getValue());
- ConfMan.set("sfx_volume", _sfxVolumeSlider->getValue());
- ConfMan.set("fullscreen", _fullscreenCheckbox->getState());
- ConfMan.set("aspect_ratio", _aspectCheckbox->getState());
- ConfMan.set("multi_midi", _multiMidiCheckbox->getState());
- ConfMan.set("native_mt32", _mt32Checkbox->getState());
-
- const MidiDriverDescription *md = getAvailableMidiDrivers();
- for (; md->name; md++) {
- if (md->id == (int)_midiPopUp->getSelectedTag()) {
- ConfMan.set("music_driver", md->name);
- break;
- }
- }
- if (!md->name)
- ConfMan.removeKey("music_driver", Common::ConfigManager::kApplicationDomain);
-
- close();
- break; }
default:
- Dialog::handleCommand(sender, cmd, data);
+ OptionsDialog::handleCommand(sender, cmd, data);
}
}