aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/dialogs.cpp51
-rw-r--r--engines/dialogs.h4
-rw-r--r--engines/engine.cpp20
-rw-r--r--engines/engine.h39
-rw-r--r--engines/igor/igor.h4
-rw-r--r--engines/igor/saveload.cpp8
-rw-r--r--engines/metaengine.h12
-rw-r--r--engines/queen/queen.cpp4
-rw-r--r--engines/queen/queen.h2
-rw-r--r--engines/saga/detection.cpp26
-rw-r--r--engines/saga/saga.cpp8
-rw-r--r--engines/saga/saga.h3
-rw-r--r--engines/touche/menu.cpp2
-rw-r--r--engines/touche/saveload.cpp4
-rw-r--r--engines/touche/touche.h2
-rw-r--r--gui/launcher.cpp39
-rw-r--r--gui/launcher.h40
-rw-r--r--gui/object.h2
-rw-r--r--gui/themes/scummclassic.zipbin43354 -> 43733 bytes
-rw-r--r--gui/themes/scummclassic/classic_layout.stx9
-rw-r--r--gui/themes/scummclassic/classic_layout_320.stx9
-rw-r--r--gui/themes/scummmodern.zipbin143656 -> 144052 bytes
-rw-r--r--gui/themes/scummmodern/scummmodern_layout.stx9
-rw-r--r--gui/themes/scummmodern/scummmodern_layout_320.stx9
24 files changed, 251 insertions, 55 deletions
diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp
index 97c55d4a1f..d0eac1d2e7 100644
--- a/engines/dialogs.cpp
+++ b/engines/dialogs.cpp
@@ -33,6 +33,7 @@
#include "gui/about.h"
#include "gui/newgui.h"
+#include "gui/launcher.h"
#include "gui/ListWidget.h"
#include "gui/theme.h"
@@ -96,8 +97,15 @@ MainMenuDialog::MainMenuDialog(Engine *engine)
new GUI::ButtonWidget(this, "GlobalMenu.Resume", "Resume", kPlayCmd, 'P');
-// new GUI::ButtonWidget(this, "globalmain_load", "Load", kLoadCmd, 'L');
-// new GUI::ButtonWidget(this, "globalmain_save", "Save", kSaveCmd, 'S');
+ _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", "Load", kLoadCmd, 'L');
+ // TODO: setEnabled -> setVisible
+ _loadButton->setEnabled(_engine->hasFeature(Engine::kSupportsListSaves) &&
+ _engine->hasFeature(Engine::kSupportsLoadingDuringRuntime));
+
+ _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", "Save", kSaveCmd, 'S');
+ // TODO: setEnabled -> setVisible
+ _saveButton->setEnabled(_engine->hasFeature(Engine::kSupportsListSaves) &&
+ _engine->hasFeature(Engine::kSupportsSavingDuringRuntime));
new GUI::ButtonWidget(this, "GlobalMenu.Options", "Options", kOptionsCmd, 'O');
@@ -111,11 +119,14 @@ MainMenuDialog::MainMenuDialog(Engine *engine)
_aboutDialog = new GUI::AboutDialog();
_optionsDialog = new ConfigDialog();
+ _loadDialog = new GUI::SaveLoadChooser("Load game:", "Load");
}
MainMenuDialog::~MainMenuDialog() {
delete _aboutDialog;
delete _optionsDialog;
+ delete _loadDialog;
+ //delete _saveDialog;
}
void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
@@ -123,6 +134,39 @@ void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
case kPlayCmd:
close();
break;
+ case kLoadCmd:
+ {
+ String gameId = ConfMan.get("gameid");
+
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+
+ int slot = _loadDialog->runModal(plugin, ConfMan.getActiveDomainName());
+
+ if (slot >= 0) {
+ _engine->loadGameState(slot);
+ close();
+ }
+
+ }
+ break;
+ case kSaveCmd:
+ /*
+ String gameId = ConfMan.get("gameid");
+
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+
+ int slot = _saveDialog->runModal(plugin, ConfMan.getActiveDomainName());
+
+ if (slot >= 0) {
+ _engine->saveGameState(slot);
+ close();
+ }
+
+ }
+ */
+ break;
case kOptionsCmd:
_optionsDialog->runModal();
break;
@@ -149,6 +193,9 @@ void MainMenuDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
}
void MainMenuDialog::reflowLayout() {
+ _loadButton->setEnabled(_engine->canLoadGameStateCurrently());
+ _saveButton->setEnabled(_engine->canSaveGameStateCurrently());
+
#ifndef DISABLE_FANCY_THEMES
if (g_gui.xmlEval()->getVar("Globals.ShowGlobalMenuLogo", 0) == 1 && g_gui.theme()->supportsImages()) {
if (!_logo)
diff --git a/engines/dialogs.h b/engines/dialogs.h
index 66ea13b8f1..d38abeb3cf 100644
--- a/engines/dialogs.h
+++ b/engines/dialogs.h
@@ -27,6 +27,7 @@
#include "common/str.h"
#include "gui/dialog.h"
+#include "gui/launcher.h"
#include "gui/options.h"
#include "gui/widget.h"
@@ -56,8 +57,11 @@ protected:
GUI::GraphicsWidget *_logo;
GUI::ButtonWidget *_rtlButton;
+ GUI::ButtonWidget *_loadButton;
+ GUI::ButtonWidget *_saveButton;
GUI::Dialog *_aboutDialog;
GUI::Dialog *_optionsDialog;
+ GUI::SaveLoadChooser *_loadDialog;
};
diff --git a/engines/engine.cpp b/engines/engine.cpp
index d5d5498384..4bbe2d069f 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -255,6 +255,26 @@ void Engine::syncSoundSettings() {
_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, soundVolumeSpeech);
}
+int Engine::loadGameState(int slot) {
+ // Do nothing by default
+ return 0;
+}
+
+bool Engine::canLoadGameStateCurrently() {
+ // Do not allow loading by default
+ return false;
+}
+
+int Engine::saveGameState(int slot) {
+ // Do nothing by default
+ return 0;
+}
+
+bool Engine::canSaveGameStateCurrently() {
+ // Do not allow saving by default
+ return false;
+}
+
void Engine::quitGame() {
Common::Event event;
diff --git a/engines/engine.h b/engines/engine.h
index 69caafac49..90eea859ef 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -125,6 +125,26 @@ public:
*/
virtual void syncSoundSettings();
+ /**
+ * Load a game state
+ */
+ virtual int loadGameState(int slot);
+
+ /**
+ * Indicates whether a game state can be loaded
+ */
+ virtual bool canLoadGameStateCurrently();
+
+ /**
+ * Save a game state
+ */
+ virtual int saveGameState(int slot);
+
+ /**
+ * Indicates whether a game state can be saved
+ */
+ virtual bool canSaveGameStateCurrently();
+
protected:
/**
@@ -182,7 +202,24 @@ public:
/**
* 'Return to launcher' feature is supported, i.e., EVENT_RTL is handled.
*/
- kSupportsRTL
+ kSupportsRTL = 0,
+
+ /**
+ * Listing all Save States for a given target is supported, i.e.,
+ * the listSaves() method is implemented.
+ * Used for --list-saves support, as well as the GMM load dialog.
+ */
+ kSupportsListSaves = 1,
+
+ /**
+ * Loading from the in-game common ScummVM options dialog is supported
+ */
+ kSupportsLoadingDuringRuntime = 8,
+
+ /**
+ * Saving from the in-game common ScummVM options dialog is supported
+ */
+ kSupportsSavingDuringRuntime = 9
};
/**
diff --git a/engines/igor/igor.h b/engines/igor/igor.h
index 99155c5d43..418a7ad6b4 100644
--- a/engines/igor/igor.h
+++ b/engines/igor/igor.h
@@ -427,8 +427,8 @@ protected:
void dialogueReplyToQuestion(int x, int y, int r, int g, int b, int reply = 0);
void saveOrLoadGameState(TypeSerializer &typeSerializer);
- void loadGameState(int slot);
- void saveGameState(int slot);
+ int loadGameState(int slot);
+ int saveGameState(int slot);
void generateGameStateFileName(int num, char *dst, int len) const;
MidiPlayer *_midiPlayer;
diff --git a/engines/igor/saveload.cpp b/engines/igor/saveload.cpp
index 96bacdf1ac..a87ecc0ba5 100644
--- a/engines/igor/saveload.cpp
+++ b/engines/igor/saveload.cpp
@@ -156,7 +156,7 @@ void IgorEngine::saveOrLoadGameState(TypeSerializer &typeSerializer) {
}
}
-void IgorEngine::loadGameState(int slot) {
+int IgorEngine::loadGameState(int slot) {
char name[64];
generateGameStateFileName(slot, name, 63);
Common::InSaveFile *isf = _saveFileMan->openForLoading(name);
@@ -175,9 +175,11 @@ void IgorEngine::loadGameState(int slot) {
}
debug(0, "Loaded state, current part %d", _currentPart);
}
+
+ return 0; // TODO: return success/failure
}
-void IgorEngine::saveGameState(int slot) {
+int IgorEngine::saveGameState(int slot) {
char name[64];
generateGameStateFileName(slot, name, 63);
Common::OutSaveFile *osf = _saveFileMan->openForSaving(name);
@@ -187,6 +189,8 @@ void IgorEngine::saveGameState(int slot) {
saveOrLoadGameState(ts);
delete osf;
}
+
+ return 0; // TODO: return success/failure
}
void IgorEngine::generateGameStateFileName(int num, char *dst, int len) const {
diff --git a/engines/metaengine.h b/engines/metaengine.h
index 077d5696b8..938764fdb9 100644
--- a/engines/metaengine.h
+++ b/engines/metaengine.h
@@ -183,7 +183,17 @@ public:
* the game till the save.
* This flag may only be set when 'kSavesSupportMetaInfo' is set.
*/
- kSavesSupportPlayTime
+ kSavesSupportPlayTime,
+
+ /**
+ *Features loading from the Common ScummVM options dialog in-game
+ */
+ kSupportsLoadingDuringRuntime,
+
+ /**
+ *Features saving from the Common ScummVM options dialog in-game
+ */
+ kSupportsSavingDuringRuntime
};
/**
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 40e7aa8b05..9fc30e0d62 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -351,7 +351,7 @@ void QueenEngine::saveGameState(int slot, const char *desc) {
}
}
-void QueenEngine::loadGameState(int slot) {
+int QueenEngine::loadGameState(int slot) {
debug(3, "Loading game from slot %d", slot);
GameStateHeader header;
Common::InSaveFile *file = readGameStateHeader(slot, &header);
@@ -374,6 +374,8 @@ void QueenEngine::loadGameState(int slot) {
delete[] saveData;
delete file;
}
+
+ return 0; // TODO: return success/failure
}
Common::InSaveFile *QueenEngine::readGameStateHeader(int slot, GameStateHeader *gsh) {
diff --git a/engines/queen/queen.h b/engines/queen/queen.h
index 66931e037d..01d6340abb 100644
--- a/engines/queen/queen.h
+++ b/engines/queen/queen.h
@@ -108,7 +108,7 @@ public:
bool canLoadOrSave() const;
void saveGameState(int slot, const char *desc);
- void loadGameState(int slot);
+ int loadGameState(int slot);
void makeGameStateName(int slot, char *buf) const;
int getGameStateSlot(const char *filename) const;
void findGameStateDescriptions(char descriptions[100][32]);
diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp
index eecff5f511..e26cf48dcb 100644
--- a/engines/saga/detection.cpp
+++ b/engines/saga/detection.cpp
@@ -33,7 +33,9 @@
#include "common/advancedDetector.h"
#include "common/system.h"
+#include "saga/animation.h"
#include "saga/displayinfo.h"
+#include "saga/events.h"
#include "saga/rscfile.h"
#include "saga/interface.h"
#include "saga/scene.h"
@@ -157,7 +159,9 @@ bool SagaMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsRTL) ||
(f == kSupportsListSaves) ||
(f == kSupportsLoadingDuringStartup) ||
- (f == kSupportsDeleteSave);
+ (f == kSupportsDeleteSave) ||
+ (f == kSupportsLoadingDuringRuntime) ||
+ (f == kSupportsSavingDuringRuntime);
}
bool SagaMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const {
@@ -237,4 +241,24 @@ int SagaEngine::getDisplayHeight() const {
return di.logicalHeight;
}
+int SagaEngine::loadGameState(int slot) {
+ // Init the current chapter to 8 (character selection) for IHNM
+ if (getGameType() == GType_IHNM)
+ _scene->changeScene(-2, 0, kTransitionFade, 8);
+
+ // First scene sets up palette
+ _scene->changeScene(getStartSceneNumber(), 0, kTransitionNoFade);
+ _events->handleEvents(0); // Process immediate events
+
+ if (getGameType() != GType_IHNM)
+ _interface->setMode(kPanelMain);
+ else
+ _interface->setMode(kPanelChapterSelection);
+
+ load(calcSaveFileName((uint)slot));
+ syncSoundSettings();
+
+ return 0; // TODO: return success/failure
+}
+
} // End of namespace Saga
diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp
index 7904e60d1c..4ee81269d2 100644
--- a/engines/saga/saga.cpp
+++ b/engines/saga/saga.cpp
@@ -532,4 +532,12 @@ void SagaEngine::syncSoundSettings() {
_sound->setVolume();
}
+bool SagaEngine::canLoadGameStateCurrently() {
+ return !this->_scene->isInIntro();
+}
+
+bool SagaEngine::canSaveGameStateCurrently() {
+ return !this->_scene->isInIntro();
+}
+
} // End of namespace Saga
diff --git a/engines/saga/saga.h b/engines/saga/saga.h
index 2be74e1766..5417217065 100644
--- a/engines/saga/saga.h
+++ b/engines/saga/saga.h
@@ -650,6 +650,9 @@ public:
const Common::Rect &getDisplayClip() const { return _displayClip;}
int getDisplayWidth() const;
int getDisplayHeight() const;
+ int loadGameState(int slot);
+ bool canLoadGameStateCurrently();
+ bool canSaveGameStateCurrently();
const GameDisplayInfo &getDisplayInfo();
const char *getTextString(int textStringId);
diff --git a/engines/touche/menu.cpp b/engines/touche/menu.cpp
index 9da76dadde..2d7af18da3 100644
--- a/engines/touche/menu.cpp
+++ b/engines/touche/menu.cpp
@@ -331,7 +331,7 @@ void ToucheEngine::handleMenuAction(void *menu, int actionId) {
break;
case kActionPerformSaveLoad:
if (menuData->mode == kMenuLoadStateMode) {
- if (loadGameState(_saveLoadCurrentSlot)) {
+ if (loadGameState(_saveLoadCurrentSlot) == 0) {
menuData->quit = true;
}
} else if (menuData->mode == kMenuSaveStateMode) {
diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp
index fedd40eb76..011e739c35 100644
--- a/engines/touche/saveload.cpp
+++ b/engines/touche/saveload.cpp
@@ -340,7 +340,7 @@ bool ToucheEngine::saveGameState(int num, const char *description) {
return saveOk;
}
-bool ToucheEngine::loadGameState(int num) {
+int ToucheEngine::loadGameState(int num) {
bool loadOk = false;
char gameStateFileName[64];
generateGameStateFileName(num, gameStateFileName, 63);
@@ -360,7 +360,7 @@ bool ToucheEngine::loadGameState(int num) {
}
delete f;
}
- return loadOk;
+ return loadOk ? 0 : 1;
}
void ToucheEngine::readGameStateDescription(int num, char *description, int len) {
diff --git a/engines/touche/touche.h b/engines/touche/touche.h
index f341769422..707eedbb38 100644
--- a/engines/touche/touche.h
+++ b/engines/touche/touche.h
@@ -496,7 +496,7 @@ protected:
void saveGameStateData(Common::WriteStream *stream);
void loadGameStateData(Common::ReadStream *stream);
bool saveGameState(int num, const char *description);
- bool loadGameState(int num);
+ int loadGameState(int num);
void readGameStateDescription(int num, char *description, int len);
void generateGameStateFileName(int num, char *dst, int len, bool prefixOnly = false) const;
int getGameStateFileSlot(const char *filename) const;
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index 55489e2017..9a201fd936 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -473,45 +473,6 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
}
}
-class SaveLoadChooser : public GUI::Dialog {
- typedef Common::String String;
- typedef Common::StringList StringList;
-protected:
- GUI::ListWidget *_list;
- GUI::ButtonWidget *_chooseButton;
- GUI::ButtonWidget *_deleteButton;
- GUI::GraphicsWidget *_gfxWidget;
- GUI::ContainerWidget *_container;
- GUI::StaticTextWidget *_date;
- GUI::StaticTextWidget *_time;
- GUI::StaticTextWidget *_playtime;
-
- const EnginePlugin *_plugin;
- bool _delSupport;
- bool _metaInfoSupport;
- bool _thumbnailSupport;
- bool _saveDateSupport;
- bool _playTimeSupport;
- String _target;
- SaveStateList _saveList;
-
- uint8 _fillR, _fillG, _fillB;
-
- void updateSaveList();
- void updateSelection(bool redraw);
-public:
- SaveLoadChooser(const String &title, const String &buttonLabel);
- ~SaveLoadChooser();
-
- virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
- void setList(const StringList& list);
- int runModal(const EnginePlugin *plugin, const String &target);
-
- virtual void reflowLayout();
-
- virtual void close();
-};
-
SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel)
: Dialog("ScummSaveLoad"), _delSupport(0), _list(0), _chooseButton(0), _deleteButton(0), _gfxWidget(0) {
_delSupport = _metaInfoSupport = _thumbnailSupport = _saveDateSupport = _playTimeSupport = false;
diff --git a/gui/launcher.h b/gui/launcher.h
index 1b2b0a354e..7e04e865f9 100644
--- a/gui/launcher.h
+++ b/gui/launcher.h
@@ -27,6 +27,7 @@
#include "gui/dialog.h"
#include "engines/game.h"
+#include "engines/metaengine.h"
#include "common/str.h"
namespace GUI {
@@ -79,6 +80,45 @@ protected:
void selectGame(const String &name);
};
+class SaveLoadChooser : public GUI::Dialog {
+ typedef Common::String String;
+ typedef Common::StringList StringList;
+protected:
+ GUI::ListWidget *_list;
+ GUI::ButtonWidget *_chooseButton;
+ GUI::ButtonWidget *_deleteButton;
+ GUI::GraphicsWidget *_gfxWidget;
+ GUI::ContainerWidget *_container;
+ GUI::StaticTextWidget *_date;
+ GUI::StaticTextWidget *_time;
+ GUI::StaticTextWidget *_playtime;
+
+ const EnginePlugin *_plugin;
+ bool _delSupport;
+ bool _metaInfoSupport;
+ bool _thumbnailSupport;
+ bool _saveDateSupport;
+ bool _playTimeSupport;
+ String _target;
+ SaveStateList _saveList;
+
+ uint8 _fillR, _fillG, _fillB;
+
+ void updateSaveList();
+ void updateSelection(bool redraw);
+public:
+ SaveLoadChooser(const String &title, const String &buttonLabel);
+ ~SaveLoadChooser();
+
+ virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
+ void setList(const StringList& list);
+ int runModal(const EnginePlugin *plugin, const String &target);
+
+ virtual void reflowLayout();
+
+ virtual void close();
+};
+
} // End of namespace GUI
#endif
diff --git a/gui/object.h b/gui/object.h
index 01046bd668..d188807a16 100644
--- a/gui/object.h
+++ b/gui/object.h
@@ -67,7 +67,7 @@ protected:
Widget *_firstWidget;
public:
- GuiObject(int x, int y, int w, int h) : _x(x), _y(y), _w(w), _h(h), _name(""), _firstWidget(0) { }
+ GuiObject(int x, int y, int w, int h) : _x(x), _y(y), _w(w), _h(h), _firstWidget(0) { }
GuiObject(const Common::String &name);
~GuiObject();
diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip
index 3ee5730303..2d6dd7b113 100644
--- a/gui/themes/scummclassic.zip
+++ b/gui/themes/scummclassic.zip
Binary files differ
diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx
index 42e6eaebd7..c663c16853 100644
--- a/gui/themes/scummclassic/classic_layout.stx
+++ b/gui/themes/scummclassic/classic_layout.stx
@@ -464,6 +464,15 @@
height = 'Globals.Button.Height'
/>
<space size = '10'/>
+ <widget name = 'Load'
+ width = '150'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Save'
+ width = '150'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '10'/>
<widget name = 'Options'
width = '150'
height = 'Globals.Button.Height'
diff --git a/gui/themes/scummclassic/classic_layout_320.stx b/gui/themes/scummclassic/classic_layout_320.stx
index 7d925be9cb..921e3ff5eb 100644
--- a/gui/themes/scummclassic/classic_layout_320.stx
+++ b/gui/themes/scummclassic/classic_layout_320.stx
@@ -465,6 +465,15 @@
height = 'Globals.Button.Height'
/>
<space size = '4'/>
+ <widget name = 'Load'
+ width = '70'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Save'
+ width = '70'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '4'/>
<widget name = 'Options'
width = '70'
height = 'Globals.Button.Height'
diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip
index 0de77c92fc..b4244ec2ef 100644
--- a/gui/themes/scummmodern.zip
+++ b/gui/themes/scummmodern.zip
Binary files differ
diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx
index ebf273ccf5..7e463894ff 100644
--- a/gui/themes/scummmodern/scummmodern_layout.stx
+++ b/gui/themes/scummmodern/scummmodern_layout.stx
@@ -476,6 +476,15 @@
height = 'Globals.Button.Height'
/>
<space size = '10'/>
+ <widget name = 'Load'
+ width = '150'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Save'
+ width = '150'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '10'/>
<widget name = 'Options'
width = '150'
height = 'Globals.Button.Height'
diff --git a/gui/themes/scummmodern/scummmodern_layout_320.stx b/gui/themes/scummmodern/scummmodern_layout_320.stx
index c135d7e03a..85a5b4b241 100644
--- a/gui/themes/scummmodern/scummmodern_layout_320.stx
+++ b/gui/themes/scummmodern/scummmodern_layout_320.stx
@@ -462,6 +462,15 @@
height = 'Globals.Button.Height'
/>
<space size = '4'/>
+ <widget name = 'Load'
+ width = '70'
+ height = 'Globals.Button.Height'
+ />
+ <widget name = 'Save'
+ width = '70'
+ height = 'Globals.Button.Height'
+ />
+ <space size = '4'/>
<widget name = 'Options'
width = '70'
height = 'Globals.Button.Height'