2016-07-10 05:05:00 +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 .
*
*/
# include "gui/editgamedialog.h"
# include "common/config-manager.h"
# include "common/gui_options.h"
# include "common/translation.h"
2016-07-15 12:27:56 +00:00
# include "common/system.h"
2016-07-10 05:05:00 +00:00
# include "gui/browser.h"
2018-01-06 15:13:29 +00:00
# include "gui/gui-manager.h"
2016-07-10 05:05:00 +00:00
# include "gui/message.h"
# ifdef ENABLE_EVENTRECORDER
# include "gui/onscreendialog.h"
# include "gui/recorderdialog.h"
# include "gui/EventRecorder.h"
# endif
# include "gui/widgets/edittext.h"
# include "gui/widgets/tab.h"
# include "gui/widgets/popup.h"
2018-07-21 23:01:01 +00:00
# include "gui/widgets/scrollcontainer.h"
2016-07-10 05:05:00 +00:00
2016-10-17 16:45:12 +00:00
# if defined(USE_CLOUD) && defined(USE_LIBCURL)
2016-07-10 05:05:00 +00:00
# include "backends/cloud/cloudmanager.h"
# endif
using Common : : ConfigManager ;
namespace GUI {
enum {
kStartCmd = ' STRT ' ,
kAboutCmd = ' ABOU ' ,
kOptionsCmd = ' OPTN ' ,
kAddGameCmd = ' ADDG ' ,
kEditGameCmd = ' EDTG ' ,
kRemoveGameCmd = ' REMG ' ,
kLoadGameCmd = ' LOAD ' ,
kQuitCmd = ' QUIT ' ,
kSearchCmd = ' SRCH ' ,
kListSearchCmd = ' LSSR ' ,
kSearchClearCmd = ' SRCL ' ,
kCmdGlobalGraphicsOverride = ' OGFX ' ,
kCmdGlobalAudioOverride = ' OSFX ' ,
kCmdGlobalMIDIOverride = ' OMID ' ,
kCmdGlobalMT32Override = ' OM32 ' ,
kCmdGlobalVolumeOverride = ' OVOL ' ,
kCmdChooseSoundFontCmd = ' chsf ' ,
kCmdExtraBrowser = ' PEXT ' ,
kCmdExtraPathClear = ' PEXC ' ,
kCmdGameBrowser = ' PGME ' ,
kCmdSaveBrowser = ' PSAV ' ,
2018-07-21 23:01:01 +00:00
kCmdSavePathClear = ' PSAC ' ,
kGraphicsTabContainerReflowCmd = ' gtcr '
2016-07-10 05:05:00 +00:00
} ;
/*
* TODO : Clean up this ugly design : we subclass EditTextWidget to perform
* input validation . It would be much more elegant to use a decorator pattern ,
* or a validation callback , or something like that .
*/
class DomainEditTextWidget : public EditTextWidget {
public :
2020-01-05 16:48:04 +00:00
DomainEditTextWidget ( GuiObject * boss , const String & name , const String & text , const char * tooltip = nullptr )
2016-07-10 05:05:00 +00:00
: EditTextWidget ( boss , name , text , tooltip ) { }
protected :
2020-01-05 16:48:04 +00:00
bool tryInsertChar ( byte c , int pos ) override {
2016-07-10 05:05:00 +00:00
if ( Common : : isAlnum ( c ) | | c = = ' - ' | | c = = ' _ ' ) {
_editString . insertChar ( c , pos ) ;
return true ;
}
return false ;
}
} ;
2018-05-06 10:57:08 +00:00
EditGameDialog : : EditGameDialog ( const String & domain )
2016-07-10 05:05:00 +00:00
: OptionsDialog ( domain , " GameOptions " ) {
2016-09-15 16:43:42 +00:00
EngineMan . upgradeTargetIfNecessary ( domain ) ;
2016-07-10 05:05:00 +00:00
// Retrieve all game specific options.
2016-09-25 06:45:42 +00:00
2016-07-10 05:05:00 +00:00
// Retrieve the plugin, since we need to access the engine's MetaEngine
// implementation.
2016-09-25 06:45:42 +00:00
const Plugin * plugin = nullptr ;
QualifiedGameDescriptor qgd = EngineMan . findTarget ( domain , & plugin ) ;
2016-07-10 05:05:00 +00:00
if ( plugin ) {
2017-11-11 05:06:42 +00:00
_engineOptions = plugin - > get < MetaEngine > ( ) . getExtraGuiOptions ( domain ) ;
2016-07-10 05:05:00 +00:00
} else {
warning ( " Plugin for target \" %s \" not found! Game specific settings might be missing " , domain . c_str ( ) ) ;
}
// GAME: Path to game data (r/o), extra data (r/o), and save data (r/w)
String gamePath ( ConfMan . get ( " path " , _domain ) ) ;
String extraPath ( ConfMan . get ( " extrapath " , _domain ) ) ;
String savePath ( ConfMan . get ( " savepath " , _domain ) ) ;
// GAME: Determine the description string
String description ( ConfMan . get ( " description " , domain ) ) ;
2020-01-01 07:19:48 +00:00
if ( description . empty ( ) & & ! qgd . description . empty ( ) ) {
2016-09-25 06:45:42 +00:00
description = qgd . description ;
2016-07-10 05:05:00 +00:00
}
// GUI: Add tab widget
TabWidget * tab = new TabWidget ( this , " GameOptions.TabWidget " ) ;
//
// 1) The game tab
//
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " Game " ) , " GameOptions_Game " ) ;
2016-07-10 05:05:00 +00:00
// GUI: Label & edit widget for the game ID
if ( g_system - > getOverlayWidth ( ) > 320 )
new StaticTextWidget ( tab , " GameOptions_Game.Id " , _ ( " ID: " ) , _ ( " Short game identifier used for referring to saved games and running the game from the command line " ) ) ;
else
new StaticTextWidget ( tab , " GameOptions_Game.Id " , _c ( " ID: " , " lowres " ) , _ ( " Short game identifier used for referring to saved games and running the game from the command line " ) ) ;
_domainWidget = new DomainEditTextWidget ( tab , " GameOptions_Game.Domain " , _domain , _ ( " Short game identifier used for referring to saved games and running the game from the command line " ) ) ;
// GUI: Label & edit widget for the description
if ( g_system - > getOverlayWidth ( ) > 320 )
new StaticTextWidget ( tab , " GameOptions_Game.Name " , _ ( " Name: " ) , _ ( " Full title of the game " ) ) ;
else
new StaticTextWidget ( tab , " GameOptions_Game.Name " , _c ( " Name: " , " lowres " ) , _ ( " Full title of the game " ) ) ;
_descriptionWidget = new EditTextWidget ( tab , " GameOptions_Game.Desc " , description , _ ( " Full title of the game " ) ) ;
// Language popup
_langPopUpDesc = new StaticTextWidget ( tab , " GameOptions_Game.LangPopupDesc " , _ ( " Language: " ) , _ ( " Language of the game. This will not turn your Spanish game version into English " ) ) ;
_langPopUp = new PopUpWidget ( tab , " GameOptions_Game.LangPopup " , _ ( " Language of the game. This will not turn your Spanish game version into English " ) ) ;
_langPopUp - > appendEntry ( _ ( " <default> " ) , ( uint32 ) Common : : UNK_LANG ) ;
_langPopUp - > appendEntry ( " " , ( uint32 ) Common : : UNK_LANG ) ;
const Common : : LanguageDescription * l = Common : : g_languages ;
for ( ; l - > code ; + + l ) {
if ( checkGameGUIOptionLanguage ( l - > id , _guioptionsString ) )
_langPopUp - > appendEntry ( l - > description , l - > id ) ;
}
// Platform popup
if ( g_system - > getOverlayWidth ( ) > 320 )
_platformPopUpDesc = new StaticTextWidget ( tab , " GameOptions_Game.PlatformPopupDesc " , _ ( " Platform: " ) , _ ( " Platform the game was originally designed for " ) ) ;
else
_platformPopUpDesc = new StaticTextWidget ( tab , " GameOptions_Game.PlatformPopupDesc " , _c ( " Platform: " , " lowres " ) , _ ( " Platform the game was originally designed for " ) ) ;
_platformPopUp = new PopUpWidget ( tab , " GameOptions_Game.PlatformPopup " , _ ( " Platform the game was originally designed for " ) ) ;
_platformPopUp - > appendEntry ( _ ( " <default> " ) ) ;
_platformPopUp - > appendEntry ( " " ) ;
const Common : : PlatformDescription * p = Common : : g_platforms ;
for ( ; p - > code ; + + p ) {
_platformPopUp - > appendEntry ( p - > description , p - > id ) ;
}
//
// 2) The engine tab (shown only if there are custom engine options)
//
if ( _engineOptions . size ( ) > 0 ) {
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " Engine " ) , " GameOptions_Engine " ) ;
2016-07-10 05:05:00 +00:00
addEngineControls ( tab , " GameOptions_Engine. " , _engineOptions ) ;
}
//
// 3) The graphics tab
//
2019-12-28 09:43:58 +00:00
_graphicsTabId = tab - > addTab ( g_system - > getOverlayWidth ( ) > 320 ? _ ( " Graphics " ) : _ ( " GFX " ) , " GameOptions_Graphics " ) ;
ScrollContainerWidget * graphicsContainer = new ScrollContainerWidget ( tab , " GameOptions_Graphics.Container " , " GameOptions_Graphics_Container " , kGraphicsTabContainerReflowCmd ) ;
2019-12-28 09:43:58 +00:00
graphicsContainer - > setBackgroundType ( ThemeEngine : : kWidgetBackgroundNo ) ;
2018-07-21 23:01:01 +00:00
graphicsContainer - > setTarget ( this ) ;
2016-07-10 05:05:00 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-01-05 16:48:04 +00:00
_globalGraphicsOverride = new CheckboxWidget ( graphicsContainer , " GameOptions_Graphics_Container.EnableTabCheckbox " , _ ( " Override global graphic settings " ) , nullptr , kCmdGlobalGraphicsOverride ) ;
2016-07-10 05:05:00 +00:00
else
2020-01-05 16:48:04 +00:00
_globalGraphicsOverride = new CheckboxWidget ( graphicsContainer , " GameOptions_Graphics_Container.EnableTabCheckbox " , _c ( " Override global graphic settings " , " lowres " ) , nullptr , kCmdGlobalGraphicsOverride ) ;
2016-07-10 05:05:00 +00:00
2018-07-21 23:01:01 +00:00
addGraphicControls ( graphicsContainer , " GameOptions_Graphics_Container. " ) ;
2016-07-10 05:05:00 +00:00
//
// 4) The audio tab
//
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " Audio " ) , " GameOptions_Audio " ) ;
2016-07-10 05:05:00 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-01-05 16:48:04 +00:00
_globalAudioOverride = new CheckboxWidget ( tab , " GameOptions_Audio.EnableTabCheckbox " , _ ( " Override global audio settings " ) , nullptr , kCmdGlobalAudioOverride ) ;
2016-07-10 05:05:00 +00:00
else
2020-01-05 16:48:04 +00:00
_globalAudioOverride = new CheckboxWidget ( tab , " GameOptions_Audio.EnableTabCheckbox " , _c ( " Override global audio settings " , " lowres " ) , nullptr , kCmdGlobalAudioOverride ) ;
2016-07-10 05:05:00 +00:00
addAudioControls ( tab , " GameOptions_Audio. " ) ;
addSubtitleControls ( tab , " GameOptions_Audio. " ) ;
//
// 5) The volume tab
//
if ( g_system - > getOverlayWidth ( ) > 320 )
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " Volume " ) , " GameOptions_Volume " ) ;
2016-07-10 05:05:00 +00:00
else
2019-12-28 09:43:58 +00:00
tab - > addTab ( _c ( " Volume " , " lowres " ) , " GameOptions_Volume " ) ;
2016-07-10 05:05:00 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-01-05 16:48:04 +00:00
_globalVolumeOverride = new CheckboxWidget ( tab , " GameOptions_Volume.EnableTabCheckbox " , _ ( " Override global volume settings " ) , nullptr , kCmdGlobalVolumeOverride ) ;
2016-07-10 05:05:00 +00:00
else
2020-01-05 16:48:04 +00:00
_globalVolumeOverride = new CheckboxWidget ( tab , " GameOptions_Volume.EnableTabCheckbox " , _c ( " Override global volume settings " , " lowres " ) , nullptr , kCmdGlobalVolumeOverride ) ;
2016-07-10 05:05:00 +00:00
addVolumeControls ( tab , " GameOptions_Volume. " ) ;
2019-12-03 07:35:05 +00:00
bool showMidi = ! _guioptions . contains ( GUIO_NOMIDI ) & & ! _guioptions . contains ( GUIO_NOMUSIC ) ;
2016-07-10 05:05:00 +00:00
//
// 6) The MIDI tab
//
2020-01-05 16:48:04 +00:00
_globalMIDIOverride = nullptr ;
2019-12-03 07:35:05 +00:00
if ( showMidi ) {
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " MIDI " ) , " GameOptions_MIDI " ) ;
2016-07-10 05:05:00 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-01-05 16:48:04 +00:00
_globalMIDIOverride = new CheckboxWidget ( tab , " GameOptions_MIDI.EnableTabCheckbox " , _ ( " Override global MIDI settings " ) , nullptr , kCmdGlobalMIDIOverride ) ;
2016-07-10 05:05:00 +00:00
else
2020-01-05 16:48:04 +00:00
_globalMIDIOverride = new CheckboxWidget ( tab , " GameOptions_MIDI.EnableTabCheckbox " , _c ( " Override global MIDI settings " , " lowres " ) , nullptr , kCmdGlobalMIDIOverride ) ;
2016-07-10 05:05:00 +00:00
addMIDIControls ( tab , " GameOptions_MIDI. " ) ;
}
//
// 7) The MT-32 tab
//
2020-01-05 16:48:04 +00:00
_globalMT32Override = nullptr ;
2019-12-03 07:35:05 +00:00
if ( showMidi ) {
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " MT-32 " ) , " GameOptions_MT32 " ) ;
2016-07-10 05:05:00 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-01-05 16:48:04 +00:00
_globalMT32Override = new CheckboxWidget ( tab , " GameOptions_MT32.EnableTabCheckbox " , _ ( " Override global MT-32 settings " ) , nullptr , kCmdGlobalMT32Override ) ;
2016-07-10 05:05:00 +00:00
else
2020-01-05 16:48:04 +00:00
_globalMT32Override = new CheckboxWidget ( tab , " GameOptions_MT32.EnableTabCheckbox " , _c ( " Override global MT-32 settings " , " lowres " ) , nullptr , kCmdGlobalMT32Override ) ;
2016-07-10 05:05:00 +00:00
addMT32Controls ( tab , " GameOptions_MT32. " ) ;
}
//
// 8) The Paths tab
//
if ( g_system - > getOverlayWidth ( ) > 320 )
2019-12-28 09:43:58 +00:00
tab - > addTab ( _ ( " Paths " ) , " GameOptions_Paths " ) ;
2016-07-10 05:05:00 +00:00
else
2019-12-28 09:43:58 +00:00
tab - > addTab ( _c ( " Paths " , " lowres " ) , " GameOptions_Paths " ) ;
2016-07-10 05:05:00 +00:00
// These buttons have to be extra wide, or the text will be truncated
// in the small version of the GUI.
// GUI: Button + Label for the game path
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-01-05 16:48:04 +00:00
new ButtonWidget ( tab , " GameOptions_Paths.Gamepath " , _ ( " Game Path: " ) , nullptr , kCmdGameBrowser ) ;
2016-07-10 05:05:00 +00:00
else
2020-01-05 16:48:04 +00:00
new ButtonWidget ( tab , " GameOptions_Paths.Gamepath " , _c ( " Game Path: " , " lowres " ) , nullptr , kCmdGameBrowser ) ;
2016-07-10 05:05:00 +00:00
_gamePathWidget = new StaticTextWidget ( tab , " GameOptions_Paths.GamepathText " , gamePath ) ;
// GUI: Button + Label for the additional path
if ( g_system - > getOverlayWidth ( ) > 320 )
new ButtonWidget ( tab , " GameOptions_Paths.Extrapath " , _ ( " Extra Path: " ) , _ ( " Specifies path to additional data used by the game " ) , kCmdExtraBrowser ) ;
else
new ButtonWidget ( tab , " GameOptions_Paths.Extrapath " , _c ( " Extra Path: " , " lowres " ) , _ ( " Specifies path to additional data used by the game " ) , kCmdExtraBrowser ) ;
_extraPathWidget = new StaticTextWidget ( tab , " GameOptions_Paths.ExtrapathText " , extraPath , _ ( " Specifies path to additional data used by the game " ) ) ;
_extraPathClearButton = addClearButton ( tab , " GameOptions_Paths.ExtraPathClearButton " , kCmdExtraPathClear ) ;
// GUI: Button + Label for the save path
if ( g_system - > getOverlayWidth ( ) > 320 )
new ButtonWidget ( tab , " GameOptions_Paths.Savepath " , _ ( " Save Path: " ) , _ ( " Specifies where your saved games are put " ) , kCmdSaveBrowser ) ;
else
new ButtonWidget ( tab , " GameOptions_Paths.Savepath " , _c ( " Save Path: " , " lowres " ) , _ ( " Specifies where your saved games are put " ) , kCmdSaveBrowser ) ;
_savePathWidget = new StaticTextWidget ( tab , " GameOptions_Paths.SavepathText " , savePath , _ ( " Specifies where your saved games are put " ) ) ;
_savePathClearButton = addClearButton ( tab , " GameOptions_Paths.SavePathClearButton " , kCmdSavePathClear ) ;
// Activate the first tab
tab - > setActiveTab ( 0 ) ;
_tabWidget = tab ;
// Add OK & Cancel buttons
2020-01-05 16:48:04 +00:00
new ButtonWidget ( this , " GameOptions.Cancel " , _ ( " Cancel " ) , nullptr , kCloseCmd ) ;
new ButtonWidget ( this , " GameOptions.Ok " , _ ( " OK " ) , nullptr , kOKCmd ) ;
2016-07-10 05:05:00 +00:00
}
2018-07-21 23:01:01 +00:00
void EditGameDialog : : setupGraphicsTab ( ) {
OptionsDialog : : setupGraphicsTab ( ) ;
_globalGraphicsOverride - > setVisible ( true ) ;
}
2016-07-10 05:05:00 +00:00
void EditGameDialog : : open ( ) {
OptionsDialog : : open ( ) ;
String extraPath ( ConfMan . get ( " extrapath " , _domain ) ) ;
if ( extraPath . empty ( ) | | ! ConfMan . hasKey ( " extrapath " , _domain ) ) {
_extraPathWidget - > setLabel ( _c ( " None " , " path " ) ) ;
}
String savePath ( ConfMan . get ( " savepath " , _domain ) ) ;
if ( savePath . empty ( ) | | ! ConfMan . hasKey ( " savepath " , _domain ) ) {
_savePathWidget - > setLabel ( _ ( " Default " ) ) ;
}
int sel , i ;
bool e ;
// En-/disable dialog items depending on whether overrides are active or not.
e = ConfMan . hasKey ( " gfx_mode " , _domain ) | |
ConfMan . hasKey ( " render_mode " , _domain ) | |
ConfMan . hasKey ( " fullscreen " , _domain ) | |
ConfMan . hasKey ( " aspect_ratio " , _domain ) ;
_globalGraphicsOverride - > setState ( e ) ;
e = ConfMan . hasKey ( " music_driver " , _domain ) | |
ConfMan . hasKey ( " output_rate " , _domain ) | |
ConfMan . hasKey ( " opl_driver " , _domain ) | |
ConfMan . hasKey ( " subtitles " , _domain ) | |
ConfMan . hasKey ( " talkspeed " , _domain ) ;
_globalAudioOverride - > setState ( e ) ;
e = ConfMan . hasKey ( " music_volume " , _domain ) | |
ConfMan . hasKey ( " sfx_volume " , _domain ) | |
ConfMan . hasKey ( " speech_volume " , _domain ) ;
_globalVolumeOverride - > setState ( e ) ;
2020-01-10 02:36:52 +00:00
if ( ! _guioptions . contains ( GUIO_NOMIDI ) & & ! _guioptions . contains ( GUIO_NOMUSIC ) ) {
2016-07-10 05:05:00 +00:00
e = ConfMan . hasKey ( " soundfont " , _domain ) | |
ConfMan . hasKey ( " multi_midi " , _domain ) | |
ConfMan . hasKey ( " midi_gain " , _domain ) ;
_globalMIDIOverride - > setState ( e ) ;
e = ConfMan . hasKey ( " native_mt32 " , _domain ) | |
ConfMan . hasKey ( " enable_gs " , _domain ) ;
_globalMT32Override - > setState ( e ) ;
}
// TODO: game path
const Common : : Language lang = Common : : parseLanguage ( ConfMan . get ( " language " , _domain ) ) ;
if ( ConfMan . hasKey ( " language " , _domain ) ) {
_langPopUp - > setSelectedTag ( lang ) ;
} else {
_langPopUp - > setSelectedTag ( ( uint32 ) Common : : UNK_LANG ) ;
}
if ( _langPopUp - > numEntries ( ) < = 3 ) { // If only one language is avaliable
_langPopUpDesc - > setEnabled ( false ) ;
_langPopUp - > setEnabled ( false ) ;
}
// Set the state of engine-specific checkboxes
for ( uint j = 0 ; j < _engineOptions . 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 = _engineOptions [ j ] . defaultState ;
if ( ConfMan . hasKey ( _engineOptions [ j ] . configOption , _domain ) )
isChecked = ConfMan . getBool ( _engineOptions [ j ] . configOption , _domain ) ;
_engineCheckboxes [ j ] - > setState ( isChecked ) ;
}
const Common : : PlatformDescription * p = Common : : g_platforms ;
const Common : : Platform platform = Common : : parsePlatform ( ConfMan . get ( " platform " , _domain ) ) ;
sel = 0 ;
for ( i = 0 ; p - > code ; + + p , + + i ) {
if ( platform = = p - > id )
sel = i + 2 ;
}
_platformPopUp - > setSelected ( sel ) ;
}
2016-10-30 15:43:14 +00:00
void EditGameDialog : : apply ( ) {
ConfMan . set ( " description " , _descriptionWidget - > getEditString ( ) , _domain ) ;
2018-05-22 14:03:56 +00:00
2016-10-30 15:43:14 +00:00
Common : : Language lang = ( Common : : Language ) _langPopUp - > getSelectedTag ( ) ;
if ( lang < 0 )
ConfMan . removeKey ( " language " , _domain ) ;
else
ConfMan . set ( " language " , Common : : getLanguageCode ( lang ) , _domain ) ;
2018-05-22 14:03:56 +00:00
2016-10-30 15:43:14 +00:00
String gamePath ( _gamePathWidget - > getLabel ( ) ) ;
if ( ! gamePath . empty ( ) )
ConfMan . set ( " path " , gamePath , _domain ) ;
2018-05-22 14:03:56 +00:00
2016-10-30 15:43:14 +00:00
String extraPath ( _extraPathWidget - > getLabel ( ) ) ;
if ( ! extraPath . empty ( ) & & ( extraPath ! = _c ( " None " , " path " ) ) )
ConfMan . set ( " extrapath " , extraPath , _domain ) ;
else
ConfMan . removeKey ( " extrapath " , _domain ) ;
2018-05-22 14:03:56 +00:00
2016-10-30 15:43:14 +00:00
String savePath ( _savePathWidget - > getLabel ( ) ) ;
if ( ! savePath . empty ( ) & & ( savePath ! = _ ( " Default " ) ) )
ConfMan . set ( " savepath " , savePath , _domain ) ;
else
ConfMan . removeKey ( " savepath " , _domain ) ;
2018-05-22 14:03:56 +00:00
2016-10-30 15:43:14 +00:00
Common : : Platform platform = ( Common : : Platform ) _platformPopUp - > getSelectedTag ( ) ;
if ( platform < 0 )
ConfMan . removeKey ( " platform " , _domain ) ;
else
ConfMan . set ( " platform " , Common : : getPlatformCode ( platform ) , _domain ) ;
2018-05-22 14:03:56 +00:00
2016-10-30 15:43:14 +00:00
// Set the state of engine-specific checkboxes
for ( uint i = 0 ; i < _engineOptions . size ( ) ; i + + ) {
ConfMan . setBool ( _engineOptions [ i ] . configOption , _engineCheckboxes [ i ] - > getState ( ) , _domain ) ;
2016-07-10 05:05:00 +00:00
}
2016-10-30 15:43:14 +00:00
OptionsDialog : : apply ( ) ;
2016-07-10 05:05:00 +00:00
}
void EditGameDialog : : handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) {
switch ( cmd ) {
case kCmdGlobalGraphicsOverride :
setGraphicSettingsState ( data ! = 0 ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
case kCmdGlobalAudioOverride :
setAudioSettingsState ( data ! = 0 ) ;
setSubtitleSettingsState ( data ! = 0 ) ;
2020-01-05 16:48:04 +00:00
if ( _globalVolumeOverride = = nullptr )
2016-07-10 05:05:00 +00:00
setVolumeSettingsState ( data ! = 0 ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
case kCmdGlobalMIDIOverride :
setMIDISettingsState ( data ! = 0 ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
case kCmdGlobalMT32Override :
setMT32SettingsState ( data ! = 0 ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
case kCmdGlobalVolumeOverride :
setVolumeSettingsState ( data ! = 0 ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
case kCmdChooseSoundFontCmd :
{
BrowserDialog browser ( _ ( " Select SoundFont " ) , false ) ;
if ( browser . runModal ( ) > 0 ) {
// User made this choice...
Common : : FSNode file ( browser . getResult ( ) ) ;
_soundFont - > setLabel ( file . getPath ( ) ) ;
if ( ! file . getPath ( ) . empty ( ) & & ( file . getPath ( ) ! = _c ( " None " , " path " ) ) )
_soundFontClearButton - > setEnabled ( true ) ;
else
_soundFontClearButton - > setEnabled ( false ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
}
break ;
}
// Change path for the game
case kCmdGameBrowser :
{
BrowserDialog browser ( _ ( " Select directory with game data " ) , true ) ;
if ( browser . runModal ( ) > 0 ) {
// User made his choice...
Common : : FSNode dir ( browser . getResult ( ) ) ;
// TODO: Verify the game can be found in the new directory... Best
// done with optional specific gameid to pluginmgr detectgames?
// FSList files = dir.listDir(FSNode::kListFilesOnly);
_gamePathWidget - > setLabel ( dir . getPath ( ) ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
}
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
}
// Change path for extra game data (eg, using sword cutscenes when playing via CD)
case kCmdExtraBrowser :
{
BrowserDialog browser ( _ ( " Select additional game directory " ) , true ) ;
if ( browser . runModal ( ) > 0 ) {
// User made his choice...
Common : : FSNode dir ( browser . getResult ( ) ) ;
_extraPathWidget - > setLabel ( dir . getPath ( ) ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
}
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
}
// Change path for stored save game (perm and temp) data
case kCmdSaveBrowser :
{
BrowserDialog browser ( _ ( " Select directory for saved games " ) , true ) ;
if ( browser . runModal ( ) > 0 ) {
// User made his choice...
Common : : FSNode dir ( browser . getResult ( ) ) ;
_savePathWidget - > setLabel ( dir . getPath ( ) ) ;
2016-10-17 16:45:12 +00:00
# if defined(USE_CLOUD) && defined(USE_LIBCURL)
2016-09-18 15:39:11 +00:00
MessageDialog warningMessage ( _ ( " Saved games sync feature doesn't work with non-default directories. If you want your saved games to sync, use default directory. " ) ) ;
2016-07-10 05:05:00 +00:00
warningMessage . runModal ( ) ;
# endif
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
}
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-10 05:05:00 +00:00
break ;
}
case kCmdExtraPathClear :
_extraPathWidget - > setLabel ( _c ( " None " , " path " ) ) ;
break ;
case kCmdSavePathClear :
_savePathWidget - > setLabel ( _ ( " Default " ) ) ;
break ;
case kOKCmd :
{
// Write back changes made to config object
String newDomain ( _domainWidget - > getEditString ( ) ) ;
if ( newDomain ! = _domain ) {
if ( newDomain . empty ( )
| | newDomain . hasPrefix ( " _ " )
| | newDomain = = ConfigManager : : kApplicationDomain
| | ConfMan . hasGameDomain ( newDomain ) ) {
MessageDialog alert ( _ ( " This game ID is already taken. Please choose another one. " ) ) ;
alert . runModal ( ) ;
return ;
}
ConfMan . renameGameDomain ( _domain , newDomain ) ;
_domain = newDomain ;
}
}
2017-08-06 14:54:38 +00:00
// fall through
2016-07-10 05:05:00 +00:00
default :
OptionsDialog : : handleCommand ( sender , cmd , data ) ;
}
}
} // End of namespace GUI