aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/dialogs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/scumm/dialogs.cpp')
-rw-r--r--engines/scumm/dialogs.cpp213
1 files changed, 209 insertions, 4 deletions
diff --git a/engines/scumm/dialogs.cpp b/engines/scumm/dialogs.cpp
index d9c24ddca2..1f153094c1 100644
--- a/engines/scumm/dialogs.cpp
+++ b/engines/scumm/dialogs.cpp
@@ -233,6 +233,19 @@ protected:
#endif
+class ConfigDialog : public GUI::OptionsDialog {
+protected:
+#ifdef SMALL_SCREEN_DEVICE
+ GUI::Dialog *_keysDialog;
+#endif
+
+public:
+ ConfigDialog();
+ ~ConfigDialog();
+
+ virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
+};
+
#pragma mark -
ScummDialog::ScummDialog(int x, int y, int w, int h) : GUI::Dialog(x, y, w, h) {
@@ -245,31 +258,223 @@ ScummDialog::ScummDialog(String name) : GUI::Dialog(name) {
#pragma mark -
-#ifndef DISABLE_HELP
+enum {
+ kSaveCmd = 'SAVE',
+ kLoadCmd = 'LOAD',
+ kPlayCmd = 'PLAY',
+ kOptionsCmd = 'OPTN',
+ kHelpCmd = 'HELP',
+ kAboutCmd = 'ABOU',
+ kQuitCmd = 'QUIT',
+ kChooseCmd = 'CHOS'
+};
ScummMenuDialog::ScummMenuDialog(ScummEngine *scumm)
- : MainMenuDialog(scumm) {
+ : ScummDialog("ScummMain"), _vm(scumm) {
+
+ new GUI::ButtonWidget(this, "ScummMain.Resume", "Resume", kPlayCmd, 'P');
+
+ _loadButton = new GUI::ButtonWidget(this, "ScummMain.Load", "Load", kLoadCmd, 'L');
+ _saveButton = new GUI::ButtonWidget(this, "ScummMain.Save", "Save", kSaveCmd, 'S');
+
+ new GUI::ButtonWidget(this, "ScummMain.Options", "Options", kOptionsCmd, 'O');
+#ifndef DISABLE_HELP
+ new GUI::ButtonWidget(this, "ScummMain.Help", "Help", kHelpCmd, 'H');
+#endif
+ new GUI::ButtonWidget(this, "ScummMain.About", "About", kAboutCmd, 'A');
+
+ new GUI::ButtonWidget(this, "ScummMain.Quit", "Quit", kQuitCmd, 'Q');
+
+ //
+ // Create the sub dialog(s)
+ //
+ _aboutDialog = new GUI::AboutDialog();
+ _optionsDialog = new ConfigDialog();
+#ifndef DISABLE_HELP
_helpDialog = new HelpDialog(scumm->_game);
- _helpButton->setEnabled(true);
+#endif
+ _saveDialog = new GUI::SaveLoadChooser("Save game:", "Save");
+ _saveDialog->setSaveMode(true);
+ _loadDialog = new GUI::SaveLoadChooser("Load game:", "Load");
+ _loadDialog->setSaveMode(false);
}
ScummMenuDialog::~ScummMenuDialog() {
+ delete _aboutDialog;
+ delete _optionsDialog;
+#ifndef DISABLE_HELP
delete _helpDialog;
+#endif
+ delete _saveDialog;
+ delete _loadDialog;
+}
+
+int ScummMenuDialog::runModal() {
+ _loadButton->setEnabled(_vm->canLoadGameStateCurrently());
+ _saveButton->setEnabled(_vm->canSaveGameStateCurrently());
+ return ScummDialog::runModal();
+}
+
+void ScummMenuDialog::reflowLayout() {
+ _loadButton->setEnabled(_vm->canLoadGameStateCurrently());
+ _saveButton->setEnabled(_vm->canSaveGameStateCurrently());
+ Dialog::reflowLayout();
}
void ScummMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
switch (cmd) {
+ case kSaveCmd:
+ save();
+ break;
+ case kLoadCmd:
+ load();
+ break;
+ case kPlayCmd:
+ close();
+ break;
+ case kOptionsCmd:
+ _optionsDialog->runModal();
+ break;
+ case kAboutCmd:
+ _aboutDialog->runModal();
+ break;
+#ifndef DISABLE_HELP
case kHelpCmd:
_helpDialog->runModal();
break;
+#endif
+ case kQuitCmd:
+ _vm->quitGame();
+ close();
+ break;
default:
- MainMenuDialog::handleCommand(sender, cmd, data);
+ ScummDialog::handleCommand(sender, cmd, data);
+ }
+}
+
+void ScummMenuDialog::save() {
+ Common::String gameId = ConfMan.get("gameid");
+
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+
+ int idx = _saveDialog->runModal(plugin, ConfMan.getActiveDomainName());
+ if (idx >= 0) {
+ String result(_saveDialog->getResultString());
+ char buffer[20];
+ const char *str;
+ if (result.empty()) {
+ // If the user was lazy and entered no save name, come up with a default name.
+ sprintf(buffer, "Save %d", idx);
+ str = buffer;
+ } else
+ str = result.c_str();
+ _vm->requestSave(idx, str);
+ close();
+ }
+}
+
+void ScummMenuDialog::load() {
+ Common::String gameId = ConfMan.get("gameid");
+
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+
+ int idx = _loadDialog->runModal(plugin, ConfMan.getActiveDomainName());
+ if (idx >= 0) {
+ _vm->requestLoad(idx);
+ close();
}
}
#pragma mark -
enum {
+ kKeysCmd = 'KEYS'
+};
+
+// FIXME: We use the empty string as domain name here. This tells the
+// ConfigManager to use the 'default' domain for all its actions. We do that
+// to get as close as possible to editing the 'active' settings.
+//
+// However, that requires bad & evil hacks in the ConfigManager code,
+// and even then still doesn't work quite correctly.
+// For example, if the transient domain contains 'false' for the 'fullscreen'
+// flag, but the user used a hotkey to switch to windowed mode, then the dialog
+// will display the wrong value anyway.
+//
+// Proposed solution consisting of multiple steps:
+// 1) Add special code to the open() code that reads out everything stored
+// in the transient domain that is controlled by this dialog, and updates
+// the dialog accordingly.
+// 2) Even more code is added to query the backend for current settings, like
+// the fullscreen mode flag etc., and also updates the dialog accordingly.
+// 3) The domain being edited is set to the active game domain.
+// 4) If the dialog is closed with the "OK" button, then we remove everything
+// stored in the transient domain (or at least everything corresponding to
+// switches in this dialog.
+// If OTOH the dialog is closed with "Cancel" we do no such thing.
+//
+// These changes will achieve two things at once: Allow us to get rid of using
+// "" as value for the domain, and in fact provide a somewhat better user
+// experience at the same time.
+ConfigDialog::ConfigDialog()
+ : GUI::OptionsDialog("", "ScummConfig") {
+
+ //
+ // Sound controllers
+ //
+
+ addVolumeControls(this, "ScummConfig.");
+
+ //
+ // Some misc options
+ //
+
+ // SCUMM has a talkspeed range of 0-9
+ addSubtitleControls(this, "ScummConfig.", 9);
+
+ //
+ // Add the buttons
+ //
+
+ new GUI::ButtonWidget(this, "ScummConfig.Ok", "OK", GUI::kOKCmd, 'O');
+ new GUI::ButtonWidget(this, "ScummConfig.Cancel", "Cancel", GUI::kCloseCmd, 'C');
+#ifdef SMALL_SCREEN_DEVICE
+ new GUI::ButtonWidget(this, "ScummConfig.Keys", "Keys", kKeysCmd, 'K');
+ _keysDialog = NULL;
+#endif
+}
+
+ConfigDialog::~ConfigDialog() {
+#ifdef SMALL_SCREEN_DEVICE
+ delete _keysDialog;
+#endif
+}
+
+void ConfigDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
+ switch (cmd) {
+ case kKeysCmd:
+#ifdef SMALL_SCREEN_DEVICE
+ //
+ // Create the sub dialog(s)
+ //
+ _keysDialog = new GUI::KeysDialog();
+ _keysDialog->runModal();
+ delete _keysDialog;
+ _keysDialog = NULL;
+#endif
+ break;
+ default:
+ GUI::OptionsDialog::handleCommand (sender, cmd, data);
+ }
+}
+
+#ifndef DISABLE_HELP
+
+#pragma mark -
+
+enum {
kNextCmd = 'NEXT',
kPrevCmd = 'PREV'
};