diff options
-rw-r--r-- | TODO | 14 | ||||
-rw-r--r-- | scumm/dialogs.cpp | 256 | ||||
-rw-r--r-- | scumm/dialogs.h | 20 | ||||
-rw-r--r-- | scumm/scumm.h | 8 | ||||
-rw-r--r-- | scumm/scummvm.cpp | 20 | ||||
-rw-r--r-- | scumm/vars.cpp | 6 |
6 files changed, 164 insertions, 160 deletions
@@ -16,9 +16,8 @@ General some kind of main loop, which, besides many other things, also polls and dispatches events. The idea is to turn this around: the event loop frequently gives the engine time to do these "other things". -* Remove various parts from GameSettings struct: "id", "version", "detectname". - Those are only needed internally by the plugins, and hence shouldn't be - exported. On the long run, "midi" and "features" might be removed, too. +* Remove "detectname" from GameSettings struct. On the long run, "midi" and/or + "features" might be removed, too. * Enhance the Makefile-based build system to support VPATH and stuff, so that one can compile scummvm in a directory tree seperate from the source tree. That would make it possible to build ScummVM with different build options, @@ -51,19 +50,10 @@ GUI * LAUNCHER: fix global options dialog to be properly persistent * LAUNCHER: add more options to global options dialog * LAUNCHER: add more options to game target options dialog -* Maybe make use of TabWidget in the Scumm help dialog? * Global & game target options dialogs probably could share some "panes" -> write code allowing this -> also, 'in game' option dialogs (for volume/scaler/etc. settings) could potentially reuse these, too -* Maybe rearrange SCUMM in-game menu: essentially, only keep the headline - ("How may I serve you?") and the buttons in it (maybe rename "Play" - to "Resume" or so). I.e. remove the savegame list. Then, turn - "Save" and "Load" into real buttons, which when clicked pop up a - new save or load dialog. That way we avoid all the confusing parts of the - current scheme in an elegant fashion. A similar approach is used by - StarCraft/WarCraft/Diablo/NWN/many others. Drawback: Loading a game - would now require one click more. * Maybe rearrange Launcher dialog, too, to look a bit like the current SCUMM in-game menu: instead of two button rows, have a single button column at the right side, and the target list on the left side. diff --git a/scumm/dialogs.cpp b/scumm/dialogs.cpp index 4b7bbd00aa..17447d126f 100644 --- a/scumm/dialogs.cpp +++ b/scumm/dialogs.cpp @@ -19,6 +19,13 @@ */ #include "stdafx.h" + +#include "common/config-manager.h" + +#include "gui/chooser.h" +#include "gui/newgui.h" +#include "gui/ListWidget.h" + #include "scumm/dialogs.h" #include "scumm/sound.h" #include "scumm/scumm.h" @@ -32,10 +39,6 @@ #include "scumm/help.h" #endif -#include "gui/newgui.h" -#include "gui/ListWidget.h" -#include "common/config-manager.h" - #ifdef _WIN32_WCE #include "gapi_keys.h" extern bool _get_key_mapping; @@ -192,28 +195,124 @@ enum { kQuitCmd = 'QUIT' }; -SaveLoadDialog::SaveLoadDialog(ScummEngine *scumm) - : ScummDialog(scumm, 20, 8, 280, 184) { - const int x = _w - kButtonWidth - 8; - int y = 20; +class SaveLoadChooser : public ChooserDialog { + typedef Common::String String; + typedef Common::StringList StringList; +protected: + bool _saveMode; + +public: + SaveLoadChooser(const String &title, const StringList& list, const String &buttonLabel, bool saveMode); + + virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); + const String &getResultString() const; +}; + +SaveLoadChooser::SaveLoadChooser(const String &title, const StringList& list, const String &buttonLabel, bool saveMode) + : ChooserDialog(title, list, buttonLabel, 182), _saveMode(saveMode) { + + _list->setEditable(saveMode); + _list->setNumberingMode(saveMode ? kListNumberingOne : kListNumberingZero); +} - // The headline - addResText(0, 7, 260, 16, 1); +const Common::String &SaveLoadChooser::getResultString() const { + return _list->getSelectedString(); +} - // The five buttons on the side - _saveButton = addPushButton(x, y, queryResString(4), kSaveCmd, 'S'); y += 20; - _loadButton = addPushButton(x, y, queryResString(5), kLoadCmd, 'L'); y += 20; +void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { + int selItem = _list->getSelected(); + switch (cmd) { + case kListItemActivatedCmd: + case kListItemDoubleClickedCmd: + if (selItem >= 0) { + if (!getResultString().isEmpty()) { + setResult(selItem); + close(); + } else if (_saveMode) { + // Start editing the selected item, for saving + _list->startEditMode(); + } + } + break; + case kListSelectionChangedCmd: + if (_saveMode) { + _list->startEditMode(); + } + _chooseButton->setEnabled(selItem >= 0); + _chooseButton->draw(); + break; + default: + ChooserDialog::handleCommand(sender, cmd, data); + } +} + + +Common::StringList generateSavegameList(ScummEngine *scumm, bool saveMode) { + // Get savegame names + Common::StringList l; + char name[32]; + uint i = saveMode ? 1 : 0; + bool avail_saves[81]; + + SaveFileManager *mgr = OSystem::instance()->get_savefile_manager(); + + scumm->listSavegames(avail_saves, ARRAYSIZE(avail_saves), mgr); + for (; i < ARRAYSIZE(avail_saves); i++) { + if (avail_saves[i]) + scumm->getSavegameName(i, name, mgr); + else + name[0] = 0; + l.push_back(name); + } + + delete mgr; + + return l; +} + +enum { + rowHeight = 18, + kMainMenuWidth = (kButtonWidth + 2*8), + kMainMenuHeight = 7*rowHeight + 3*5 + 7 + 5 +}; + +class SeperatorWidget : public Widget { +protected: + typedef Common::String String; + + String _label; + int _align; +public: + SeperatorWidget(GuiObject *boss, int x, int y, int w) : Widget(boss, x, y, w, 2) { } + +protected: + void drawWidget(bool hilite) { + g_gui.hLine(_x, _y, _x + _w - 2, g_gui._color); + g_gui.hLine(_x+1, _y+1, _x + _w - 1, g_gui._shadowcolor); + } +}; + + +MainMenuDialog::MainMenuDialog(ScummEngine *scumm) + : ScummDialog(scumm, (320 - kMainMenuWidth)/2, (200 - kMainMenuHeight)/2, kMainMenuWidth, kMainMenuHeight) { + int y = 7; + + const int x = (_w - kButtonWidth) / 2; + addButton(x, y, "Resume", kPlayCmd, 'P'); y += rowHeight; + y += 5; + + addButton(x, y, "Load", kLoadCmd, 'L'); y += rowHeight; + addButton(x, y, "Save", kSaveCmd, 'S'); y += rowHeight; y += 5; - addButton(x, y, "About", kAboutCmd, 'A'); y += 20; // About + addButton(x, y, "Options", kOptionsCmd, 'O'); y += rowHeight; #ifndef DISABLE_HELP - addButton(x, y, "Help", kHelpCmd, 'H'); y += 20; // Help + addButton(x, y, "Help", kHelpCmd, 'H'); y += rowHeight; #endif - addButton(x, y, "Options", kOptionsCmd, 'O'); y += 20; // Options + addButton(x, y, "About", kAboutCmd, 'A'); y += rowHeight; y += 5; - addButton(x, y, queryResString(6), kPlayCmd, 'P'); y += 20; // Play - addButton(x, y, queryResString(8), kQuitCmd, 'Q'); y += 20; // Quit + addButton(x, y, "Quit", kQuitCmd, 'Q'); y += rowHeight; // // Create the sub dialog(s) @@ -222,21 +321,16 @@ SaveLoadDialog::SaveLoadDialog(ScummEngine *scumm) #ifndef DISABLE_HELP _helpDialog = new HelpDialog(scumm); #endif - - // The save game list - _savegameList = new ListWidget(this, 8, 20, x - 14, 156); } -SaveLoadDialog::~SaveLoadDialog() { +MainMenuDialog::~MainMenuDialog() { delete _aboutDialog; #ifndef DISABLE_HELP delete _helpDialog; #endif } -void SaveLoadDialog::open() { - switchToLoadMode(); - +void MainMenuDialog::open() { #ifdef _WIN32_WCE force_keyboard(true); #endif @@ -244,45 +338,13 @@ void SaveLoadDialog::open() { ScummDialog::open(); } -void SaveLoadDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { +void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kSaveCmd: - if (!_saveMode) { - switchToSaveMode(); - } + save(); break; case kLoadCmd: - if (_saveMode) { - switchToLoadMode(); - } - break; - case kListItemDoubleClickedCmd: - if (_savegameList->getSelected() >= 0) { - if (_saveMode) { - if (_savegameList->getSelectedString().isEmpty()) { - // Start editing the selected item, for saving - _savegameList->startEditMode(); - } else { - save(); - } - } else if (!_savegameList->getSelectedString().isEmpty()) { - load(); - } - } - break; - case kListItemActivatedCmd: - if (_savegameList->getSelected() >= 0 && !_savegameList->getSelectedString().isEmpty()) { - if (_saveMode) { - save(); - } else { - load(); - } - } - break; - case kListSelectionChangedCmd: - if (_saveMode) { - _savegameList->startEditMode(); - } + load(); break; case kPlayCmd: close(); @@ -307,7 +369,7 @@ void SaveLoadDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat } } -void SaveLoadDialog::close() { +void MainMenuDialog::close() { ScummDialog::close(); #ifdef _WIN32_WCE @@ -315,62 +377,24 @@ void SaveLoadDialog::close() { #endif } -void SaveLoadDialog::fillList() { - // Get savegame names - Common::StringList l; - char name[32]; - uint i = _saveMode ? 1 : 0; - bool avail_saves[81]; - - SaveFileManager *mgr = _scumm->_system->get_savefile_manager(); - - _scumm->listSavegames(avail_saves, ARRAYSIZE(avail_saves), mgr); - for (; i < ARRAYSIZE(avail_saves); i++) { - if (avail_saves[i]) - _scumm->getSavegameName(i, name, mgr); - else - name[0] = 0; - l.push_back(name); +void MainMenuDialog::save() { + int idx; + SaveLoadChooser dialog("Save game:", generateSavegameList(_scumm, true), "Save", true); + idx = dialog.runModal(); + if (idx >= 0) { + _scumm->requestSave(idx + 1, dialog.getResultString().c_str()); + close(); } - - delete mgr; - - _savegameList->setList(l); - _savegameList->setNumberingMode(_saveMode ? kListNumberingOne : kListNumberingZero); -} - -void SaveLoadDialog::save() { - // Save the selected item - _scumm->requestSave(_savegameList->getSelected() + 1, _savegameList->getSelectedString().c_str()); - close(); } -void SaveLoadDialog::load() { - // Load the selected item - _scumm->requestLoad(_savegameList->getSelected()); - close(); -} - -void SaveLoadDialog::switchToSaveMode() { - _saveMode = true; - _saveButton->setState(true); - _loadButton->setState(false); - _saveButton->clearFlags(WIDGET_ENABLED); - _loadButton->setFlags(WIDGET_ENABLED); - _savegameList->setEditable(true); - fillList(); - draw(); -} - -void SaveLoadDialog::switchToLoadMode() { - _saveMode = false; - _saveButton->setState(false); - _loadButton->setState(true); - _saveButton->setFlags(WIDGET_ENABLED); - _loadButton->clearFlags(WIDGET_ENABLED); - _savegameList->setEditable(false); - fillList(); - draw(); +void MainMenuDialog::load() { + int idx; + SaveLoadChooser dialog("Load game:", generateSavegameList(_scumm, false), "Load", false); + idx = dialog.runModal(); + if (idx >= 0) { + _scumm->requestLoad(idx); + close(); + } } #pragma mark - @@ -541,8 +565,8 @@ HelpDialog::HelpDialog(ScummEngine *scumm) _page = 1; _numPages = ScummHelp::numPages(scumm->_gameId); - _prevButton = addPushButton(10, 170, "Previous", kPrevCmd, 'P'); - _nextButton = addPushButton(90, 170, "Next", kNextCmd, 'N'); + _prevButton = addButton(10, 170, "Previous", kPrevCmd, 'P'); + _nextButton = addButton(90, 170, "Next", kNextCmd, 'N'); addButton(210, 170, "Close", kCloseCmd, 'C'); _prevButton->clearFlags(WIDGET_ENABLED); diff --git a/scumm/dialogs.h b/scumm/dialogs.h index d8e9a63a07..ab6999d38d 100644 --- a/scumm/dialogs.h +++ b/scumm/dialogs.h @@ -52,32 +52,22 @@ protected: const String queryResString(int stringno); }; -class SaveLoadDialog : public ScummDialog { +class MainMenuDialog : public ScummDialog { public: - SaveLoadDialog(ScummEngine *scumm); - ~SaveLoadDialog(); + MainMenuDialog(ScummEngine *scumm); + ~MainMenuDialog(); virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); virtual void open(); virtual void close(); protected: - ListWidget *_savegameList; - - PushButtonWidget *_saveButton; - PushButtonWidget *_loadButton; - Dialog *_aboutDialog; #ifndef DISABLE_HELP Dialog *_helpDialog; #endif - bool _saveMode; - - void fillList(); void save(); void load(); - void switchToSaveMode(); - void switchToLoadMode(); }; #ifndef DISABLE_HELP @@ -90,8 +80,8 @@ public: protected: typedef Common::String String; - PushButtonWidget *_nextButton; - PushButtonWidget *_prevButton; + ButtonWidget *_nextButton; + ButtonWidget *_prevButton; StaticTextWidget *_title; StaticTextWidget *_key[HELP_NUM_LINES]; diff --git a/scumm/scumm.h b/scumm/scumm.h index 9ff5adb0c2..f80d99c244 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -343,16 +343,16 @@ public: protected: Dialog *_pauseDialog; Dialog *_optionsDialog; - Dialog *_saveLoadDialog; + Dialog *_mainMenuDialog; Dialog *_confirmExitDialog; protected: int runDialog(Dialog &dialog); void confirmexitDialog(); void pauseDialog(); - void saveloadDialog(); + void mainMenuDialog(); public: - void optionsDialog(); // Used by SaveLoadDialog::handleCommand() + void optionsDialog(); // Used by MainMenuDialog::handleCommand() protected: char displayError(bool showCancel, const char *message, ...); @@ -1122,7 +1122,7 @@ public: byte VAR_TMR_4; byte VAR_SOUNDCARD; byte VAR_VIDEOMODE; - byte VAR_SAVELOADDIALOG_KEY; + byte VAR_MAINMENU_KEY; byte VAR_FIXEDDISK; byte VAR_CURSORSTATE; byte VAR_USERPUT; diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index 739f128649..f26c0b8d4f 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -287,7 +287,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _gameId(gs.id), _version(gs.version), _features(gs.features), - gdi(this), _pauseDialog(0), _optionsDialog(0), _saveLoadDialog(0), + gdi(this), _pauseDialog(0), _optionsDialog(0), _mainMenuDialog(0), _targetName(detector->_targetName) { OSystem::Property prop; @@ -308,7 +308,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _quit = false; _pauseDialog = NULL; _optionsDialog = NULL; - _saveLoadDialog = NULL; + _mainMenuDialog = NULL; _confirmExitDialog = NULL; _fastMode = 0; _actors = NULL; @@ -531,7 +531,7 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS VAR_TMR_4 = 0xFF; VAR_SOUNDCARD = 0xFF; VAR_VIDEOMODE = 0xFF; - VAR_SAVELOADDIALOG_KEY = 0xFF; + VAR_MAINMENU_KEY = 0xFF; VAR_FIXEDDISK = 0xFF; VAR_CURSORSTATE = 0xFF; VAR_USERPUT = 0xFF; @@ -799,7 +799,7 @@ ScummEngine::~ScummEngine() { delete _charset; delete _pauseDialog; delete _optionsDialog; - delete _saveLoadDialog; + delete _mainMenuDialog; delete _confirmExitDialog; delete _sound; @@ -1778,7 +1778,7 @@ void ScummEngine::processKbd() { else if ((_version <= 3) || (_gameId == GID_SAMNMAX) || (_gameId == GID_CMI)) saveloadkey = 319; // F5 else - saveloadkey = VAR(VAR_SAVELOADDIALOG_KEY); + saveloadkey = VAR(VAR_MAINMENU_KEY); if (_lastKeyHit == VAR(VAR_CUTSCENEEXIT_KEY) || (VAR(VAR_CUTSCENEEXIT_KEY) == 4 && _lastKeyHit == 27)) { @@ -1799,7 +1799,7 @@ void ScummEngine::processKbd() { if (VAR_SAVELOAD_SCRIPT != 0xFF && _currentRoom != 0) runScript(VAR(VAR_SAVELOAD_SCRIPT), 0, 0, 0); - saveloadDialog(); // Display NewGui + mainMenuDialog(); // Display NewGui if (VAR_SAVELOAD_SCRIPT != 0xFF && _currentRoom != 0) runScript(VAR(VAR_SAVELOAD_SCRIPT2), 0, 0, 0); @@ -2459,10 +2459,10 @@ void ScummEngine::pauseDialog() { runDialog(*_pauseDialog); } -void ScummEngine::saveloadDialog() { - if (!_saveLoadDialog) - _saveLoadDialog = new SaveLoadDialog(this); - runDialog(*_saveLoadDialog); +void ScummEngine::mainMenuDialog() { + if (!_mainMenuDialog) + _mainMenuDialog = new MainMenuDialog(this); + runDialog(*_mainMenuDialog); } void ScummEngine::optionsDialog() { diff --git a/scumm/vars.cpp b/scumm/vars.cpp index 0eb8a823c8..8da1612cca 100644 --- a/scumm/vars.cpp +++ b/scumm/vars.cpp @@ -77,7 +77,7 @@ void ScummEngine::setupScummVars() { VAR_TMR_4 = 47; VAR_SOUNDCARD = 48; VAR_VIDEOMODE = 49; - VAR_SAVELOADDIALOG_KEY = 50; + VAR_MAINMENU_KEY = 50; VAR_FIXEDDISK = 51; VAR_CURSORSTATE = 52; VAR_USERPUT = 53; @@ -205,7 +205,7 @@ void ScummEngine_v7::setupScummVars() { VAR_CUTSCENEEXIT_KEY = 62; VAR_RESTART_KEY = 63; // ??? VAR_PAUSE_KEY = 64; - VAR_SAVELOADDIALOG_KEY = 65; // ??? + VAR_MAINMENU_KEY = 65; // ??? VAR_TALKSTOP_KEY = 67; VAR_KEYPRESS = 118; @@ -294,7 +294,7 @@ void ScummEngine_v8::setupScummVars() { VAR_CUTSCENEEXIT_KEY = 62; // FIXME - guess based on script-1 (could also be 68) VAR_PAUSE_KEY = 64; - VAR_SAVELOADDIALOG_KEY = 65; + VAR_MAINMENU_KEY = 65; VAR_TALKSTOP_KEY = 67; |