2007-05-30 21:56:52 +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 .
2002-09-27 23:27:14 +00:00
*
* 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
2005-10-18 01:30:26 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2014-02-18 01:34:20 +00:00
*
2002-09-27 23:27:14 +00:00
*/
2004-02-09 01:27:27 +00:00
# include "base/version.h"
2003-11-05 00:59:03 +00:00
# include "common/config-manager.h"
2007-03-17 16:05:16 +00:00
# include "common/events.h"
2006-06-24 08:07:48 +00:00
# include "common/fs.h"
2012-02-22 14:33:29 +00:00
# include "common/gui_options.h"
2003-11-05 00:59:03 +00:00
# include "common/util.h"
2005-05-16 00:26:23 +00:00
# include "common/system.h"
2010-06-15 10:44:51 +00:00
# include "common/translation.h"
2003-11-05 00:59:03 +00:00
2003-09-08 18:09:32 +00:00
# include "gui/about.h"
# include "gui/browser.h"
# include "gui/chooser.h"
2016-07-10 05:05:00 +00:00
# include "gui/editgamedialog.h"
2003-09-08 18:09:32 +00:00
# include "gui/launcher.h"
2007-02-18 18:23:52 +00:00
# include "gui/massadd.h"
2003-09-08 18:09:32 +00:00
# include "gui/message.h"
2010-11-16 10:19:01 +00:00
# include "gui/gui-manager.h"
2003-09-08 18:09:32 +00:00
# include "gui/options.h"
2013-05-16 21:18:09 +00:00
# ifdef ENABLE_EVENTRECORDER
# include "gui/onscreendialog.h"
# include "gui/recorderdialog.h"
# include "gui/EventRecorder.h"
# endif
2008-11-11 12:13:55 +00:00
# include "gui/saveload.h"
2010-11-16 10:11:57 +00:00
# include "gui/widgets/edittext.h"
# include "gui/widgets/list.h"
# include "gui/widgets/tab.h"
# include "gui/widgets/popup.h"
2008-11-11 12:13:55 +00:00
# include "gui/ThemeEval.h"
2008-06-16 18:47:32 +00:00
# include "graphics/cursorman.h"
2016-10-17 16:45:12 +00:00
# if defined(USE_CLOUD) && defined(USE_LIBCURL)
2016-07-04 11:42:38 +00:00
# include "backends/cloud/cloudmanager.h"
# endif
2002-09-27 23:27:14 +00:00
2003-10-08 21:59:23 +00:00
using Common : : ConfigManager ;
2002-09-27 23:27:14 +00:00
2003-11-10 23:40:48 +00:00
namespace GUI {
2002-09-27 23:27:14 +00:00
enum {
2002-09-30 00:55:47 +00:00
kStartCmd = ' STRT ' ,
2003-09-08 18:09:32 +00:00
kAboutCmd = ' ABOU ' ,
2002-09-30 00:55:47 +00:00
kOptionsCmd = ' OPTN ' ,
2002-10-13 11:51:48 +00:00
kAddGameCmd = ' ADDG ' ,
2002-11-21 13:11:29 +00:00
kEditGameCmd = ' EDTG ' ,
kRemoveGameCmd = ' REMG ' ,
2008-07-30 21:48:45 +00:00
kLoadGameCmd = ' LOAD ' ,
2003-11-07 16:01:51 +00:00
kQuitCmd = ' QUIT ' ,
2009-06-06 17:53:25 +00:00
kSearchCmd = ' SRCH ' ,
2009-06-06 17:54:28 +00:00
kListSearchCmd = ' LSSR ' ,
2009-06-07 22:19:48 +00:00
kSearchClearCmd = ' SRCL ' ,
2005-07-30 21:11:48 +00:00
2003-11-07 16:01:51 +00:00
kCmdGlobalGraphicsOverride = ' OGFX ' ,
kCmdGlobalAudioOverride = ' OSFX ' ,
2005-04-13 00:11:49 +00:00
kCmdGlobalMIDIOverride = ' OMID ' ,
2010-07-24 22:29:17 +00:00
kCmdGlobalMT32Override = ' OM32 ' ,
2004-06-29 14:23:39 +00:00
kCmdGlobalVolumeOverride = ' OVOL ' ,
2005-05-16 06:33:33 +00:00
kCmdChooseSoundFontCmd = ' chsf ' ,
2004-06-29 14:23:39 +00:00
kCmdExtraBrowser = ' PEXT ' ,
2011-10-24 18:34:10 +00:00
kCmdExtraPathClear = ' PEXC ' ,
2004-06-29 14:23:39 +00:00
kCmdGameBrowser = ' PGME ' ,
2011-10-24 18:34:10 +00:00
kCmdSaveBrowser = ' PSAV ' ,
kCmdSavePathClear = ' PSAC '
2002-09-27 23:27:14 +00:00
} ;
2002-11-21 02:19:02 +00:00
2003-11-05 12:25:42 +00:00
# pragma mark -
2003-11-05 00:59:03 +00:00
2006-05-04 22:52:18 +00:00
LauncherDialog : : LauncherDialog ( )
2007-03-17 16:05:16 +00:00
: Dialog ( 0 , 0 , 320 , 200 ) {
2008-11-10 11:24:55 +00:00
_backgroundType = GUI : : ThemeEngine : : kDialogBackgroundMain ;
2005-05-16 00:26:23 +00:00
const int screenW = g_system - > getOverlayWidth ( ) ;
const int screenH = g_system - > getOverlayHeight ( ) ;
2005-07-30 21:11:48 +00:00
2005-05-16 00:26:23 +00:00
_w = screenW ;
_h = screenH ;
2016-10-30 18:56:35 +00:00
build ( ) ;
GUI : : GuiManager : : instance ( ) . _launched = true ;
}
void LauncherDialog : : selectTarget ( const String & target ) {
if ( ! target . empty ( ) ) {
int itemToSelect = 0 ;
StringArray : : const_iterator iter ;
for ( iter = _domains . begin ( ) ; iter ! = _domains . end ( ) ; + + iter , + + itemToSelect ) {
if ( target = = * iter ) {
_list - > setSelected ( itemToSelect ) ;
break ;
}
}
}
}
LauncherDialog : : ~ LauncherDialog ( ) {
delete _browser ;
delete _loadDialog ;
}
void LauncherDialog : : build ( ) {
2006-03-14 02:19:38 +00:00
# ifndef DISABLE_FANCY_THEMES
2006-04-20 12:25:25 +00:00
_logo = 0 ;
2008-08-08 18:30:16 +00:00
if ( g_gui . xmlEval ( ) - > getVar ( " Globals.ShowLauncherLogo " ) = = 1 & & g_gui . theme ( ) - > supportsImages ( ) ) {
2008-08-05 16:23:17 +00:00
_logo = new GraphicsWidget ( this , " Launcher.Logo " ) ;
2006-05-29 14:55:43 +00:00
_logo - > useThemeTransparency ( true ) ;
2008-11-10 11:24:55 +00:00
_logo - > setGfx ( g_gui . theme ( ) - > getImageSurface ( ThemeEngine : : kImageLogo ) ) ;
2006-03-14 03:08:14 +00:00
2008-08-05 16:23:17 +00:00
new StaticTextWidget ( this , " Launcher.Version " , gScummVMVersionDate ) ;
2006-03-14 03:08:14 +00:00
} else
2008-08-05 16:23:17 +00:00
new StaticTextWidget ( this , " Launcher.Version " , gScummVMFullVersion ) ;
2006-03-14 03:08:14 +00:00
# else
// Show ScummVM version
2008-08-05 16:23:17 +00:00
new StaticTextWidget ( this , " Launcher.Version " , gScummVMFullVersion ) ;
2006-03-14 02:19:38 +00:00
# endif
2010-06-15 10:53:30 +00:00
new ButtonWidget ( this , " Launcher.QuitButton " , _ ( " ~Q~uit " ) , _ ( " Quit ScummVM " ) , kQuitCmd ) ;
new ButtonWidget ( this , " Launcher.AboutButton " , _ ( " A~b~out... " ) , _ ( " About ScummVM " ) , kAboutCmd ) ;
new ButtonWidget ( this , " Launcher.OptionsButton " , _ ( " ~O~ptions... " ) , _ ( " Change global ScummVM options " ) , kOptionsCmd ) ;
2006-03-07 05:39:52 +00:00
_startButton =
2010-06-15 10:53:30 +00:00
new ButtonWidget ( this , " Launcher.StartButton " , _ ( " ~S~tart " ) , _ ( " Start selected game " ) , kStartCmd ) ;
2005-05-16 00:26:23 +00:00
2008-09-14 18:19:22 +00:00
_loadButton =
2014-08-19 18:42:20 +00:00
new ButtonWidget ( this , " Launcher.LoadGameButton " , _ ( " ~L~oad... " ) , _ ( " Load saved game for selected game " ) , kLoadGameCmd ) ;
2005-05-16 00:26:23 +00:00
// Above the lowest button rows: two more buttons (directly below the list box)
2010-08-30 22:24:40 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 ) {
_addButton =
new ButtonWidget ( this , " Launcher.AddGameButton " , _ ( " ~A~dd Game... " ) , _ ( " Hold Shift for Mass Add " ) , kAddGameCmd ) ;
_editButton =
new ButtonWidget ( this , " Launcher.EditGameButton " , _ ( " ~E~dit Game... " ) , _ ( " Change game options " ) , kEditGameCmd ) ;
_removeButton =
new ButtonWidget ( this , " Launcher.RemoveGameButton " , _ ( " ~R~emove Game " ) , _ ( " Remove game from the list. The game data files stay intact " ) , kRemoveGameCmd ) ;
} else {
_addButton =
new ButtonWidget ( this , " Launcher.AddGameButton " , _c ( " ~A~dd Game... " , " lowres " ) , _ ( " Hold Shift for Mass Add " ) , kAddGameCmd ) ;
_editButton =
new ButtonWidget ( this , " Launcher.EditGameButton " , _c ( " ~E~dit Game... " , " lowres " ) , _ ( " Change game options " ) , kEditGameCmd ) ;
_removeButton =
new ButtonWidget ( this , " Launcher.RemoveGameButton " , _c ( " ~R~emove Game " , " lowres " ) , _ ( " Remove game from the list. The game data files stay intact " ) , kRemoveGameCmd ) ;
}
2005-05-16 00:26:23 +00:00
2009-06-06 17:53:25 +00:00
// Search box
2009-06-06 17:54:08 +00:00
_searchDesc = 0 ;
# ifndef DISABLE_FANCY_THEMES
_searchPic = 0 ;
if ( g_gui . xmlEval ( ) - > getVar ( " Globals.ShowSearchPic " ) = = 1 & & g_gui . theme ( ) - > supportsImages ( ) ) {
2010-06-15 10:52:35 +00:00
_searchPic = new GraphicsWidget ( this , " Launcher.SearchPic " , _ ( " Search in game list " ) ) ;
2009-06-06 17:54:08 +00:00
_searchPic - > setGfx ( g_gui . theme ( ) - > getImageSurface ( ThemeEngine : : kImageSearch ) ) ;
} else
# endif
2010-06-15 10:44:51 +00:00
_searchDesc = new StaticTextWidget ( this , " Launcher.SearchDesc " , _ ( " Search: " ) ) ;
2009-06-06 17:54:08 +00:00
2010-06-15 10:54:22 +00:00
_searchWidget = new EditTextWidget ( this , " Launcher.Search " , _search , 0 , kSearchCmd ) ;
2011-10-24 18:50:31 +00:00
_searchClearButton = addClearButton ( this , " Launcher.SearchClearButton " , kSearchClearCmd ) ;
2002-09-27 23:27:14 +00:00
// Add list with game titles
2010-06-15 10:54:22 +00:00
_list = new ListWidget ( this , " Launcher.GameList " , 0 , kListSearchCmd ) ;
2002-09-30 12:56:59 +00:00
_list - > setEditable ( false ) ;
2002-09-30 00:55:47 +00:00
_list - > setNumberingMode ( kListNumberingOff ) ;
2003-03-06 19:52:54 +00:00
2002-12-01 12:47:13 +00:00
// Populate the list
updateListing ( ) ;
2004-10-01 21:12:18 +00:00
// Restore last selection
2006-06-03 13:33:39 +00:00
String last ( ConfMan . get ( " lastselectedgame " , ConfigManager : : kApplicationDomain ) ) ;
2009-12-15 08:19:34 +00:00
selectTarget ( last ) ;
2005-07-30 21:11:48 +00:00
2005-05-16 00:26:23 +00:00
// En-/disable the buttons depending on the list selection
2005-01-05 01:42:52 +00:00
updateButtons ( ) ;
// Create file browser dialog
2010-06-15 10:44:51 +00:00
_browser = new BrowserDialog ( _ ( " Select directory with game data " ) , true ) ;
2008-07-30 21:48:45 +00:00
2008-08-14 03:50:48 +00:00
// Create Load dialog
2012-06-10 02:14:17 +00:00
_loadDialog = new SaveLoadChooser ( _ ( " Load game: " ) , _ ( " Load " ) , false ) ;
2005-01-05 01:42:52 +00:00
}
2016-10-30 18:56:35 +00:00
void LauncherDialog : : clean ( ) {
while ( _firstWidget ) {
Widget * w = _firstWidget ;
removeWidget ( w ) ;
delete w ;
2004-10-01 21:12:18 +00:00
}
2002-11-21 02:19:02 +00:00
delete _browser ;
2008-08-13 20:27:39 +00:00
delete _loadDialog ;
2002-11-21 02:19:02 +00:00
}
2016-10-30 18:56:35 +00:00
void LauncherDialog : : rebuild ( ) {
clean ( ) ;
build ( ) ;
reflowLayout ( ) ;
setFocusWidget ( _firstWidget ) ;
}
2006-07-22 21:23:49 +00:00
void LauncherDialog : : open ( ) {
// Clear the active domain, in case we return to the dialog from a
// failure to launch a game. Otherwise, pressing ESC will attempt to
// re-launch the same game again.
ConfMan . setActiveDomain ( " " ) ;
2008-06-16 18:47:32 +00:00
CursorMan . popAllCursors ( ) ;
2006-07-22 21:23:49 +00:00
Dialog : : open ( ) ;
2007-09-19 08:40:12 +00:00
2007-03-17 16:05:16 +00:00
updateButtons ( ) ;
2006-07-22 21:23:49 +00:00
}
2004-10-01 21:12:18 +00:00
void LauncherDialog : : close ( ) {
// Save last selection
const int sel = _list - > getSelected ( ) ;
if ( sel > = 0 )
2006-06-03 13:33:39 +00:00
ConfMan . set ( " lastselectedgame " , _domains [ sel ] , ConfigManager : : kApplicationDomain ) ;
2004-10-01 21:12:18 +00:00
else
2006-06-03 13:33:39 +00:00
ConfMan . removeKey ( " lastselectedgame " , ConfigManager : : kApplicationDomain ) ;
2005-07-30 21:11:48 +00:00
ConfMan . flushToDisk ( ) ;
2004-10-01 21:12:18 +00:00
Dialog : : close ( ) ;
}
2003-03-06 19:52:54 +00:00
void LauncherDialog : : updateListing ( ) {
2010-03-18 15:09:24 +00:00
StringArray l ;
2002-10-28 09:03:02 +00:00
2002-10-28 10:40:49 +00:00
// Retrieve a list of all games defined in the config file
2002-11-21 15:20:52 +00:00
_domains . clear ( ) ;
2003-10-08 21:59:23 +00:00
const ConfigManager : : DomainMap & domains = ConfMan . getGameDomains ( ) ;
2008-06-11 06:22:02 +00:00
ConfigManager : : DomainMap : : const_iterator iter ;
2003-10-05 14:03:07 +00:00
for ( iter = domains . begin ( ) ; iter ! = domains . end ( ) ; + + iter ) {
2008-06-11 06:22:02 +00:00
# ifdef __DS__
// DS port uses an extra section called 'ds'. This prevents the section from being
// detected as a game.
if ( iter - > _key = = " ds " ) {
continue ;
}
# endif
2010-03-29 20:31:23 +00:00
String gameid ( iter - > _value . getVal ( " gameid " ) ) ;
String description ( iter - > _value . getVal ( " description " ) ) ;
2003-03-06 19:52:54 +00:00
2006-03-28 09:42:54 +00:00
if ( gameid . empty ( ) )
2006-01-21 13:01:20 +00:00
gameid = iter - > _key ;
2006-03-28 09:42:54 +00:00
if ( description . empty ( ) ) {
2008-05-12 00:26:29 +00:00
GameDescriptor g = EngineMan . findGame ( gameid ) ;
2007-01-20 21:27:57 +00:00
if ( g . contains ( " description " ) )
description = g . description ( ) ;
2003-10-17 15:54:17 +00:00
}
2007-07-02 22:48:39 +00:00
2010-06-15 10:44:51 +00:00
if ( description . empty ( ) ) {
2011-06-01 22:07:18 +00:00
description = Common : : String : : format ( " Unknown (target %s, gameid %s) " , iter - > _key . c_str ( ) , gameid . c_str ( ) ) ;
2010-06-15 10:44:51 +00:00
}
2002-10-28 10:40:49 +00:00
2006-03-28 09:42:54 +00:00
if ( ! gameid . empty ( ) & & ! description . empty ( ) ) {
2002-10-28 10:40:49 +00:00
// Insert the game into the launcher list
int pos = 0 , size = l . size ( ) ;
2002-10-28 09:03:02 +00:00
2004-08-26 00:27:51 +00:00
while ( pos < size & & ( scumm_stricmp ( description . c_str ( ) , l [ pos ] . c_str ( ) ) > 0 ) )
2002-10-15 15:32:54 +00:00
pos + + ;
2002-10-28 10:40:49 +00:00
l . insert_at ( pos , description ) ;
2003-10-08 21:59:23 +00:00
_domains . insert_at ( pos , iter - > _key ) ;
2002-09-30 00:55:47 +00:00
}
2002-09-27 23:27:14 +00:00
}
2004-12-25 22:26:28 +00:00
const int oldSel = _list - > getSelected ( ) ;
2002-11-21 15:20:52 +00:00
_list - > setList ( l ) ;
2004-12-25 23:19:42 +00:00
if ( oldSel < ( int ) l . size ( ) )
2004-12-25 22:26:28 +00:00
_list - > setSelected ( oldSel ) ; // Restore the old selection
2006-11-13 16:29:14 +00:00
else if ( oldSel ! = - 1 )
// Select the last entry if the list has been reduced
_list - > setSelected ( _list - > getList ( ) . size ( ) - 1 ) ;
2002-12-01 12:47:13 +00:00
updateButtons ( ) ;
2009-07-15 17:07:45 +00:00
// Update the filter settings, those are lost when "setList"
// is called.
_list - > setFilter ( _searchWidget - > getEditString ( ) ) ;
2002-09-27 23:27:14 +00:00
}
2003-11-05 12:25:42 +00:00
void LauncherDialog : : addGame ( ) {
2011-06-01 13:15:31 +00:00
2011-05-21 14:45:51 +00:00
# ifndef DISABLE_MASS_ADD
2013-05-16 21:18:09 +00:00
const bool massAdd = checkModifier ( Common : : KBD_SHIFT ) ;
2007-09-19 08:40:12 +00:00
2006-10-02 22:28:02 +00:00
if ( massAdd ) {
2010-06-15 10:44:51 +00:00
MessageDialog alert ( _ ( " Do you really want to run the mass game detector? "
" This could potentially add a huge number of games. " ) , _ ( " Yes " ) , _ ( " No " ) ) ;
2006-10-02 22:28:02 +00:00
if ( alert . runModal ( ) = = GUI : : kMessageOK & & _browser - > runModal ( ) > 0 ) {
2007-02-18 18:23:52 +00:00
MassAddDialog massAddDlg ( _browser - > getResult ( ) ) ;
2009-06-06 17:49:59 +00:00
2007-02-18 18:23:52 +00:00
massAddDlg . runModal ( ) ;
2007-02-18 18:36:21 +00:00
2009-06-06 17:50:30 +00:00
// Update the ListWidget and force a redraw
2009-12-15 08:19:34 +00:00
// If new target(s) were added, update the ListWidget and move
// the selection to to first newly detected game.
2009-12-15 12:56:10 +00:00
Common : : String newTarget = massAddDlg . getFirstAddedTarget ( ) ;
2009-12-15 08:19:34 +00:00
if ( ! newTarget . empty ( ) ) {
updateListing ( ) ;
selectTarget ( newTarget ) ;
}
2009-06-06 17:49:59 +00:00
2007-02-18 18:36:21 +00:00
draw ( ) ;
2006-10-02 22:28:02 +00:00
}
2009-01-08 17:08:24 +00:00
// We need to update the buttons here, so "Mass add" will revert to "Add game"
// without any additional event.
updateButtons ( ) ;
2006-10-02 22:28:02 +00:00
return ;
}
2011-05-21 14:45:51 +00:00
# endif
2006-10-02 22:28:02 +00:00
2003-11-05 12:25:42 +00:00
// Allow user to add a new game to the list.
// 1) show a dir selection dialog which lets the user pick the directory
// the game data resides in.
// 2) try to auto detect which game is in the directory, if we cannot
2009-04-18 21:12:32 +00:00
// determine it uniquely present a list of candidates to the user
2003-11-05 12:25:42 +00:00
// to pick from
// 3) Display the 'Edit' dialog for that item, letting the user specify
// an alternate description (to distinguish multiple versions of the
// game, e.g. 'Monkey German' and 'Monkey English') and set default
2009-06-06 17:37:15 +00:00
// options for that game
// 4) If no game is found in the specified directory, return to the
// dialog.
2007-02-18 18:23:52 +00:00
2009-06-06 17:37:15 +00:00
bool looping ;
do {
looping = false ;
2007-02-18 18:23:52 +00:00
2009-06-06 17:37:15 +00:00
if ( _browser - > runModal ( ) > 0 ) {
// User made his choice...
2016-10-17 16:45:12 +00:00
# if defined(USE_CLOUD) && defined(USE_LIBCURL)
2016-07-12 08:00:11 +00:00
String selectedDirectory = _browser - > getResult ( ) . getPath ( ) ;
2016-07-04 11:42:38 +00:00
String bannedDirectory = CloudMan . getDownloadLocalDirectory ( ) ;
if ( selectedDirectory . size ( ) & & selectedDirectory . lastChar ( ) ! = ' / ' & & selectedDirectory . lastChar ( ) ! = ' \\ ' )
selectedDirectory + = ' / ' ;
2016-07-22 10:38:07 +00:00
if ( bannedDirectory . size ( ) & & bannedDirectory . lastChar ( ) ! = ' / ' & & bannedDirectory . lastChar ( ) ! = ' \\ ' ) {
if ( selectedDirectory . size ( ) ) {
bannedDirectory + = selectedDirectory . lastChar ( ) ;
} else {
bannedDirectory + = ' / ' ;
}
}
2016-07-04 11:42:38 +00:00
if ( selectedDirectory . equalsIgnoreCase ( bannedDirectory ) ) {
MessageDialog alert ( _ ( " This directory cannot be used yet, it is being downloaded into! " ) ) ;
alert . runModal ( ) ;
return ;
}
# endif
2016-07-12 08:00:11 +00:00
looping = ! doGameDetection ( _browser - > getResult ( ) . getPath ( ) ) ;
2006-10-02 22:28:02 +00:00
}
2009-06-06 17:37:15 +00:00
} while ( looping ) ;
2006-10-02 22:28:02 +00:00
}
2007-02-18 18:23:52 +00:00
Common : : String addGameToConf ( const GameDescriptor & result ) {
2006-11-19 22:32:35 +00:00
// The auto detector or the user made a choice.
// Pick a domain name which does not yet exist (after all, we
// are *adding* a game to the config, not replacing).
2008-11-08 01:34:02 +00:00
Common : : String domain = result . preferredtarget ( ) ;
2007-01-29 23:25:51 +00:00
2007-01-28 10:38:23 +00:00
assert ( ! domain . empty ( ) ) ;
2006-11-19 22:32:35 +00:00
if ( ConfMan . hasGameDomain ( domain ) ) {
int suffixN = 1 ;
2008-11-08 01:34:02 +00:00
Common : : String gameid ( domain ) ;
2006-11-19 22:32:35 +00:00
while ( ConfMan . hasGameDomain ( domain ) ) {
2011-06-01 22:07:18 +00:00
domain = gameid + Common : : String : : format ( " -%d " , suffixN ) ;
2006-11-19 22:32:35 +00:00
suffixN + + ;
}
}
2006-04-16 13:58:11 +00:00
2006-11-19 22:32:35 +00:00
// Add the name domain
ConfMan . addGameDomain ( domain ) ;
2007-02-18 18:39:46 +00:00
// Copy all non-empty key/value pairs into the new domain
for ( GameDescriptor : : const_iterator iter = result . begin ( ) ; iter ! = result . end ( ) ; + + iter ) {
if ( ! iter - > _value . empty ( ) & & iter - > _key ! = " preferredtarget " )
ConfMan . set ( iter - > _key , iter - > _value , domain ) ;
}
2006-11-19 22:32:35 +00:00
// TODO: Setting the description field here has the drawback
// that the user does never notice when we upgrade our descriptions.
// It might be nice ot leave this field empty, and only set it to
2007-09-19 08:40:12 +00:00
// a value when the user edits the description string.
2006-11-19 22:32:35 +00:00
// However, at this point, that's impractical. Once we have a method
// to query all backends for the proper & full description of a given
// game target, we can change this (currently, you can only query
// for the generic gameid description; it's not possible to obtain
// a description which contains extended information like language, etc.).
2007-09-19 08:40:12 +00:00
2007-02-18 18:23:52 +00:00
return domain ;
2006-11-19 22:32:35 +00:00
}
2003-11-05 12:25:42 +00:00
void LauncherDialog : : removeGame ( int item ) {
2010-06-15 10:44:51 +00:00
MessageDialog alert ( _ ( " Do you really want to remove this game configuration? " ) , _ ( " Yes " ) , _ ( " No " ) ) ;
2005-07-30 21:11:48 +00:00
2004-08-11 21:49:58 +00:00
if ( alert . runModal ( ) = = GUI : : kMessageOK ) {
2003-11-05 12:25:42 +00:00
// Remove the currently selected game from the list
assert ( item > = 0 ) ;
ConfMan . removeGameDomain ( _domains [ item ] ) ;
// Write config to disk
ConfMan . flushToDisk ( ) ;
2005-07-30 21:11:48 +00:00
2003-11-05 12:25:42 +00:00
// Update the ListWidget and force a redraw
updateListing ( ) ;
draw ( ) ;
}
}
void LauncherDialog : : editGame ( int item ) {
2009-02-15 22:07:19 +00:00
// Set game specific options. Most of these should be "optional", i.e. by
2003-11-05 12:25:42 +00:00
// default set nothing and use the global ScummVM settings. E.g. the user
// can set here an optional alternate music volume, or for specific games
// a different music driver etc.
2010-01-25 00:13:32 +00:00
// This is useful because e.g. MonkeyVGA needs AdLib music to have decent
2003-11-05 12:25:42 +00:00
// music support etc.
assert ( item > = 0 ) ;
String gameId ( ConfMan . get ( " gameid " , _domains [ item ] ) ) ;
2006-03-28 09:42:54 +00:00
if ( gameId . empty ( ) )
2003-11-05 12:25:42 +00:00
gameId = _domains [ item ] ;
2008-05-12 00:26:29 +00:00
EditGameDialog editDialog ( _domains [ item ] , EngineMan . findGame ( gameId ) . description ( ) ) ;
2004-03-17 00:07:43 +00:00
if ( editDialog . runModal ( ) > 0 ) {
2003-11-05 12:25:42 +00:00
// User pressed OK, so make changes permanent
// Write config to disk
ConfMan . flushToDisk ( ) ;
2003-11-08 23:22:16 +00:00
2009-02-15 22:07:19 +00:00
// Update the ListWidget, reselect the edited game and force a redraw
2003-11-05 12:25:42 +00:00
updateListing ( ) ;
2009-12-15 08:19:34 +00:00
selectTarget ( editDialog . getDomain ( ) ) ;
2003-11-05 12:25:42 +00:00
draw ( ) ;
}
}
2013-05-16 21:18:09 +00:00
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 ;
2014-08-19 18:42:20 +00:00
MessageDialog alert ( _ ( " Do you want to load saved game? " ) ,
2013-05-16 21:18:09 +00:00
_ ( " 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
2008-07-30 21:48:45 +00:00
void LauncherDialog : : loadGame ( int item ) {
2008-08-06 01:48:46 +00:00
String gameId = ConfMan . get ( " gameid " , _domains [ item ] ) ;
if ( gameId . empty ( ) )
gameId = _domains [ item ] ;
const EnginePlugin * plugin = 0 ;
2011-06-01 13:15:31 +00:00
2008-09-11 20:20:02 +00:00
EngineMan . findGame ( gameId , & plugin ) ;
2008-08-14 03:50:48 +00:00
2008-09-11 20:20:02 +00:00
String target = _domains [ item ] ;
target . toLowercase ( ) ;
2008-08-14 06:51:04 +00:00
2008-08-06 01:48:46 +00:00
if ( plugin ) {
2008-12-22 11:22:15 +00:00
if ( ( * plugin ) - > hasFeature ( MetaEngine : : kSupportsListSaves ) & &
2008-10-26 16:42:08 +00:00
( * plugin ) - > hasFeature ( MetaEngine : : kSupportsLoadingDuringStartup ) ) {
2011-02-07 22:58:22 +00:00
int slot = _loadDialog - > runModalWithPluginAndTarget ( plugin , target ) ;
2008-09-11 20:20:02 +00:00
if ( slot > = 0 ) {
ConfMan . setActiveDomain ( _domains [ item ] ) ;
ConfMan . setInt ( " save_slot " , slot , Common : : ConfigManager : : kTransientDomain ) ;
close ( ) ;
}
2008-08-15 18:15:14 +00:00
} else {
MessageDialog dialog
2010-06-15 10:44:51 +00:00
( _ ( " This game does not support loading games from the launcher. " ) , _ ( " OK " ) ) ;
2008-08-15 18:15:14 +00:00
dialog . runModal ( ) ;
2008-08-06 01:48:46 +00:00
}
} else {
2010-06-15 10:44:51 +00:00
MessageDialog dialog ( _ ( " ScummVM could not find any engine capable of running the selected game! " ) , _ ( " OK " ) ) ;
2008-08-06 01:48:46 +00:00
dialog . runModal ( ) ;
}
2008-07-30 21:48:45 +00:00
}
2007-06-30 12:26:59 +00:00
void LauncherDialog : : handleKeyDown ( Common : : KeyState state ) {
2009-06-06 23:22:48 +00:00
if ( state . keycode = = Common : : KEYCODE_TAB ) {
// Toggle between the game list and the quick search field.
if ( getFocusWidget ( ) = = _searchWidget ) {
setFocusWidget ( _list ) ;
} else if ( getFocusWidget ( ) = = _list ) {
setFocusWidget ( _searchWidget ) ;
}
}
2007-06-30 12:26:59 +00:00
Dialog : : handleKeyDown ( state ) ;
2007-03-17 16:05:16 +00:00
updateButtons ( ) ;
2006-10-02 22:28:02 +00:00
}
2007-06-30 12:26:59 +00:00
void LauncherDialog : : handleKeyUp ( Common : : KeyState state ) {
Dialog : : handleKeyUp ( state ) ;
2007-03-17 16:05:16 +00:00
updateButtons ( ) ;
2006-10-02 22:28:02 +00:00
}
2016-07-12 08:00:11 +00:00
bool LauncherDialog : : doGameDetection ( const Common : : String & path ) {
// Allow user to add a new game to the list.
// 2) try to auto detect which game is in the directory, if we cannot
// determine it uniquely present a list of candidates to the user
// to pick from
// 3) Display the 'Edit' dialog for that item, letting the user specify
// an alternate description (to distinguish multiple versions of the
// game, e.g. 'Monkey German' and 'Monkey English') and set default
// options for that game
// 4) If no game is found in the specified directory, return to the
// dialog.
// User made his choice...
Common : : FSNode dir ( path ) ;
Common : : FSList files ;
if ( ! dir . getChildren ( files , Common : : FSNode : : kListAll ) ) {
MessageDialog alert ( _ ( " ScummVM couldn't open the specified directory! " ) ) ;
alert . runModal ( ) ;
return true ;
}
// ...so let's determine a list of candidates, games that
// could be contained in the specified directory.
GameList candidates ( EngineMan . detectGames ( files ) ) ;
int idx ;
if ( candidates . empty ( ) ) {
// No game was found in the specified directory
MessageDialog alert ( _ ( " ScummVM could not find any game in the specified directory! " ) ) ;
alert . runModal ( ) ;
idx = - 1 ;
return false ;
} else if ( candidates . size ( ) = = 1 ) {
// Exact match
idx = 0 ;
} else {
// Display the candidates to the user and let her/him pick one
StringArray list ;
for ( idx = 0 ; idx < ( int ) candidates . size ( ) ; idx + + )
list . push_back ( candidates [ idx ] . description ( ) ) ;
ChooserDialog dialog ( _ ( " Pick the game: " ) ) ;
dialog . setList ( list ) ;
idx = dialog . runModal ( ) ;
}
if ( 0 < = idx & & idx < ( int ) candidates . size ( ) ) {
GameDescriptor result = candidates [ idx ] ;
// TODO: Change the detectors to set "path" !
result [ " path " ] = dir . getPath ( ) ;
Common : : String domain = addGameToConf ( result ) ;
// Display edit dialog for the new entry
EditGameDialog editDialog ( domain , result . description ( ) ) ;
if ( editDialog . runModal ( ) > 0 ) {
// User pressed OK, so make changes permanent
// Write config to disk
ConfMan . flushToDisk ( ) ;
// Update the ListWidget, select the new item, and force a redraw
updateListing ( ) ;
selectTarget ( editDialog . getDomain ( ) ) ;
draw ( ) ;
} else {
// User aborted, remove the the new domain again
ConfMan . removeGameDomain ( domain ) ;
}
}
return true ;
}
2003-11-05 12:25:42 +00:00
void LauncherDialog : : handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) {
2003-11-10 23:40:48 +00:00
int item = _list - > getSelected ( ) ;
2003-11-05 12:25:42 +00:00
switch ( cmd ) {
case kAddGameCmd :
addGame ( ) ;
2002-11-21 13:11:29 +00:00
break ;
2003-11-05 12:25:42 +00:00
case kRemoveGameCmd :
removeGame ( item ) ;
break ;
case kEditGameCmd :
editGame ( item ) ;
2002-10-17 22:43:13 +00:00
break ;
2008-07-30 21:48:45 +00:00
case kLoadGameCmd :
2013-05-16 21:18:09 +00:00
loadGameButtonPressed ( item ) ;
2008-07-30 21:48:45 +00:00
break ;
2002-11-21 13:11:29 +00:00
case kOptionsCmd : {
2016-07-12 08:00:11 +00:00
GlobalOptionsDialog options ( this ) ;
2002-12-12 23:22:48 +00:00
options . runModal ( ) ;
2002-11-21 13:11:29 +00:00
}
2002-10-17 22:43:13 +00:00
break ;
2003-09-08 18:09:32 +00:00
case kAboutCmd : {
2003-11-02 02:18:16 +00:00
AboutDialog about ;
2003-09-08 18:09:32 +00:00
about . runModal ( ) ;
}
break ;
2002-09-30 00:55:47 +00:00
case kStartCmd :
2003-11-18 23:47:08 +00:00
case kListItemActivatedCmd :
2002-09-27 23:27:14 +00:00
case kListItemDoubleClickedCmd :
2009-12-15 08:19:34 +00:00
// Start the selected game.
2002-10-01 23:11:19 +00:00
assert ( item > = 0 ) ;
2006-05-05 00:26:03 +00:00
ConfMan . setActiveDomain ( _domains [ item ] ) ;
2002-10-01 23:11:19 +00:00
close ( ) ;
2007-07-17 21:59:44 +00:00
break ;
case kListItemRemovalRequestCmd :
removeGame ( item ) ;
2002-10-01 23:11:19 +00:00
break ;
2002-12-01 12:47:13 +00:00
case kListSelectionChangedCmd :
updateButtons ( ) ;
2002-09-27 23:27:14 +00:00
break ;
case kQuitCmd :
2006-06-11 21:41:04 +00:00
ConfMan . setActiveDomain ( " " ) ;
2004-12-25 22:13:44 +00:00
setResult ( - 1 ) ;
2003-04-30 13:57:57 +00:00
close ( ) ;
2002-09-27 23:27:14 +00:00
break ;
2009-06-06 17:53:25 +00:00
case kSearchCmd :
2009-12-15 08:19:34 +00:00
// Update the active search filter.
2009-06-06 17:54:08 +00:00
_list - > setFilter ( _searchWidget - > getEditString ( ) ) ;
2009-06-06 17:53:25 +00:00
break ;
2009-06-07 22:19:48 +00:00
case kSearchClearCmd :
2009-12-15 08:19:34 +00:00
// Reset the active search filter, thus showing all games again
2009-06-07 22:19:48 +00:00
_searchWidget - > setEditString ( " " ) ;
_list - > setFilter ( " " ) ;
break ;
2002-09-27 23:27:14 +00:00
default :
Dialog : : handleCommand ( sender , cmd , data ) ;
}
}
2002-12-01 12:47:13 +00:00
void LauncherDialog : : updateButtons ( ) {
bool enable = ( _list - > getSelected ( ) > = 0 ) ;
if ( enable ! = _startButton - > isEnabled ( ) ) {
_startButton - > setEnabled ( enable ) ;
_startButton - > draw ( ) ;
}
if ( enable ! = _editButton - > isEnabled ( ) ) {
_editButton - > setEnabled ( enable ) ;
_editButton - > draw ( ) ;
}
if ( enable ! = _removeButton - > isEnabled ( ) ) {
_removeButton - > setEnabled ( enable ) ;
_removeButton - > draw ( ) ;
}
2009-06-06 17:59:04 +00:00
int item = _list - > getSelected ( ) ;
bool en = enable ;
if ( item > = 0 )
2011-10-23 14:14:41 +00:00
en = ! ( Common : : checkGameGUIOption ( GUIO_NOLAUNCHLOAD , ConfMan . get ( " guioptions " , _domains [ item ] ) ) ) ;
2009-06-06 17:59:04 +00:00
if ( en ! = _loadButton - > isEnabled ( ) ) {
_loadButton - > setEnabled ( en ) ;
2008-09-14 18:19:22 +00:00
_loadButton - > draw ( ) ;
}
2015-06-25 20:37:09 +00:00
switchButtonsText ( _addButton , " ~A~dd Game... " , _s ( " Mass Add... " ) ) ;
2013-05-16 21:18:09 +00:00
# ifdef ENABLE_EVENTRECORDER
2015-06-25 20:37:09 +00:00
switchButtonsText ( _loadButton , " ~L~oad... " , _s ( " Record... " ) ) ;
2013-05-16 21:18:09 +00:00
# endif
}
2007-03-17 16:05:16 +00:00
2013-05-16 21:18:09 +00:00
// 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 ) ;
2010-08-31 20:03:47 +00:00
const bool lowRes = g_system - > getOverlayWidth ( ) < = 320 ;
2010-10-12 02:18:11 +00:00
2013-05-16 21:18:09 +00:00
const char * newAddButtonLabel = shiftPressed
? ( lowRes ? _c ( shiftedText , " lowres " ) : _ ( shiftedText ) )
: ( lowRes ? _c ( normalText , " lowres " ) : _ ( normalText ) ) ;
2007-03-17 16:05:16 +00:00
2013-05-16 21:18:09 +00:00
if ( button - > getLabel ( ) ! = newAddButtonLabel )
button - > setLabel ( newAddButtonLabel ) ;
2002-12-01 12:47:13 +00:00
}
2003-11-10 23:40:48 +00:00
2013-05-16 21:18:09 +00:00
2006-08-04 13:55:53 +00:00
void LauncherDialog : : reflowLayout ( ) {
2006-04-16 20:33:52 +00:00
# ifndef DISABLE_FANCY_THEMES
2008-08-08 18:30:16 +00:00
if ( g_gui . xmlEval ( ) - > getVar ( " Globals.ShowLauncherLogo " ) = = 1 & & g_gui . theme ( ) - > supportsImages ( ) ) {
2012-02-15 15:53:31 +00:00
StaticTextWidget * ver = ( StaticTextWidget * ) findWidget ( " Launcher.Version " ) ;
2006-04-19 01:05:28 +00:00
if ( ver ) {
2013-02-02 23:35:20 +00:00
ver - > setAlign ( g_gui . xmlEval ( ) - > getWidgetTextHAlign ( " Launcher.Version " ) ) ;
2006-04-19 01:05:28 +00:00
ver - > setLabel ( gScummVMVersionDate ) ;
}
2006-04-17 18:50:33 +00:00
if ( ! _logo )
2008-08-08 18:30:16 +00:00
_logo = new GraphicsWidget ( this , " Launcher.Logo " ) ;
2006-05-29 14:55:43 +00:00
_logo - > useThemeTransparency ( true ) ;
2008-11-10 11:24:55 +00:00
_logo - > setGfx ( g_gui . theme ( ) - > getImageSurface ( ThemeEngine : : kImageLogo ) ) ;
2006-04-17 18:50:33 +00:00
} else {
2012-02-15 15:53:31 +00:00
StaticTextWidget * ver = ( StaticTextWidget * ) findWidget ( " Launcher.Version " ) ;
2006-04-19 01:05:28 +00:00
if ( ver ) {
2013-02-02 23:35:20 +00:00
ver - > setAlign ( g_gui . xmlEval ( ) - > getWidgetTextHAlign ( " Launcher.Version " ) ) ;
2006-04-19 01:05:28 +00:00
ver - > setLabel ( gScummVMFullVersion ) ;
}
if ( _logo ) {
2007-03-16 20:47:41 +00:00
removeWidget ( _logo ) ;
2006-04-19 01:05:28 +00:00
_logo - > setNext ( 0 ) ;
delete _logo ;
_logo = 0 ;
}
2006-04-16 20:33:52 +00:00
}
2009-06-06 17:54:08 +00:00
if ( g_gui . xmlEval ( ) - > getVar ( " Globals.ShowSearchPic " ) = = 1 & & g_gui . theme ( ) - > supportsImages ( ) ) {
if ( ! _searchPic )
_searchPic = new GraphicsWidget ( this , " Launcher.SearchPic " ) ;
_searchPic - > setGfx ( g_gui . theme ( ) - > getImageSurface ( ThemeEngine : : kImageSearch ) ) ;
if ( _searchDesc ) {
removeWidget ( _searchDesc ) ;
_searchDesc - > setNext ( 0 ) ;
delete _searchDesc ;
_searchDesc = 0 ;
}
} else {
if ( ! _searchDesc )
2010-06-15 10:44:51 +00:00
_searchDesc = new StaticTextWidget ( this , " Launcher.SearchDesc " , _ ( " Search: " ) ) ;
2009-06-06 17:54:08 +00:00
if ( _searchPic ) {
removeWidget ( _searchPic ) ;
_searchPic - > setNext ( 0 ) ;
delete _searchPic ;
_searchPic = 0 ;
}
}
2011-10-25 14:18:18 +00:00
removeWidget ( _searchClearButton ) ;
_searchClearButton - > setNext ( 0 ) ;
delete _searchClearButton ;
_searchClearButton = addClearButton ( this , " Launcher.SearchClearButton " , kSearchClearCmd ) ;
2006-04-16 20:33:52 +00:00
# endif
2006-04-19 01:05:28 +00:00
_w = g_system - > getOverlayWidth ( ) ;
_h = g_system - > getOverlayHeight ( ) ;
2006-08-04 13:55:53 +00:00
Dialog : : reflowLayout ( ) ;
2006-04-16 20:33:52 +00:00
}
2013-05-16 21:18:09 +00:00
bool LauncherDialog : : checkModifier ( int checkedModifier ) {
int modifiers = g_system - > getEventManager ( ) - > getModifierState ( ) ;
return ( modifiers & checkedModifier ) ! = 0 ;
}
2003-11-10 23:40:48 +00:00
} // End of namespace GUI