2016-07-03 20:09:51 +06: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 "gui/widgets/list.h"
# include "gui/widget.h"
# include "gui/gui-manager.h"
# include "backends/cloud/cloudmanager.h"
# include "common/translation.h"
# include "widgets/edittext.h"
2016-07-04 11:52:40 +06:00
# include "message.h"
# include "browser.h"
# include "remotebrowser.h"
2016-07-03 20:09:51 +06:00
namespace GUI {
enum {
kDownloadDialogButtonCmd = ' Dldb '
} ;
DownloadDialog : : DownloadDialog ( uint32 storageId ) :
2016-07-04 17:11:58 +06:00
Dialog ( " GlobalOptions_Cloud_DownloadDialog " ) , _reflow ( false ) {
2016-07-03 20:09:51 +06:00
_backgroundType = GUI : : ThemeEngine : : kDialogBackgroundPlain ;
2016-07-04 11:52:40 +06:00
_browser = new BrowserDialog ( _ ( " Select directory where to download game data " ) , true ) ;
2016-07-04 13:00:26 +06:00
_remoteBrowser = new RemoteBrowserDialog ( _ ( " Select directory with game data " ) ) ;
2016-07-04 11:52:40 +06:00
2016-07-03 20:09:51 +06:00
_messageText = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.DialogDesc " , _ ( " Press the button to download a directory " ) ) ;
_mainButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _ ( " Start download " ) , 0 , kDownloadDialogButtonCmd ) ;
2016-07-04 17:11:58 +06: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-03 20:09:51 +06:00
_closeButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.CloseButton " , _ ( " OK " ) , 0 , kCloseCmd ) ;
updateButtons ( ) ;
2016-07-04 17:11:58 +06:00
CloudMan . setDownloadTarget ( this ) ;
}
DownloadDialog : : ~ DownloadDialog ( ) {
CloudMan . setDownloadTarget ( nullptr ) ;
}
void DownloadDialog : : close ( ) {
CloudMan . setDownloadTarget ( nullptr ) ;
Dialog : : close ( ) ;
2016-07-03 20:09:51 +06:00
}
void DownloadDialog : : handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) {
switch ( cmd ) {
case kDownloadDialogButtonCmd : {
2016-07-04 16:14:30 +06:00
if ( CloudMan . isDownloading ( ) ) {
2016-07-04 17:11:58 +06:00
CloudMan . setDownloadTarget ( nullptr ) ;
2016-07-04 16:14:30 +06:00
CloudMan . cancelDownload ( ) ;
2016-07-04 15:34:02 +06:00
} else {
2016-07-04 16:14:30 +06:00
selectDirectories ( ) ;
2016-07-04 11:52:40 +06:00
}
2016-07-03 20:09:51 +06:00
reflowLayout ( ) ;
2016-07-04 15:34:02 +06:00
draw ( ) ;
2016-07-03 20:09:51 +06:00
break ;
}
2016-07-04 17:11:58 +06:00
case kDownloadProgressCmd :
_percentLabel - > setLabel ( Common : : String : : format ( " %u %% " , data ) ) ;
_progressBar - > setValue ( data ) ;
_reflow = true ;
break ;
case kDownloadEndedCmd :
_reflow = true ;
break ;
2016-07-03 20:09:51 +06:00
default :
Dialog : : handleCommand ( sender , cmd , data ) ;
}
}
2016-07-04 11:52:40 +06:00
void DownloadDialog : : selectDirectories ( ) {
//first user should select remote directory to download
if ( _remoteBrowser - > runModal ( ) < = 0 ) return ;
2016-07-04 14:49:33 +06:00
Cloud : : StorageFile remoteDirectory = _remoteBrowser - > getResult ( ) ;
2016-07-04 11:52:40 +06:00
//now user should select local directory to download into
if ( _browser - > runModal ( ) < = 0 ) return ;
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 ( ) ;
return ;
}
2016-07-04 14:49:33 +06: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 ( ) ;
return ;
}
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 " )
) ;
if ( alert . runModal ( ) ! = GUI : : kMessageOK ) return ;
break ;
}
}
2016-07-04 11:52:40 +06:00
2016-07-04 15:34:02 +06:00
//make a local path
Common : : String localPath = dir . getPath ( ) ;
//simple heuristic to determine which path separator to use
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 ( ) ;
2016-07-04 16:14:30 +06:00
CloudMan . startDownload ( remoteDirectory . path ( ) , localPath ) ;
2016-07-04 17:11:58 +06:00
CloudMan . setDownloadTarget ( this ) ;
2016-07-04 11:52:40 +06:00
}
2016-07-03 20:09:51 +06:00
void DownloadDialog : : handleTickle ( ) {
2016-07-04 17:11:58 +06:00
if ( _reflow ) {
reflowLayout ( ) ;
draw ( ) ;
_reflow = false ;
2016-07-03 20:09:51 +06:00
}
Dialog : : handleTickle ( ) ;
}
void DownloadDialog : : reflowLayout ( ) {
Dialog : : reflowLayout ( ) ;
updateButtons ( ) ;
}
2016-07-04 17:11:58 +06:00
void DownloadDialog : : updateButtons ( ) {
bool downloading = CloudMan . isDownloading ( ) ;
if ( downloading ) {
2016-07-03 20:09:51 +06:00
_messageText - > setLabel ( _ ( " Press the button to cancel the download " ) ) ;
_mainButton - > setLabel ( _ ( " Cancel the download " ) ) ;
2016-07-04 17:11:58 +06:00
_remoteDirectoryLabel - > setLabel ( _ ( " From: " ) + CloudMan . getDownloadRemoteDirectory ( ) ) ;
_localDirectoryLabel - > setLabel ( _ ( " To: " ) + CloudMan . getDownloadLocalDirectory ( ) ) ;
uint32 progress = ( uint32 ) ( 100 * CloudMan . getDownloadingProgress ( ) ) ;
_percentLabel - > setLabel ( Common : : String : : format ( " %u %% " , progress ) ) ;
_progressBar - > setValue ( progress ) ;
2016-07-03 20:09:51 +06:00
} else {
_messageText - > setLabel ( _ ( " Press the button to download a directory " ) ) ;
_mainButton - > setLabel ( _ ( " Start download " ) ) ;
2016-07-04 15:34:02 +06:00
}
2016-07-04 17:11:58 +06:00
_remoteDirectoryLabel - > setVisible ( downloading ) ;
_localDirectoryLabel - > setVisible ( downloading ) ;
_percentLabel - > setVisible ( downloading ) ;
_progressBar - > setVisible ( downloading ) ;
2016-07-03 20:09:51 +06:00
}
} // End of namespace GUI