2016-07-03 14:09:51 +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/downloaddialog.h"
# include "backends/cloud/cloudmanager.h"
2016-07-10 05:05:00 +00:00
# include "common/config-manager.h"
2016-07-03 14:09:51 +00:00
# include "common/translation.h"
2016-07-10 05:05:00 +00:00
# include "engines/metaengine.h"
# include "gui/browser.h"
# include "gui/chooser.h"
# include "gui/editgamedialog.h"
# include "gui/message.h"
# include "gui/remotebrowser.h"
# include "gui/widgets/edittext.h"
# include "gui/widgets/list.h"
2016-07-03 14:09:51 +00:00
namespace GUI {
enum {
kDownloadDialogButtonCmd = ' Dldb '
} ;
DownloadDialog : : DownloadDialog ( uint32 storageId ) :
2016-07-11 08:24:30 +00:00
Dialog ( " GlobalOptions_Cloud_DownloadDialog " ) , _close ( false ) {
2016-07-03 14:09:51 +00:00
_backgroundType = GUI : : ThemeEngine : : kDialogBackgroundPlain ;
2016-07-04 05:52:40 +00:00
_browser = new BrowserDialog ( _ ( " Select directory where to download game data " ) , true ) ;
2016-07-04 07:00:26 +00:00
_remoteBrowser = new RemoteBrowserDialog ( _ ( " Select directory with game data " ) ) ;
2016-07-04 12:30:23 +00:00
2016-07-04 11:11:58 +00:00
_remoteDirectoryLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.RemoteDirectory " , _ ( " From: " ) ) ;
_localDirectoryLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.LocalDirectory " , _ ( " To: " ) ) ;
uint32 progress = ( uint32 ) ( 100 * CloudMan . getDownloadingProgress ( ) ) ;
_progressBar = new SliderWidget ( this , " GlobalOptions_Cloud_DownloadDialog.ProgressBar " ) ;
_progressBar - > setMinValue ( 0 ) ;
_progressBar - > setMaxValue ( 100 ) ;
_progressBar - > setValue ( progress ) ;
_progressBar - > setEnabled ( false ) ;
_percentLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.PercentText " , Common : : String : : format ( " %u %% " , progress ) ) ;
2016-07-04 12:36:47 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
_cancelButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _ ( " Cancel download " ) , 0 , kDownloadDialogButtonCmd ) ;
else
_cancelButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _c ( " Cancel download " , " lowres " ) , 0 , kDownloadDialogButtonCmd ) ;
2016-07-03 14:09:51 +00:00
_closeButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.CloseButton " , _ ( " OK " ) , 0 , kCloseCmd ) ;
2016-07-04 12:30:23 +00:00
refreshWidgets ( ) ;
2016-07-04 11:11:58 +00:00
CloudMan . setDownloadTarget ( this ) ;
}
DownloadDialog : : ~ DownloadDialog ( ) {
CloudMan . setDownloadTarget ( nullptr ) ;
}
2016-07-04 12:30:23 +00:00
void DownloadDialog : : open ( ) {
Dialog : : open ( ) ;
2016-07-11 08:24:30 +00:00
CloudMan . setDownloadTarget ( this ) ;
2016-07-04 12:30:23 +00:00
if ( ! CloudMan . isDownloading ( ) )
if ( ! selectDirectories ( ) )
close ( ) ;
reflowLayout ( ) ;
draw ( ) ;
}
2016-07-04 11:11:58 +00:00
void DownloadDialog : : close ( ) {
CloudMan . setDownloadTarget ( nullptr ) ;
Dialog : : close ( ) ;
2016-07-03 14:09:51 +00:00
}
void DownloadDialog : : handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) {
switch ( cmd ) {
2016-07-04 12:30:23 +00:00
case kDownloadDialogButtonCmd : {
CloudMan . setDownloadTarget ( nullptr ) ;
CloudMan . cancelDownload ( ) ;
close ( ) ;
2016-07-03 14:09:51 +00:00
break ;
}
2016-07-11 08:24:30 +00:00
case kDownloadProgressCmd :
if ( ! _close ) {
refreshWidgets ( ) ;
draw ( ) ;
}
2016-07-04 11:11:58 +00:00
break ;
case kDownloadEndedCmd :
2016-07-04 12:30:23 +00:00
_close = true ;
2016-07-04 11:11:58 +00:00
break ;
2016-07-03 14:09:51 +00:00
default :
Dialog : : handleCommand ( sender , cmd , data ) ;
}
}
2016-07-04 12:30:23 +00:00
bool DownloadDialog : : selectDirectories ( ) {
2016-07-04 05:52:40 +00:00
//first user should select remote directory to download
2016-07-04 12:30:23 +00:00
if ( _remoteBrowser - > runModal ( ) < = 0 ) return false ;
2016-07-04 05:52:40 +00:00
2016-07-04 08:49:33 +00:00
Cloud : : StorageFile remoteDirectory = _remoteBrowser - > getResult ( ) ;
2016-07-04 05:52:40 +00:00
//now user should select local directory to download into
2016-07-04 12:30:23 +00:00
if ( _browser - > runModal ( ) < = 0 ) return false ;
2016-07-04 05:52:40 +00:00
Common : : FSNode dir ( _browser - > getResult ( ) ) ;
Common : : FSList files ;
if ( ! dir . getChildren ( files , Common : : FSNode : : kListAll ) ) {
MessageDialog alert ( _ ( " ScummVM couldn't open the specified directory! " ) ) ;
alert . runModal ( ) ;
2016-07-04 12:30:23 +00:00
return false ;
2016-07-04 05:52:40 +00:00
}
2016-07-04 08:49:33 +00:00
//check that there is no file with the remote directory's name in the local one
for ( Common : : FSList : : iterator i = files . begin ( ) ; i ! = files . end ( ) ; + + i ) {
if ( i - > getName ( ) . equalsIgnoreCase ( remoteDirectory . name ( ) ) ) {
//if there is, ask user whether it's OK
if ( ! i - > isDirectory ( ) ) {
GUI : : MessageDialog alert ( _ ( " Cannot create a directory to download - the specified directory has a file with the same name. " ) , _ ( " OK " ) ) ;
alert . runModal ( ) ;
2016-07-04 12:30:23 +00:00
return false ;
2016-07-04 08:49:33 +00:00
}
GUI : : MessageDialog alert (
Common : : String : : format ( _ ( " The \" %s \" already exists in the specified directory. \n Do you really want to download files into that directory? " ) , remoteDirectory . name ( ) . c_str ( ) ) ,
_ ( " Yes " ) ,
_ ( " No " )
) ;
2016-07-04 12:30:23 +00:00
if ( alert . runModal ( ) ! = GUI : : kMessageOK ) return false ;
2016-07-04 08:49:33 +00:00
break ;
}
}
2016-07-04 05:52:40 +00:00
2016-07-04 09:34:02 +00:00
//make a local path
Common : : String localPath = dir . getPath ( ) ;
//simple heuristic to determine which path separator to use
2016-07-04 11:26:16 +00:00
if ( localPath . size ( ) & & localPath . lastChar ( ) ! = ' / ' & & localPath . lastChar ( ) ! = ' \\ ' ) {
int backslashes = 0 ;
for ( uint32 i = 0 ; i < localPath . size ( ) ; + + i )
if ( localPath [ i ] = = ' / ' ) - - backslashes ;
else if ( localPath [ i ] = = ' \\ ' ) + + backslashes ;
if ( backslashes > 0 ) localPath + = ' \\ ' + remoteDirectory . name ( ) ;
else localPath + = ' / ' + remoteDirectory . name ( ) ;
} else localPath + = remoteDirectory . name ( ) ;
2016-07-04 09:34:02 +00:00
2016-07-04 10:14:30 +00:00
CloudMan . startDownload ( remoteDirectory . path ( ) , localPath ) ;
2016-07-04 11:11:58 +00:00
CloudMan . setDownloadTarget ( this ) ;
2016-07-10 05:05:00 +00:00
_localDirectory = localPath ;
2016-07-04 12:30:23 +00:00
return true ;
2016-07-04 05:52:40 +00:00
}
2016-07-03 14:09:51 +00:00
void DownloadDialog : : handleTickle ( ) {
2016-07-04 12:30:23 +00:00
if ( _close ) {
2016-07-10 05:05:00 +00:00
addGame ( ) ;
2016-07-04 12:30:23 +00:00
close ( ) ;
_close = false ;
return ;
}
2016-07-03 14:09:51 +00:00
Dialog : : handleTickle ( ) ;
}
2016-07-10 05:05:00 +00:00
void DownloadDialog : : addGame ( ) {
// 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 ( _localDirectory ) ;
Common : : FSList files ;
if ( ! dir . getChildren ( files , Common : : FSNode : : kListAll ) ) {
MessageDialog alert ( _ ( " ScummVM couldn't open the specified directory! " ) ) ;
alert . runModal ( ) ;
return ;
}
// ...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 ( ) ;
return ;
}
if ( candidates . size ( ) = = 1 ) {
// Exact match
idx = 0 ;
} else {
// Display the candidates to the user and let her/him pick one
Common : : 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 ( ) ;
} else {
// User aborted, remove the the new domain again
ConfMan . removeGameDomain ( domain ) ;
}
}
}
2016-07-03 14:09:51 +00:00
void DownloadDialog : : reflowLayout ( ) {
Dialog : : reflowLayout ( ) ;
2016-07-04 12:30:23 +00:00
refreshWidgets ( ) ;
2016-07-03 14:09:51 +00:00
}
2016-07-04 12:30:23 +00:00
void DownloadDialog : : refreshWidgets ( ) {
2016-07-10 05:05:00 +00:00
_localDirectory = CloudMan . getDownloadLocalDirectory ( ) ;
2016-07-04 12:30:23 +00:00
_remoteDirectoryLabel - > setLabel ( _ ( " From: " ) + CloudMan . getDownloadRemoteDirectory ( ) ) ;
2016-07-10 05:05:00 +00:00
_localDirectoryLabel - > setLabel ( _ ( " To: " ) + _localDirectory ) ;
2016-07-04 12:30:23 +00:00
uint32 progress = ( uint32 ) ( 100 * CloudMan . getDownloadingProgress ( ) ) ;
_percentLabel - > setLabel ( Common : : String : : format ( " %u %% " , progress ) ) ;
_progressBar - > setValue ( progress ) ;
2016-07-03 14:09:51 +00:00
}
} // End of namespace GUI