aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorStrangerke2013-09-08 14:49:34 +0200
committerStrangerke2013-09-08 14:49:34 +0200
commit599d2eeb06c937a4479cc751f4f9f5e94795c43b (patch)
tree6efd0f887d7a1fd5082209a585d609983031c92d /gui
parent7df4c94aeb6c1408d26d6ada58d728b6eac17717 (diff)
parent03bf56ea82c0b89f4e61e5e0787a36473f999efa (diff)
downloadscummvm-rg350-599d2eeb06c937a4479cc751f4f9f5e94795c43b.tar.gz
scummvm-rg350-599d2eeb06c937a4479cc751f4f9f5e94795c43b.tar.bz2
scummvm-rg350-599d2eeb06c937a4479cc751f4f9f5e94795c43b.zip
Merge branch 'master' into avalanche
Diffstat (limited to 'gui')
-rw-r--r--gui/EventRecorder.cpp678
-rw-r--r--gui/EventRecorder.h238
-rw-r--r--gui/ThemeEngine.cpp83
-rw-r--r--gui/ThemeEngine.h17
-rw-r--r--gui/about.cpp4
-rw-r--r--gui/chooser.cpp1
-rw-r--r--gui/credits.h6
-rw-r--r--gui/dialog.h3
-rw-r--r--gui/editrecorddialog.cpp87
-rw-r--r--gui/editrecorddialog.h56
-rw-r--r--gui/gui-manager.cpp142
-rw-r--r--gui/gui-manager.h6
-rw-r--r--gui/launcher.cpp83
-rw-r--r--gui/launcher.h15
-rw-r--r--gui/module.mk8
-rw-r--r--gui/onscreendialog.cpp233
-rw-r--r--gui/onscreendialog.h66
-rw-r--r--gui/recorderdialog.cpp298
-rw-r--r--gui/recorderdialog.h81
-rw-r--r--gui/saveload-dialog.cpp2
-rw-r--r--gui/themes/default.inc3282
-rw-r--r--gui/themes/scummclassic.zipbin104059 -> 110000 bytes
-rw-r--r--gui/themes/scummclassic/classic_layout.stx128
-rw-r--r--gui/themes/scummclassic/classic_layout_lowres.stx104
-rw-r--r--gui/themes/scummmodern.zipbin1462338 -> 1485763 bytes
-rw-r--r--gui/themes/scummmodern/editbtn.bmpbin0 -> 3126 bytes
-rw-r--r--gui/themes/scummmodern/editbtn_small.bmpbin0 -> 822 bytes
-rw-r--r--gui/themes/scummmodern/fastreplay.bmpbin0 -> 3126 bytes
-rw-r--r--gui/themes/scummmodern/fastreplay_small.bmpbin0 -> 822 bytes
-rw-r--r--gui/themes/scummmodern/scummmodern_gfx.stx8
-rw-r--r--gui/themes/scummmodern/scummmodern_layout.stx130
-rw-r--r--gui/themes/scummmodern/scummmodern_layout_lowres.stx125
-rw-r--r--gui/themes/scummmodern/stopbtn.bmpbin0 -> 3126 bytes
-rw-r--r--gui/themes/scummmodern/stopbtn_small.bmpbin0 -> 822 bytes
-rw-r--r--gui/themes/scummmodern/switchbtn.bmpbin0 -> 3126 bytes
-rw-r--r--gui/themes/scummmodern/switchbtn_small.bmpbin0 -> 822 bytes
-rwxr-xr-xgui/themes/scummtheme.py17
-rw-r--r--gui/widget.cpp10
-rw-r--r--gui/widgets/edittext.cpp8
39 files changed, 4273 insertions, 1646 deletions
diff --git a/gui/EventRecorder.cpp b/gui/EventRecorder.cpp
new file mode 100644
index 0000000000..21152dd079
--- /dev/null
+++ b/gui/EventRecorder.cpp
@@ -0,0 +1,678 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+
+#include "gui/EventRecorder.h"
+
+#ifdef ENABLE_EVENTRECORDER
+
+namespace Common {
+DECLARE_SINGLETON(GUI::EventRecorder);
+}
+
+#include "common/debug-channels.h"
+#include "backends/timer/sdl/sdl-timer.h"
+#include "backends/mixer/sdl/sdl-mixer.h"
+#include "common/config-manager.h"
+#include "common/md5.h"
+#include "gui/gui-manager.h"
+#include "gui/widget.h"
+#include "gui/onscreendialog.h"
+#include "common/random.h"
+#include "common/savefile.h"
+#include "common/textconsole.h"
+#include "graphics/thumbnail.h"
+#include "graphics/surface.h"
+#include "graphics/scaler.h"
+
+namespace GUI {
+
+
+const int kMaxRecordsNames = 0x64;
+const int kDefaultScreenshotPeriod = 60000;
+const int kDefaultBPP = 2;
+
+uint32 readTime(Common::ReadStream *inFile) {
+ uint32 d = inFile->readByte();
+ if (d == 0xff) {
+ d = inFile->readUint32LE();
+ }
+
+ return d;
+}
+
+void writeTime(Common::WriteStream *outFile, uint32 d) {
+ //Simple RLE compression
+ if (d >= 0xff) {
+ outFile->writeByte(0xff);
+ outFile->writeUint32LE(d);
+ } else {
+ outFile->writeByte(d);
+ }
+}
+
+EventRecorder::EventRecorder() {
+ _timerManager = NULL;
+ _recordMode = kPassthrough;
+ _fakeMixerManager = NULL;
+ _initialized = false;
+ _needRedraw = false;
+ _fastPlayback = false;
+
+ _fakeTimer = 0;
+ _savedState = false;
+ _needcontinueGame = false;
+ _temporarySlot = 0;
+ _realSaveManager = 0;
+ _realMixerManager = 0;
+ _controlPanel = 0;
+ _lastMillis = 0;
+ _lastScreenshotTime = 0;
+ _screenshotPeriod = 0;
+ _playbackFile = 0;
+
+ DebugMan.addDebugChannel(kDebugLevelEventRec, "EventRec", "Event recorder debug level");
+}
+
+EventRecorder::~EventRecorder() {
+ if (_timerManager != NULL) {
+ delete _timerManager;
+ }
+}
+
+void EventRecorder::deinit() {
+ if (!_initialized) {
+ return;
+ }
+ setFileHeader();
+ _needRedraw = false;
+ _initialized = false;
+ _recordMode = kPassthrough;
+ delete _fakeMixerManager;
+ _fakeMixerManager = NULL;
+ _controlPanel->close();
+ delete _controlPanel;
+ debugC(1, kDebugLevelEventRec, "playback:action=stopplayback");
+ g_system->getEventManager()->getEventDispatcher()->unregisterSource(this);
+ _recordMode = kPassthrough;
+ _playbackFile->close();
+ delete _playbackFile;
+ switchMixer();
+ switchTimerManagers();
+ DebugMan.disableDebugChannel("EventRec");
+}
+
+void EventRecorder::processMillis(uint32 &millis, bool skipRecord) {
+ if (!_initialized) {
+ return;
+ }
+ if (skipRecord) {
+ millis = _fakeTimer;
+ return;
+ }
+ if (_recordMode == kRecorderPlaybackPause) {
+ millis = _fakeTimer;
+ }
+ uint32 millisDelay;
+ Common::RecorderEvent timerEvent;
+ switch (_recordMode) {
+ case kRecorderRecord:
+ updateSubsystems();
+ millisDelay = millis - _lastMillis;
+ _lastMillis = millis;
+ _fakeTimer += millisDelay;
+ _controlPanel->setReplayedTime(_fakeTimer);
+ timerEvent.recordedtype = Common::kRecorderEventTypeTimer;
+ timerEvent.time = _fakeTimer;
+ _playbackFile->writeEvent(timerEvent);
+ takeScreenshot();
+ _timerManager->handler();
+ break;
+ case kRecorderPlayback:
+ updateSubsystems();
+ if (_nextEvent.recordedtype == Common::kRecorderEventTypeTimer) {
+ _fakeTimer = _nextEvent.time;
+ _nextEvent = _playbackFile->getNextEvent();
+ _timerManager->handler();
+ } else {
+ if (_nextEvent.type == Common::EVENT_RTL) {
+ error("playback:action=stopplayback");
+ } else {
+ uint32 seconds = _fakeTimer / 1000;
+ Common::String screenTime = Common::String::format("%.2d:%.2d:%.2d", seconds / 3600 % 24, seconds / 60 % 60, seconds % 60);
+ error("playback:action=error reason=\"synchronization error\" time = %s", screenTime.c_str());
+ }
+ }
+ millis = _fakeTimer;
+ _controlPanel->setReplayedTime(_fakeTimer);
+ break;
+ case kRecorderPlaybackPause:
+ millis = _fakeTimer;
+ break;
+ default:
+ break;
+ }
+}
+
+bool EventRecorder::processDelayMillis() {
+ return _fastPlayback;
+}
+
+void EventRecorder::checkForKeyCode(const Common::Event &event) {
+ if ((event.type == Common::EVENT_KEYDOWN) && (event.kbd.flags & Common::KBD_CTRL) && (event.kbd.keycode == Common::KEYCODE_p) && (!event.synthetic)) {
+ togglePause();
+ }
+}
+
+bool EventRecorder::pollEvent(Common::Event &ev) {
+ if ((_recordMode != kRecorderPlayback) || !_initialized)
+ return false;
+
+ if ((_nextEvent.recordedtype == Common::kRecorderEventTypeTimer) || (_nextEvent.type == Common::EVENT_INVALID)) {
+ return false;
+ }
+
+ switch (_nextEvent.type) {
+ case Common::EVENT_MOUSEMOVE:
+ case Common::EVENT_LBUTTONDOWN:
+ case Common::EVENT_LBUTTONUP:
+ case Common::EVENT_RBUTTONDOWN:
+ case Common::EVENT_RBUTTONUP:
+ case Common::EVENT_WHEELUP:
+ case Common::EVENT_WHEELDOWN:
+ g_system->warpMouse(_nextEvent.mouse.x, _nextEvent.mouse.y);
+ break;
+ default:
+ break;
+ }
+ ev = _nextEvent;
+ _nextEvent = _playbackFile->getNextEvent();
+ return true;
+}
+
+void EventRecorder::switchFastMode() {
+ if (_recordMode == kRecorderPlaybackPause) {
+ _fastPlayback = !_fastPlayback;
+ }
+}
+
+void EventRecorder::togglePause() {
+ RecordMode oldState;
+ switch (_recordMode) {
+ case kRecorderPlayback:
+ case kRecorderRecord:
+ oldState = _recordMode;
+ _recordMode = kRecorderPlaybackPause;
+ _controlPanel->runModal();
+ _recordMode = oldState;
+ _initialized = true;
+ break;
+ case kRecorderPlaybackPause:
+ _controlPanel->close();
+ break;
+ default:
+ break;
+ }
+}
+
+void EventRecorder::RegisterEventSource() {
+ g_system->getEventManager()->getEventDispatcher()->registerMapper(this, false);
+}
+
+uint32 EventRecorder::getRandomSeed(const Common::String &name) {
+ uint32 result = g_system->getMillis();
+ if (_recordMode == kRecorderRecord) {
+ _playbackFile->getHeader().randomSourceRecords[name] = result;
+ } else if (_recordMode == kRecorderPlayback) {
+ result = _playbackFile->getHeader().randomSourceRecords[name];
+ }
+ return result;
+}
+
+Common::String EventRecorder::generateRecordFileName(const Common::String &target) {
+ Common::String pattern(target+".r??");
+ Common::StringArray files = g_system->getSavefileManager()->listSavefiles(pattern);
+ for (int i = 0; i < kMaxRecordsNames; ++i) {
+ Common::String recordName = Common::String::format("%s.r%02d", target.c_str(), i);
+ if (find(files.begin(), files.end(), recordName) != files.end()) {
+ continue;
+ }
+ return recordName;
+ }
+ return "";
+}
+
+
+void EventRecorder::init(Common::String recordFileName, RecordMode mode) {
+ _fakeMixerManager = new NullSdlMixerManager();
+ _fakeMixerManager->init();
+ _fakeMixerManager->suspendAudio();
+ _fakeTimer = 0;
+ _lastMillis = g_system->getMillis();
+ _playbackFile = new Common::PlaybackFile();
+ _lastScreenshotTime = 0;
+ _recordMode = mode;
+ _needcontinueGame = false;
+ if (ConfMan.hasKey("disable_display")) {
+ DebugMan.enableDebugChannel("EventRec");
+ gDebugLevel = 1;
+ }
+ if (_recordMode == kRecorderPlayback) {
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Load file\" filename=%s", recordFileName.c_str());
+ }
+ g_system->getEventManager()->getEventDispatcher()->registerSource(this, false);
+ _screenshotPeriod = ConfMan.getInt("screenshot_period");
+ if (_screenshotPeriod == 0) {
+ _screenshotPeriod = kDefaultScreenshotPeriod;
+ }
+ if (!openRecordFile(recordFileName)) {
+ deinit();
+ error("playback:action=error reason=\"Record file loading error\"");
+ return;
+ }
+ if (_recordMode != kPassthrough) {
+ _controlPanel = new GUI::OnScreenDialog(_recordMode == kRecorderRecord);
+ }
+ if (_recordMode == kRecorderPlayback) {
+ applyPlaybackSettings();
+ _nextEvent = _playbackFile->getNextEvent();
+ }
+ if (_recordMode == kRecorderRecord) {
+ getConfig();
+ }
+
+ switchMixer();
+ switchTimerManagers();
+ _needRedraw = true;
+ _initialized = true;
+}
+
+
+/**
+ * Opens or creates file depend of recording mode.
+ *
+ *@param id of recording or playing back game
+ *@return true in case of success, false in case of error
+ *
+ */
+bool EventRecorder::openRecordFile(const Common::String &fileName) {
+ bool result;
+ switch (_recordMode) {
+ case kRecorderRecord:
+ return _playbackFile->openWrite(fileName);
+ case kRecorderPlayback:
+ _recordMode = kPassthrough;
+ result = _playbackFile->openRead(fileName);
+ _recordMode = kRecorderPlayback;
+ return result;
+ default:
+ return false;
+ }
+ return true;
+}
+
+bool EventRecorder::checkGameHash(const ADGameDescription *gameDesc) {
+ if (_playbackFile->getHeader().hashRecords.size() != 0) {
+ warning("Engine doesn't contain description table");
+ return false;
+ }
+ for (const ADGameFileDescription *fileDesc = gameDesc->filesDescriptions; fileDesc->fileName; fileDesc++) {
+ if (_playbackFile->getHeader().hashRecords.find(fileDesc->fileName) == _playbackFile->getHeader().hashRecords.end()) {
+ warning("MD5 hash for file %s not found in record file", fileDesc->fileName);
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Check game hash\" filename=%s filehash=%s storedhash=\"\" result=different", fileDesc->fileName, fileDesc->md5);
+ return false;
+ }
+ if (_playbackFile->getHeader().hashRecords[fileDesc->fileName] != fileDesc->md5) {
+ warning("Incorrect version of game file %s. Stored MD5 is %s. MD5 of loaded game is %s", fileDesc->fileName, _playbackFile->getHeader().hashRecords[fileDesc->fileName].c_str(), fileDesc->md5);
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Check game hash\" filename=%s filehash=%s storedhash=%s result=different", fileDesc->fileName, fileDesc->md5, _playbackFile->getHeader().hashRecords[fileDesc->fileName].c_str());
+ return false;
+ }
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Check game hash\" filename=%s filehash=%s storedhash=%s result=equal", fileDesc->fileName, fileDesc->md5, _playbackFile->getHeader().hashRecords[fileDesc->fileName].c_str());
+ }
+ return true;
+}
+
+void EventRecorder::registerMixerManager(SdlMixerManager *mixerManager) {
+ _realMixerManager = mixerManager;
+}
+
+void EventRecorder::switchMixer() {
+ if (_recordMode == kPassthrough) {
+ _realMixerManager->resumeAudio();
+ } else {
+ _realMixerManager->suspendAudio();
+ _fakeMixerManager->resumeAudio();
+ }
+}
+
+SdlMixerManager *EventRecorder::getMixerManager() {
+ if (_recordMode == kPassthrough) {
+ return _realMixerManager;
+ } else {
+ return _fakeMixerManager;
+ }
+}
+
+void EventRecorder::getConfigFromDomain(const Common::ConfigManager::Domain *domain) {
+ for (Common::ConfigManager::Domain::const_iterator entry = domain->begin(); entry!= domain->end(); ++entry) {
+ _playbackFile->getHeader().settingsRecords[entry->_key] = entry->_value;
+ }
+}
+
+void EventRecorder::getConfig() {
+ getConfigFromDomain(ConfMan.getDomain(ConfMan.kApplicationDomain));
+ getConfigFromDomain(ConfMan.getActiveDomain());
+ _playbackFile->getHeader().settingsRecords["save_slot"] = ConfMan.get("save_slot");
+}
+
+
+void EventRecorder::applyPlaybackSettings() {
+ for (Common::StringMap::const_iterator i = _playbackFile->getHeader().settingsRecords.begin(); i != _playbackFile->getHeader().settingsRecords.end(); ++i) {
+ Common::String currentValue = ConfMan.get(i->_key);
+ if (currentValue != i->_value) {
+ ConfMan.set(i->_key, i->_value, ConfMan.kTransientDomain);
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Apply settings\" key=%s storedvalue=%s currentvalue=%s result=different", i->_key.c_str(), i->_value.c_str(), currentValue.c_str());
+ } else {
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Apply settings\" key=%s storedvalue=%s currentvalue=%s result=equal", i->_key.c_str(), i->_value.c_str(), currentValue.c_str());
+ }
+ }
+ removeDifferentEntriesInDomain(ConfMan.getDomain(ConfMan.kApplicationDomain));
+ removeDifferentEntriesInDomain(ConfMan.getActiveDomain());
+}
+
+void EventRecorder::removeDifferentEntriesInDomain(Common::ConfigManager::Domain *domain) {
+ for (Common::ConfigManager::Domain::const_iterator entry = domain->begin(); entry!= domain->end(); ++entry) {
+ if (_playbackFile->getHeader().settingsRecords.find(entry->_key) == _playbackFile->getHeader().settingsRecords.end()) {
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Apply settings\" checksettings:key=%s storedvalue=%s currentvalue="" result=different", entry->_key.c_str(), entry->_value.c_str());
+ domain->erase(entry->_key);
+ }
+ }
+}
+
+DefaultTimerManager *EventRecorder::getTimerManager() {
+ return _timerManager;
+}
+
+void EventRecorder::registerTimerManager(DefaultTimerManager *timerManager) {
+ _timerManager = timerManager;
+}
+
+void EventRecorder::switchTimerManagers() {
+ delete _timerManager;
+ if (_recordMode == kPassthrough) {
+ _timerManager = new SdlTimerManager();
+ } else {
+ _timerManager = new DefaultTimerManager();
+ }
+}
+
+void EventRecorder::updateSubsystems() {
+ if (_recordMode == kPassthrough) {
+ return;
+ }
+ RecordMode oldRecordMode = _recordMode;
+ _recordMode = kPassthrough;
+ _fakeMixerManager->update();
+ _recordMode = oldRecordMode;
+}
+
+Common::List<Common::Event> EventRecorder::mapEvent(const Common::Event &ev, Common::EventSource *source) {
+ if ((!_initialized) && (_recordMode != kRecorderPlaybackPause)) {
+ return DefaultEventMapper::mapEvent(ev, source);
+ }
+
+ checkForKeyCode(ev);
+ Common::Event evt = ev;
+ evt.mouse.x = evt.mouse.x * (g_system->getOverlayWidth() / g_system->getWidth());
+ evt.mouse.y = evt.mouse.y * (g_system->getOverlayHeight() / g_system->getHeight());
+ switch (_recordMode) {
+ case kRecorderPlayback:
+ if (ev.synthetic != true) {
+ return Common::List<Common::Event>();
+ }
+ return Common::DefaultEventMapper::mapEvent(ev, source);
+ break;
+ case kRecorderRecord:
+ g_gui.processEvent(evt, _controlPanel);
+ if (((evt.type == Common::EVENT_LBUTTONDOWN) || (evt.type == Common::EVENT_LBUTTONUP) || (evt.type == Common::EVENT_MOUSEMOVE)) && _controlPanel->isMouseOver()) {
+ return Common::List<Common::Event>();
+ } else {
+ Common::RecorderEvent e;
+ memcpy(&e, &ev, sizeof(ev));
+ e.recordedtype = Common::kRecorderEventTypeNormal;
+ e.time = _fakeTimer;
+ _playbackFile->writeEvent(e);
+ return DefaultEventMapper::mapEvent(ev, source);
+ }
+ break;
+ case kRecorderPlaybackPause: {
+ Common::Event dialogEvent;
+ if (_controlPanel->isEditDlgVisible()) {
+ dialogEvent = ev;
+ } else {
+ dialogEvent = evt;
+ }
+ g_gui.processEvent(dialogEvent, _controlPanel->getActiveDlg());
+ if (((dialogEvent.type == Common::EVENT_LBUTTONDOWN) || (dialogEvent.type == Common::EVENT_LBUTTONUP) || (dialogEvent.type == Common::EVENT_MOUSEMOVE)) && _controlPanel->isMouseOver()) {
+ return Common::List<Common::Event>();
+ }
+ return Common::DefaultEventMapper::mapEvent(dialogEvent, source);
+ }
+ break;
+ default:
+ return Common::DefaultEventMapper::mapEvent(ev, source);
+ }
+}
+
+void EventRecorder::setGameMd5(const ADGameDescription *gameDesc) {
+ for (const ADGameFileDescription *fileDesc = gameDesc->filesDescriptions; fileDesc->fileName; fileDesc++) {
+ if (fileDesc->md5 != NULL) {
+ _playbackFile->getHeader().hashRecords[fileDesc->fileName] = fileDesc->md5;
+ }
+ }
+}
+
+void EventRecorder::processGameDescription(const ADGameDescription *desc) {
+ if (_recordMode == kRecorderRecord) {
+ setGameMd5(desc);
+ }
+ if ((_recordMode == kRecorderPlayback) && !checkGameHash(desc)) {
+ deinit();
+ error("playback:action=error reason=\"\"");
+ }
+}
+
+void EventRecorder::deleteRecord(const Common::String& fileName) {
+ g_system->getSavefileManager()->removeSavefile(fileName);
+}
+
+void EventRecorder::takeScreenshot() {
+ if ((_fakeTimer - _lastScreenshotTime) > _screenshotPeriod) {
+ Graphics::Surface screen;
+ uint8 md5[16];
+ if (grabScreenAndComputeMD5(screen, md5)) {
+ _lastScreenshotTime = _fakeTimer;
+ _playbackFile->saveScreenShot(screen, md5);
+ screen.free();
+ }
+ }
+}
+
+bool EventRecorder::grabScreenAndComputeMD5(Graphics::Surface &screen, uint8 md5[16]) {
+ if (!createScreenShot(screen)) {
+ warning("Can't save screenshot");
+ return false;
+ }
+ Common::MemoryReadStream bitmapStream((const byte*)screen.getPixels(), screen.w * screen.h * screen.format.bytesPerPixel);
+ computeStreamMD5(bitmapStream, md5);
+ return true;
+}
+
+Common::SeekableReadStream *EventRecorder::processSaveStream(const Common::String &fileName) {
+ Common::InSaveFile *saveFile;
+ switch (_recordMode) {
+ case kRecorderPlayback:
+ debugC(1, kDebugLevelEventRec, "playback:action=\"Process save file\" filename=%s len=%d", fileName.c_str(), _playbackFile->getHeader().saveFiles[fileName].size);
+ return new Common::MemoryReadStream(_playbackFile->getHeader().saveFiles[fileName].buffer, _playbackFile->getHeader().saveFiles[fileName].size);
+ case kRecorderRecord:
+ saveFile = _realSaveManager->openForLoading(fileName);
+ if (saveFile != NULL) {
+ _playbackFile->addSaveFile(fileName, saveFile);
+ saveFile->seek(0);
+ }
+ return saveFile;
+ default:
+ return NULL;
+ break;
+ }
+}
+
+Common::SaveFileManager *EventRecorder::getSaveManager(Common::SaveFileManager *realSaveManager) {
+ _realSaveManager = realSaveManager;
+ if (_recordMode != kPassthrough) {
+ return &_fakeSaveManager;
+ } else {
+ return realSaveManager;
+ }
+}
+
+void EventRecorder::preDrawOverlayGui() {
+ if ((_initialized) || (_needRedraw)) {
+ RecordMode oldMode = _recordMode;
+ _recordMode = kPassthrough;
+ g_system->showOverlay();
+ g_gui.theme()->clearAll();
+ g_gui.theme()->openDialog(true, GUI::ThemeEngine::kShadingNone);
+ _controlPanel->drawDialog();
+ g_gui.theme()->finishBuffering();
+ g_gui.theme()->updateScreen();
+ _recordMode = oldMode;
+ }
+}
+
+void EventRecorder::postDrawOverlayGui() {
+ if ((_initialized) || (_needRedraw)) {
+ RecordMode oldMode = _recordMode;
+ _recordMode = kPassthrough;
+ g_system->hideOverlay();
+ _recordMode = oldMode;
+ }
+}
+
+Common::StringArray EventRecorder::listSaveFiles(const Common::String &pattern) {
+ if (_recordMode == kRecorderPlayback) {
+ Common::StringArray result;
+ for (Common::HashMap<Common::String, Common::PlaybackFile::SaveFileBuffer>::iterator i = _playbackFile->getHeader().saveFiles.begin(); i != _playbackFile->getHeader().saveFiles.end(); ++i) {
+ if (i->_key.matchString(pattern, false, true)) {
+ result.push_back(i->_key);
+ }
+ }
+ return result;
+ } else {
+ return _realSaveManager->listSavefiles(pattern);
+ }
+}
+
+void EventRecorder::setFileHeader() {
+ if (_recordMode != kRecorderRecord) {
+ return;
+ }
+ TimeDate t;
+ const EnginePlugin *plugin = 0;
+ GameDescriptor desc = EngineMan.findGame(ConfMan.getActiveDomainName(), &plugin);
+ g_system->getTimeAndDate(t);
+ if (_author.empty()) {
+ setAuthor("Unknown Author");
+ }
+ if (_name.empty()) {
+ g_eventRec.setName(Common::String::format("%.2d.%.2d.%.4d ", t.tm_mday, t.tm_mon, 1900 + t.tm_year) + desc.description());
+ }
+ _playbackFile->getHeader().author = _author;
+ _playbackFile->getHeader().notes = _desc;
+ _playbackFile->getHeader().name = _name;
+}
+
+SDL_Surface *EventRecorder::getSurface(int width, int height) {
+ // Create a RGB565 surface of the requested dimensions.
+ return SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 16, 0xF800, 0x07E0, 0x001F, 0x0000);
+}
+
+bool EventRecorder::switchMode() {
+ const Common::String gameId = ConfMan.get("gameid");
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+ bool metaInfoSupport = (*plugin)->hasFeature(MetaEngine::kSavesSupportMetaInfo);
+ bool featuresSupport = metaInfoSupport &&
+ g_engine->canSaveGameStateCurrently() &&
+ (*plugin)->hasFeature(MetaEngine::kSupportsListSaves) &&
+ (*plugin)->hasFeature(MetaEngine::kSupportsDeleteSave);
+ if (!featuresSupport) {
+ return false;
+ }
+
+ int emptySlot = 1;
+ SaveStateList saveList = (*plugin)->listSaves(gameId.c_str());
+ for (SaveStateList::const_iterator x = saveList.begin(); x != saveList.end(); ++x) {
+ int saveSlot = x->getSaveSlot();
+ if (saveSlot == 0) {
+ continue;
+ }
+ if (emptySlot != saveSlot) {
+ break;
+ }
+ emptySlot++;
+ }
+ Common::String saveName;
+ if (emptySlot >= 0) {
+ saveName = Common::String::format("Save %d", emptySlot + 1);
+ Common::Error status = g_engine->saveGameState(emptySlot, saveName);
+ if (status.getCode() == Common::kNoError) {
+ Common::Event eventRTL;
+ eventRTL.type = Common::EVENT_RTL;
+ g_system->getEventManager()->pushEvent(eventRTL);
+ }
+ }
+ ConfMan.set("record_mode", "", Common::ConfigManager::kTransientDomain);
+ ConfMan.setInt("save_slot", emptySlot, Common::ConfigManager::kTransientDomain);
+ _needcontinueGame = true;
+ return true;
+}
+
+bool EventRecorder::checkForContinueGame() {
+ bool result = _needcontinueGame;
+ _needcontinueGame = false;
+ return result;
+}
+
+void EventRecorder::deleteTemporarySave() {
+ if (_temporarySlot == -1) return;
+ const Common::String gameId = ConfMan.get("gameid");
+ const EnginePlugin *plugin = 0;
+ EngineMan.findGame(gameId, &plugin);
+ (*plugin)->removeSaveState(gameId.c_str(), _temporarySlot);
+ _temporarySlot = -1;
+}
+
+} // End of namespace GUI
+
+#endif // ENABLE_EVENTRECORDER
+
diff --git a/gui/EventRecorder.h b/gui/EventRecorder.h
new file mode 100644
index 0000000000..b2a549ece8
--- /dev/null
+++ b/gui/EventRecorder.h
@@ -0,0 +1,238 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GUI_EVENTRECORDER_H
+#define GUI_EVENTRECORDER_H
+
+#include "common/system.h"
+
+#include "common/events.h"
+#include "common/savefile.h"
+#include "common/singleton.h"
+
+#include "engines/advancedDetector.h"
+
+#ifdef ENABLE_EVENTRECORDER
+
+#include "common/mutex.h"
+#include "common/array.h"
+#include "common/memstream.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/mixer/sdl/sdl-mixer.h"
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+#include "backends/timer/sdl/sdl-timer.h"
+#include "common/config-manager.h"
+#include "common/recorderfile.h"
+#include "backends/saves/recorder/recorder-saves.h"
+#include "backends/mixer/nullmixer/nullsdl-mixer.h"
+#include "backends/saves/default/default-saves.h"
+
+
+#define g_eventRec (GUI::EventRecorder::instance())
+
+namespace GUI {
+ class OnScreenDialog;
+}
+
+namespace GUI {
+class RandomSource;
+class SeekableReadStream;
+class WriteStream;
+
+
+/**
+ * Our generic event recorder.
+ *
+ * TODO: Add more documentation.
+ */
+class EventRecorder : private Common::EventSource, public Common::Singleton<EventRecorder>, private Common::DefaultEventMapper {
+ friend class Common::Singleton<SingletonBaseType>;
+ EventRecorder();
+ ~EventRecorder();
+public:
+ /** Specify operation mode of Event Recorder */
+ enum RecordMode {
+ kPassthrough = 0, /**< kPassthrough, do nothing */
+ kRecorderRecord = 1, /**< kRecorderRecord, do the recording */
+ kRecorderPlayback = 2, /**< kRecorderPlayback, playback existing recording */
+ kRecorderPlaybackPause = 3 /**< kRecordetPlaybackPause, interal state when user pauses the playback */
+ };
+
+ void init(Common::String recordFileName, RecordMode mode);
+ void deinit();
+ bool processDelayMillis();
+ uint32 getRandomSeed(const Common::String &name);
+ void processMillis(uint32 &millis, bool skipRecord);
+ bool processAudio(uint32 &samples, bool paused);
+ void processGameDescription(const ADGameDescription *desc);
+ Common::SeekableReadStream *processSaveStream(const Common::String & fileName);
+
+ /** Hooks for intercepting into GUI processing, so required events could be shoot
+ * or filtered out */
+ void preDrawOverlayGui();
+ void postDrawOverlayGui();
+
+ /** Set recording author
+ *
+ * @see getAuthor
+ */
+ void setAuthor(const Common::String &author) {
+ _author = author;
+ }
+
+ /** Set recording notes
+ *
+ * @see getNotes
+ */
+ void setNotes(const Common::String &desc){
+ _desc = desc;
+ }
+
+ /** Set descriptive name of the recording
+ *
+ * @see getName
+ */
+ void setName(const Common::String &name) {
+ _name = name;
+ }
+
+ /** Get recording author
+ *
+ * @see getAuthor
+ */
+ const Common::String getAuthor() {
+ return _author;
+ }
+
+ /** Get recording notes
+ *
+ * @see setNotes
+ */
+ const Common::String getNotes() {
+ return _desc;
+ }
+
+ /** Get recording name
+ *
+ * @see setName
+ */
+ const Common::String getName() {
+ return _name;
+ }
+ void setRedraw(bool redraw) {
+ _needRedraw = redraw;
+ }
+
+ void registerMixerManager(SdlMixerManager *mixerManager);
+ void registerTimerManager(DefaultTimerManager *timerManager);
+
+ SdlMixerManager *getMixerManager();
+ DefaultTimerManager *getTimerManager();
+
+ void deleteRecord(const Common::String& fileName);
+ bool checkForContinueGame();
+
+ void suspendRecording() {
+ _savedState = _initialized;
+ _initialized = false;
+ }
+
+ void resumeRecording() {
+ _initialized = _savedState;
+ }
+
+ Common::StringArray listSaveFiles(const Common::String &pattern);
+ Common::String generateRecordFileName(const Common::String &target);
+
+ Common::SaveFileManager *getSaveManager(Common::SaveFileManager *realSaveManager);
+ SDL_Surface *getSurface(int width, int height);
+ void RegisterEventSource();
+
+ /** Retrieve game screenshot and compute its checksum for comparison */
+ bool grabScreenAndComputeMD5(Graphics::Surface &screen, uint8 md5[16]);
+
+ void updateSubsystems();
+ bool switchMode();
+ void switchFastMode();
+
+private:
+ virtual Common::List<Common::Event> mapEvent(const Common::Event &ev, Common::EventSource *source);
+ bool notifyPoll();
+ bool pollEvent(Common::Event &ev);
+ bool _initialized;
+ volatile uint32 _fakeTimer;
+ bool _savedState;
+ bool _needcontinueGame;
+ int _temporarySlot;
+ Common::String _author;
+ Common::String _desc;
+ Common::String _name;
+
+ Common::SaveFileManager *_realSaveManager;
+ SdlMixerManager *_realMixerManager;
+ DefaultTimerManager *_timerManager;
+ RecorderSaveFileManager _fakeSaveManager;
+ NullSdlMixerManager *_fakeMixerManager;
+ GUI::OnScreenDialog *_controlPanel;
+ Common::RecorderEvent _nextEvent;
+
+ void setFileHeader();
+ void setGameMd5(const ADGameDescription *gameDesc);
+ void getConfig();
+ void getConfigFromDomain(const Common::ConfigManager::Domain *domain);
+ void removeDifferentEntriesInDomain(Common::ConfigManager::Domain *domain);
+ void applyPlaybackSettings();
+
+ void switchMixer();
+ void switchTimerManagers();
+
+ void togglePause();
+
+ void takeScreenshot();
+
+ bool openRecordFile(const Common::String &fileName);
+
+ bool checkGameHash(const ADGameDescription *desc);
+
+ void checkForKeyCode(const Common::Event &event);
+ bool allowMapping() const { return false; }
+
+ volatile uint32 _lastMillis;
+ uint32 _lastScreenshotTime;
+ uint32 _screenshotPeriod;
+ Common::PlaybackFile *_playbackFile;
+
+ void saveScreenShot();
+ void checkRecordedMD5();
+ void deleteTemporarySave();
+ volatile RecordMode _recordMode;
+ Common::String _recordFileName;
+ bool _fastPlayback;
+ bool _needRedraw;
+};
+
+} // End of namespace GUI
+
+#endif // ENABLE_EVENTRECORDER
+
+#endif
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index e2fa2580f5..561c0244a2 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -50,6 +50,14 @@ const char * const ThemeEngine::kImageEraser = "eraser.bmp";
const char * const ThemeEngine::kImageDelbtn = "delbtn.bmp";
const char * const ThemeEngine::kImageList = "list.bmp";
const char * const ThemeEngine::kImageGrid = "grid.bmp";
+const char * const ThemeEngine::kImageStopbtn = "stopbtn.bmp";
+const char * const ThemeEngine::kImageEditbtn = "editbtn.bmp";
+const char * const ThemeEngine::kImageSwitchModebtn = "switchbtn.bmp";
+const char * const ThemeEngine::kImageFastReplaybtn = "fastreplay.bmp";
+const char * const ThemeEngine::kImageStopSmallbtn = "stopbtn_small.bmp";
+const char * const ThemeEngine::kImageEditSmallbtn = "editbtn_small.bmp";
+const char * const ThemeEngine::kImageSwitchModeSmallbtn = "switchbtn_small.bmp";
+const char * const ThemeEngine::kImageFastReplaySmallbtn = "fastreplay_small.bmp";
struct TextDrawData {
const Graphics::Font *_fontPtr;
@@ -335,9 +343,9 @@ ThemeEngine::~ThemeEngine() {
*********************************************************/
const ThemeEngine::Renderer ThemeEngine::_rendererModes[] = {
{ _s("Disabled GFX"), _sc("Disabled GFX", "lowres"), "none", kGfxDisabled },
- { _s("Standard Renderer (16bpp)"), _s("Standard (16bpp)"), "normal_16bpp", kGfxStandard16bit },
+ { _s("Standard Renderer"), _s("Standard"), "normal", kGfxStandard },
#ifndef DISABLE_FANCY_THEMES
- { _s("Antialiased Renderer (16bpp)"), _s("Antialiased (16bpp)"), "aa_16bpp", kGfxAntialias16bit }
+ { _s("Antialiased Renderer"), _s("Antialiased"), "antialias", kGfxAntialias }
#endif
};
@@ -345,9 +353,9 @@ const uint ThemeEngine::_rendererModesSize = ARRAYSIZE(ThemeEngine::_rendererMod
const ThemeEngine::GraphicsMode ThemeEngine::_defaultRendererMode =
#ifndef DISABLE_FANCY_THEMES
- ThemeEngine::kGfxAntialias16bit;
+ ThemeEngine::kGfxAntialias;
#else
- ThemeEngine::kGfxStandard16bit;
+ ThemeEngine::kGfxStandard;
#endif
ThemeEngine::GraphicsMode ThemeEngine::findMode(const Common::String &cfg) {
@@ -381,7 +389,7 @@ bool ThemeEngine::init() {
_overlayFormat = _system->getOverlayFormat();
setGraphicsMode(_graphicsMode);
- if (_screen.pixels && _backBuffer.pixels) {
+ if (_screen.getPixels() && _backBuffer.getPixels()) {
_initOk = true;
}
@@ -431,7 +439,7 @@ bool ThemeEngine::init() {
void ThemeEngine::clearAll() {
if (_initOk) {
_system->clearOverlay();
- _system->grabOverlay(_screen.pixels, _screen.pitch);
+ _system->grabOverlay(_screen.getPixels(), _screen.pitch);
}
}
@@ -465,11 +473,7 @@ void ThemeEngine::enable() {
if (_enabled)
return;
- if (_useCursor) {
- CursorMan.pushCursorPalette(_cursorPal, 0, _cursorPalSize);
- CursorMan.pushCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY, 255, true);
- CursorMan.showMouse(true);
- }
+ showCursor();
_system->showOverlay();
clearAll();
@@ -482,23 +486,25 @@ void ThemeEngine::disable() {
_system->hideOverlay();
- if (_useCursor) {
- CursorMan.popCursorPalette();
- CursorMan.popCursor();
- }
+ hideCursor();
+
_enabled = false;
}
void ThemeEngine::setGraphicsMode(GraphicsMode mode) {
switch (mode) {
- case kGfxStandard16bit:
+ case kGfxStandard:
#ifndef DISABLE_FANCY_THEMES
- case kGfxAntialias16bit:
+ case kGfxAntialias:
#endif
- _bytesPerPixel = sizeof(uint16);
- break;
-
+ if (g_system->getOverlayFormat().bytesPerPixel == 4) {
+ _bytesPerPixel = sizeof(uint32);
+ break;
+ } else if (g_system->getOverlayFormat().bytesPerPixel == 2) {
+ _bytesPerPixel = sizeof(uint16);
+ break;
+ }
default:
error("Invalid graphics mode");
}
@@ -1217,7 +1223,7 @@ void ThemeEngine::updateScreen(bool render) {
}
_vectorRenderer->setSurface(&_screen);
- memcpy(_screen.getBasePtr(0, 0), _backBuffer.getBasePtr(0, 0), _screen.pitch * _screen.h);
+ memcpy(_screen.getPixels(), _backBuffer.getPixels(), _screen.pitch * _screen.h);
_bufferQueue.clear();
}
@@ -1285,7 +1291,7 @@ void ThemeEngine::openDialog(bool doBuffer, ShadingStyle style) {
addDirtyRect(Common::Rect(0, 0, _screen.w, _screen.h));
}
- memcpy(_backBuffer.getBasePtr(0, 0), _screen.getBasePtr(0, 0), _screen.pitch * _screen.h);
+ memcpy(_backBuffer.getPixels(), _screen.getPixels(), _screen.pitch * _screen.h);
_vectorRenderer->setSurface(&_screen);
}
@@ -1318,22 +1324,31 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
memset(_cursor, 0xFF, sizeof(byte) * _cursorWidth * _cursorHeight);
// the transparent color is 0xFF00FF
- const int colTransparent = _overlayFormat.RGBToColor(0xFF, 0, 0xFF);
+ const uint32 colTransparent = _overlayFormat.RGBToColor(0xFF, 0, 0xFF);
// Now, scan the bitmap. We have to convert it from 16 bit color mode
// to 8 bit mode, and have to create a suitable palette on the fly.
uint colorsFound = 0;
Common::HashMap<int, int> colorToIndex;
- const OverlayColor *src = (const OverlayColor *)cursor->pixels;
+ const byte *src = (const byte *)cursor->getPixels();
for (uint y = 0; y < _cursorHeight; ++y) {
for (uint x = 0; x < _cursorWidth; ++x) {
+ uint32 color = colTransparent;
byte r, g, b;
+ if (cursor->format.bytesPerPixel == 2) {
+ color = READ_UINT16(src);
+ } else if (cursor->format.bytesPerPixel == 4) {
+ color = READ_UINT32(src);
+ }
+
+ src += cursor->format.bytesPerPixel;
+
// Skip transparency
- if (src[x] == colTransparent)
+ if (color == colTransparent)
continue;
- _overlayFormat.colorToRGB(src[x], r, g, b);
+ cursor->format.colorToRGB(color, r, g, b);
const int col = (r << 16) | (g << 8) | b;
// If there is no entry yet for this color in the palette: Add one
@@ -1355,7 +1370,6 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
const int index = colorToIndex[col];
_cursor[y * _cursorWidth + x] = index;
}
- src += _cursorWidth;
}
_useCursor = true;
@@ -1787,5 +1801,20 @@ Common::String ThemeEngine::getThemeId(const Common::String &filename) {
}
}
+void ThemeEngine::showCursor() {
+ if (_useCursor) {
+ CursorMan.pushCursorPalette(_cursorPal, 0, _cursorPalSize);
+ CursorMan.pushCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY, 255, true);
+ CursorMan.showMouse(true);
+ }
+}
+
+void ThemeEngine::hideCursor() {
+ if (_useCursor) {
+ CursorMan.popCursorPalette();
+ CursorMan.popCursor();
+ }
+}
+
} // End of namespace GUI.
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index 6e5fd291b7..c0e47a19e6 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -234,6 +234,14 @@ public:
static const char *const kImageDelbtn; ///< Delete characters in the predictive dialog
static const char *const kImageList; ///< List image used in save/load chooser selection
static const char *const kImageGrid; ///< Grid image used in save/load chooser selection
+ static const char *const kImageStopbtn; ///< Stop recording button in recorder onscreen dialog
+ static const char *const kImageEditbtn; ///< Edit recording metadata in recorder onscreen dialog
+ static const char *const kImageSwitchModebtn; ///< Switch mode button in recorder onscreen dialog
+ static const char *const kImageFastReplaybtn; ///< Fast playback mode button in recorder onscreen dialog
+ static const char *const kImageStopSmallbtn; ///< Stop recording button in recorder onscreen dialog (for 320xY)
+ static const char *const kImageEditSmallbtn; ///< Edit recording metadata in recorder onscreen dialog (for 320xY)
+ static const char *const kImageSwitchModeSmallbtn; ///< Switch mode button in recorder onscreen dialog (for 320xY)
+ static const char *const kImageFastReplaySmallbtn; ///< Fast playback mode button in recorder onscreen dialog (for 320xY)
/**
* Graphics mode enumeration.
@@ -242,8 +250,8 @@ public:
*/
enum GraphicsMode {
kGfxDisabled = 0, ///< No GFX
- kGfxStandard16bit, ///< 2BPP with the standard (aliased) renderer.
- kGfxAntialias16bit ///< 2BPP with the optimized AA renderer.
+ kGfxStandard, ///< Standard (aliased) renderer.
+ kGfxAntialias ///< Optimized AA renderer.
};
/** Constant value to expand dirty rectangles, to make sure they are fully copied */
@@ -275,8 +283,13 @@ public:
void refresh();
void enable();
+
+ void showCursor();
+ void hideCursor();
+
void disable();
+
/**
* Query the set up pixel format.
*/
diff --git a/gui/about.cpp b/gui/about.cpp
index 088971f273..20145886c6 100644
--- a/gui/about.cpp
+++ b/gui/about.cpp
@@ -46,7 +46,7 @@ enum {
// 0 - 2 -- set a custom color:
// 0 normal text
// 1 highlighted text
-// 2 disabled text
+// 2 disabled text
// TODO: Maybe add a tab/indent feature; that is, make it possible to specify
// an amount by which that line shall be indented (the indent of course would have
// to be considered while performing any word wrapping, too).
@@ -139,7 +139,7 @@ void AboutDialog::addLine(const char *str) {
} else {
Common::String format(str, 2);
str += 2;
-
+
static Common::String asciiStr;
if (format[0] == 'A') {
bool useAscii = false;
diff --git a/gui/chooser.cpp b/gui/chooser.cpp
index 6ae08161df..c195e94c9b 100644
--- a/gui/chooser.cpp
+++ b/gui/chooser.cpp
@@ -67,6 +67,7 @@ void ChooserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data
break;
case kCloseCmd:
setResult(-1);
+ // Fall through
default:
Dialog::handleCommand(sender, cmd, data);
}
diff --git a/gui/credits.h b/gui/credits.h
index 81d46b2b73..70f79ac9a5 100644
--- a/gui/credits.h
+++ b/gui/credits.h
@@ -294,9 +294,6 @@ static const char *credits[] = {
"C0""Andre Heider",
"C0""Angus Lees",
"",
-"C1""BADA",
-"C0""Chris Warren-Smith",
-"",
"C1""Dreamcast",
"C0""Marcus Comstedt",
"",
@@ -352,6 +349,9 @@ static const char *credits[] = {
"C0""Jurgen Braam",
"C0""Lars Persson",
"",
+"C1""Tizen / BADA",
+"C0""Chris Warren-Smith",
+"",
"C1""WebOS",
"C0""Klaus Reimer",
"",
diff --git a/gui/dialog.h b/gui/dialog.h
index 1773c6633e..d269a2f645 100644
--- a/gui/dialog.h
+++ b/gui/dialog.h
@@ -37,6 +37,8 @@ struct Event;
namespace GUI {
+class EventRecorder;
+
class Widget;
// Some "common" commands sent to handleCommand()
@@ -47,6 +49,7 @@ enum {
class Dialog : public GuiObject {
friend class GuiManager;
+ friend class EventRecorder;
friend class Tooltip;
protected:
Widget *_mouseWidget;
diff --git a/gui/editrecorddialog.cpp b/gui/editrecorddialog.cpp
new file mode 100644
index 0000000000..cfcc747121
--- /dev/null
+++ b/gui/editrecorddialog.cpp
@@ -0,0 +1,87 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "editrecorddialog.h"
+#include "gui/widgets/edittext.h"
+#include "common/translation.h"
+
+
+namespace GUI {
+
+const Common::String EditRecordDialog::getAuthor() {
+ return _authorEdit->getEditString();
+}
+
+void EditRecordDialog::setAuthor(const Common::String &author) {
+ _authorEdit->setEditString(author);
+}
+
+const Common::String EditRecordDialog::getNotes() {
+ return _notesEdit->getEditString();
+}
+
+void EditRecordDialog::setNotes(const Common::String &desc) {
+ _notesEdit->setEditString(desc);
+}
+
+const Common::String EditRecordDialog::getName() {
+ return _nameEdit->getEditString();
+}
+
+void EditRecordDialog::setName(const Common::String &name) {
+ _nameEdit->setEditString(name);
+}
+
+EditRecordDialog::~EditRecordDialog() {
+}
+
+EditRecordDialog::EditRecordDialog(const Common::String author, const Common::String name, const Common::String notes) : Dialog("EditRecordDialog") {
+ new StaticTextWidget(this,"EditRecordDialog.AuthorLabel",_("Author:"));
+ new StaticTextWidget(this,"EditRecordDialog.NameLabel",_("Name:"));
+ new StaticTextWidget(this,"EditRecordDialog.NotesLabel",_("Notes:"));
+ _authorEdit = new EditTextWidget(this, "EditRecordDialog.AuthorEdit","");
+ _notesEdit = new EditTextWidget(this, "EditRecordDialog.NotesEdit","");
+ _nameEdit = new EditTextWidget(this, "EditRecordDialog.NameEdit","");
+ _authorEdit->setEditString(author);
+ _notesEdit->setEditString(notes);
+ _nameEdit->setEditString(name);
+ new GUI::ButtonWidget(this, "EditRecordDialog.Cancel", _("Cancel"), 0, kCloseCmd);
+ new GUI::ButtonWidget(this, "EditRecordDialog.OK", _("Ok"), 0, kOKCmd);
+}
+
+void EditRecordDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
+ switch(cmd) {
+ case kCloseCmd:
+ setResult(kCloseCmd);
+ close();
+ break;
+ case kOKCmd:
+ setResult(kOKCmd);
+ close();
+ break;
+ default:
+ Dialog::handleCommand(sender, cmd, data);
+ break;
+ }
+}
+
+}
diff --git a/gui/editrecorddialog.h b/gui/editrecorddialog.h
new file mode 100644
index 0000000000..c8da4521ca
--- /dev/null
+++ b/gui/editrecorddialog.h
@@ -0,0 +1,56 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GUI_EDITRECORDDIALOG_H
+#define GUI_EDITRECORDDIALOG_H
+
+#include "gui/dialog.h"
+
+namespace GUI {
+
+class EditTextWidget;
+class StaticTextWidget;
+
+class EditRecordDialog : public Dialog {
+private:
+ EditTextWidget *_notesEdit;
+ EditTextWidget *_nameEdit;
+ EditTextWidget *_authorEdit;
+ EditRecordDialog() : Dialog("EditRecordDialog") {};
+public:
+ EditRecordDialog(const Common::String author, const Common::String name, const Common::String notes);
+ ~EditRecordDialog();
+
+ const Common::String getAuthor();
+ const Common::String getNotes();
+ const Common::String getName();
+
+ void setAuthor(const Common::String &author);
+ void setNotes(const Common::String &desc);
+ void setName(const Common::String &name);
+
+ virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
+};
+
+}// End of namespace GUI
+
+#endif
diff --git a/gui/gui-manager.cpp b/gui/gui-manager.cpp
index a0ef4216aa..1505c8c707 100644
--- a/gui/gui-manager.cpp
+++ b/gui/gui-manager.cpp
@@ -27,6 +27,7 @@
#include "common/rect.h"
#include "common/textconsole.h"
#include "common/translation.h"
+#include "gui/EventRecorder.h"
#include "backends/keymapper/keymapper.h"
@@ -253,12 +254,15 @@ Dialog *GuiManager::getTopDialog() const {
void GuiManager::runLoop() {
Dialog * const activeDialog = getTopDialog();
bool didSaveState = false;
- int button;
- uint32 time;
if (activeDialog == 0)
return;
+#ifdef ENABLE_EVENTRECORDER
+ // Suspend recording while GUI is shown
+ g_eventRec.suspendRecording();
+#endif
+
if (!_stateIsSaved) {
saveState();
_theme->enable();
@@ -296,10 +300,10 @@ void GuiManager::runLoop() {
// _theme->updateScreen();
// _system->updateScreen();
- if (lastRedraw + waitTime < _system->getMillis()) {
+ if (lastRedraw + waitTime < _system->getMillis(true)) {
_theme->updateScreen();
_system->updateScreen();
- lastRedraw = _system->getMillis();
+ lastRedraw = _system->getMillis(true);
}
Common::Event event;
@@ -314,72 +318,21 @@ void GuiManager::runLoop() {
if (activeDialog != getTopDialog() && event.type != Common::EVENT_SCREEN_CHANGED)
continue;
- Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y);
-
- switch (event.type) {
- case Common::EVENT_KEYDOWN:
- activeDialog->handleKeyDown(event.kbd);
- break;
- case Common::EVENT_KEYUP:
- activeDialog->handleKeyUp(event.kbd);
- break;
- case Common::EVENT_MOUSEMOVE:
- activeDialog->handleMouseMoved(mouse.x, mouse.y, 0);
-
- if (mouse.x != _lastMousePosition.x || mouse.y != _lastMousePosition.y) {
- _lastMousePosition.x = mouse.x;
- _lastMousePosition.y = mouse.y;
- _lastMousePosition.time = _system->getMillis();
- }
+ processEvent(event, activeDialog);
+ if (event.type == Common::EVENT_MOUSEMOVE) {
tooltipCheck = true;
- break;
- // We don't distinguish between mousebuttons (for now at least)
- case Common::EVENT_LBUTTONDOWN:
- case Common::EVENT_RBUTTONDOWN:
- button = (event.type == Common::EVENT_LBUTTONDOWN ? 1 : 2);
- time = _system->getMillis();
- if (_lastClick.count && (time < _lastClick.time + kDoubleClickDelay)
- && ABS(_lastClick.x - event.mouse.x) < 3
- && ABS(_lastClick.y - event.mouse.y) < 3) {
- _lastClick.count++;
- } else {
- _lastClick.x = event.mouse.x;
- _lastClick.y = event.mouse.y;
- _lastClick.count = 1;
- }
- _lastClick.time = time;
- activeDialog->handleMouseDown(mouse.x, mouse.y, button, _lastClick.count);
- break;
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_RBUTTONUP:
- button = (event.type == Common::EVENT_LBUTTONUP ? 1 : 2);
- activeDialog->handleMouseUp(mouse.x, mouse.y, button, _lastClick.count);
- break;
- case Common::EVENT_WHEELUP:
- activeDialog->handleMouseWheel(mouse.x, mouse.y, -1);
- break;
- case Common::EVENT_WHEELDOWN:
- activeDialog->handleMouseWheel(mouse.x, mouse.y, 1);
- break;
- case Common::EVENT_SCREEN_CHANGED:
- screenChange();
- break;
- default:
-#ifdef ENABLE_KEYMAPPER
- activeDialog->handleOtherEvent(event);
-#endif
- break;
}
- if (lastRedraw + waitTime < _system->getMillis()) {
+
+ if (lastRedraw + waitTime < _system->getMillis(true)) {
_theme->updateScreen();
_system->updateScreen();
- lastRedraw = _system->getMillis();
+ lastRedraw = _system->getMillis(true);
}
}
- if (tooltipCheck && _lastMousePosition.time + kTooltipDelay < _system->getMillis()) {
+ if (tooltipCheck && _lastMousePosition.time + kTooltipDelay < _system->getMillis(true)) {
Widget *wdg = activeDialog->findWidget(_lastMousePosition.x, _lastMousePosition.y);
if (wdg && wdg->hasTooltip() && !(wdg->getFlags() & WIDGET_PRESSED)) {
Tooltip *tooltip = new Tooltip();
@@ -409,6 +362,11 @@ void GuiManager::runLoop() {
restoreState();
_useStdCursor = false;
}
+
+#ifdef ENABLE_EVENTRECORDER
+ // Resume recording once GUI is shown
+ g_eventRec.resumeRecording();
+#endif
}
#pragma mark -
@@ -492,7 +450,7 @@ void GuiManager::setupCursor() {
// very much. We could plug in a different cursor here if we like to.
void GuiManager::animateCursor() {
- int time = _system->getMillis();
+ int time = _system->getMillis(true);
if (time > _cursorAnimateTimer + kCursorAnimateDelay) {
for (int i = 0; i < 15; i++) {
if ((i < 6) || (i > 8)) {
@@ -537,4 +495,64 @@ void GuiManager::screenChange() {
_system->updateScreen();
}
+void GuiManager::processEvent(const Common::Event &event, Dialog *const activeDialog) {
+ int button;
+ uint32 time;
+ Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y);
+ switch (event.type) {
+ case Common::EVENT_KEYDOWN:
+ activeDialog->handleKeyDown(event.kbd);
+ break;
+ case Common::EVENT_KEYUP:
+ activeDialog->handleKeyUp(event.kbd);
+ break;
+ case Common::EVENT_MOUSEMOVE:
+ activeDialog->handleMouseMoved(mouse.x, mouse.y, 0);
+
+ if (mouse.x != _lastMousePosition.x || mouse.y != _lastMousePosition.y) {
+ _lastMousePosition.x = mouse.x;
+ _lastMousePosition.y = mouse.y;
+ _lastMousePosition.time = _system->getMillis(true);
+ }
+
+ break;
+ // We don't distinguish between mousebuttons (for now at least)
+ case Common::EVENT_LBUTTONDOWN:
+ case Common::EVENT_RBUTTONDOWN:
+ button = (event.type == Common::EVENT_LBUTTONDOWN ? 1 : 2);
+ time = _system->getMillis(true);
+ if (_lastClick.count && (time < _lastClick.time + kDoubleClickDelay)
+ && ABS(_lastClick.x - event.mouse.x) < 3
+ && ABS(_lastClick.y - event.mouse.y) < 3) {
+ _lastClick.count++;
+ } else {
+ _lastClick.x = event.mouse.x;
+ _lastClick.y = event.mouse.y;
+ _lastClick.count = 1;
+ }
+ _lastClick.time = time;
+ activeDialog->handleMouseDown(mouse.x, mouse.y, button, _lastClick.count);
+ break;
+ case Common::EVENT_LBUTTONUP:
+ case Common::EVENT_RBUTTONUP:
+ button = (event.type == Common::EVENT_LBUTTONUP ? 1 : 2);
+ activeDialog->handleMouseUp(mouse.x, mouse.y, button, _lastClick.count);
+ break;
+ case Common::EVENT_WHEELUP:
+ activeDialog->handleMouseWheel(mouse.x, mouse.y, -1);
+ break;
+ case Common::EVENT_WHEELDOWN:
+ activeDialog->handleMouseWheel(mouse.x, mouse.y, 1);
+ break;
+ case Common::EVENT_SCREEN_CHANGED:
+ screenChange();
+ break;
+ default:
+ #ifdef ENABLE_KEYMAPPER
+ activeDialog->handleOtherEvent(event);
+ #endif
+ break;
+ }
+}
+
} // End of namespace GUI
diff --git a/gui/gui-manager.h b/gui/gui-manager.h
index 49542fd001..b52d91ba08 100644
--- a/gui/gui-manager.h
+++ b/gui/gui-manager.h
@@ -35,6 +35,10 @@ namespace Graphics {
class Font;
}
+namespace Common {
+ struct Event;
+}
+
namespace GUI {
class Dialog;
@@ -67,6 +71,8 @@ public:
// until no dialogs are active anymore.
void runLoop();
+ void processEvent(const Common::Event &event, Dialog *const activeDialog);
+
bool isActive() const { return ! _dialogStack.empty(); }
bool loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx = ThemeEngine::kGfxDisabled, bool force = false);
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index 4e35b54db8..77d4cce794 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -37,6 +37,11 @@
#include "gui/message.h"
#include "gui/gui-manager.h"
#include "gui/options.h"
+#ifdef ENABLE_EVENTRECORDER
+#include "gui/onscreendialog.h"
+#include "gui/recorderdialog.h"
+#include "gui/EventRecorder.h"
+#endif
#include "gui/saveload.h"
#include "gui/widgets/edittext.h"
#include "gui/widgets/list.h"
@@ -596,7 +601,6 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
LauncherDialog::LauncherDialog()
: Dialog(0, 0, 320, 200) {
_backgroundType = GUI::ThemeEngine::kDialogBackgroundMain;
-
const int screenW = g_system->getOverlayWidth();
const int screenH = g_system->getOverlayHeight();
@@ -779,10 +783,9 @@ void LauncherDialog::updateListing() {
}
void LauncherDialog::addGame() {
- int modifiers = g_system->getEventManager()->getModifierState();
#ifndef DISABLE_MASS_ADD
- const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0;
+ const bool massAdd = checkModifier(Common::KBD_SHIFT);
if (massAdd) {
MessageDialog alert(_("Do you really want to run the mass game detector? "
@@ -975,6 +978,49 @@ void LauncherDialog::editGame(int item) {
}
}
+void LauncherDialog::loadGameButtonPressed(int item) {
+#ifdef ENABLE_EVENTRECORDER
+ const bool shiftPressed = checkModifier(Common::KBD_SHIFT);
+ if (shiftPressed) {
+ recordGame(item);
+ } else {
+ loadGame(item);
+ }
+ updateButtons();
+#else
+ loadGame(item);
+#endif
+}
+
+#ifdef ENABLE_EVENTRECORDER
+void LauncherDialog::recordGame(int item) {
+ RecorderDialog recorderDialog;
+ MessageDialog alert(_("Do you want to load savegame?"),
+ _("Yes"), _("No"));
+ switch(recorderDialog.runModal(_domains[item])) {
+ case RecorderDialog::kRecordDialogClose:
+ break;
+ case RecorderDialog::kRecordDialogPlayback:
+ ConfMan.setActiveDomain(_domains[item]);
+ close();
+ ConfMan.set("record_mode", "playback", ConfigManager::kTransientDomain);
+ ConfMan.set("record_file_name", recorderDialog.getFileName(), ConfigManager::kTransientDomain);
+ break;
+ case RecorderDialog::kRecordDialogRecord:
+ ConfMan.setActiveDomain(_domains[item]);
+ if (alert.runModal() == GUI::kMessageOK) {
+ loadGame(item);
+ }
+ close();
+ g_eventRec.setAuthor(recorderDialog._author);
+ g_eventRec.setName(recorderDialog._name);
+ g_eventRec.setNotes(recorderDialog._notes);
+ ConfMan.set("record_mode", "record", ConfigManager::kTransientDomain);
+ break;
+ }
+}
+#endif
+
void LauncherDialog::loadGame(int item) {
String gameId = ConfMan.get("gameid", _domains[item]);
if (gameId.empty())
@@ -1039,7 +1085,7 @@ void LauncherDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat
editGame(item);
break;
case kLoadGameCmd:
- loadGame(item);
+ loadGameButtonPressed(item);
break;
case kOptionsCmd: {
GlobalOptionsDialog options;
@@ -1109,20 +1155,28 @@ void LauncherDialog::updateButtons() {
_loadButton->setEnabled(en);
_loadButton->draw();
}
+ switchButtonsText(_addButton, "~A~dd Game...", "Mass Add...");
+#ifdef ENABLE_EVENTRECORDER
+ switchButtonsText(_loadButton, "~L~oad...", "Record...");
+#endif
+}
- // Update the label of the "Add" button depending on whether shift is pressed or not
- int modifiers = g_system->getEventManager()->getModifierState();
- const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0;
+// Update the label of the button depending on whether shift is pressed or not
+void LauncherDialog::switchButtonsText(ButtonWidget *button, const char *normalText, const char *shiftedText) {
+ const bool shiftPressed = checkModifier(Common::KBD_SHIFT);
const bool lowRes = g_system->getOverlayWidth() <= 320;
- const char *newAddButtonLabel = massAdd
- ? (lowRes ? _c("Mass Add...", "lowres") : _("Mass Add..."))
- : (lowRes ? _c("~A~dd Game...", "lowres") : _("~A~dd Game..."));
+ const char *newAddButtonLabel = shiftPressed
+ ? (lowRes ? _c(shiftedText, "lowres") : _(shiftedText))
+ : (lowRes ? _c(normalText, "lowres") : _(normalText));
- if (_addButton->getLabel() != newAddButtonLabel)
- _addButton->setLabel(newAddButtonLabel);
+ if (button->getLabel() != newAddButtonLabel)
+ button->setLabel(newAddButtonLabel);
}
+
+
+
void LauncherDialog::reflowLayout() {
#ifndef DISABLE_FANCY_THEMES
if (g_gui.xmlEval()->getVar("Globals.ShowLauncherLogo") == 1 && g_gui.theme()->supportsImages()) {
@@ -1186,4 +1240,9 @@ void LauncherDialog::reflowLayout() {
Dialog::reflowLayout();
}
+bool LauncherDialog::checkModifier(int checkedModifier) {
+ int modifiers = g_system->getEventManager()->getModifierState();
+ return (modifiers & checkedModifier) != 0;
+}
+
} // End of namespace GUI
diff --git a/gui/launcher.h b/gui/launcher.h
index fc0484350a..2ab47be98d 100644
--- a/gui/launcher.h
+++ b/gui/launcher.h
@@ -56,7 +56,7 @@ protected:
ListWidget *_list;
ButtonWidget *_addButton;
Widget *_startButton;
- Widget *_loadButton;
+ ButtonWidget *_loadButton;
Widget *_editButton;
Widget *_removeButton;
#ifndef DISABLE_FANCY_THEMES
@@ -80,6 +80,7 @@ protected:
void updateListing();
void updateButtons();
+ void switchButtonsText(ButtonWidget *button, const char *normalText, const char *shiftedText);
void open();
void close();
@@ -100,6 +101,16 @@ protected:
void editGame(int item);
/**
+ * Facade for "Load..."/"Record..." buttons.
+ */
+ void loadGameButtonPressed(int item);
+
+ /**
+ * Handle "Record..." button.
+ */
+ void recordGame(int item);
+
+ /**
* Handle "Load..." button.
*/
void loadGame(int item);
@@ -111,6 +122,8 @@ protected:
* @target name of target to select
*/
void selectTarget(const String &target);
+private:
+ bool checkModifier(int modifier);
};
} // End of namespace GUI
diff --git a/gui/module.mk b/gui/module.mk
index bda3c88cd5..338e43c6a4 100644
--- a/gui/module.mk
+++ b/gui/module.mk
@@ -7,6 +7,7 @@ MODULE_OBJS := \
debugger.o \
dialog.o \
error.o \
+ EventRecorder.o \
gui-manager.o \
launcher.o \
massadd.o \
@@ -38,6 +39,13 @@ MODULE_OBJS += \
browser.o
endif
+ifdef ENABLE_EVENTRECORDER
+MODULE_OBJS += \
+ editrecorddialog.o \
+ onscreendialog.o \
+ recorderdialog.o
+endif
+
ifdef USE_FLUIDSYNTH
MODULE_OBJS += \
fluidsynth-dialog.o
diff --git a/gui/onscreendialog.cpp b/gui/onscreendialog.cpp
new file mode 100644
index 0000000000..03a6f26ec0
--- /dev/null
+++ b/gui/onscreendialog.cpp
@@ -0,0 +1,233 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+
+#include "gui/gui-manager.h"
+
+#include "gui/EventRecorder.h"
+
+#include "common/events.h"
+#include "common/rect.h"
+#include "common/translation.h"
+
+#include "graphics/cursorman.h"
+
+#include "gui/editrecorddialog.h"
+#include "gui/ThemeEval.h"
+
+#include "gui/onscreendialog.h"
+
+namespace GUI {
+
+bool OnScreenDialog::isVisible() const {
+ return true;
+}
+
+enum {
+ kStopCmd = 'STOP',
+ kEditCmd = 'EDIT',
+ kSwitchModeCmd = 'MODE',
+ kFastModeCmd = 'FAST'
+};
+
+void OnScreenDialog::reflowLayout() {
+ GuiObject::reflowLayout();
+}
+
+void OnScreenDialog::releaseFocus() {
+}
+
+OnScreenDialog::OnScreenDialog(bool isRecord) : Dialog("OnScreenDialog") {
+ _x = _y = 0;
+
+#ifndef DISABLE_FANCY_THEMES
+ if (g_gui.xmlEval()->getVar("Globals.OnScreenDialog.ShowPics") == 1 && g_gui.theme()->supportsImages()) {
+ GUI::PicButtonWidget *btn;
+ btn = new PicButtonWidget(this, "OnScreenDialog.StopButton", 0, kStopCmd, 0);
+ btn->useThemeTransparency(true);
+
+ if (g_system->getOverlayWidth() > 320)
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageStopbtn));
+ else
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageStopSmallbtn));
+
+ if (isRecord) {
+ btn = new PicButtonWidget(this, "OnScreenDialog.EditButton", 0, kEditCmd, 0);
+ btn->useThemeTransparency(true);
+
+ if (g_system->getOverlayWidth() > 320)
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageEditbtn));
+ else
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageEditSmallbtn));
+ } else {
+ btn = new PicButtonWidget(this, "OnScreenDialog.SwitchModeButton", 0, kSwitchModeCmd, 0);
+ btn->useThemeTransparency(true);
+ if (g_system->getOverlayWidth() > 320)
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageSwitchModebtn));
+ else
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageSwitchModeSmallbtn));
+
+ btn = new PicButtonWidget(this, "OnScreenDialog.FastReplayButton", 0, kFastModeCmd, 0);
+ btn->useThemeTransparency(true);
+ if (g_system->getOverlayWidth() > 320)
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageFastReplaybtn));
+ else
+ btn->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageFastReplaySmallbtn));
+ }
+ } else
+#endif
+ {
+ if (g_system->getOverlayWidth() > 320)
+ new ButtonWidget(this, "OnScreenDialog.StopButton", "[ ]", _("Stop"), kStopCmd);
+ else
+ new ButtonWidget(this, "OnScreenDialog.StopButton", "[]", _("Stop"), kStopCmd);
+
+ if (isRecord) {
+ new ButtonWidget(this, "OnScreenDialog.EditButton", "E", _("Edit record description"), kEditCmd);
+ } else {
+ new ButtonWidget(this, "OnScreenDialog.SwitchModeButton", "G", _("Switch to Game"), kSwitchModeCmd);
+
+ new ButtonWidget(this, "OnScreenDialog.FastReplayButton", ">>", _("Fast replay"), kFastModeCmd);
+ }
+ }
+
+
+ _text = new GUI::StaticTextWidget(this, "OnScreenDialog.TimeLabel", "00:00:00");
+ _enableDrag = false;
+ _mouseOver = false;
+ _editDlgShown = false;
+
+ _lastTime = 0;
+ _dlg = 0;
+}
+
+void OnScreenDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
+ Common::Event eventRTL;
+ switch (cmd) {
+ case kStopCmd:
+ eventRTL.type = Common::EVENT_RTL;
+ g_system->getEventManager()->pushEvent(eventRTL);
+ close();
+ break;
+ case kEditCmd:
+ _dlg = new EditRecordDialog(g_eventRec.getAuthor(), g_eventRec.getName(), g_eventRec.getNotes());
+ CursorMan.lock(false);
+ g_eventRec.setRedraw(false);
+ g_system->showOverlay();
+ _editDlgShown = true;
+ _dlg->runModal();
+ _editDlgShown = false;
+ g_system->hideOverlay();
+ g_eventRec.setRedraw(true);
+ CursorMan.lock(true);
+ g_eventRec.setAuthor(((EditRecordDialog *)_dlg)->getAuthor());
+ g_eventRec.setName(((EditRecordDialog *)_dlg)->getName());
+ g_eventRec.setNotes(((EditRecordDialog *)_dlg)->getNotes());
+ delete _dlg;
+ break;
+ case kSwitchModeCmd:
+ if (g_eventRec.switchMode()) {
+ close();
+ }
+ break;
+ case kFastModeCmd:
+ g_eventRec.switchFastMode();
+ break;
+ }
+}
+
+void OnScreenDialog::setReplayedTime(uint32 newTime) {
+ if (newTime - _lastTime > 1000) {
+ uint32 seconds = newTime / 1000;
+ _text->setLabel(Common::String::format("%.2d:%.2d:%.2d", seconds / 3600 % 24, seconds / 60 % 60, seconds % 60));
+ _lastTime = newTime;
+ }
+}
+
+OnScreenDialog::~OnScreenDialog() {
+}
+
+void OnScreenDialog::handleMouseMoved(int x, int y, int button) {
+ if (_enableDrag) {
+ _x = _x + x - _dragPoint.x;
+ _y = _y + y - _dragPoint.y;
+ }
+ Dialog::handleMouseMoved(x, y, button);
+ if (isMouseOver(x, y)) {
+ if (_mouseOver == false) {
+ g_gui.theme()->showCursor();
+ CursorMan.lock(true);
+ }
+ _mouseOver = true;
+ } else {
+ if (_mouseOver == true) {
+ CursorMan.lock(false);
+ g_gui.theme()->hideCursor();
+ }
+ _mouseOver = false;
+ }
+}
+
+void OnScreenDialog::handleMouseDown(int x, int y, int button, int clickCount) {
+ if (isMouseOver(x, y)) {
+ _dragPoint.x = x;
+ _dragPoint.y = y;
+ _enableDrag = true;
+ }
+ Dialog::handleMouseDown(x, y, button, clickCount);
+}
+
+void OnScreenDialog::handleMouseUp(int x, int y, int button, int clickCount) {
+ if (isMouseOver(x, y)) {
+
+ }
+ _enableDrag = false;
+ Dialog::handleMouseUp(x, y, button, clickCount);
+}
+
+bool OnScreenDialog::isMouseOver(int x, int y) {
+ return (x >= 0 && x < _w && y >= 0 && y < _h);
+}
+
+bool OnScreenDialog::isMouseOver() {
+ return _mouseOver;
+}
+
+void OnScreenDialog::close() {
+ CursorMan.lock(false);
+ Dialog::close();
+}
+
+Dialog *OnScreenDialog::getActiveDlg() {
+ if (_editDlgShown) {
+ return _dlg;
+ } else {
+ return this;
+ }
+}
+
+bool OnScreenDialog::isEditDlgVisible() {
+ return _editDlgShown;
+}
+
+}
diff --git a/gui/onscreendialog.h b/gui/onscreendialog.h
new file mode 100644
index 0000000000..2fae14cbc6
--- /dev/null
+++ b/gui/onscreendialog.h
@@ -0,0 +1,66 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GUI_ONSCREENDIALOG_H
+#define GUI_ONSCREENDIALOG_H
+
+#include "gui/dialog.h"
+#include "gui/widget.h"
+
+namespace GUI {
+
+class OnScreenDialog : public Dialog {
+private:
+ uint32 _lastTime;
+ bool _enableDrag;
+ bool _mouseOver;
+ bool _editDlgShown;
+ Common::Point _dragPoint;
+ GUI::StaticTextWidget *_text;
+ Dialog *_dlg;
+
+ bool isMouseOver(int x, int y);
+
+public:
+ OnScreenDialog(bool recordingMode);
+ ~OnScreenDialog();
+ virtual void close();
+ virtual bool isVisible() const;
+ virtual void reflowLayout();
+
+ void setReplayedTime(uint32 newTime);
+
+ virtual void handleMouseMoved(int x, int y, int button);
+ virtual void handleMouseDown(int x, int y, int button, int clickCount);
+ virtual void handleMouseUp(int x, int y, int button, int clickCount);
+ void handleCommand(CommandSender *sender, uint32 cmd, uint32 data);
+
+ bool isMouseOver();
+ bool isEditDlgVisible();
+ Dialog *getActiveDlg();
+protected:
+ virtual void releaseFocus();
+};
+
+} // End of namespace GUI
+
+#endif
diff --git a/gui/recorderdialog.cpp b/gui/recorderdialog.cpp
new file mode 100644
index 0000000000..1a11dbac65
--- /dev/null
+++ b/gui/recorderdialog.cpp
@@ -0,0 +1,298 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "common/algorithm.h"
+#include "common/bufferedstream.h"
+#include "common/savefile.h"
+#include "common/system.h"
+#include "graphics/colormasks.h"
+#include "graphics/palette.h"
+#include "graphics/scaler.h"
+#include "graphics/thumbnail.h"
+#include "common/translation.h"
+#include "gui/widgets/list.h"
+#include "gui/editrecorddialog.h"
+#include "gui/EventRecorder.h"
+#include "gui/message.h"
+#include "gui/saveload.h"
+#include "common/system.h"
+#include "gui/ThemeEval.h"
+#include "gui/gui-manager.h"
+#include "recorderdialog.h"
+
+#define MAX_RECORDS_NAMES 0xFF
+
+namespace GUI {
+
+enum {
+ kRecordCmd = 'RCRD',
+ kPlaybackCmd = 'PBCK',
+ kDeleteCmd = 'DEL ',
+ kNextScreenshotCmd = 'NEXT',
+ kPrevScreenshotCmd = 'PREV',
+ kEditRecordCmd = 'EDIT'
+};
+
+RecorderDialog::RecorderDialog() : Dialog("RecorderDialog"), _list(0), _currentScreenshot(0) {
+ _firstScreenshotUpdate = false;
+ _screenShotsCount = 0;
+ _currentScreenshotText = 0;
+ _authorText = 0;
+ _notesText = 0;
+
+ _backgroundType = ThemeEngine::kDialogBackgroundSpecial;
+
+ new StaticTextWidget(this, "SaveLoadChooser.Title", _("Recorder or Playback Gameplay"));
+
+ _list = new GUI::ListWidget(this, "RecorderDialog.List");
+ _list->setNumberingMode(GUI::kListNumberingOff);
+
+ _deleteButton = new GUI::ButtonWidget(this, "RecorderDialog.Delete", _("Delete"), 0, kDeleteCmd);
+ new GUI::ButtonWidget(this, "RecorderDialog.Cancel", _("Cancel"), 0, kCloseCmd);
+ new GUI::ButtonWidget(this, "RecorderDialog.Record", _("Record"), 0, kRecordCmd);
+ _playbackButton = new GUI::ButtonWidget(this, "RecorderDialog.Playback", _("Playback"), 0, kPlaybackCmd);
+
+ _editButton = new GUI::ButtonWidget(this, "RecorderDialog.Edit", _("Edit"), 0, kEditRecordCmd);
+
+ _editButton->setEnabled(false);
+ _deleteButton->setEnabled(false);
+ _playbackButton->setEnabled(false);
+
+ _gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10);
+ _container = new GUI::ContainerWidget(this, 0, 0, 10, 10);
+ if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") == 1) {
+ new GUI::ButtonWidget(this,"RecorderDialog.NextScreenShotButton", "<", 0, kPrevScreenshotCmd);
+ new GUI::ButtonWidget(this, "RecorderDialog.PreviousScreenShotButton", ">", 0, kNextScreenshotCmd);
+ _currentScreenshotText = new StaticTextWidget(this, "RecorderDialog.currentScreenshot", "0/0");
+ _authorText = new StaticTextWidget(this, "RecorderDialog.Author", _("Author: "));
+ _notesText = new StaticTextWidget(this, "RecorderDialog.Notes", _("Notes: "));
+ }
+ if (_gfxWidget)
+ _gfxWidget->setGfx(0);
+}
+
+
+void RecorderDialog::reflowLayout() {
+ if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") == 1) {
+ int16 x, y;
+ uint16 w, h;
+
+ if (!g_gui.xmlEval()->getWidgetData("RecorderDialog.Thumbnail", x, y, w, h)) {
+ error("Error when loading position data for Recorder Thumbnails");
+ }
+
+ int thumbW = kThumbnailWidth;
+ int thumbH = kThumbnailHeight2;
+ int thumbX = x + (w >> 1) - (thumbW >> 1);
+ int thumbY = y + kLineHeight;
+
+ _container->resize(x, y, w, h);
+ _gfxWidget->resize(thumbX, thumbY, thumbW, thumbH);
+
+ _container->setVisible(true);
+ _gfxWidget->setVisible(true);
+ updateSelection(false);
+ } else {
+ _container->setVisible(false);
+ _gfxWidget->setVisible(false);
+ }
+ Dialog::reflowLayout();
+}
+
+
+
+void RecorderDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
+ switch(cmd) {
+ case kEditRecordCmd: {
+ if (_list->getSelected() >= 0) {
+ EditRecordDialog editDlg(_fileHeaders[_list->getSelected()].author, _fileHeaders[_list->getSelected()].name, _fileHeaders[_list->getSelected()].notes);
+ if (editDlg.runModal() != kOKCmd) {
+ return;
+ }
+ _playbackFile.openRead(_fileHeaders[_list->getSelected()].fileName);
+ _playbackFile.getHeader().author = editDlg.getAuthor();
+ _playbackFile.getHeader().name = editDlg.getName();
+ _playbackFile.getHeader().notes = editDlg.getNotes();
+ _playbackFile.updateHeader();
+ _fileHeaders[_list->getSelected()] = _playbackFile.getHeader();
+ int oldselection = _list->getSelected();
+ updateList();
+ _list->setSelected(oldselection);
+ updateSelection(true);
+ _playbackFile.close();
+ }
+ }
+ break;
+ case kNextScreenshotCmd:
+ ++_currentScreenshot;
+ updateScreenshot();
+ break;
+ case kPrevScreenshotCmd:
+ --_currentScreenshot;
+ updateScreenshot();
+ break;
+ case kDeleteCmd:
+ if (_list->getSelected() >= 0) {
+ MessageDialog alert(_("Do you really want to delete this record?"),
+ _("Delete"), _("Cancel"));
+ if (alert.runModal() == GUI::kMessageOK) {
+ _playbackFile.close();
+ g_eventRec.deleteRecord(_fileHeaders[_list->getSelected()].fileName);
+ _list->setSelected(-1);
+ updateList();
+ }
+ }
+ break;
+ case GUI::kListSelectionChangedCmd:
+ updateSelection(true);
+ break;
+ case kRecordCmd: {
+ TimeDate t;
+ Common::String gameId = ConfMan.get("gameid", _target);
+ const EnginePlugin *plugin = 0;
+ GameDescriptor desc = EngineMan.findGame(gameId, &plugin);
+ g_system->getTimeAndDate(t);
+ EditRecordDialog editDlg("Unknown Author", Common::String::format("%.2d.%.2d.%.4d ", t.tm_mday, t.tm_mon, 1900 + t.tm_year) + desc.description(), "");
+ if (editDlg.runModal() != kOKCmd) {
+ return;
+ }
+ _author = editDlg.getAuthor();
+ _name = editDlg.getName();
+ _notes = editDlg.getNotes();
+ _filename = g_eventRec.generateRecordFileName(_target);
+ setResult(kRecordDialogRecord);
+ close();
+ }
+ break;
+ case kPlaybackCmd:
+ if (_list->getSelected() >= 0) {
+ _filename = _fileHeaders[_list->getSelected()].fileName;
+ setResult(kRecordDialogPlayback);
+ close();
+ }
+ break;
+ case kCloseCmd:
+ setResult(kRecordDialogClose);
+ // Fall through
+ default:
+ Dialog::handleCommand(sender, cmd, data);
+ }
+}
+
+void RecorderDialog::updateList() {
+ Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
+ Common::String pattern(_target+".r??");
+ Common::StringArray files = saveFileMan->listSavefiles(pattern);
+ Common::PlaybackFile file;
+ Common::StringArray namesList;
+ _fileHeaders.clear();
+ for (Common::StringArray::iterator i = files.begin(); i != files.end(); ++i) {
+ if (file.openRead(*i)) {
+ namesList.push_back(file.getHeader().name);
+ _fileHeaders.push_back(file.getHeader());
+ }
+ file.close();
+ }
+ _list->setList(namesList);
+ _list->draw();
+}
+
+int RecorderDialog::runModal(Common::String &target) {
+ _target = target;
+ updateList();
+ return Dialog::runModal();
+}
+
+RecorderDialog::~RecorderDialog() {
+}
+
+void RecorderDialog::updateSelection(bool redraw) {
+ if (_list->getSelected() >= 0) {
+ _editButton->setEnabled(true);
+ _deleteButton->setEnabled(true);
+ _playbackButton->setEnabled(true);
+ }
+
+ if (g_gui.xmlEval()->getVar("Globals.RecorderDialog.ExtInfo.Visible") != 1)
+ return;
+
+ _gfxWidget->setGfx(-1, -1, 0, 0, 0);
+ _screenShotsCount = 0;
+ _currentScreenshot = 0;
+ updateScreenShotsText();
+ if (_list->getSelected() >= 0) {
+ _authorText->setLabel(_("Author: ") + _fileHeaders[_list->getSelected()].author);
+ _notesText->setLabel(_("Notes: ") + _fileHeaders[_list->getSelected()].notes);
+
+ _firstScreenshotUpdate = true;
+ updateScreenshot();
+ if ((_screenShotsCount) > 0) {
+ _currentScreenshot = 1;
+ }
+ updateScreenshot();
+ } else {
+ _authorText->setLabel(_("Author: "));
+ _notesText->setLabel(_("Notes: "));
+ _screenShotsCount = -1;
+ _currentScreenshot = 0;
+ _gfxWidget->setGfx(-1, -1, 0, 0, 0);
+ _gfxWidget->draw();
+ updateScreenShotsText();
+ }
+}
+
+void RecorderDialog::updateScreenshot() {
+ if (_list->getSelected() == -1) {
+ return;
+ }
+ if (_currentScreenshot < 1) {
+ _currentScreenshot = _screenShotsCount;
+ }
+ if (_currentScreenshot > _screenShotsCount) {
+ _currentScreenshot = 1;
+ }
+ if (_firstScreenshotUpdate) {
+ _playbackFile.openRead(_fileHeaders[_list->getSelected()].fileName);
+ _screenShotsCount = _playbackFile.getScreensCount();
+ _firstScreenshotUpdate = false;
+ }
+ Graphics::Surface *srcsf = _playbackFile.getScreenShot(_currentScreenshot);
+ if (srcsf != NULL) {
+ Graphics::Surface *destsf = Graphics::scale(*srcsf, _gfxWidget->getWidth(), _gfxWidget->getHeight());
+ _gfxWidget->setGfx(destsf);
+ updateScreenShotsText();
+ delete destsf;
+ delete srcsf;
+ } else {
+ _gfxWidget->setGfx(-1, -1, 0, 0, 0);
+ }
+ _gfxWidget->draw();
+}
+
+void RecorderDialog::updateScreenShotsText() {
+ if (_screenShotsCount == -1) {
+ _currentScreenshotText->setLabel(Common::String::format("%d / ?", _currentScreenshot));
+ } else {
+ _currentScreenshotText->setLabel(Common::String::format("%d / %d", _currentScreenshot, _screenShotsCount));
+ }
+}
+
+} // End of namespace GUI
diff --git a/gui/recorderdialog.h b/gui/recorderdialog.h
new file mode 100644
index 0000000000..eb690a4f38
--- /dev/null
+++ b/gui/recorderdialog.h
@@ -0,0 +1,81 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GUI_RECORDER_DIALOG_H
+#define GUI_RECORDER_DIALOG_H
+#include "common/stream.h"
+#include "common/recorderfile.h"
+#include "gui/dialog.h"
+namespace GUI {
+
+class ListWidget;
+class GraphicsWidget;
+class ButtonWidget;
+class CommandSender;
+class ContainerWidget;
+class StaticTextWidget;
+
+class RecorderDialog : public GUI::Dialog {
+private:
+ bool _firstScreenshotUpdate;
+ Common::PlaybackFile _playbackFile;
+ Common::String _target;
+ Common::String _filename;
+ int _currentScreenshot;
+ int _screenShotsCount;
+ Common::Array<Common::PlaybackFile::PlaybackFileHeader> _fileHeaders;
+ GUI::ListWidget *_list;
+ GUI::ContainerWidget *_container;
+ GUI::GraphicsWidget *_gfxWidget;
+ GUI::StaticTextWidget *_currentScreenshotText;
+ GUI::StaticTextWidget *_authorText;
+ GUI::StaticTextWidget *_notesText;
+ GUI::ButtonWidget *_editButton;
+ GUI::ButtonWidget *_deleteButton;
+ GUI::ButtonWidget *_playbackButton;
+
+ void updateList();
+ void updateScreenShotsText();
+ void updateSelection(bool redraw);
+ void updateScreenshot();
+public:
+ Common::String _author;
+ Common::String _name;
+ Common::String _notes;
+ enum DialogResult {
+ kRecordDialogClose,
+ kRecordDialogRecord,
+ kRecordDialogPlayback
+ };
+ RecorderDialog();
+ ~RecorderDialog();
+
+ virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
+ virtual void reflowLayout();
+
+ int runModal(Common::String &target);
+ const Common::String getFileName() {return _filename;}
+};
+
+} // End of namespace GUI
+
+
+#endif
diff --git a/gui/saveload-dialog.cpp b/gui/saveload-dialog.cpp
index c7dd62b6c6..585117fba4 100644
--- a/gui/saveload-dialog.cpp
+++ b/gui/saveload-dialog.cpp
@@ -286,6 +286,7 @@ void SaveLoadChooserSimple::handleCommand(CommandSender *sender, uint32 cmd, uin
break;
case kCloseCmd:
setResult(-1);
+ // Fall through
default:
SaveLoadChooserDialog::handleCommand(sender, cmd, data);
}
@@ -595,6 +596,7 @@ void SaveLoadChooserGrid::handleCommand(CommandSender *sender, uint32 cmd, uint3
case kCloseCmd:
setResult(-1);
+ // Fall through
default:
SaveLoadChooserDialog::handleCommand(sender, cmd, data);
}
diff --git a/gui/themes/default.inc b/gui/themes/default.inc
index 6d8e6baac7..352cc86852 100644
--- a/gui/themes/default.inc
+++ b/gui/themes/default.inc
@@ -1,142 +1,142 @@
"<?xml version = '1.0'?>"
-"<render_info> "
-"<palette> "
+"<render_info>"
+"<palette>"
"<color name='black' "
"rgb='0,0,0' "
-"/> "
+"/>"
"<color name='lightgrey' "
"rgb='104,104,104' "
-"/> "
+"/>"
"<color name='darkgrey' "
"rgb='64,64,64' "
-"/> "
+"/>"
"<color name='green' "
"rgb='32,160,32' "
-"/> "
+"/>"
"<color name='green2' "
"rgb='0,255,0' "
-"/> "
-"</palette> "
-"<fonts> "
+"/>"
+"</palette>"
+"<fonts>"
"<font id='text_default' "
"file='helvb12.bdf' "
-"/> "
+"/>"
"<font resolution='y<400' "
"id='text_default' "
"file='clR6x12.bdf' "
-"/> "
+"/>"
"<font id='text_button' "
"file='helvb12.bdf' "
-"/> "
+"/>"
"<font resolution='y<400' "
"id='text_button' "
"file='clR6x12.bdf' "
-"/> "
+"/>"
"<font id='text_normal' "
"file='helvb12.bdf' "
-"/> "
+"/>"
"<font resolution='y<400' "
"id='text_normal' "
"file='clR6x12.bdf' "
-"/> "
+"/>"
"<font id='tooltip_normal' "
"file='fixed5x8.bdf' "
-"/> "
+"/>"
"<text_color id='color_normal' "
"color='green' "
-"/> "
+"/>"
"<text_color id='color_normal_inverted' "
"color='black' "
-"/> "
+"/>"
"<text_color id='color_normal_hover' "
"color='green2' "
-"/> "
+"/>"
"<text_color id='color_normal_disabled' "
"color='lightgrey' "
-"/> "
+"/>"
"<text_color id='color_alternative' "
"color='lightgrey' "
-"/> "
+"/>"
"<text_color id='color_alternative_inverted' "
"color='255,255,255' "
-"/> "
+"/>"
"<text_color id='color_alternative_hover' "
"color='176,176,176' "
-"/> "
+"/>"
"<text_color id='color_alternative_disabled' "
"color='darkgrey' "
-"/> "
+"/>"
"<text_color id='color_button' "
"color='green' "
-"/> "
+"/>"
"<text_color id='color_button_hover' "
"color='green2' "
-"/> "
+"/>"
"<text_color id='color_button_disabled' "
"color='lightgrey' "
-"/> "
-"</fonts> "
-"<defaults fill='foreground' fg_color='darkgrey' bg_color='black' shadow='0' bevel_color='lightgrey'/> "
-"<drawdata id='text_selection' cache='false'> "
+"/>"
+"</fonts>"
+"<defaults fill='foreground' fg_color='darkgrey' bg_color='black' shadow='0' bevel_color='lightgrey'/>"
+"<drawdata id='text_selection' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='lightgrey' "
-"/> "
-"</drawdata> "
-"<drawdata id='text_selection_focus' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='text_selection_focus' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='green' "
-"/> "
-"</drawdata> "
-"<drawdata id='mainmenu_bg' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='mainmenu_bg' cache='false'>"
"<drawstep func='fill' "
"fill='foreground' "
"fg_color='black' "
-"/> "
-"</drawdata> "
-"<drawdata id='special_bg' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='special_bg' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
-"/> "
-"</drawdata> "
-"<drawdata id='tooltip_bg' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='tooltip_bg' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='foreground' "
"fg_color='black' "
-"/> "
-"</drawdata> "
-"<drawdata id='separator' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='separator' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"height='2' "
"ypos='center' "
"fg_color='lightgrey' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_base' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_base' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_handle_hover' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_handle_hover' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='green2' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_handle_idle' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_handle_idle' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='green' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_button_idle' cache='false' resolution='y>399'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_button_idle' cache='false' resolution='y>399'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -146,13 +146,13 @@
"ypos='center' "
"padding='0,0,3,0' "
"orientation='top' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_button_idle' cache='false' resolution='y<400'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_button_idle' cache='false' resolution='y<400'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -162,13 +162,13 @@
"ypos='center' "
"padding='0,0,2,0' "
"orientation='top' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_button_hover' cache='false' resolution='y>399'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_button_hover' cache='false' resolution='y>399'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -178,13 +178,13 @@
"ypos='center' "
"padding='0,0,3,0' "
"orientation='top' "
-"/> "
-"</drawdata> "
-"<drawdata id='scrollbar_button_hover' cache='false' resolution='y<400'> "
+"/>"
+"</drawdata>"
+"<drawdata id='scrollbar_button_hover' cache='false' resolution='y<400'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -194,69 +194,69 @@
"ypos='center' "
"padding='0,0,2,0' "
"orientation='top' "
-"/> "
-"</drawdata> "
-"<drawdata id='tab_active' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='tab_active' cache='false'>"
"<text font='text_default' "
"text_color='color_normal_hover' "
"vertical_align='center' "
"horizontal_align='center' "
-"/> "
+"/>"
"<drawstep func='tab' "
"bevel='2' "
"radius='0' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='tab_inactive' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='tab_inactive' cache='false'>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='center' "
-"/> "
+"/>"
"<drawstep func='tab' "
"bevel='2' "
"radius='0' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='tab_background' cache='false'> "
-"</drawdata> "
-"<drawdata id='widget_slider' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='tab_background' cache='false'>"
+"</drawdata>"
+"<drawdata id='widget_slider' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='slider_disabled' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='slider_disabled' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='lightgrey' "
-"/> "
-"</drawdata> "
-"<drawdata id='slider_full' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='slider_full' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='green' "
-"/> "
-"</drawdata> "
-"<drawdata id='slider_hover' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='slider_hover' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='green2' "
-"/> "
-"</drawdata> "
-"<drawdata id='widget_small' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='widget_small' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='popup_idle' cache='false' resolution='y>399'> "
+"/>"
+"</drawdata>"
+"<drawdata id='popup_idle' cache='false' resolution='y>399'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -266,7 +266,7 @@
"ypos='10' "
"padding='0,0,7,0' "
"orientation='bottom' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -276,18 +276,18 @@
"ypos='4' "
"padding='0,0,7,0' "
"orientation='top' "
-"/> "
+"/>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
-"</drawdata> "
-"<drawdata id='popup_idle' cache='false' resolution='y<400'> "
+"/>"
+"</drawdata>"
+"<drawdata id='popup_idle' cache='false' resolution='y<400'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -297,7 +297,7 @@
"ypos='9' "
"padding='0,0,3,0' "
"orientation='bottom' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -307,18 +307,18 @@
"ypos='4' "
"padding='0,0,3,0' "
"orientation='top' "
-"/> "
+"/>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
-"</drawdata> "
-"<drawdata id='popup_disabled' cache='false' resolution='y>399'> "
+"/>"
+"</drawdata>"
+"<drawdata id='popup_disabled' cache='false' resolution='y>399'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -328,7 +328,7 @@
"ypos='10' "
"padding='0,0,7,0' "
"orientation='bottom' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -338,18 +338,18 @@
"ypos='4' "
"padding='0,0,7,0' "
"orientation='top' "
-"/> "
+"/>"
"<text font='text_default' "
"text_color='color_normal_disabled' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
-"</drawdata> "
-"<drawdata id='popup_disabled' cache='false' resolution='y<400'> "
+"/>"
+"</drawdata>"
+"<drawdata id='popup_disabled' cache='false' resolution='y<400'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -359,7 +359,7 @@
"ypos='9' "
"padding='0,0,3,0' "
"orientation='bottom' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -369,18 +369,18 @@
"ypos='4' "
"padding='0,0,3,0' "
"orientation='top' "
-"/> "
+"/>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
-"</drawdata> "
-"<drawdata id='popup_hover' cache='false' resolution='y>399'> "
+"/>"
+"</drawdata>"
+"<drawdata id='popup_hover' cache='false' resolution='y>399'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -390,7 +390,7 @@
"ypos='10' "
"padding='0,0,7,0' "
"orientation='bottom' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -400,18 +400,18 @@
"ypos='4' "
"padding='0,0,7,0' "
"orientation='top' "
-"/> "
+"/>"
"<text font='text_default' "
"text_color='color_normal_hover' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
-"</drawdata> "
-"<drawdata id='popup_hover' cache='false' resolution='y<400'> "
+"/>"
+"</drawdata>"
+"<drawdata id='popup_hover' cache='false' resolution='y<400'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -421,7 +421,7 @@
"ypos='9' "
"padding='0,0,3,0' "
"orientation='bottom' "
-"/> "
+"/>"
"<drawstep func='triangle' "
"fg_color='green' "
"fill='foreground' "
@@ -431,123 +431,123 @@
"ypos='4' "
"padding='0,0,3,0' "
"orientation='top' "
-"/> "
+"/>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
-"</drawdata> "
-"<drawdata id='widget_textedit' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='widget_textedit' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='plain_bg' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='plain_bg' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
-"/> "
-"</drawdata> "
-"<drawdata id='caret' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='caret' cache='false'>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='lightgrey' "
-"/> "
-"</drawdata> "
-"<drawdata id='default_bg' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='default_bg' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
-"/> "
-"</drawdata> "
-"<drawdata id='button_pressed' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='button_pressed' cache='false'>"
"<text font='text_button' "
"text_color='color_alternative_inverted' "
"vertical_align='center' "
"horizontal_align='center' "
-"/> "
+"/>"
"<drawstep func='square' "
"fill='foreground' "
"fg_color='green' "
-"/> "
-"</drawdata> "
-"<drawdata id='button_idle' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='button_idle' cache='false'>"
"<text font='text_button' "
"text_color='color_button' "
"vertical_align='center' "
"horizontal_align='center' "
-"/> "
+"/>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='button_hover' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='button_hover' cache='false'>"
"<text font='text_button' "
"text_color='color_button_hover' "
"vertical_align='center' "
"horizontal_align='center' "
-"/> "
+"/>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='button_disabled' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='button_disabled' cache='false'>"
"<text font='text_button' "
"text_color='color_button_disabled' "
"vertical_align='center' "
"horizontal_align='center' "
-"/> "
+"/>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='checkbox_disabled' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='checkbox_disabled' cache='false'>"
"<text font='text_default' "
"text_color='color_normal_disabled' "
"vertical_align='top' "
"horizontal_align='left' "
-"/> "
+"/>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='checkbox_selected' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='checkbox_selected' cache='false'>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='top' "
"horizontal_align='left' "
-"/> "
+"/>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
+"/>"
"<drawstep func='cross' "
"fill='foreground' "
"stroke='2' "
"fg_color='green' "
-"/> "
-"</drawdata> "
-"<drawdata id='checkbox_default' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='checkbox_default' cache='false'>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='top' "
"horizontal_align='left' "
-"/> "
+"/>"
"<drawstep func='bevelsq' "
"bevel='2' "
"fill='none' "
-"/> "
-"</drawdata> "
-"<drawdata id='radiobutton_default' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='radiobutton_default' cache='false'>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
+"/>"
"<drawstep func='circle' "
"width='7' "
"height='7' "
@@ -556,14 +556,14 @@
"bg_color='darkgrey' "
"xpos='0' "
"ypos='0' "
-"/> "
-"</drawdata> "
-"<drawdata id='radiobutton_selected' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='radiobutton_selected' cache='false'>"
"<text font='text_default' "
"text_color='color_normal' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
+"/>"
"<drawstep func='circle' "
"width='7' "
"height='7' "
@@ -572,7 +572,7 @@
"fill='none' "
"xpos='0' "
"ypos='0' "
-"/> "
+"/>"
"<drawstep func='circle' "
"width='7' "
"height='7' "
@@ -581,14 +581,14 @@
"fill='foreground' "
"xpos='2' "
"ypos='2' "
-"/> "
-"</drawdata> "
-"<drawdata id='radiobutton_disabled' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='radiobutton_disabled' cache='false'>"
"<text font='text_default' "
"text_color='color_normal_disabled' "
"vertical_align='center' "
"horizontal_align='left' "
-"/> "
+"/>"
"<drawstep func='circle' "
"width='7' "
"height='7' "
@@ -597,2286 +597,2510 @@
"fill='background' "
"xpos='0' "
"ypos='0' "
-"/> "
-"</drawdata> "
-"<drawdata id='widget_default' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='widget_default' cache='false'>"
"<drawstep func='bevelsq' "
"bevel='2' "
-"/> "
-"</drawdata> "
-"<drawdata id='widget_small' cache='false'> "
+"/>"
+"</drawdata>"
+"<drawdata id='widget_small' cache='false'>"
"<drawstep func='square' "
"stroke='0' "
-"/> "
-"</drawdata> "
-"</render_info> "
-"<layout_info resolution='y<400'> "
-"<globals> "
-"<def var='Line.Height' value='12' /> "
-"<def var='Font.Height' value='10' /> "
-"<def var='About.OuterBorder' value='10'/> "
-"<def var='Layout.Spacing' value='8'/> "
-"<def var='ShowLauncherLogo' value='0'/> "
-"<def var='ShowGlobalMenuLogo' value='0'/> "
-"<def var='ShowSearchPic' value='0'/> "
-"<def var='ShowChooserPics' value='0'/> "
-"<def var='ShowChooserPageDisplay' value='0'/> "
-"<def var='SaveLoadChooser.ExtInfo.Visible' value='0'/> "
-"<def var='KeyMapper.Spacing' value='5'/> "
-"<def var='KeyMapper.LabelWidth' value='80'/> "
-"<def var='KeyMapper.ButtonWidth' value='60'/> "
-"<def var='Tooltip.MaxWidth' value='70'/> "
-"<def var='Tooltip.XDelta' value='8'/> "
-"<def var='Tooltip.YDelta' value='8'/> "
-"<def var='Predictive.Button.Width' value='45' /> "
-"<def var='Predictive.Button.Height' value='15' /> "
-"<widget name='Button' "
-"size='72,16' "
-"/> "
-"<widget name='Slider' "
-"size='85,12' "
-"/> "
+"/>"
+"</drawdata>"
+"</render_info>"
+"<layout_info resolution='y>399'>"
+"<globals>"
+"<def var='Line.Height' value='16' />"
+"<def var='Font.Height' value='16' />"
+"<def var='About.OuterBorder' value='80'/>"
+"<def var='Layout.Spacing' value='8' />"
+"<def var='ShowLauncherLogo' value='0'/>"
+"<def var='ShowGlobalMenuLogo' value='0'/>"
+"<def var='ShowSearchPic' value='0'/>"
+"<def var='ShowChooserPics' value='0'/>"
+"<def var='ShowChooserPageDisplay' value='1'/>"
+"<def var='SaveLoadChooser.ExtInfo.Visible' value='1'/>"
+"<def var='RecorderDialog.ExtInfo.Visible' value='1'/>"
+"<def var='OnScreenDialog.ShowPics' value='0'/>"
+"<def var='KeyMapper.Spacing' value='10'/>"
+"<def var='KeyMapper.LabelWidth' value='100'/>"
+"<def var='KeyMapper.ButtonWidth' value='80'/>"
+"<def var='Tooltip.MaxWidth' value='200'/>"
+"<def var='Tooltip.XDelta' value='16'/> "
+"<def var='Tooltip.YDelta' value='16'/>"
+"<def var='Predictive.Button.Width' value='60' />"
"<widget name='OptionsLabel' "
"size='110,Globals.Line.Height' "
"textalign='right' "
-"/> "
+"/>"
"<widget name='SmallLabel' "
-"size='18,Globals.Line.Height' "
-"/> "
+"size='24,Globals.Line.Height' "
+"/>"
+"<widget name='ShortOptionsLabel' "
+"size='60,Globals.Line.Height' "
+"/>"
+"<widget name='Button' "
+"size='108,24' "
+"/>"
+"<widget name='Slider' "
+"size='128,18' "
+"/>"
"<widget name='PopUp' "
-"size='-1,15' "
-"/> "
+"size='-1,19' "
+"/>"
"<widget name='Checkbox' "
-"size='-1,Globals.Line.Height' "
-"/> "
+"size='-1,14' "
+"/>"
"<widget name='Radiobutton' "
"size='-1,Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ListWidget' "
-"padding='5,0,0,0' "
-"/> "
+"padding='5,0,8,0' "
+"/>"
"<widget name='PopUpWidget' "
"padding='7,5,0,0' "
-"/> "
+"/>"
"<widget name='EditTextWidget' "
"padding='5,5,0,0' "
-"/> "
+"/>"
"<widget name='Console' "
"padding='7,5,5,5' "
-"/> "
+"/>"
"<widget name='Scrollbar' "
-"size='9,0' "
-"/> "
+"size='15,0' "
+"/>"
"<widget name='TabWidget.Tab' "
-"size='45,16' "
-"padding='0,0,2,0' "
-"/> "
+"size='75,27' "
+"padding='0,0,8,0' "
+"/>"
"<widget name='TabWidget.Body' "
-"padding='0,0,0,-8' "
-"/> "
+"padding='0,0,0,0' "
+"/>"
"<widget name='TabWidget.NavButton' "
-"size='32,18' "
-"padding='0,0,1,0' "
-"/> "
-"</globals> "
-"<dialog name='Launcher' overlays='screen'> "
-"<layout type='vertical' center='true' padding='6,6,2,2'> "
+"size='15,18' "
+"padding='0,3,4,0' "
+"/>"
+"<widget name='EditRecordLabel' "
+"size='60,25' "
+"/>"
+"<widget name='EditRecord' "
+"size='240,25' "
+"/>"
+"</globals>"
+"<dialog name='Launcher' overlays='screen'>"
+"<layout type='vertical' center='true' padding='16,16,8,8'>"
"<widget name='Version' "
"height='Globals.Line.Height' "
"textalign='center' "
-"/> "
-"<layout type='horizontal' spacing='5' padding='0,0,0,0'> "
+"/>"
+"<layout type='horizontal' spacing='5' padding='10,0,0,0'>"
"<widget name='SearchDesc' "
-"width='50' "
+"width='60' "
"height='Globals.Line.Height' "
"textalign='right' "
-"/> "
+"/>"
"<widget name='Search' "
"width='150' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='SearchClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"<space /> "
-"</layout> "
-"<widget name='GameList'/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='8'> "
+"/>"
+"<space />"
+"</layout>"
+"<widget name='GameList'/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='LoadGameButton' "
-"height='12' "
-"/> "
+"height='20' "
+"/>"
"<widget name='AddGameButton' "
-"height='12' "
-"/> "
+"height='20' "
+"/>"
"<widget name='EditGameButton' "
-"height='12' "
-"/> "
+"height='20' "
+"/>"
"<widget name='RemoveGameButton' "
-"height='12' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='8'> "
+"height='20' "
+"/>"
+"</layout>"
+"<space size='4'/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='QuitButton' "
-"height='12' "
-"/> "
+"height='20' "
+"/>"
"<widget name='AboutButton' "
-"height='12' "
-"/> "
+"height='20' "
+"/>"
"<widget name='OptionsButton' "
-"height='12' "
-"/> "
+"height='20' "
+"/>"
"<widget name='StartButton' "
-"height='12' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='Browser' overlays='screen' inset='8' shading='dim'> "
-"<layout type='vertical' padding='8,8,0,4'> "
+"height='20' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='Browser' overlays='Dialog.Launcher.GameList' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8'>"
"<widget name='Headline' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Path' "
"height='Globals.Line.Height' "
-"/> "
-"<widget name='List'/> "
-"<layout type='vertical' padding='0,0,8,0'> "
+"/>"
+"<widget name='List'/>"
+"<layout type='vertical' padding='0,0,16,0'>"
"<widget name='Hidden' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='Up' "
"type='Button' "
-"/> "
-"<space/> "
+"/>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Choose' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions' overlays='screen' inset='16' shading='dim'> "
-"<layout type='vertical' padding='0,0,0,0'> "
-"<widget name='TabWidget'/> "
-"<layout type='horizontal' padding='8,8,8,8'> "
-"<space/> "
+"/>"
+"</layout>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions' overlays='Dialog.Launcher.GameList' shading='dim'>"
+"<layout type='vertical' padding='0,0,0,0'>"
+"<widget name='TabWidget'/>"
+"<layout type='horizontal' padding='16,16,16,16'>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='grModePopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='grModePopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='grRenderPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='grRenderPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='grAspectCheckbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='grFullscreenCheckbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='auMidiPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auMidiPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='auOPLPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auOPLPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='auSampleRatePopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auSampleRatePopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='3' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='subToggleDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='subToggleSpeechOnly' "
"type='Radiobutton' "
-"/> "
+"/>"
"<widget name='subToggleSubOnly' "
"type='Radiobutton' "
-"/> "
+"/>"
"<widget name='subToggleSubBoth' "
"type='Radiobutton' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='subSubtitleSpeedDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='horizontal' padding='16,16,16,16' spacing='8'>"
+"<layout type='vertical' padding='0,0,0,0' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='vcMusicText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcMusicSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcMusicLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='vcSfxText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSfxSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSfxLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='vcSpeechText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSpeechSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSpeechLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
-"<space size='110' /> "
+"/>"
+"</layout>"
+"</layout>"
+"<layout type='vertical' padding='24,0,24,0' center='true'>"
"<widget name='vcMuteCheckbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='6'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='auPrefGmPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auPrefGmPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='mcFontButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='mcFontPath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='mcFontClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='mcMixedCheckbox' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='mcMidiGainText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='mcMidiGainSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='mcMidiGainLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='mcFluidSynthSettings' "
-"width='150' "
+"width='200' "
"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='auPrefMt32PopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auPrefMt32Popup' "
"type='PopUp' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='mcMt32Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='mcGSCheckbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Paths' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Paths' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='SaveButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='SavePath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='SavePathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='ThemeButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='ThemePath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ThemePathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='ExtraButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='ExtraPath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ExtraPathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16'>"
"<widget name='PluginsButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='PluginsPath' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Misc' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Misc' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='ThemeButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='CurTheme' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='RendererPopupDesc' "
-"width='80' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='RendererPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='AutosavePeriodPopupDesc' "
-"width='80' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='AutosavePeriodPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='GuiLanguagePopupDesc' "
-"width='80' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='GuiLanguagePopup' "
"type='PopUp' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='KeysButton' "
"type='Button' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='KeysDialog' overlays='Dialog.GlobalOptions' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='KeysDialog' overlays='Dialog.GlobalOptions' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
"<widget name='Action' "
"height='Globals.Line.Height' "
-"/> "
-"<widget name='List'/> "
+"/>"
+"<widget name='List'/>"
"<widget name='Mapping' "
"height='Globals.Line.Height' "
-"/> "
-"<space size='Globals.Line.Height'/> "
-"<layout type='horizontal'> "
+"/>"
+"<space size='Globals.Line.Height'/>"
+"<layout type='horizontal'>"
"<widget name='Map' "
"type='Button' "
-"/> "
-"<space/> "
+"/>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions' overlays='screen' inset='16' shading='dim'> "
-"<layout type='vertical' padding='0,0,0,0' spacing='16'> "
-"<widget name='TabWidget'/> "
-"<layout type='horizontal' padding='8,8,8,8'> "
-"<space/> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions' overlays='Dialog.Launcher.GameList' shading='dim'>"
+"<layout type='vertical' padding='0,0,0,0' spacing='16'>"
+"<widget name='TabWidget'/>"
+"<layout type='horizontal' padding='16,16,16,4'>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_Graphics' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_Graphics' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_Audio' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_Audio' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_MIDI' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_MIDI' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_MT32' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_MT32' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_Volume' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Game' overlays='Dialog.GameOptions.TabWidget' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_Volume' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Game' overlays='Dialog.GameOptions.TabWidget' shading='dim'>"
+"<layout type='vertical' padding='16,16,16,16'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='Id' "
-"width='35' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='Domain' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='Name' "
-"width='35' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='Desc' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<space size='8'/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='LangPopupDesc' "
-"width='60' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='LangPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='PlatformPopupDesc' "
-"width='60' "
-"height='Globals.Line.Height' "
-"textalign='right' "
-"/> "
+"type='OptionsLabel' "
+"/>"
"<widget name='PlatformPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Paths' overlays='Dialog.GameOptions.TabWidget' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Paths' overlays='Dialog.GameOptions.TabWidget' shading='dim'>"
+"<layout type='vertical' padding='16,16,16,16'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='Savepath' "
"type='Button' "
-"/> "
+"/>"
"<widget name='SavepathText' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='SavePathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='Extrapath' "
"type='Button' "
-"/> "
+"/>"
"<widget name='ExtrapathText' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ExtraPathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='Gamepath' "
"type='Button' "
-"/> "
+"/>"
"<widget name='GamepathText' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Engine' overlays='Dialog.GameOptions.TabWidget' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Engine' overlays='Dialog.GameOptions.TabWidget' shading='dim'>"
+"<layout type='vertical' padding='16,16,16,16'>"
"<widget name='customOption1Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption2Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption3Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption4Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption5Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption6Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption7Checkbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalMenu' overlays='screen_center'> "
-"<layout type='vertical' padding='2,2,4,6' center='true' spacing='6'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalMenu' overlays='screen_center'>"
+"<layout type='vertical' padding='16,16,16,16' center='true'>"
"<widget name='Title' "
-"width='160' "
-"height='4' "
-"/> "
+"width='210' "
+"height='Globals.Line.Height' "
+"/>"
"<widget name='Version' "
-"width='160' "
-"height='4' "
-"/> "
-"<space size='1'/> "
+"width='210' "
+"height='Globals.Line.Height' "
+"/>"
+"<widget name='Resume' "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
+"<space size='10'/>"
"<widget name='Load' "
-"width='120' "
-"height='12' "
-"/> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Save' "
-"width='120' "
-"height='12' "
-"/> "
-"<space size='1'/> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
+"<space size='10'/>"
"<widget name='Options' "
-"width='120' "
-"height='12' "
-"/> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Help' "
-"width='120' "
-"height='12' "
-"/> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='About' "
-"width='120' "
-"height='12' "
-"/> "
-"<space size='1'/> "
-"<widget name='Resume' "
-"width='120' "
-"height='12' "
-"/> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
+"<space size='10'/>"
"<widget name='RTL' "
-"width='120' "
-"height='12' "
-"/> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Quit' "
-"width='120' "
-"height='12' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalConfig' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"width='150' "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalConfig' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8'>"
+"<layout type='horizontal' padding='0,0,0,0'>"
+"<layout type='vertical' padding='0,0,0,0' center='true'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='8'>"
"<widget name='vcMusicText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcMusicSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcMusicLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='8'>"
"<widget name='vcSfxText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSfxSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSfxLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='8'>"
"<widget name='vcSpeechText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSpeechSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSpeechLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
-"<space size='110' /> "
+"/>"
+"</layout>"
+"</layout>"
+"<layout type='vertical' padding='24,24,24,24' center='true'>"
"<widget name='vcMuteCheckbox' "
"type='Checkbox' "
-"width='80' "
-"/> "
-"</layout> "
-"<layout type='vertical' padding='0,0,0,0' spacing='1' center='true'> "
+"width='80' "
+"/>"
+"</layout>"
+"</layout>"
+"<space size='8' />"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='subToggleDesc' "
"type='OptionsLabel' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"/>"
"<widget name='subToggleSpeechOnly' "
"type='Radiobutton' "
-"width='90' "
-"/> "
+"width='100' "
+"/>"
"<widget name='subToggleSubOnly' "
"type='Radiobutton' "
-"width='90' "
-"/> "
+"width='100' "
+"/>"
"<widget name='subToggleSubBoth' "
"type='Radiobutton' "
-"width='90' "
-"/> "
-"</layout> "
-"</layout> "
-"<space size='2' /> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'> "
+"width='100' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='subSubtitleSpeedDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<space size='16'/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='4'> "
+"/>"
+"</layout>"
+"<space size='60'/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10'>"
"<widget name='Keys' "
"type='Button' "
-"/> "
-"<space size='Globals.Button.Width' /> "
+"/>"
+"<space size='Globals.Button.Width' />"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'> "
-"<layout type='vertical' padding='0,0,0,0'> "
-"<widget name='TabWidget'/> "
-"<layout type='horizontal' padding='8,8,8,8'> "
-"<space/> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'>"
+"<layout type='vertical' padding='0,0,0,0'>"
+"<widget name='TabWidget'/>"
+"<layout type='horizontal' padding='16,16,16,16'>"
+"<space/>"
"<widget name='ResetSettings' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings_Chorus' overlays='Dialog.FluidSynthSettings.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings_Chorus' overlays='Dialog.FluidSynthSettings.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='VoiceCountText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='VoiceCountSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='VoiceCountLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='LevelText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='LevelSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='LevelLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='SpeedText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='SpeedSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='SpeedLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='DepthText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='DepthSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='DepthLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='WaveFormTypeText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='WaveFormType' "
"type='PopUp' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings_Reverb' overlays='Dialog.FluidSynthSettings.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings_Reverb' overlays='Dialog.FluidSynthSettings.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='RoomSizeText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='RoomSizeSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='RoomSizeLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='DampingText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='DampingSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='DampingLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='WidthText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='WidthSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='WidthLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='LevelText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='LevelSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='LevelLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings_Misc' overlays='Dialog.FluidSynthSettings.TabWidget'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='6'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings_Misc' overlays='Dialog.FluidSynthSettings.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='InterpolationText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='Interpolation' "
"type='PopUp' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='SaveLoadChooser' overlays='screen' inset='8' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8' center='true'> "
-"<widget name='Title' height='Globals.Line.Height'/> "
-"<widget name='List' /> "
-"<layout type='horizontal' padding='0,0,16,0'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='SaveLoadChooser' overlays='screen' inset='8' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,32' center='true'>"
+"<layout type='horizontal' padding='0,0,0,0'>"
+"<widget name='Title' "
+"height='Globals.Line.Height' "
+"/>"
+"<space/>"
+"<widget name='PageDisplay' "
+"width='200' "
+"height='Globals.Line.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,16' spacing='16'>"
+"<widget name='List' />"
+"<widget name='Thumbnail' "
+"width='180' "
+"height='200' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='ListSwitch' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='GridSwitch' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"<space/> "
+"/>"
+"<space/>"
"<widget name='Delete' "
"type='Button' "
-"/> "
-"<space size='16'/> "
+"/>"
+"<space size='32'/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Choose' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='SavenameDialog' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='SavenameDialog' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8'>"
"<widget name='DescriptionText' "
-"width='180' "
+"width='320' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Description' "
"height='19' "
-"/> "
-"<layout type='horizontal' padding='0,0,16,0'> "
+"/>"
+"<layout type='horizontal' padding='0,0,16,0'>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
+"<space size='96'/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='ScummHelp' overlays='screen'> "
-"<layout type='vertical' padding='8,8,8,8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='RecorderDialog' overlays='screen' inset='8' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,32' center='true'>"
"<widget name='Title' "
+"height='Globals.Line.Height' "
+"/>"
+"<layout type='horizontal' padding='0,0,0,16' spacing='16'>"
+"<widget name='List' />"
+"<layout type='vertical' padding='0,0,0,0'>"
+"<widget name='Thumbnail' "
"width='180' "
+"height='170' "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0'>"
+"<widget name='NextScreenShotButton' "
+"width='25' "
+"height='25' "
+"/>"
+"<widget name='currentScreenshot' "
+"width='125' "
+"height='25' "
+"textalign='center' "
+"/>"
+"<widget name='PreviousScreenShotButton' "
+"width='25' "
+"height='25' "
+"/>"
+"</layout>"
+"<widget name='Author' height='Globals.Line.Height' />"
+"<widget name='Notes' height='Globals.Line.Height' />"
+"</layout>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0'>"
+"<widget name='Delete' "
+"type='Button' "
+"/>"
+"<space size='16'/>"
+"<widget name='Cancel' "
+"type='Button' "
+"/>"
+"<space size='16'/>"
+"<widget name='Edit' "
+"type='Button' "
+"/>"
+"<widget name='Record' "
+"type='Button' "
+"/>"
+"<widget name='Playback' "
+"type='Button' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='OnScreenDialog' overlays='screen_center'>"
+"<layout type='horizontal' spacing='5' padding='5,3,5,3' center='true'>"
+"<widget name='StopButton' "
+"width='32' "
+"height='32' "
+"/>"
+"<widget name='EditButton' "
+"width='32' "
+"height='32' "
+"/>"
+"<widget name='SwitchModeButton' "
+"width='32' "
+"height='32' "
+"/>"
+"<widget name='FastReplayButton' "
+"width='32' "
+"height='32' "
+"/>"
+"<widget name='TimeLabel' "
+"width='50' "
+"height='30' "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='EditRecordDialog' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
+"<widget name='Title' "
+"width='320' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='AuthorLabel' "
+"type='EditRecordLabel' "
+"/>"
+"<widget name='AuthorEdit' "
+"type='EditRecord' "
+"/>"
+"</layout>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='NameLabel' "
+"type='EditRecordLabel' "
+"/>"
+"<widget name='NameEdit' "
+"type='EditRecord' "
+"/>"
+"</layout>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='NotesLabel' "
+"type='EditRecordLabel' "
+"/>"
+"<widget name='NotesEdit' "
+"type='EditRecord' "
+"/>"
+"</layout>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='Cancel' "
+"type='Button' "
+"/>"
+"<widget name='OK' "
+"type='Button' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='ScummHelp' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
+"<widget name='Title' "
+"width='320' "
+"height='Globals.Line.Height' "
+"/>"
"<widget name='HelpText' "
-"height='140' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"height='200' "
+"/>"
+"<layout type='horizontal' padding='0,0,16,0'>"
"<widget name='Prev' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Next' "
"type='Button' "
-"/> "
-"<space size='32'/> "
+"/>"
+"<space size='32'/>"
"<widget name='Close' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='LoomTownsDifficultyDialog' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='LoomTownsDifficultyDialog' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
"<widget name='Description1' "
-"width='280' "
+"width='320' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Description2' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Standard' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Practice' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Expert' "
"type='Button' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='MassAdd' overlays='screen_center' shading='dim'> "
-"<layout type='vertical' padding='4,4,16,4' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='MassAdd' overlays='screen_center' shading='dim'>"
+"<layout type='vertical' padding='8,8,32,8' center='true'>"
"<widget name='DirProgressText' "
-"width='280' "
+"width='480' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='GameProgressText' "
-"width='280' "
+"width='480' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='GameList' "
-"width='280' "
-"height='100' "
-"/> "
-"<layout type='horizontal' padding='4,4,4,4'> "
+"width='480' "
+"height='250' "
+"/>"
+"<layout type='horizontal' padding='8,8,8,8'>"
"<widget name='Ok' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='KeyMapper' overlays='screen_center' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8' spacing='10' center='true'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='KeyMapper' overlays='screen_center' shading='dim'>"
+"<layout type='vertical' padding='8,8,32,8' spacing='10' center='true'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='PopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='Popup' "
"type='PopUp' "
-"width='150' "
+"width='400' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='KeymapArea' "
-"width='300' "
-"height='120' "
-"/> "
+"width='600' "
+"height='280' "
+"/>"
"<widget name='Close' "
"type='Button' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='Predictive' overlays='screen_center'> "
-"<layout type='vertical' padding='1,1,1,1' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='Predictive' overlays='screen_center'>"
+"<layout type='vertical' padding='5,5,5,5' center='true'>"
"<widget name='Headline' "
"height='Globals.Line.Height' "
-"width='150' "
+"width='210' "
"textalign='center' "
-"/> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"/>"
+"<layout type='horizontal' padding='5,5,5,5'>"
"<widget name='Word' "
-"width='120' "
+"width='190' "
"height='Globals.Button.Height' "
-"/> "
+"/>"
"<widget name='Delete' "
"width='20' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"<space size='5' />"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Button1' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button2' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button3' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Button4' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button5' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button6' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Button7' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button8' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button9' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,0'> "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Pre' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Button0' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='Next' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
-"</layout> "
-"<space size='3' /> "
-"<layout type='horizontal' padding='3,3,0,3'> "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"<space size='5' />"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Add' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
+"<space size='22'/>"
"<widget name='Cancel' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
+"height='Globals.Button.Height' "
+"/>"
"<widget name='OK' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Predictive.Button.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"</layout_info> "
-"<layout_info resolution='y>399'> "
-"<globals> "
-"<def var='Line.Height' value='16' /> "
-"<def var='Font.Height' value='16' /> "
-"<def var='About.OuterBorder' value='80'/> "
-"<def var='Layout.Spacing' value='8' /> "
-"<def var='ShowLauncherLogo' value='0'/> "
-"<def var='ShowGlobalMenuLogo' value='0'/> "
-"<def var='ShowSearchPic' value='0'/> "
-"<def var='ShowChooserPics' value='0'/> "
-"<def var='ShowChooserPageDisplay' value='1'/> "
-"<def var='SaveLoadChooser.ExtInfo.Visible' value='1'/> "
-"<def var='KeyMapper.Spacing' value='10'/> "
-"<def var='KeyMapper.LabelWidth' value='100'/> "
-"<def var='KeyMapper.ButtonWidth' value='80'/> "
-"<def var='Tooltip.MaxWidth' value='200'/> "
-"<def var='Tooltip.XDelta' value='16'/> "
-"<def var='Tooltip.YDelta' value='16'/> "
-"<def var='Predictive.Button.Width' value='60' /> "
+"height='Globals.Button.Height' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"</layout_info>"
+"<layout_info resolution='y<400'>"
+"<globals>"
+"<def var='Line.Height' value='12' />"
+"<def var='Font.Height' value='10' />"
+"<def var='About.OuterBorder' value='10'/>"
+"<def var='Layout.Spacing' value='8'/>"
+"<def var='ShowLauncherLogo' value='0'/>"
+"<def var='ShowGlobalMenuLogo' value='0'/>"
+"<def var='ShowSearchPic' value='0'/>"
+"<def var='ShowChooserPics' value='0'/>"
+"<def var='ShowChooserPageDisplay' value='0'/>"
+"<def var='SaveLoadChooser.ExtInfo.Visible' value='0'/>"
+"<def var='RecorderDialog.ExtInfo.Visible' value='0'/>"
+"<def var='OnScreenDialog.ShowPics' value='0'/>"
+"<def var='KeyMapper.Spacing' value='5'/>"
+"<def var='KeyMapper.LabelWidth' value='80'/>"
+"<def var='KeyMapper.ButtonWidth' value='60'/>"
+"<def var='Tooltip.MaxWidth' value='70'/>"
+"<def var='Tooltip.XDelta' value='8'/> "
+"<def var='Tooltip.YDelta' value='8'/>"
+"<def var='Predictive.Button.Width' value='45' />"
+"<def var='Predictive.Button.Height' value='15' />"
+"<widget name='Button' "
+"size='72,16' "
+"/>"
+"<widget name='Slider' "
+"size='85,12' "
+"/>"
"<widget name='OptionsLabel' "
"size='110,Globals.Line.Height' "
"textalign='right' "
-"/> "
+"/>"
"<widget name='SmallLabel' "
-"size='24,Globals.Line.Height' "
-"/> "
-"<widget name='ShortOptionsLabel' "
-"size='60,Globals.Line.Height' "
-"/> "
-"<widget name='Button' "
-"size='108,24' "
-"/> "
-"<widget name='Slider' "
-"size='128,18' "
-"/> "
+"size='18,Globals.Line.Height' "
+"/>"
"<widget name='PopUp' "
-"size='-1,19' "
-"/> "
+"size='-1,15' "
+"/>"
"<widget name='Checkbox' "
-"size='-1,14' "
-"/> "
+"size='-1,Globals.Line.Height' "
+"/>"
"<widget name='Radiobutton' "
"size='-1,Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ListWidget' "
-"padding='5,0,8,0' "
-"/> "
+"padding='5,0,0,0' "
+"/>"
"<widget name='PopUpWidget' "
"padding='7,5,0,0' "
-"/> "
+"/>"
"<widget name='EditTextWidget' "
"padding='5,5,0,0' "
-"/> "
+"/>"
"<widget name='Console' "
"padding='7,5,5,5' "
-"/> "
+"/>"
"<widget name='Scrollbar' "
-"size='15,0' "
-"/> "
+"size='9,0' "
+"/>"
"<widget name='TabWidget.Tab' "
-"size='75,27' "
-"padding='0,0,8,0' "
-"/> "
+"size='45,16' "
+"padding='0,0,2,0' "
+"/>"
"<widget name='TabWidget.Body' "
-"padding='0,0,0,0' "
-"/> "
+"padding='0,0,0,-8' "
+"/>"
"<widget name='TabWidget.NavButton' "
-"size='15,18' "
-"padding='0,3,4,0' "
-"/> "
-"</globals> "
-"<dialog name='Launcher' overlays='screen'> "
-"<layout type='vertical' center='true' padding='16,16,8,8'> "
+"size='32,18' "
+"padding='0,0,1,0' "
+"/>"
+"<widget name='EditRecordLabel' "
+"size='60,Globals.Line.Height' "
+"/>"
+"<widget name='EditRecord' "
+"size='120,15' "
+"/>"
+"</globals>"
+"<dialog name='Launcher' overlays='screen'>"
+"<layout type='vertical' center='true' padding='6,6,2,2'>"
"<widget name='Version' "
"height='Globals.Line.Height' "
"textalign='center' "
-"/> "
-"<layout type='horizontal' spacing='5' padding='10,0,0,0'> "
+"/>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,0'>"
"<widget name='SearchDesc' "
-"width='60' "
+"width='50' "
"height='Globals.Line.Height' "
"textalign='right' "
-"/> "
+"/>"
"<widget name='Search' "
"width='150' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='SearchClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"<space /> "
-"</layout> "
-"<widget name='GameList'/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"/>"
+"<space />"
+"</layout>"
+"<widget name='GameList'/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='8'>"
"<widget name='LoadGameButton' "
-"height='20' "
-"/> "
+"height='12' "
+"/>"
"<widget name='AddGameButton' "
-"height='20' "
-"/> "
+"height='12' "
+"/>"
"<widget name='EditGameButton' "
-"height='20' "
-"/> "
+"height='12' "
+"/>"
"<widget name='RemoveGameButton' "
-"height='20' "
-"/> "
-"</layout> "
-"<space size='4'/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"height='12' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='8'>"
"<widget name='QuitButton' "
-"height='20' "
-"/> "
+"height='12' "
+"/>"
"<widget name='AboutButton' "
-"height='20' "
-"/> "
+"height='12' "
+"/>"
"<widget name='OptionsButton' "
-"height='20' "
-"/> "
+"height='12' "
+"/>"
"<widget name='StartButton' "
-"height='20' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='Browser' overlays='Dialog.Launcher.GameList' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8'> "
+"height='12' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='Browser' overlays='screen' inset='8' shading='dim'>"
+"<layout type='vertical' padding='8,8,0,4'>"
"<widget name='Headline' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Path' "
"height='Globals.Line.Height' "
-"/> "
-"<widget name='List'/> "
-"<layout type='vertical' padding='0,0,16,0'> "
+"/>"
+"<widget name='List'/>"
+"<layout type='vertical' padding='0,0,8,0'>"
"<widget name='Hidden' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='Up' "
"type='Button' "
-"/> "
-"<space/> "
+"/>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Choose' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions' overlays='Dialog.Launcher.GameList' shading='dim'> "
-"<layout type='vertical' padding='0,0,0,0'> "
-"<widget name='TabWidget'/> "
-"<layout type='horizontal' padding='16,16,16,16'> "
-"<space/> "
+"/>"
+"</layout>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions' overlays='screen' inset='16' shading='dim'>"
+"<layout type='vertical' padding='0,0,0,0'>"
+"<widget name='TabWidget'/>"
+"<layout type='horizontal' padding='8,8,8,8'>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='grModePopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='grModePopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='grRenderPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='grRenderPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='grAspectCheckbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='grFullscreenCheckbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='auMidiPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auMidiPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='auOPLPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auOPLPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='auSampleRatePopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auSampleRatePopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='3' center='true'>"
"<widget name='subToggleDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='subToggleSpeechOnly' "
"type='Radiobutton' "
-"/> "
+"/>"
"<widget name='subToggleSubOnly' "
"type='Radiobutton' "
-"/> "
+"/>"
"<widget name='subToggleSubBoth' "
"type='Radiobutton' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='subSubtitleSpeedDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='horizontal' padding='16,16,16,16' spacing='8'> "
-"<layout type='vertical' padding='0,0,0,0' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='vcMusicText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcMusicSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcMusicLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='vcSfxText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSfxSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSfxLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='vcSpeechText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSpeechSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSpeechLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"</layout> "
-"<layout type='vertical' padding='24,0,24,0' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
+"<space size='110' />"
"<widget name='vcMuteCheckbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='6'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='auPrefGmPopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auPrefGmPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'>"
"<widget name='mcFontButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='mcFontPath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='mcFontClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='mcMixedCheckbox' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='mcMidiGainText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='mcMidiGainSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='mcMidiGainLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='mcFluidSynthSettings' "
-"width='200' "
+"width='150' "
"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='auPrefMt32PopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='auPrefMt32Popup' "
"type='PopUp' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='mcMt32Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='mcGSCheckbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Paths' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Paths' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16'>"
"<widget name='SaveButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='SavePath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='SavePathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16'>"
"<widget name='ThemeButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='ThemePath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ThemePathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16'>"
"<widget name='ExtraButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='ExtraPath' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ExtraPathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='16'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16'>"
"<widget name='PluginsButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='PluginsPath' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalOptions_Misc' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalOptions_Misc' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16'>"
"<widget name='ThemeButton' "
"type='Button' "
-"/> "
+"/>"
"<widget name='CurTheme' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='RendererPopupDesc' "
-"type='OptionsLabel' "
-"/> "
+"width='80' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='RendererPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='AutosavePeriodPopupDesc' "
-"type='OptionsLabel' "
-"/> "
+"width='80' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='AutosavePeriodPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='GuiLanguagePopupDesc' "
-"type='OptionsLabel' "
-"/> "
+"width='80' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='GuiLanguagePopup' "
"type='PopUp' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='KeysButton' "
"type='Button' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='KeysDialog' overlays='Dialog.GlobalOptions' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,8' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='KeysDialog' overlays='Dialog.GlobalOptions' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
"<widget name='Action' "
"height='Globals.Line.Height' "
-"/> "
-"<widget name='List'/> "
+"/>"
+"<widget name='List'/>"
"<widget name='Mapping' "
"height='Globals.Line.Height' "
-"/> "
-"<space size='Globals.Line.Height'/> "
-"<layout type='horizontal'> "
+"/>"
+"<space size='Globals.Line.Height'/>"
+"<layout type='horizontal'>"
"<widget name='Map' "
"type='Button' "
-"/> "
-"<space/> "
+"/>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions' overlays='Dialog.Launcher.GameList' shading='dim'> "
-"<layout type='vertical' padding='0,0,0,0' spacing='16'> "
-"<widget name='TabWidget'/> "
-"<layout type='horizontal' padding='16,16,16,4'> "
-"<space/> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions' overlays='screen' inset='16' shading='dim'>"
+"<layout type='vertical' padding='0,0,0,0' spacing='16'>"
+"<widget name='TabWidget'/>"
+"<layout type='horizontal' padding='8,8,8,8'>"
+"<space/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Graphics' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_Graphics' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_Graphics' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_Audio' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_Audio' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_MIDI' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_MIDI' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_MIDI' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_MT32' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_MT32' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_MT32' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Volume' overlays='Dialog.GlobalOptions.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<import layout='Dialog.GlobalOptions_Volume' /> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Game' overlays='Dialog.GameOptions.TabWidget' shading='dim'> "
-"<layout type='vertical' padding='16,16,16,16'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"<import layout='Dialog.GlobalOptions_Volume' />"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Game' overlays='Dialog.GameOptions.TabWidget' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='Id' "
-"type='OptionsLabel' "
-"/> "
+"width='35' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='Domain' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='Name' "
-"type='OptionsLabel' "
-"/> "
+"width='35' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='Desc' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<space size='8'/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='LangPopupDesc' "
-"type='OptionsLabel' "
-"/> "
+"width='60' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='LangPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='PlatformPopupDesc' "
-"type='OptionsLabel' "
-"/> "
+"width='60' "
+"height='Globals.Line.Height' "
+"textalign='right' "
+"/>"
"<widget name='PlatformPopup' "
"type='PopUp' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Paths' overlays='Dialog.GameOptions.TabWidget' shading='dim'> "
-"<layout type='vertical' padding='16,16,16,16'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Paths' overlays='Dialog.GameOptions.TabWidget' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'>"
"<widget name='Savepath' "
"type='Button' "
-"/> "
+"/>"
"<widget name='SavepathText' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='SavePathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'>"
"<widget name='Extrapath' "
"type='Button' "
-"/> "
+"/>"
"<widget name='ExtrapathText' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='ExtraPathClearButton' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='16' center='true'>"
"<widget name='Gamepath' "
"type='Button' "
-"/> "
+"/>"
"<widget name='GamepathText' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='GameOptions_Engine' overlays='Dialog.GameOptions.TabWidget' shading='dim'> "
-"<layout type='vertical' padding='16,16,16,16'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='GameOptions_Engine' overlays='Dialog.GameOptions.TabWidget' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8'>"
"<widget name='customOption1Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption2Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption3Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption4Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption5Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption6Checkbox' "
"type='Checkbox' "
-"/> "
+"/>"
"<widget name='customOption7Checkbox' "
"type='Checkbox' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalMenu' overlays='screen_center'> "
-"<layout type='vertical' padding='16,16,16,16' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalMenu' overlays='screen_center'>"
+"<layout type='vertical' padding='2,2,4,6' center='true' spacing='6'>"
"<widget name='Title' "
-"width='210' "
-"height='Globals.Line.Height' "
-"/> "
+"width='160' "
+"height='4' "
+"/>"
"<widget name='Version' "
-"width='210' "
-"height='Globals.Line.Height' "
-"/> "
-"<widget name='Resume' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
-"<space size='10'/> "
+"width='160' "
+"height='4' "
+"/>"
+"<space size='1'/>"
"<widget name='Load' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
+"width='120' "
+"height='12' "
+"/>"
"<widget name='Save' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
-"<space size='10'/> "
+"width='120' "
+"height='12' "
+"/>"
+"<space size='1'/>"
"<widget name='Options' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
+"width='120' "
+"height='12' "
+"/>"
"<widget name='Help' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
+"width='120' "
+"height='12' "
+"/>"
"<widget name='About' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
-"<space size='10'/> "
+"width='120' "
+"height='12' "
+"/>"
+"<space size='1'/>"
+"<widget name='Resume' "
+"width='120' "
+"height='12' "
+"/>"
"<widget name='RTL' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
+"width='120' "
+"height='12' "
+"/>"
"<widget name='Quit' "
-"width='150' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='GlobalConfig' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8'> "
-"<layout type='horizontal' padding='0,0,0,0'> "
-"<layout type='vertical' padding='0,0,0,0' center='true'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='8'> "
+"width='120' "
+"height='12' "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='GlobalConfig' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='vcMusicText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcMusicSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcMusicLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='8'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='vcSfxText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSfxSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSfxLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='8'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='vcSpeechText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='vcSpeechSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='vcSpeechLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"</layout> "
-"<layout type='vertical' padding='24,24,24,24' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
+"<space size='110' />"
"<widget name='vcMuteCheckbox' "
"type='Checkbox' "
-"width='80' "
-"/> "
-"</layout> "
-"</layout> "
-"<space size='8' /> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"width='80' "
+"/>"
+"</layout>"
+"<layout type='vertical' padding='0,0,0,0' spacing='1' center='true'>"
"<widget name='subToggleDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='subToggleSpeechOnly' "
"type='Radiobutton' "
-"width='100' "
-"/> "
+"width='90' "
+"/>"
"<widget name='subToggleSubOnly' "
"type='Radiobutton' "
-"width='100' "
-"/> "
+"width='90' "
+"/>"
"<widget name='subToggleSubBoth' "
"type='Radiobutton' "
-"width='100' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"width='90' "
+"/>"
+"</layout>"
+"</layout>"
+"<space size='2' />"
+"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
"<widget name='subSubtitleSpeedDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='subSubtitleSpeedLabel' "
"type='SmallLabel' "
-"/> "
-"</layout> "
-"<space size='60'/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10'> "
+"/>"
+"</layout>"
+"<space size='16'/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='4'>"
"<widget name='Keys' "
"type='Button' "
-"/> "
-"<space size='Globals.Button.Width' /> "
+"/>"
+"<space size='Globals.Button.Width' />"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'> "
-"<layout type='vertical' padding='0,0,0,0'> "
-"<widget name='TabWidget'/> "
-"<layout type='horizontal' padding='16,16,16,16'> "
-"<space/> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings' overlays='GlobalOptions' shading='dim'>"
+"<layout type='vertical' padding='0,0,0,0'>"
+"<widget name='TabWidget'/>"
+"<layout type='horizontal' padding='8,8,8,8'>"
+"<space/>"
"<widget name='ResetSettings' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings_Chorus' overlays='Dialog.FluidSynthSettings.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings_Chorus' overlays='Dialog.FluidSynthSettings.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='VoiceCountText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='VoiceCountSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='VoiceCountLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='LevelText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='LevelSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='LevelLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='SpeedText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='SpeedSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='SpeedLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='DepthText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='DepthSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='DepthLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='WaveFormTypeText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='WaveFormType' "
"type='PopUp' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings_Reverb' overlays='Dialog.FluidSynthSettings.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings_Reverb' overlays='Dialog.FluidSynthSettings.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
"<widget name='EnableTabCheckbox' "
"type='Checkbox' "
-"/> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='RoomSizeText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='RoomSizeSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='RoomSizeLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='DampingText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='DampingSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='DampingLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='WidthText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='WidthSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='WidthLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='LevelText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='LevelSlider' "
"type='Slider' "
-"/> "
+"/>"
"<widget name='LevelLabel' "
"width='32' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='FluidSynthSettings_Misc' overlays='Dialog.FluidSynthSettings.TabWidget'> "
-"<layout type='vertical' padding='16,16,16,16' spacing='8'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='FluidSynthSettings_Misc' overlays='Dialog.FluidSynthSettings.TabWidget'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='6'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='InterpolationText' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='Interpolation' "
"type='PopUp' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='SaveLoadChooser' overlays='screen' inset='8' shading='dim'> "
-"<layout type='vertical' padding='8,8,8,32' center='true'> "
-"<layout type='horizontal' padding='0,0,0,0'> "
-"<widget name='Title' "
-"height='Globals.Line.Height' "
-"/> "
-"<space/> "
-"<widget name='PageDisplay' "
-"width='200' "
-"height='Globals.Line.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,16' spacing='16'> "
-"<widget name='List' /> "
-"<widget name='Thumbnail' "
-"width='180' "
-"height='200' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='0,0,0,0'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='SaveLoadChooser' overlays='screen' inset='8' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
+"<widget name='Title' height='Globals.Line.Height'/>"
+"<widget name='List' />"
+"<layout type='horizontal' padding='0,0,16,0'>"
"<widget name='ListSwitch' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='GridSwitch' "
"height='Globals.Line.Height' "
"width='Globals.Line.Height' "
-"/> "
-"<space/> "
+"/>"
+"<space/>"
"<widget name='Delete' "
"type='Button' "
-"/> "
-"<space size='32'/> "
+"/>"
+"<space size='16'/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Choose' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='SavenameDialog' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='SavenameDialog' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8'>"
"<widget name='DescriptionText' "
-"width='320' "
+"width='180' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Description' "
"height='19' "
-"/> "
-"<layout type='horizontal' padding='0,0,16,0'> "
+"/>"
+"<layout type='horizontal' padding='0,0,16,0'>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
-"<space size='96'/> "
+"/>"
"<widget name='Ok' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='ScummHelp' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='RecorderDialog' overlays='screen' inset='8' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,4' center='true'>"
"<widget name='Title' "
-"width='320' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
+"<widget name='List' />"
+"<layout type='horizontal' padding='0,0,0,0' spacing='2'>"
+"<widget name='Edit' "
+"type='Button' "
+"/>"
+"<space />"
+"<widget name='Record' "
+"type='Button' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='2'>"
+"<widget name='Delete' "
+"type='Button' "
+"/>"
+"<space />"
+"<widget name='Cancel' "
+"type='Button' "
+"/>"
+"<widget name='Playback' "
+"type='Button' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='OnScreenDialog' overlays='screen_center'>"
+"<layout type='horizontal' spacing='5' padding='3,2,3,2' center='true'>"
+"<widget name='StopButton' "
+"width='16' "
+"height='16' "
+"/>"
+"<widget name='EditButton' "
+"width='16' "
+"height='16' "
+"/>"
+"<widget name='SwitchModeButton' "
+"width='16' "
+"height='16' "
+"/>"
+"<widget name='FastReplayButton' "
+"width='16' "
+"height='16' "
+"/>"
+"<widget name='TimeLabel' "
+"width='50' "
+"height='16' "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='EditRecordDialog' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
+"<widget name='Title' "
+"height='Globals.Line.Height' "
+"/>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='AuthorLabel' "
+"type='EditRecordLabel' "
+"/>"
+"<widget name='AuthorEdit' "
+"type='EditRecord' "
+"/>"
+"</layout>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='NameLabel' "
+"type='EditRecordLabel' "
+"/>"
+"<widget name='NameEdit' "
+"type='EditRecord' "
+"/>"
+"</layout>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,10'>"
+"<widget name='NotesLabel' "
+"type='EditRecordLabel' "
+"/>"
+"<widget name='NotesEdit' "
+"type='EditRecord' "
+"/>"
+"</layout>"
+"<layout type='horizontal' spacing='5' padding='0,0,0,0'>"
+"<widget name='Cancel' "
+"type='Button' "
+"/>"
+"<widget name='OK' "
+"type='Button' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='ScummHelp' overlays='screen'>"
+"<layout type='vertical' padding='8,8,8,8'>"
+"<widget name='Title' "
+"width='180' "
+"height='Globals.Line.Height' "
+"/>"
"<widget name='HelpText' "
-"height='200' "
-"/> "
-"<layout type='horizontal' padding='0,0,16,0'> "
+"height='140' "
+"/>"
+"<layout type='horizontal' padding='0,0,0,0'>"
"<widget name='Prev' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Next' "
"type='Button' "
-"/> "
-"<space size='32'/> "
+"/>"
+"<space size='32'/>"
"<widget name='Close' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='LoomTownsDifficultyDialog' overlays='screen_center'> "
-"<layout type='vertical' padding='8,8,8,8' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='LoomTownsDifficultyDialog' overlays='screen_center'>"
+"<layout type='vertical' padding='8,8,8,8' center='true'>"
"<widget name='Description1' "
-"width='320' "
+"width='280' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Description2' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='Standard' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Practice' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Expert' "
"type='Button' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='MassAdd' overlays='screen_center' shading='dim'> "
-"<layout type='vertical' padding='8,8,32,8' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='MassAdd' overlays='screen_center' shading='dim'>"
+"<layout type='vertical' padding='4,4,16,4' center='true'>"
"<widget name='DirProgressText' "
-"width='480' "
+"width='280' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='GameProgressText' "
-"width='480' "
+"width='280' "
"height='Globals.Line.Height' "
-"/> "
+"/>"
"<widget name='GameList' "
-"width='480' "
-"height='250' "
-"/> "
-"<layout type='horizontal' padding='8,8,8,8'> "
+"width='280' "
+"height='100' "
+"/>"
+"<layout type='horizontal' padding='4,4,4,4'>"
"<widget name='Ok' "
"type='Button' "
-"/> "
+"/>"
"<widget name='Cancel' "
"type='Button' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"<dialog name='KeyMapper' overlays='screen_center' shading='dim'> "
-"<layout type='vertical' padding='8,8,32,8' spacing='10' center='true'> "
-"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'> "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"<dialog name='KeyMapper' overlays='screen_center' shading='dim'>"
+"<layout type='vertical' padding='8,8,8,8' spacing='10' center='true'>"
+"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
"<widget name='PopupDesc' "
"type='OptionsLabel' "
-"/> "
+"/>"
"<widget name='Popup' "
"type='PopUp' "
-"width='400' "
+"width='150' "
"height='Globals.Line.Height' "
-"/> "
-"</layout> "
+"/>"
+"</layout>"
"<widget name='KeymapArea' "
-"width='600' "
-"height='280' "
-"/> "
+"width='300' "
+"height='120' "
+"/>"
"<widget name='Close' "
"type='Button' "
-"/> "
-"</layout> "
-"</dialog> "
-"<dialog name='Predictive' overlays='screen_center'> "
-"<layout type='vertical' padding='5,5,5,5' center='true'> "
+"/>"
+"</layout>"
+"</dialog>"
+"<dialog name='Predictive' overlays='screen_center'>"
+"<layout type='vertical' padding='1,1,1,1' center='true'>"
"<widget name='Headline' "
"height='Globals.Line.Height' "
-"width='210' "
+"width='150' "
"textalign='center' "
-"/> "
-"<layout type='horizontal' padding='5,5,5,5'> "
+"/>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Word' "
-"width='190' "
+"width='120' "
"height='Globals.Button.Height' "
-"/> "
+"/>"
"<widget name='Delete' "
"width='20' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"<space size='5' /> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Button1' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button2' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button3' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Button4' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button5' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button6' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,3'>"
"<widget name='Button7' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button8' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button9' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
+"</layout>"
+"<layout type='horizontal' padding='3,3,3,0'>"
"<widget name='Pre' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Button0' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Next' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"<space size='5' /> "
-"<layout type='horizontal' padding='3,3,3,3'> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
+"</layout>"
+"<space size='3' />"
+"<layout type='horizontal' padding='3,3,0,3'>"
"<widget name='Add' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
-"<space size='22'/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='Cancel' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
"<widget name='OK' "
"width='Globals.Predictive.Button.Width' "
-"height='Globals.Button.Height' "
-"/> "
-"</layout> "
-"</layout> "
-"</dialog> "
-"</layout_info> "
+"height='Globals.Predictive.Button.Height' "
+"/>"
+"</layout>"
+"</layout>"
+"</dialog>"
+"</layout_info>"
diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip
index 297ff20344..4154c6c33a 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 180e8fba74..5fd2d6f835 100644
--- a/gui/themes/scummclassic/classic_layout.stx
+++ b/gui/themes/scummclassic/classic_layout.stx
@@ -36,6 +36,9 @@
<def var = 'ShowChooserPageDisplay' value = '1'/>
<def var = 'SaveLoadChooser.ExtInfo.Visible' value = '1'/>
+ <def var = 'RecorderDialog.ExtInfo.Visible' value = '1'/>
+
+ <def var = 'OnScreenDialog.ShowPics' value = '0'/>
<def var = 'KeyMapper.Spacing' value = '10'/>
<def var = 'KeyMapper.LabelWidth' value = '100'/>
@@ -101,6 +104,12 @@
size = '15, 18'
padding = '0, 3, 4, 0'
/>
+ <widget name = 'EditRecordLabel'
+ size = '60, 25'
+ />
+ <widget name = 'EditRecord'
+ size = '240, 25'
+ />
</globals>
<dialog name = 'Launcher' overlays = 'screen'>
@@ -1019,6 +1028,125 @@
</layout>
</dialog>
+ <dialog name = 'RecorderDialog' overlays = 'screen' inset = '8' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 32' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 0, 16' spacing = '16'>
+ <widget name = 'List' />
+ <layout type = 'vertical' padding = '0, 0, 0, 0'>
+ <widget name = 'Thumbnail'
+ width = '180'
+ height = '170'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <widget name = 'NextScreenShotButton'
+ width = '25'
+ height = '25'
+ />
+ <widget name = 'currentScreenshot'
+ width = '125'
+ height = '25'
+ textalign = 'center'
+ />
+ <widget name = 'PreviousScreenShotButton'
+ width = '25'
+ height = '25'
+ />
+ </layout>
+ <widget name = 'Author' height = 'Globals.Line.Height' />
+ <widget name = 'Notes' height = 'Globals.Line.Height' />
+ </layout>
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <widget name = 'Delete'
+ type = 'Button'
+ />
+ <space size = '16'/>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <space size = '16'/>
+ <widget name = 'Edit'
+ type = 'Button'
+ />
+ <widget name = 'Record'
+ type = 'Button'
+ />
+ <widget name = 'Playback'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'OnScreenDialog' overlays = 'screen_center'>
+ <layout type = 'horizontal' spacing = '5' padding = '5, 3, 5, 3' center = 'true'>
+ <widget name = 'StopButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'EditButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'SwitchModeButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'FastReplayButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'TimeLabel'
+ width = '50'
+ height = '30'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'EditRecordDialog' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
+ <widget name = 'Title'
+ width = '320'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'AuthorLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'AuthorEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NameLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NameEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NotesLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NotesEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'OK'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
<dialog name = 'ScummHelp' overlays = 'screen_center'>
<layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
<widget name = 'Title'
diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx
index 8bb03dea17..802998df3c 100644
--- a/gui/themes/scummclassic/classic_layout_lowres.stx
+++ b/gui/themes/scummclassic/classic_layout_lowres.stx
@@ -37,6 +37,9 @@
<def var = 'ShowChooserPageDisplay' value = '0'/>
<def var = 'SaveLoadChooser.ExtInfo.Visible' value = '0'/>
+ <def var = 'RecorderDialog.ExtInfo.Visible' value = '0'/>
+
+ <def var = 'OnScreenDialog.ShowPics' value = '0'/>
<def var = 'KeyMapper.Spacing' value = '5'/>
<def var = 'KeyMapper.LabelWidth' value = '80'/>
@@ -99,6 +102,12 @@
size = '32, 18'
padding = '0, 0, 1, 0'
/>
+ <widget name = 'EditRecordLabel'
+ size = '60, Globals.Line.Height'
+ />
+ <widget name = 'EditRecord'
+ size = '120, 15'
+ />
</globals>
<dialog name = 'Launcher' overlays = 'screen'>
@@ -1013,6 +1022,101 @@
</layout>
</dialog>
+ <dialog name = 'RecorderDialog' overlays = 'screen' inset = '8' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 4' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'List' />
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '2'>
+ <widget name = 'Edit'
+ type = 'Button'
+ />
+ <space />
+ <widget name = 'Record'
+ type = 'Button'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '2'>
+ <widget name = 'Delete'
+ type = 'Button'
+ />
+ <space />
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Playback'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'OnScreenDialog' overlays = 'screen_center'>
+ <layout type = 'horizontal' spacing = '5' padding = '3, 2, 3, 2' center = 'true'>
+ <widget name = 'StopButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'EditButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'SwitchModeButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'FastReplayButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'TimeLabel'
+ width = '50'
+ height = '16'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'EditRecordDialog' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'AuthorLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'AuthorEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NameLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NameEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NotesLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NotesEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 0'>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'OK'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
<dialog name = 'ScummHelp' overlays = 'screen'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<widget name = 'Title'
diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip
index dbd84992e6..0f10003e94 100644
--- a/gui/themes/scummmodern.zip
+++ b/gui/themes/scummmodern.zip
Binary files differ
diff --git a/gui/themes/scummmodern/editbtn.bmp b/gui/themes/scummmodern/editbtn.bmp
new file mode 100644
index 0000000000..49eb4035b5
--- /dev/null
+++ b/gui/themes/scummmodern/editbtn.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/editbtn_small.bmp b/gui/themes/scummmodern/editbtn_small.bmp
new file mode 100644
index 0000000000..8a0357fc2e
--- /dev/null
+++ b/gui/themes/scummmodern/editbtn_small.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/fastreplay.bmp b/gui/themes/scummmodern/fastreplay.bmp
new file mode 100644
index 0000000000..35ad2b4444
--- /dev/null
+++ b/gui/themes/scummmodern/fastreplay.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/fastreplay_small.bmp b/gui/themes/scummmodern/fastreplay_small.bmp
new file mode 100644
index 0000000000..8ef004c3bf
--- /dev/null
+++ b/gui/themes/scummmodern/fastreplay_small.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/scummmodern_gfx.stx b/gui/themes/scummmodern/scummmodern_gfx.stx
index 4d449f50ec..1b3bcea0d6 100644
--- a/gui/themes/scummmodern/scummmodern_gfx.stx
+++ b/gui/themes/scummmodern/scummmodern_gfx.stx
@@ -103,6 +103,14 @@
<bitmap filename = 'delbtn.bmp'/>
<bitmap filename = 'list.bmp'/>
<bitmap filename = 'grid.bmp'/>
+ <bitmap filename = 'stopbtn.bmp'/>
+ <bitmap filename = 'editbtn.bmp'/>
+ <bitmap filename = 'switchbtn.bmp'/>
+ <bitmap filename = 'fastreplay.bmp'/>
+ <bitmap filename = 'stopbtn_small.bmp'/>
+ <bitmap filename = 'editbtn_small.bmp'/>
+ <bitmap filename = 'switchbtn_small.bmp'/>
+ <bitmap filename = 'fastreplay_small.bmp'/>
</bitmaps>
<fonts>
diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx
index 49c13cf1b0..b760e15919 100644
--- a/gui/themes/scummmodern/scummmodern_layout.stx
+++ b/gui/themes/scummmodern/scummmodern_layout.stx
@@ -43,6 +43,9 @@
<def var = 'ShowChooserPageDisplay' value = '1'/>
<def var = 'SaveLoadChooser.ExtInfo.Visible' value = '1'/>
+ <def var = 'RecorderDialog.ExtInfo.Visible' value = '1'/>
+
+ <def var = 'OnScreenDialog.ShowPics' value = '1'/>
<def var = 'KeyMapper.Spacing' value = '10'/>
<def var = 'KeyMapper.LabelWidth' value = '100'/>
@@ -106,6 +109,13 @@
size = '15, 18'
padding = '0, 3, 4, 0'
/>
+
+ <widget name = 'EditRecordLabel'
+ size = '60, 25'
+ />
+ <widget name = 'EditRecord'
+ size = '220, 25'
+ />
</globals>
<dialog name = 'Launcher' overlays = 'screen'>
@@ -1032,6 +1042,126 @@
</layout>
</dialog>
+ <dialog name = 'RecorderDialog' overlays = 'screen' inset = '8' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 32' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 0, 16' spacing = '16'>
+ <widget name = 'List' />
+ <layout type = 'vertical' padding = '0, 0, 0, 0'>
+ <widget name = 'Thumbnail'
+ width = '180'
+ height = '170'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <widget name = 'NextScreenShotButton'
+ width = '25'
+ height = '25'
+ />
+ <widget name = 'currentScreenshot'
+ width = '125'
+ height = '25'
+ textalign = 'center'
+ />
+ <widget name = 'PreviousScreenShotButton'
+ width = '25'
+ height = '25'
+ />
+ </layout>
+ <widget name = 'Author' height = 'Globals.Line.Height' />
+ <widget name = 'Notes' height = 'Globals.Line.Height' />
+ </layout>
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0'>
+ <space/>
+ <widget name = 'Delete'
+ type = 'Button'
+ />
+ <space size = '16'/>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <space size = '16'/>
+ <widget name = 'Edit'
+ type = 'Button'
+ />
+ <widget name = 'Record'
+ type = 'Button'
+ />
+ <widget name = 'Playback'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'OnScreenDialog' overlays = 'screen_center'>
+ <layout type = 'horizontal' spacing = '5' padding = '5, 3, 5, 3' center = 'true'>
+ <widget name = 'StopButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'EditButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'SwitchModeButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'FastReplayButton'
+ width = '32'
+ height = '32'
+ />
+ <widget name = 'TimeLabel'
+ width = '50'
+ height = '30'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'EditRecordDialog' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
+ <widget name = 'Title'
+ width = '320'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'AuthorLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'AuthorEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NameLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NameEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NotesLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NotesEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'OK'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
<dialog name = 'ScummHelp' overlays = 'screen_center'>
<layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
<widget name = 'Title'
diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
index 9658402f82..cee1e4af2b 100644
--- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx
+++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx
@@ -35,6 +35,9 @@
<def var = 'ShowChooserPageDisplay' value = '0'/>
<def var = 'SaveLoadChooser.ExtInfo.Visible' value = '0'/>
+ <def var = 'RecorderDialog.ExtInfo.Visible' value = '0'/>
+
+ <def var = 'OnScreenDialog.ShowPics' value = '1'/>
<def var = 'Predictive.Button.Width' value = '45' />
<def var = 'Predictive.Button.Height' value = '15' />
@@ -97,6 +100,12 @@
size = '32, 18'
padding = '0, 0, 2, 0'
/>
+ <widget name = 'EditRecordLabel'
+ size = '60, Globals.Line.Height'
+ />
+ <widget name = 'EditRecord'
+ size = '120, 15'
+ />
</globals>
<dialog name = 'Launcher' overlays = 'screen'>
@@ -1012,6 +1021,122 @@
</layout>
</dialog>
+ <dialog name = 'SavenameDialog' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8'>
+ <widget name = 'DescriptionText'
+ width = '320'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'Description'
+ height = '19'
+ />
+ <layout type = 'horizontal' padding = '0, 0, 16, 0'>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <space size = '96'/>
+ <widget name = 'Ok'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'RecorderDialog' overlays = 'screen' inset = '8' shading = 'dim'>
+ <layout type = 'vertical' padding = '8, 8, 8, 4' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <widget name = 'List' />
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '2'>
+ <widget name = 'Edit'
+ type = 'Button'
+ />
+ <space />
+ <widget name = 'Record'
+ type = 'Button'
+ />
+ </layout>
+ <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '2'>
+ <widget name = 'Delete'
+ type = 'Button'
+ />
+ <space />
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'Playback'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
+ <dialog name = 'OnScreenDialog' overlays = 'screen_center'>
+ <layout type = 'horizontal' spacing = '5' padding = '3, 2, 3, 2' center = 'true'>
+ <widget name = 'StopButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'EditButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'SwitchModeButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'FastReplayButton'
+ width = '16'
+ height = '16'
+ />
+ <widget name = 'TimeLabel'
+ width = '50'
+ height = '16'
+ />
+ </layout>
+ </dialog>
+
+ <dialog name = 'EditRecordDialog' overlays = 'screen_center'>
+ <layout type = 'vertical' padding = '8, 8, 8, 8' center = 'true'>
+ <widget name = 'Title'
+ height = 'Globals.Line.Height'
+ />
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'AuthorLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'AuthorEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NameLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NameEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 10'>
+ <widget name = 'NotesLabel'
+ type = 'EditRecordLabel'
+ />
+ <widget name = 'NotesEdit'
+ type = 'EditRecord'
+ />
+ </layout>
+ <layout type = 'horizontal' spacing = '5' padding = '0, 0, 0, 0'>
+ <widget name = 'Cancel'
+ type = 'Button'
+ />
+ <widget name = 'OK'
+ type = 'Button'
+ />
+ </layout>
+ </layout>
+ </dialog>
+
<dialog name = 'ScummHelp' overlays = 'screen' inset = '8'>
<layout type = 'vertical' padding = '8, 8, 8, 8'>
<widget name = 'Title'
diff --git a/gui/themes/scummmodern/stopbtn.bmp b/gui/themes/scummmodern/stopbtn.bmp
new file mode 100644
index 0000000000..3575956694
--- /dev/null
+++ b/gui/themes/scummmodern/stopbtn.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/stopbtn_small.bmp b/gui/themes/scummmodern/stopbtn_small.bmp
new file mode 100644
index 0000000000..ffd5025279
--- /dev/null
+++ b/gui/themes/scummmodern/stopbtn_small.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/switchbtn.bmp b/gui/themes/scummmodern/switchbtn.bmp
new file mode 100644
index 0000000000..6bafa4a998
--- /dev/null
+++ b/gui/themes/scummmodern/switchbtn.bmp
Binary files differ
diff --git a/gui/themes/scummmodern/switchbtn_small.bmp b/gui/themes/scummmodern/switchbtn_small.bmp
new file mode 100644
index 0000000000..929b128884
--- /dev/null
+++ b/gui/themes/scummmodern/switchbtn_small.bmp
Binary files differ
diff --git a/gui/themes/scummtheme.py b/gui/themes/scummtheme.py
index 4c55fd79de..524e91468e 100755
--- a/gui/themes/scummtheme.py
+++ b/gui/themes/scummtheme.py
@@ -37,9 +37,13 @@ def parseSTX(theme_file, def_file):
comm = re.compile("<!--(.*?)-->", re.DOTALL)
head = re.compile("<\?(.*?)\?>")
+ strlitcount = 0
output = ""
for line in theme_file:
- output += line.rstrip("\r\n\t ").lstrip() + " \n"
+ output += line.rstrip("\r\n\t ").lstrip()
+ if not output.endswith('>'):
+ output += ' '
+ output += "\n"
output = re.sub(comm, "", output)
output = re.sub(head, "", output)
@@ -48,7 +52,9 @@ def parseSTX(theme_file, def_file):
for line in output.splitlines():
if line and not line.isspace():
+ strlitcount += len(line)
def_file.write("\"" + line + "\"\n")
+ return strlitcount
def buildDefTheme(themeName):
def_file = open("default.inc", "w")
@@ -57,16 +63,23 @@ def buildDefTheme(themeName):
print ("Cannot open default theme dir.")
def_file.write(""" "<?xml version = '1.0'?>"\n""")
+ strlitcount = 24
for filename in os.listdir(themeName):
filename = os.path.join(themeName, filename)
if os.path.isfile(filename) and filename.endswith(".stx"):
theme_file = open(filename, "r")
- parseSTX(theme_file, def_file)
+ strlitcount += parseSTX(theme_file, def_file)
theme_file.close()
def_file.close()
+ if strlitcount > 65535:
+ print("WARNING: default.inc string literal is of length %d which exceeds the" % strlitcount)
+ print(" maximum length of 65536 that C++ compilers are required to support.")
+ print(" It is likely that bugs will occur dependent on compiler behaviour.")
+ print(" To avoid this, reduce the size of the theme.")
+
def printUsage():
print ("===============================")
print ("ScummVM Theme Generation Script")
diff --git a/gui/widget.cpp b/gui/widget.cpp
index c3f10a861f..e96b62e359 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -287,7 +287,7 @@ ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h, const Co
ButtonWidget::ButtonWidget(GuiObject *boss, const Common::String &name, const Common::String &label, const char *tooltip, uint32 cmd, uint8 hotkey)
: StaticTextWidget(boss, name, cleanupHotkey(label), tooltip), CommandSender(boss),
- _cmd(cmd), _lastTime(0) {
+ _cmd(cmd), _hotkey(hotkey), _lastTime(0) {
if (hotkey == 0)
_hotkey = parseHotkey(label);
setFlags(WIDGET_ENABLED/* | WIDGET_BORDER*/ | WIDGET_CLEARBG);
@@ -396,7 +396,7 @@ PicButtonWidget::~PicButtonWidget() {
void PicButtonWidget::setGfx(const Graphics::Surface *gfx) {
_gfx.free();
- if (!gfx || !gfx->pixels)
+ if (!gfx || !gfx->getPixels())
return;
if (gfx->format.bytesPerPixel == 1) {
@@ -429,7 +429,7 @@ void PicButtonWidget::setGfx(int w, int h, int r, int g, int b) {
void PicButtonWidget::drawWidget() {
g_gui.theme()->drawButton(Common::Rect(_x, _y, _x+_w, _y+_h), "", _state, getFlags());
- if (_gfx.pixels) {
+ if (_gfx.getPixels()) {
// Check whether the set up surface needs to be converted to the GUI
// color format.
const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat();
@@ -646,7 +646,7 @@ GraphicsWidget::~GraphicsWidget() {
void GraphicsWidget::setGfx(const Graphics::Surface *gfx) {
_gfx.free();
- if (!gfx || !gfx->pixels)
+ if (!gfx || !gfx->getPixels())
return;
if (gfx->format.bytesPerPixel == 1) {
@@ -676,7 +676,7 @@ void GraphicsWidget::setGfx(int w, int h, int r, int g, int b) {
}
void GraphicsWidget::drawWidget() {
- if (_gfx.pixels) {
+ if (_gfx.getPixels()) {
// Check whether the set up surface needs to be converted to the GUI
// color format.
const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat();
diff --git a/gui/widgets/edittext.cpp b/gui/widgets/edittext.cpp
index 4b266e8194..3677f02e47 100644
--- a/gui/widgets/edittext.cpp
+++ b/gui/widgets/edittext.cpp
@@ -19,6 +19,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include "common/system.h"
#include "gui/widgets/edittext.h"
#include "gui/gui-manager.h"
@@ -79,8 +80,13 @@ void EditTextWidget::handleMouseDown(int x, int y, int button, int clickCount) {
}
if (setCaretPos(i))
draw();
-}
+#ifdef TIZEN
+ // Display the virtual keypad to allow text entry. Samsung app-store testers expected
+ // the keypad to be displayed when clicking the filter edit control in the laucher gui.
+ g_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true);
+#endif
+}
void EditTextWidget::drawWidget() {
g_gui.theme()->drawWidgetBackground(Common::Rect(_x, _y, _x+_w, _y+_h), 0, ThemeEngine::kWidgetBackgroundEditText);