2008-06-24 23:19:23 +00:00
/* 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 .
2014-02-18 01:34:20 +00:00
*
2008-06-24 23:19:23 +00:00
*/
2008-08-17 02:02:22 +00:00
# include "base/version.h"
2008-06-24 23:19:23 +00:00
# include "common/config-manager.h"
# include "common/events.h"
2011-04-24 08:34:27 +00:00
# include "common/str.h"
# include "common/system.h"
2010-06-15 10:44:51 +00:00
# include "common/translation.h"
2008-06-24 23:19:23 +00:00
# include "gui/about.h"
2010-11-16 10:19:01 +00:00
# include "gui/gui-manager.h"
2010-10-26 21:54:57 +00:00
# include "gui/message.h"
2010-05-26 19:54:50 +00:00
# include "gui/options.h"
2008-11-11 12:13:55 +00:00
# include "gui/saveload.h"
2011-04-24 08:34:27 +00:00
# include "gui/ThemeEngine.h"
2010-05-26 19:54:50 +00:00
# include "gui/ThemeEval.h"
2011-04-24 08:34:27 +00:00
# include "gui/widget.h"
2020-02-19 19:07:12 +00:00
# include "gui/widgets/tab.h"
2011-04-24 08:34:27 +00:00
# include "graphics/font.h"
2008-06-24 23:19:23 +00:00
# include "engines/dialogs.h"
# include "engines/engine.h"
2008-08-16 02:53:16 +00:00
# include "engines/metaengine.h"
2008-06-24 23:19:23 +00:00
2016-04-10 10:52:53 +00:00
# ifdef GUI_ENABLE_KEYSDIALOG
2008-06-24 23:19:23 +00:00
# include "gui/KeysDialog.h"
# endif
MainMenuDialog : : MainMenuDialog ( Engine * engine )
2008-11-12 12:50:21 +00:00
: GUI : : Dialog ( " GlobalMenu " ) , _engine ( engine ) {
2008-11-10 11:24:55 +00:00
_backgroundType = GUI : : ThemeEngine : : kDialogBackgroundSpecial ;
2008-06-24 23:19:23 +00:00
2008-09-14 20:42:50 +00:00
# ifndef DISABLE_FANCY_THEMES
_logo = 0 ;
2008-09-20 12:36:58 +00:00
if ( g_gui . xmlEval ( ) - > getVar ( " Globals.ShowGlobalMenuLogo " , 0 ) = = 1 & & g_gui . theme ( ) - > supportsImages ( ) ) {
_logo = new GUI : : GraphicsWidget ( this , " GlobalMenu.Logo " ) ;
2008-09-14 20:42:50 +00:00
_logo - > useThemeTransparency ( true ) ;
2008-11-10 11:24:55 +00:00
_logo - > setGfx ( g_gui . theme ( ) - > getImageSurface ( GUI : : ThemeEngine : : kImageLogoSmall ) ) ;
2008-09-14 20:42:50 +00:00
} else {
2020-06-13 16:42:25 +00:00
GUI : : StaticTextWidget * title = new GUI : : StaticTextWidget ( this , " GlobalMenu.Title " , Common : : U32String ( " ScummVM " ) ) ;
2008-11-12 14:30:16 +00:00
title - > setAlign ( Graphics : : kTextAlignCenter ) ;
2008-09-14 20:42:50 +00:00
}
# else
2020-06-13 16:42:25 +00:00
GUI : : StaticTextWidget * title = new GUI : : StaticTextWidget ( this , " GlobalMenu.Title " , Common : : U32String ( " ScummVM " ) ) ;
2008-11-12 14:30:16 +00:00
title - > setAlign ( Graphics : : kTextAlignCenter ) ;
2008-09-14 20:42:50 +00:00
# endif
2008-08-17 02:02:22 +00:00
2020-06-13 17:36:08 +00:00
GUI : : StaticTextWidget * version = new GUI : : StaticTextWidget ( this , " GlobalMenu.Version " , Common : : U32String ( gScummVMVersionDate ) ) ;
2008-11-12 14:30:16 +00:00
version - > setAlign ( Graphics : : kTextAlignCenter ) ;
2009-01-01 15:06:43 +00:00
2020-07-01 18:01:48 +00:00
new GUI : : ButtonWidget ( this , " GlobalMenu.Resume " , _ ( " ~R~esume " ) , Common : : U32String ( " " ) , kPlayCmd , ' P ' ) ;
2008-06-24 23:19:23 +00:00
2020-07-01 18:01:48 +00:00
_loadButton = new GUI : : ButtonWidget ( this , " GlobalMenu.Load " , _ ( " ~L~oad " ) , Common : : U32String ( " " ) , kLoadCmd ) ;
2017-05-25 13:56:22 +00:00
_loadButton - > setVisible ( _engine - > hasFeature ( Engine : : kSupportsLoadingDuringRuntime ) ) ;
2008-11-04 16:11:40 +00:00
_loadButton - > setEnabled ( _engine - > hasFeature ( Engine : : kSupportsLoadingDuringRuntime ) ) ;
2009-01-01 15:06:43 +00:00
2020-06-13 16:42:25 +00:00
_saveButton = new GUI : : ButtonWidget ( this , " GlobalMenu.Save " , _ ( " ~S~ave " ) , Common : : U32String ( " " ) , kSaveCmd ) ;
2017-05-25 13:56:22 +00:00
_saveButton - > setVisible ( _engine - > hasFeature ( Engine : : kSupportsSavingDuringRuntime ) ) ;
2008-11-04 16:11:40 +00:00
_saveButton - > setEnabled ( _engine - > hasFeature ( Engine : : kSupportsSavingDuringRuntime ) ) ;
2008-06-24 23:19:23 +00:00
2020-07-01 18:01:48 +00:00
new GUI : : ButtonWidget ( this , " GlobalMenu.Options " , _ ( " ~O~ptions " ) , Common : : U32String ( " " ) , kOptionsCmd ) ;
2008-06-24 23:19:23 +00:00
2010-05-26 19:54:50 +00:00
// The help button is disabled by default.
// To enable "Help", an engine needs to use a subclass of MainMenuDialog
// (at least for now, we might change how this works in the future).
2020-07-01 18:01:48 +00:00
_helpButton = new GUI : : ButtonWidget ( this , " GlobalMenu.Help " , _ ( " ~H~elp " ) , Common : : U32String ( " " ) , kHelpCmd ) ;
2010-05-26 19:54:50 +00:00
2020-07-01 18:01:48 +00:00
new GUI : : ButtonWidget ( this , " GlobalMenu.About " , _ ( " ~A~bout " ) , Common : : U32String ( " " ) , kAboutCmd ) ;
2008-06-24 23:19:23 +00:00
2010-08-30 22:24:40 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-07-01 18:01:48 +00:00
_returnToLauncherButton = new GUI : : ButtonWidget ( this , " GlobalMenu.ReturnToLauncher " , _ ( " ~R~eturn to Launcher " ) , Common : : U32String ( " " ) , kLauncherCmd ) ;
2010-08-30 22:24:40 +00:00
else
2020-07-01 18:01:48 +00:00
_returnToLauncherButton = new GUI : : ButtonWidget ( this , " GlobalMenu.ReturnToLauncher " , _c ( " ~R~eturn to Launcher " , " lowres " ) , Common : : U32String ( " " ) , kLauncherCmd ) ;
2020-05-12 02:20:40 +00:00
_returnToLauncherButton - > setEnabled ( _engine - > hasFeature ( Engine : : kSupportsReturnToLauncher ) ) ;
2008-08-16 02:53:16 +00:00
2020-04-15 23:09:39 +00:00
if ( ! g_system - > hasFeature ( OSystem : : kFeatureNoQuit ) )
2020-07-01 18:01:48 +00:00
new GUI : : ButtonWidget ( this , " GlobalMenu.Quit " , _ ( " ~Q~uit " ) , Common : : U32String ( " " ) , kQuitCmd ) ;
2008-06-24 23:19:23 +00:00
_aboutDialog = new GUI : : AboutDialog ( ) ;
2020-07-01 18:01:48 +00:00
_loadDialog = new GUI : : SaveLoadChooser ( _ ( " Load game: " ) , _ ( " Load " ) , false ) ;
_saveDialog = new GUI : : SaveLoadChooser ( _ ( " Save game: " ) , _ ( " Save " ) , true ) ;
2008-06-24 23:19:23 +00:00
}
MainMenuDialog : : ~ MainMenuDialog ( ) {
delete _aboutDialog ;
2008-11-03 18:32:16 +00:00
delete _loadDialog ;
2008-11-06 20:26:19 +00:00
delete _saveDialog ;
2008-06-24 23:19:23 +00:00
}
2010-11-01 16:00:17 +00:00
void MainMenuDialog : : handleCommand ( GUI : : CommandSender * sender , uint32 cmd , uint32 data ) {
2008-06-24 23:19:23 +00:00
switch ( cmd ) {
case kPlayCmd :
close ( ) ;
break ;
2008-11-03 18:32:16 +00:00
case kLoadCmd :
2010-04-06 09:26:20 +00:00
load ( ) ;
2008-11-03 18:32:16 +00:00
break ;
case kSaveCmd :
2010-04-06 09:26:20 +00:00
save ( ) ;
2008-11-03 18:32:16 +00:00
break ;
2020-02-19 19:07:12 +00:00
case kOptionsCmd : {
2020-03-22 14:19:56 +00:00
GUI : : ConfigDialog configDialog ;
2020-02-19 19:07:12 +00:00
configDialog . runModal ( ) ;
2008-06-24 23:19:23 +00:00
break ;
2020-02-19 19:07:12 +00:00
}
2008-06-24 23:19:23 +00:00
case kAboutCmd :
_aboutDialog - > runModal ( ) ;
break ;
2010-10-26 21:54:57 +00:00
case kHelpCmd : {
GUI : : MessageDialog dialog (
2011-06-13 21:19:18 +00:00
_ ( " Sorry, this engine does not currently provide in-game help. "
2010-10-26 21:54:57 +00:00
" Please consult the README for basic information, and for "
2011-06-13 21:19:18 +00:00
" instructions on how to obtain further assistance. " ) ) ;
2010-10-26 21:54:57 +00:00
dialog . runModal ( ) ;
}
2010-05-26 19:54:50 +00:00
break ;
2020-05-12 02:20:40 +00:00
case kLauncherCmd : {
2020-05-12 02:27:27 +00:00
Common : : Event eventReturnToLauncher ;
eventReturnToLauncher . type = Common : : EVENT_RETURN_TO_LAUNCHER ;
g_system - > getEventManager ( ) - > pushEvent ( eventReturnToLauncher ) ;
2008-06-24 23:19:23 +00:00
close ( ) ;
2009-01-01 15:06:43 +00:00
}
2008-06-24 23:19:23 +00:00
break ;
2008-07-09 02:27:05 +00:00
case kQuitCmd : {
Common : : Event eventQ ;
eventQ . type = Common : : EVENT_QUIT ;
g_system - > getEventManager ( ) - > pushEvent ( eventQ ) ;
2008-06-24 23:19:23 +00:00
close ( ) ;
2008-07-09 02:27:05 +00:00
}
2008-06-24 23:19:23 +00:00
break ;
default :
2008-11-12 12:50:21 +00:00
GUI : : Dialog : : handleCommand ( sender , cmd , data ) ;
2008-06-24 23:19:23 +00:00
}
}
2008-09-14 20:42:50 +00:00
void MainMenuDialog : : reflowLayout ( ) {
2009-01-01 15:06:43 +00:00
if ( _engine - > hasFeature ( Engine : : kSupportsLoadingDuringRuntime ) )
2008-11-04 16:11:40 +00:00
_loadButton - > setEnabled ( _engine - > canLoadGameStateCurrently ( ) ) ;
if ( _engine - > hasFeature ( Engine : : kSupportsSavingDuringRuntime ) )
_saveButton - > setEnabled ( _engine - > canSaveGameStateCurrently ( ) ) ;
2011-06-19 22:59:48 +00:00
2010-11-14 21:10:56 +00:00
// Overlay size might have changed since the construction of the dialog.
// Update labels when it might be needed
// FIXME: it might be better to declare GUI::StaticTextWidget::setLabel() virtual
// and to reimplement it in GUI::ButtonWidget to handle the hotkey.
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-06-13 16:42:25 +00:00
_returnToLauncherButton - > setLabel ( _returnToLauncherButton - > cleanupHotkey ( _ ( " ~R~eturn to Launcher " ) ) ) ;
2010-11-14 21:10:56 +00:00
else
2020-06-13 16:42:25 +00:00
_returnToLauncherButton - > setLabel ( _returnToLauncherButton - > cleanupHotkey ( _c ( " ~R~eturn to Launcher " , " lowres " ) ) ) ;
2008-11-03 18:32:16 +00:00
2008-09-14 20:42:50 +00:00
# ifndef DISABLE_FANCY_THEMES
2008-09-20 12:36:58 +00:00
if ( g_gui . xmlEval ( ) - > getVar ( " Globals.ShowGlobalMenuLogo " , 0 ) = = 1 & & g_gui . theme ( ) - > supportsImages ( ) ) {
2008-09-14 20:42:50 +00:00
if ( ! _logo )
2008-09-20 12:36:58 +00:00
_logo = new GUI : : GraphicsWidget ( this , " GlobalMenu.Logo " ) ;
2008-09-14 20:42:50 +00:00
_logo - > useThemeTransparency ( true ) ;
2008-11-10 11:24:55 +00:00
_logo - > setGfx ( g_gui . theme ( ) - > getImageSurface ( GUI : : ThemeEngine : : kImageLogoSmall ) ) ;
2008-09-14 20:42:50 +00:00
2010-11-01 16:00:17 +00:00
GUI : : StaticTextWidget * title = ( GUI : : StaticTextWidget * ) findWidget ( " GlobalMenu.Title " ) ;
2008-09-14 20:42:50 +00:00
if ( title ) {
removeWidget ( title ) ;
title - > setNext ( 0 ) ;
delete title ;
}
} else {
2010-11-01 16:00:17 +00:00
GUI : : StaticTextWidget * title = ( GUI : : StaticTextWidget * ) findWidget ( " GlobalMenu.Title " ) ;
2008-09-20 16:07:00 +00:00
if ( ! title ) {
2020-06-13 17:36:08 +00:00
title = new GUI : : StaticTextWidget ( this , " GlobalMenu.Title " , Common : : U32String ( " ScummVM " ) ) ;
2008-11-12 14:30:16 +00:00
title - > setAlign ( Graphics : : kTextAlignCenter ) ;
2008-09-20 16:07:00 +00:00
}
2008-09-14 20:42:50 +00:00
if ( _logo ) {
removeWidget ( _logo ) ;
_logo - > setNext ( 0 ) ;
delete _logo ;
_logo = 0 ;
}
}
# endif
Dialog : : reflowLayout ( ) ;
}
2010-04-06 09:26:20 +00:00
void MainMenuDialog : : save ( ) {
2012-06-10 02:49:42 +00:00
int slot = _saveDialog - > runModalWithCurrentTarget ( ) ;
2010-04-06 09:26:20 +00:00
if ( slot > = 0 ) {
2020-08-29 13:38:39 +00:00
Common : : String result ( _saveDialog - > getResultString ( ) ) ;
2010-04-06 09:26:20 +00:00
if ( result . empty ( ) ) {
// If the user was lazy and entered no save name, come up with a default name.
2012-06-10 03:04:59 +00:00
result = _saveDialog - > createDefaultSaveDescription ( slot ) ;
2012-02-21 22:30:29 +00:00
}
2020-08-29 13:38:39 +00:00
Common : : Error status = _engine - > saveGameState ( slot , result ) ;
2012-02-21 22:30:29 +00:00
if ( status . getCode ( ) ! = Common : : kNoError ) {
2020-07-03 21:43:05 +00:00
Common : : U32String failMessage = Common : : U32String : : format ( _ ( " Failed to save game (%s)! "
2012-02-21 22:30:29 +00:00
" Please consult the README for basic information, and for "
2020-07-03 21:43:05 +00:00
" instructions on how to obtain further assistance. " ) , status . getDesc ( ) . c_str ( ) ) ;
2012-02-21 22:30:29 +00:00
GUI : : MessageDialog dialog ( failMessage ) ;
2012-09-26 02:17:31 +00:00
dialog . runModal ( ) ;
2010-04-06 09:26:20 +00:00
}
close ( ) ;
}
}
void MainMenuDialog : : load ( ) {
2012-06-10 02:49:42 +00:00
int slot = _loadDialog - > runModalWithCurrentTarget ( ) ;
2010-04-06 09:26:20 +00:00
2011-06-25 13:41:58 +00:00
_engine - > setGameToLoadSlot ( slot ) ;
2012-02-21 22:30:29 +00:00
if ( slot > = 0 )
2010-04-06 09:26:20 +00:00
close ( ) ;
}
2020-05-02 16:23:53 +00:00
# ifdef GUI_ENABLE_KEYSDIALOG
2008-06-24 23:19:23 +00:00
enum {
kKeysCmd = ' KEYS '
} ;
2020-05-02 16:23:53 +00:00
# endif
2008-06-24 23:19:23 +00:00
2020-03-08 21:10:56 +00:00
namespace GUI {
2008-08-05 22:02:24 +00:00
// FIXME: We use the empty string as domain name here. This tells the
// ConfigManager to use the 'default' domain for all its actions. We do that
// to get as close as possible to editing the 'active' settings.
//
// However, that requires bad & evil hacks in the ConfigManager code,
// and even then still doesn't work quite correctly.
// For example, if the transient domain contains 'false' for the 'fullscreen'
// flag, but the user used a hotkey to switch to windowed mode, then the dialog
// will display the wrong value anyway.
//
// Proposed solution consisting of multiple steps:
// 1) Add special code to the open() code that reads out everything stored
// in the transient domain that is controlled by this dialog, and updates
// the dialog accordingly.
// 2) Even more code is added to query the backend for current settings, like
// the fullscreen mode flag etc., and also updates the dialog accordingly.
// 3) The domain being edited is set to the active game domain.
// 4) If the dialog is closed with the "OK" button, then we remove everything
// stored in the transient domain (or at least everything corresponding to
// switches in this dialog.
// If OTOH the dialog is closed with "Cancel" we do no such thing.
//
// These changes will achieve two things at once: Allow us to get rid of using
// "" as value for the domain, and in fact provide a somewhat better user
// experience at the same time.
2020-03-22 14:19:56 +00:00
ConfigDialog : : ConfigDialog ( ) :
GUI : : OptionsDialog ( " " , " GlobalConfig " ) ,
_engineOptions ( nullptr ) {
assert ( g_engine ) ;
2008-06-24 23:19:23 +00:00
2020-03-22 14:19:56 +00:00
const Common : : String & gameDomain = ConfMan . getActiveDomainName ( ) ;
const MetaEngine & metaEngine = g_engine - > getMetaEngine ( ) ;
2020-08-03 19:12:23 +00:00
const MetaEngineConnect & metaEngineConnect = g_engine - > getMetaEngineConnect ( ) ;
2020-03-08 21:10:56 +00:00
2020-02-19 19:07:12 +00:00
// GUI: Add tab widget
GUI : : TabWidget * tab = new GUI : : TabWidget ( this , " GlobalConfig.TabWidget " ) ;
2020-03-22 14:19:56 +00:00
//
// The game specific options tab
//
2020-07-01 18:01:48 +00:00
int tabId = tab - > addTab ( _ ( " Game " ) , " GlobalConfig_Engine " ) ;
2020-03-22 14:19:56 +00:00
if ( g_engine - > hasFeature ( Engine : : kSupportsChangingOptionsDuringRuntime ) ) {
_engineOptions = metaEngine . buildEngineOptionsWidget ( tab , " GlobalConfig_Engine.Container " , gameDomain ) ;
}
if ( _engineOptions ) {
_engineOptions - > setParentDialog ( this ) ;
} else {
tab - > removeTab ( tabId ) ;
}
//
// The Audio / Subtitles tab
//
2020-07-01 18:01:48 +00:00
tab - > addTab ( _ ( " Audio " ) , " GlobalConfig_Audio " ) ;
2020-02-19 19:07:12 +00:00
2008-06-24 23:19:23 +00:00
//
// Sound controllers
//
2020-02-19 19:07:12 +00:00
addVolumeControls ( tab , " GlobalConfig_Audio. " ) ;
2009-06-06 17:58:08 +00:00
setVolumeSettingsState ( true ) ; // could disable controls by GUI options
2008-06-24 23:19:23 +00:00
//
2009-02-07 06:47:19 +00:00
// Subtitle speed and toggle controllers
2008-06-24 23:19:23 +00:00
//
2020-03-22 14:19:56 +00:00
if ( g_engine - > hasFeature ( Engine : : kSupportsSubtitleOptions ) ) {
2009-02-07 06:47:19 +00:00
// Global talkspeed range of 0-255
2020-02-19 19:07:12 +00:00
addSubtitleControls ( tab , " GlobalConfig_Audio. " , 255 ) ;
2009-06-06 17:58:08 +00:00
setSubtitleSettingsState ( true ) ; // could disable controls by GUI options
2009-02-07 06:47:19 +00:00
}
2008-06-24 23:19:23 +00:00
2020-02-19 19:07:12 +00:00
//
// The Keymap tab
//
2020-08-03 19:12:23 +00:00
Common : : KeymapArray keymaps = metaEngineConnect . initKeymaps ( gameDomain . c_str ( ) ) ;
2020-02-19 19:07:12 +00:00
if ( ! keymaps . empty ( ) ) {
2020-07-01 18:01:48 +00:00
tab - > addTab ( _ ( " Keymaps " ) , " GlobalConfig_KeyMapper " ) ;
2020-02-19 19:07:12 +00:00
addKeyMapperControls ( tab , " GlobalConfig_KeyMapper. " , keymaps , gameDomain ) ;
}
2020-03-16 00:48:57 +00:00
//
// The Achievements tab
//
2020-08-06 18:12:44 +00:00
Common : : AchievementsInfo achievementsInfo = metaEngineConnect . getAchievementsInfo ( gameDomain ) ;
2020-03-16 00:48:57 +00:00
if ( achievementsInfo . descriptions . size ( ) > 0 ) {
2020-07-01 18:01:48 +00:00
tab - > addTab ( _ ( " Achievements " ) , " GlobalConfig_Achievements " ) ;
2020-03-16 00:48:57 +00:00
addAchievementsControls ( tab , " GlobalConfig_Achievements. " , achievementsInfo ) ;
}
2020-02-19 19:07:12 +00:00
// Activate the first tab
tab - > setActiveTab ( 0 ) ;
2008-06-24 23:19:23 +00:00
//
// Add the buttons
//
2020-07-01 18:01:48 +00:00
new GUI : : ButtonWidget ( this , " GlobalConfig.Ok " , _ ( " ~O~K " ) , Common : : U32String ( " " ) , GUI : : kOKCmd ) ;
new GUI : : ButtonWidget ( this , " GlobalConfig.Cancel " , _ ( " ~C~ancel " ) , Common : : U32String ( " " ) , GUI : : kCloseCmd ) ;
2008-06-24 23:19:23 +00:00
2016-04-10 10:52:53 +00:00
# ifdef GUI_ENABLE_KEYSDIALOG
2010-06-15 10:52:35 +00:00
new GUI : : ButtonWidget ( this , " GlobalConfig.Keys " , _ ( " ~K~eys " ) , 0 , kKeysCmd ) ;
2009-02-28 21:05:21 +00:00
_keysDialog = NULL ;
2008-06-24 23:19:23 +00:00
# endif
}
ConfigDialog : : ~ ConfigDialog ( ) {
2016-04-10 10:52:53 +00:00
# ifdef GUI_ENABLE_KEYSDIALOG
2008-06-24 23:19:23 +00:00
delete _keysDialog ;
# endif
}
2020-03-22 14:19:56 +00:00
void ConfigDialog : : build ( ) {
OptionsDialog : : build ( ) ;
// Engine options
if ( _engineOptions ) {
_engineOptions - > load ( ) ;
}
}
void ConfigDialog : : apply ( ) {
if ( _engineOptions ) {
_engineOptions - > save ( ) ;
}
OptionsDialog : : apply ( ) ;
}
2020-05-02 16:23:53 +00:00
# ifdef GUI_ENABLE_KEYSDIALOG
2010-11-01 16:00:17 +00:00
void ConfigDialog : : handleCommand ( GUI : : CommandSender * sender , uint32 cmd , uint32 data ) {
2008-06-24 23:19:23 +00:00
switch ( cmd ) {
case kKeysCmd :
2020-05-02 16:23:53 +00:00
//
// Create the sub dialog(s)
//
_keysDialog = new GUI : : KeysDialog ( ) ;
_keysDialog - > runModal ( ) ;
delete _keysDialog ;
_keysDialog = NULL ;
2008-06-24 23:19:23 +00:00
break ;
default :
2010-04-06 09:25:44 +00:00
GUI : : OptionsDialog : : handleCommand ( sender , cmd , data ) ;
2008-06-24 23:19:23 +00:00
}
}
2020-05-02 16:23:53 +00:00
# endif
2020-03-08 21:10:56 +00:00
2020-03-22 14:19:56 +00:00
ExtraGuiOptionsWidget : : ExtraGuiOptionsWidget ( GuiObject * containerBoss , const Common : : String & name , const Common : : String & domain , const ExtraGuiOptions & options ) :
OptionsContainerWidget ( containerBoss , name , dialogLayout ( domain ) , false , domain ) ,
_options ( options ) {
// Note: up to 7 engine options can currently fit on screen (the most that
// can fit in a 320x200 screen with the classic theme).
// TODO: Increase this number by including the checkboxes inside a scroll
// widget. The appropriate number of checkboxes will need to be added to
// the theme files.
uint i = 1 ;
ExtraGuiOptions : : const_iterator iter ;
for ( iter = _options . begin ( ) ; iter ! = _options . end ( ) ; + + iter , + + i ) {
Common : : String id = Common : : String : : format ( " %d " , i ) ;
_checkboxes . push_back ( new CheckboxWidget ( widgetsBoss ( ) ,
2020-07-01 18:01:48 +00:00
_dialogLayout + " .customOption " + id + " Checkbox " , _ ( iter - > label ) , _ ( iter - > tooltip ) ) ) ;
2020-03-22 14:19:56 +00:00
}
}
ExtraGuiOptionsWidget : : ~ ExtraGuiOptionsWidget ( ) {
}
Common : : String ExtraGuiOptionsWidget : : dialogLayout ( const Common : : String & domain ) {
if ( ConfMan . getActiveDomainName ( ) . equals ( domain ) ) {
return " GlobalConfig_Engine_Container " ;
} else {
return " GameOptions_Engine_Container " ;
}
}
void ExtraGuiOptionsWidget : : load ( ) {
// Set the state of engine-specific checkboxes
for ( uint j = 0 ; j < _options . size ( ) ; + + j ) {
// The default values for engine-specific checkboxes are not set when
// ScummVM starts, as this would require us to load and poll all of the
// engine plugins on startup. Thus, we set the state of each custom
// option checkbox to what is specified by the engine plugin, and
// update it only if a value has been set in the configuration of the
// currently selected game.
bool isChecked = _options [ j ] . defaultState ;
if ( ConfMan . hasKey ( _options [ j ] . configOption , _domain ) )
isChecked = ConfMan . getBool ( _options [ j ] . configOption , _domain ) ;
_checkboxes [ j ] - > setState ( isChecked ) ;
}
}
bool ExtraGuiOptionsWidget : : save ( ) {
// Set the state of engine-specific checkboxes
for ( uint i = 0 ; i < _options . size ( ) ; i + + ) {
ConfMan . setBool ( _options [ i ] . configOption , _checkboxes [ i ] - > getState ( ) , _domain ) ;
}
return true ;
}
2020-03-08 21:10:56 +00:00
} // End of namespace GUI