2017-10-09 08:35:48 +02:00
/*****************************************************************************
2018-05-24 22:32:00 +02:00
* gta5view Grand Theft Auto V Profile Viewer
2021-04-02 19:51:05 +02:00
* Copyright ( C ) 2016 - 2021 Syping
2017-10-09 08:35:48 +02: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 3 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 , see < http : //www.gnu.org/licenses/>.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "UserInterface.h"
# include "ui_UserInterface.h"
# include "ProfileInterface.h"
# include "SnapmaticPicture.h"
# include "SidebarGenerator.h"
# include "SavegameDialog.h"
# include "StandardPaths.h"
# include "OptionsDialog.h"
# include "PictureDialog.h"
# include "SavegameData.h"
# include "AboutDialog.h"
# include "IconLoader.h"
# include "AppEnv.h"
# include "config.h"
# include <QtGlobal>
# include <QStringBuilder>
# include <QStyleFactory>
# include <QFileDialog>
# include <QHBoxLayout>
# include <QSpacerItem>
# include <QPushButton>
# include <QMessageBox>
# include <QSettings>
# include <QFileInfo>
2020-09-13 02:10:15 +02:00
# include <QTimer>
2017-10-09 08:35:48 +02:00
# include <QDebug>
# include <QFile>
# include <QDir>
# include <QMap>
2021-03-26 18:08:30 +01:00
# ifdef GTA5SYNC_DONATE
# ifdef GTA5SYNC_DONATE_ADDRESSES
# include <QFontDatabase>
# include <QClipboard>
# endif
# endif
2020-09-13 02:10:15 +02:00
# ifdef GTA5SYNC_MOTD
UserInterface : : UserInterface ( ProfileDatabase * profileDB , CrewDatabase * crewDB , DatabaseThread * threadDB , MessageThread * threadMessage , QWidget * parent ) :
QMainWindow ( parent ) , profileDB ( profileDB ) , crewDB ( crewDB ) , threadDB ( threadDB ) , threadMessage ( threadMessage ) ,
ui ( new Ui : : UserInterface )
2021-03-26 18:08:30 +01:00
# else
2017-10-09 08:35:48 +02:00
UserInterface : : UserInterface ( ProfileDatabase * profileDB , CrewDatabase * crewDB , DatabaseThread * threadDB , QWidget * parent ) :
QMainWindow ( parent ) , profileDB ( profileDB ) , crewDB ( crewDB ) , threadDB ( threadDB ) ,
ui ( new Ui : : UserInterface )
2021-03-26 18:08:30 +01:00
# endif
2017-10-09 08:35:48 +02:00
{
ui - > setupUi ( this ) ;
contentMode = 0 ;
profileOpen = 0 ;
profileUI = 0 ;
ui - > menuProfile - > setEnabled ( false ) ;
ui - > actionSelect_profile - > setEnabled ( false ) ;
ui - > actionAbout_gta5sync - > setIcon ( IconLoader : : loadingAppIcon ( ) ) ;
ui - > actionAbout_gta5sync - > setText ( tr ( " &About %1 " ) . arg ( GTA5SYNC_APPSTR ) ) ;
ui - > cmdClose - > setToolTip ( ui - > cmdClose - > toolTip ( ) . arg ( GTA5SYNC_APPSTR ) ) ;
defaultWindowTitle = tr ( " %2 - %1 " ) . arg ( " %1 " , GTA5SYNC_APPSTR ) ;
2020-11-23 03:13:07 +01:00
setWindowTitle ( defaultWindowTitle . arg ( tr ( " Select Profile " ) ) ) ;
2018-07-13 12:07:13 +02:00
QString appVersion = GTA5SYNC_APPVER ;
# ifndef GTA5SYNC_BUILDTYPE_REL
# ifdef GTA5SYNC_COMMIT
2018-07-30 02:17:47 +02:00
if ( ! appVersion . contains ( " - " ) ) { appVersion = appVersion % " - " % GTA5SYNC_COMMIT ; }
2018-07-13 12:07:13 +02:00
# endif
# endif
ui - > labVersion - > setText ( QString ( " %1 %2 " ) . arg ( GTA5SYNC_APPSTR , appVersion ) ) ;
2017-10-09 08:35:48 +02:00
2018-01-11 08:41:00 +01:00
// Set Icon for Close Button
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " dialog-close " ) ) {
2017-10-09 08:35:48 +02:00
ui - > cmdClose - > setIcon ( QIcon : : fromTheme ( " dialog-close " ) ) ;
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " gtk-close " ) ) {
2018-01-11 08:41:00 +01:00
ui - > cmdClose - > setIcon ( QIcon : : fromTheme ( " gtk-close " ) ) ;
}
// Set Icon for Reload Button
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " view-refresh " ) ) {
2018-01-11 08:41:00 +01:00
ui - > cmdReload - > setIcon ( QIcon : : fromTheme ( " view-refresh " ) ) ;
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " reload " ) ) {
2018-01-11 08:41:00 +01:00
ui - > cmdReload - > setIcon ( QIcon : : fromTheme ( " reload " ) ) ;
}
2018-01-17 00:59:40 +01:00
// Set Icon for Choose GTA V Folder Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " document-open-folder " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionSelect_GTA_Folder - > setIcon ( QIcon : : fromTheme ( " document-open-folder " ) ) ;
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " gtk-directory " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionSelect_GTA_Folder - > setIcon ( QIcon : : fromTheme ( " gtk-directory " ) ) ;
}
// Set Icon for Open File Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " document-open " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionOpen_File - > setIcon ( QIcon : : fromTheme ( " document-open " ) ) ;
}
// Set Icon for Close Profile Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " dialog-close " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionSelect_profile - > setIcon ( QIcon : : fromTheme ( " dialog-close " ) ) ;
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " gtk-close " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionSelect_profile - > setIcon ( QIcon : : fromTheme ( " gtk-close " ) ) ;
}
// Set Icon for Exit Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " application-exit " ) ) {
2018-01-17 00:59:40 +01:00
# ifndef Q_OS_MACOS // Setting icon for exit/quit lead to a crash in Mac OS X
ui - > actionExit - > setIcon ( QIcon : : fromTheme ( " application-exit " ) ) ;
# endif
}
2018-01-11 08:41:00 +01:00
// Set Icon for Preferences Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " preferences-system " ) ) {
2017-10-09 08:35:48 +02:00
# ifndef Q_OS_MACOS // Setting icon for preferences/settings/options lead to a crash in Mac OS X
ui - > actionOptions - > setIcon ( QIcon : : fromTheme ( " preferences-system " ) ) ;
# endif
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " configure " ) ) {
2018-01-11 08:41:00 +01:00
# ifndef Q_OS_MACOS // Setting icon for preferences/settings/options lead to a crash in Mac OS X
ui - > actionOptions - > setIcon ( QIcon : : fromTheme ( " configure " ) ) ;
# endif
}
2018-01-17 00:59:40 +01:00
// Set Icon for Profile Import Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " document-import " ) ) {
2018-01-17 00:59:40 +01:00
ui - > action_Import - > setIcon ( QIcon : : fromTheme ( " document-import " ) ) ;
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " document-open " ) ) {
2018-01-24 16:26:54 +01:00
ui - > action_Import - > setIcon ( QIcon : : fromTheme ( " document-open " ) ) ;
}
2018-01-17 00:59:40 +01:00
// Set Icon for Profile Export Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " document-export " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionExport_selected - > setIcon ( QIcon : : fromTheme ( " document-export " ) ) ;
}
2021-02-15 23:12:44 +01:00
else if ( QIcon : : hasThemeIcon ( " document-save " ) ) {
2018-01-24 16:26:54 +01:00
ui - > actionExport_selected - > setIcon ( QIcon : : fromTheme ( " document-save " ) ) ;
}
2018-01-17 00:59:40 +01:00
// Set Icon for Profile Remove Menu Item
2021-02-15 23:12:44 +01:00
if ( QIcon : : hasThemeIcon ( " remove " ) ) {
2018-01-17 00:59:40 +01:00
ui - > actionDelete_selected - > setIcon ( QIcon : : fromTheme ( " remove " ) ) ;
2017-10-09 08:35:48 +02:00
}
2021-03-26 14:58:54 +01:00
# ifdef GTA5SYNC_DONATE
# ifdef GTA5SYNC_DONATE_ADDRESSES
donateAction = new QAction ( tr ( " &Donate " ) , this ) ;
if ( QIcon : : hasThemeIcon ( " help-donate " ) ) {
donateAction - > setIcon ( QIcon : : fromTheme ( " help-donate " ) ) ;
}
else if ( QIcon : : hasThemeIcon ( " taxes-finances " ) ) {
donateAction - > setIcon ( QIcon : : fromTheme ( " taxes-finances " ) ) ;
}
2021-03-26 18:08:30 +01:00
else {
2021-04-02 19:51:05 +02:00
donateAction - > setIcon ( QIcon ( AppEnv : : getImagesFolder ( ) % " /donate.svgz " ) ) ;
2021-03-26 18:08:30 +01:00
}
2021-03-26 14:58:54 +01:00
ui - > menuHelp - > insertAction ( ui - > actionAbout_gta5sync , donateAction ) ;
QObject : : connect ( donateAction , & QAction : : triggered , this , [ = ] ( ) {
QDialog * donateDialog = new QDialog ( this ) ;
donateDialog - > setWindowTitle ( QString ( " %1 - %2 " ) . arg ( GTA5SYNC_APPSTR , tr ( " Donate " ) ) ) ;
# if QT_VERSION >= 0x050900
donateDialog - > setWindowFlag ( Qt : : WindowContextHelpButtonHint , false ) ;
# else
donateDialog - > setWindowFlags ( donateDialog - > windowFlags ( ) ^ Qt : : WindowContextHelpButtonHint ) ;
# endif
QVBoxLayout * donateLayout = new QVBoxLayout ;
donateDialog - > setLayout ( donateLayout ) ;
2021-03-26 18:08:30 +01:00
QLabel * methodsLabel = new QLabel ( QString ( " <b>%1</b> " ) . arg ( tr ( " Donation methods " ) . toHtmlEscaped ( ) ) , this ) ;
2021-03-26 14:58:54 +01:00
methodsLabel - > setWordWrap ( true ) ;
donateLayout - > addWidget ( methodsLabel ) ;
const QStringList addressList = QString : : fromUtf8 ( GTA5SYNC_DONATE_ADDRESSES ) . split ( ' , ' ) ;
for ( const QString & address : addressList ) {
const QStringList addressList = address . split ( ' : ' ) ;
if ( addressList . length ( ) = = 2 ) {
const QString currency = addressList . at ( 0 ) ;
const QString address = addressList . at ( 1 ) ;
QHBoxLayout * addressLayout = new QHBoxLayout ;
const QString iconPath = QString ( " :/donate/%1.svgz " ) . arg ( currency ) ;
if ( QFile : : exists ( iconPath ) ) {
QLabel * currencyLabel = new QLabel ( this ) ;
currencyLabel - > setFixedSize ( 32 , 32 ) ;
currencyLabel - > setScaledContents ( true ) ;
currencyLabel - > setPixmap ( QIcon ( iconPath ) . pixmap ( QSize ( 32 , 32 ) ) ) ;
addressLayout - > addWidget ( currencyLabel ) ;
}
2021-03-26 18:08:30 +01:00
QLabel * currencyLabel = new QLabel ( currency , this ) ;
currencyLabel - > setTextFormat ( Qt : : PlainText ) ;
QFont currencyFont = QFontDatabase : : systemFont ( QFontDatabase : : FixedFont ) ;
currencyFont . setWeight ( QFont : : Bold ) ;
currencyFont . setCapitalization ( QFont : : AllUppercase ) ;
currencyLabel - > setFont ( currencyFont ) ;
addressLayout - > addWidget ( currencyLabel ) ;
2021-03-26 14:58:54 +01:00
QLabel * addressLabel = new QLabel ( address , this ) ;
addressLabel - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
addressLabel - > setTextInteractionFlags ( Qt : : TextSelectableByMouse ) ;
2021-03-26 18:08:30 +01:00
addressLabel - > setFont ( QFontDatabase : : systemFont ( QFontDatabase : : FixedFont ) ) ;
2021-03-26 14:58:54 +01:00
addressLabel - > setWordWrap ( true ) ;
addressLayout - > addWidget ( addressLabel ) ;
QPushButton * addressButton = new QPushButton ( tr ( " Copy " ) , this ) ;
QObject : : connect ( addressButton , & QPushButton : : pressed , this , [ = ] ( ) {
QApplication : : clipboard ( ) - > setText ( address ) ;
} ) ;
addressLayout - > addWidget ( addressButton ) ;
donateLayout - > addLayout ( addressLayout ) ;
}
}
2021-03-26 18:08:30 +01:00
donateLayout - > addSpacerItem ( new QSpacerItem ( 0 , 0 , QSizePolicy : : Minimum , QSizePolicy : : Expanding ) ) ;
2021-03-26 14:58:54 +01:00
QHBoxLayout * buttonLayout = new QHBoxLayout ;
buttonLayout - > addSpacerItem ( new QSpacerItem ( 0 , 0 , QSizePolicy : : Expanding , QSizePolicy : : Minimum ) ) ;
QPushButton * closeButton = new QPushButton ( donateDialog ) ;
closeButton - > setText ( tr ( " &Close " ) ) ;
if ( QIcon : : hasThemeIcon ( " dialog-close " ) ) {
closeButton - > setIcon ( QIcon : : fromTheme ( " dialog-close " ) ) ;
}
else if ( QIcon : : hasThemeIcon ( " gtk-close " ) ) {
closeButton - > setIcon ( QIcon : : fromTheme ( " gtk-close " ) ) ;
}
2021-03-26 19:05:48 +01:00
closeButton - > setDefault ( true ) ;
2021-03-26 14:58:54 +01:00
buttonLayout - > addWidget ( closeButton ) ;
donateLayout - > addLayout ( buttonLayout ) ;
QObject : : connect ( closeButton , & QPushButton : : clicked , donateDialog , & QDialog : : accept ) ;
QObject : : connect ( donateDialog , & QDialog : : finished , donateDialog , & QDialog : : deleteLater ) ;
QTimer : : singleShot ( 0 , closeButton , [ = ] ( ) {
closeButton - > setFocus ( ) ;
} ) ;
donateDialog - > open ( ) ;
} ) ;
# endif
# endif
2017-10-09 08:35:48 +02:00
// DPI calculation
qreal screenRatio = AppEnv : : screenRatio ( ) ;
2017-12-17 13:03:43 +01:00
# ifndef Q_QS_ANDROID
2017-10-09 08:35:48 +02:00
resize ( 625 * screenRatio , 500 * screenRatio ) ;
2017-12-17 13:03:43 +01:00
# endif
2017-10-09 08:35:48 +02:00
ui - > vlUserInterface - > setSpacing ( 6 * screenRatio ) ;
ui - > vlUserInterface - > setContentsMargins ( 9 * screenRatio , 9 * screenRatio , 9 * screenRatio , 9 * screenRatio ) ;
}
2020-10-21 19:14:20 +02:00
void UserInterface : : setupDirEnv ( bool showFolderDialog )
2017-10-09 08:35:48 +02:00
{
// settings init
QSettings settings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
bool folderExists ;
GTAV_Folder = AppEnv : : getGameFolder ( & folderExists ) ;
2020-11-23 03:47:17 +01:00
if ( folderExists ) {
2017-10-09 08:35:48 +02:00
QDir : : setCurrent ( GTAV_Folder ) ;
}
2021-03-26 14:58:54 +01:00
else if ( showFolderDialog ) {
GTAV_Folder = QFileDialog : : getExistingDirectory ( this , tr ( " Select GTA V Folder... " ) , StandardPaths : : documentsLocation ( ) , QFileDialog : : ShowDirsOnly ) ;
if ( QFileInfo ( GTAV_Folder ) . exists ( ) ) {
folderExists = true ;
QDir : : setCurrent ( GTAV_Folder ) ;
AppEnv : : setGameFolder ( GTAV_Folder ) ;
// First time folder selection save
settings . beginGroup ( " dir " ) ;
if ( settings . value ( " dir " , " " ) . toString ( ) . isEmpty ( ) )
{
settings . setValue ( " dir " , GTAV_Folder ) ;
2017-10-09 08:35:48 +02:00
}
2021-03-26 14:58:54 +01:00
settings . endGroup ( ) ;
2017-10-09 08:35:48 +02:00
}
}
// profiles init
settings . beginGroup ( " Profile " ) ;
QString defaultProfile = settings . value ( " Default " , " " ) . toString ( ) ;
2020-11-23 03:47:17 +01:00
contentMode = settings . value ( " ContentMode " , 0 ) . toInt ( ) ;
if ( contentMode = = 1 ) {
contentMode = 21 ;
}
else if ( contentMode ! = 10 & & contentMode ! = 11 & & contentMode ! = 20 & & contentMode ! = 21 ) {
contentMode = 20 ;
2017-10-09 08:35:48 +02:00
}
2020-11-23 03:47:17 +01:00
if ( folderExists ) {
2017-10-09 08:35:48 +02:00
QDir GTAV_ProfilesDir ;
2017-10-12 22:21:45 +02:00
GTAV_ProfilesFolder = GTAV_Folder % " /Profiles " ;
2017-10-09 08:35:48 +02:00
GTAV_ProfilesDir . setPath ( GTAV_ProfilesFolder ) ;
GTAV_Profiles = GTAV_ProfilesDir . entryList ( QDir : : Dirs | QDir : : NoDotAndDotDot , QDir : : NoSort ) ;
setupProfileUi ( ) ;
2020-11-23 03:47:17 +01:00
if ( GTAV_Profiles . length ( ) = = 1 ) {
2017-10-09 08:35:48 +02:00
openProfile ( GTAV_Profiles . at ( 0 ) ) ;
}
2020-11-23 03:47:17 +01:00
else if ( GTAV_Profiles . contains ( defaultProfile ) ) {
2017-10-09 08:35:48 +02:00
openProfile ( defaultProfile ) ;
}
}
2020-11-23 03:47:17 +01:00
else {
2017-10-09 08:35:48 +02:00
GTAV_Profiles = QStringList ( ) ;
setupProfileUi ( ) ;
}
settings . endGroup ( ) ;
}
void UserInterface : : setupProfileUi ( )
{
qreal screenRatio = AppEnv : : screenRatio ( ) ;
2021-02-15 23:12:44 +01:00
if ( GTAV_Profiles . isEmpty ( ) ) {
2017-10-09 08:35:48 +02:00
QPushButton * changeDirBtn = new QPushButton ( tr ( " Select >A V Folder... " ) , ui - > swSelection ) ;
changeDirBtn - > setObjectName ( " cmdChangeDir " ) ;
changeDirBtn - > setMinimumSize ( 0 , 40 * screenRatio ) ;
changeDirBtn - > setAutoDefault ( true ) ;
ui - > vlButtons - > addWidget ( changeDirBtn ) ;
profileBtns + = changeDirBtn ;
QObject : : connect ( changeDirBtn , SIGNAL ( clicked ( bool ) ) , this , SLOT ( changeFolder_clicked ( ) ) ) ;
}
2021-02-15 23:12:44 +01:00
else for ( const QString & GTAV_Profile : GTAV_Profiles ) {
2017-10-09 08:35:48 +02:00
QPushButton * profileBtn = new QPushButton ( GTAV_Profile , ui - > swSelection ) ;
profileBtn - > setObjectName ( GTAV_Profile ) ;
profileBtn - > setMinimumSize ( 0 , 40 * screenRatio ) ;
profileBtn - > setAutoDefault ( true ) ;
ui - > vlButtons - > addWidget ( profileBtn ) ;
profileBtns + = profileBtn ;
QObject : : connect ( profileBtn , SIGNAL ( clicked ( bool ) ) , this , SLOT ( profileButton_clicked ( ) ) ) ;
}
profileBtns . at ( 0 ) - > setFocus ( ) ;
}
void UserInterface : : changeFolder_clicked ( )
{
on_actionSelect_GTA_Folder_triggered ( ) ;
}
void UserInterface : : on_cmdReload_clicked ( )
{
2021-02-15 23:12:44 +01:00
for ( QPushButton * profileBtn : profileBtns ) {
2017-10-09 08:35:48 +02:00
ui - > vlButtons - > removeWidget ( profileBtn ) ;
delete profileBtn ;
}
2017-11-12 15:58:59 +01:00
profileBtns . clear ( ) ;
2017-10-09 08:35:48 +02:00
setupDirEnv ( ) ;
}
void UserInterface : : profileButton_clicked ( )
{
QPushButton * profileBtn = ( QPushButton * ) sender ( ) ;
openProfile ( profileBtn - > objectName ( ) ) ;
}
void UserInterface : : openProfile ( const QString & profileName_ )
{
profileOpen = true ;
profileName = profileName_ ;
profileUI = new ProfileInterface ( profileDB , crewDB , threadDB ) ;
ui - > swProfile - > addWidget ( profileUI ) ;
ui - > swProfile - > setCurrentWidget ( profileUI ) ;
profileUI - > setProfileFolder ( GTAV_ProfilesFolder % QDir : : separator ( ) % profileName , profileName ) ;
2017-10-12 22:21:45 +02:00
profileUI - > settingsApplied ( contentMode , false ) ;
2017-10-09 08:35:48 +02:00
profileUI - > setupProfileInterface ( ) ;
QObject : : connect ( profileUI , SIGNAL ( profileClosed ( ) ) , this , SLOT ( closeProfile ( ) ) ) ;
QObject : : connect ( profileUI , SIGNAL ( profileLoaded ( ) ) , this , SLOT ( profileLoaded ( ) ) ) ;
2020-11-23 03:13:07 +01:00
setWindowTitle ( defaultWindowTitle . arg ( profileName ) ) ;
2017-10-09 08:35:48 +02:00
}
void UserInterface : : closeProfile ( )
{
2021-03-26 14:58:54 +01:00
if ( profileOpen ) {
2017-11-12 15:58:59 +01:00
closeProfile_p ( ) ;
2017-10-09 08:35:48 +02:00
}
2020-11-23 03:13:07 +01:00
setWindowTitle ( defaultWindowTitle . arg ( tr ( " Select Profile " ) ) ) ;
2017-10-09 08:35:48 +02:00
}
2017-11-12 15:58:59 +01:00
void UserInterface : : closeProfile_p ( )
{
profileOpen = false ;
profileName . clear ( ) ;
profileName . squeeze ( ) ;
ui - > menuProfile - > setEnabled ( false ) ;
ui - > actionSelect_profile - > setEnabled ( false ) ;
ui - > swProfile - > removeWidget ( profileUI ) ;
profileUI - > disconnect ( ) ;
delete profileUI ;
}
2017-10-09 08:35:48 +02:00
void UserInterface : : closeEvent ( QCloseEvent * ev )
{
Q_UNUSED ( ev )
2020-09-13 02:10:15 +02:00
# ifdef GTA5SYNC_MOTD
threadMessage - > terminateThread ( ) ;
# else
2017-11-12 15:58:59 +01:00
threadDB - > terminateThread ( ) ;
2020-09-13 02:10:15 +02:00
# endif
2017-10-09 08:35:48 +02:00
}
UserInterface : : ~ UserInterface ( )
{
2017-11-12 15:58:59 +01:00
if ( profileOpen )
closeProfile_p ( ) ;
2021-02-15 23:12:44 +01:00
for ( QPushButton * profileBtn : profileBtns ) {
2017-10-09 08:35:48 +02:00
delete profileBtn ;
}
2017-11-12 15:58:59 +01:00
profileBtns . clear ( ) ;
2017-10-09 08:35:48 +02:00
delete ui ;
}
void UserInterface : : on_actionExit_triggered ( )
{
2020-11-23 03:13:07 +01:00
close ( ) ;
2017-10-09 08:35:48 +02:00
}
void UserInterface : : on_actionSelect_profile_triggered ( )
{
closeProfile ( ) ;
openSelectProfile ( ) ;
}
void UserInterface : : openSelectProfile ( )
{
// not needed right now
}
void UserInterface : : on_actionAbout_gta5sync_triggered ( )
{
AboutDialog * aboutDialog = new AboutDialog ( this ) ;
aboutDialog - > setWindowIcon ( windowIcon ( ) ) ;
aboutDialog - > setModal ( true ) ;
# ifdef Q_OS_ANDROID
// Android ...
aboutDialog - > showMaximized ( ) ;
# else
aboutDialog - > show ( ) ;
# endif
aboutDialog - > exec ( ) ;
delete aboutDialog ;
}
void UserInterface : : profileLoaded ( )
{
ui - > menuProfile - > setEnabled ( true ) ;
ui - > actionSelect_profile - > setEnabled ( true ) ;
}
void UserInterface : : on_actionSelect_all_triggered ( )
{
if ( profileOpen )
profileUI - > selectAllWidgets ( ) ;
}
void UserInterface : : on_actionDeselect_all_triggered ( )
{
if ( profileOpen )
profileUI - > deselectAllWidgets ( ) ;
}
void UserInterface : : on_actionExport_selected_triggered ( )
{
if ( profileOpen )
profileUI - > exportSelected ( ) ;
}
void UserInterface : : on_actionDelete_selected_triggered ( )
{
if ( profileOpen )
profileUI - > deleteSelected ( ) ;
}
void UserInterface : : on_actionOptions_triggered ( )
{
OptionsDialog * optionsDialog = new OptionsDialog ( profileDB , this ) ;
optionsDialog - > setWindowIcon ( windowIcon ( ) ) ;
optionsDialog - > commitProfiles ( GTAV_Profiles ) ;
2017-10-12 22:21:45 +02:00
QObject : : connect ( optionsDialog , SIGNAL ( settingsApplied ( int , bool ) ) , this , SLOT ( settingsApplied ( int , bool ) ) ) ;
2017-10-09 08:35:48 +02:00
optionsDialog - > setModal ( true ) ;
# ifdef Q_OS_ANDROID
// Android ...
optionsDialog - > showMaximized ( ) ;
# else
optionsDialog - > show ( ) ;
# endif
optionsDialog - > exec ( ) ;
delete optionsDialog ;
}
void UserInterface : : on_action_Import_triggered ( )
{
if ( profileOpen )
profileUI - > importFiles ( ) ;
}
void UserInterface : : on_actionOpen_File_triggered ( )
{
QSettings settings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
settings . beginGroup ( " FileDialogs " ) ;
fileDialogPreOpen :
QFileDialog fileDialog ( this ) ;
fileDialog . setFileMode ( QFileDialog : : ExistingFiles ) ;
fileDialog . setViewMode ( QFileDialog : : Detail ) ;
fileDialog . setAcceptMode ( QFileDialog : : AcceptOpen ) ;
fileDialog . setOption ( QFileDialog : : DontUseNativeDialog , false ) ;
2021-02-15 23:12:44 +01:00
# if QT_VERSION >= 0x050900
fileDialog . setWindowFlag ( Qt : : WindowContextHelpButtonHint , false ) ;
# else
2017-10-09 08:35:48 +02:00
fileDialog . setWindowFlags ( fileDialog . windowFlags ( ) ^ Qt : : WindowContextHelpButtonHint ) ;
2021-02-15 23:12:44 +01:00
# endif
2017-10-09 08:35:48 +02:00
fileDialog . setWindowTitle ( tr ( " Open File... " ) ) ;
QStringList filters ;
filters < < ProfileInterface : : tr ( " All profile files (*.g5e SGTA* PGTA*) " ) ;
filters < < ProfileInterface : : tr ( " GTA V Export (*.g5e) " ) ;
filters < < ProfileInterface : : tr ( " Savegames files (SGTA*) " ) ;
filters < < ProfileInterface : : tr ( " Snapmatic pictures (PGTA*) " ) ;
filters < < ProfileInterface : : tr ( " All files (**) " ) ;
fileDialog . setNameFilters ( filters ) ;
QList < QUrl > sidebarUrls = SidebarGenerator : : generateSidebarUrls ( fileDialog . sidebarUrls ( ) ) ;
fileDialog . setSidebarUrls ( sidebarUrls ) ;
fileDialog . setDirectory ( settings . value ( " OpenDialogDirectory " , StandardPaths : : documentsLocation ( ) ) . toString ( ) ) ;
fileDialog . restoreGeometry ( settings . value ( " OpenDialogGeometry " , " " ) . toByteArray ( ) ) ;
if ( fileDialog . exec ( ) )
{
QStringList selectedFiles = fileDialog . selectedFiles ( ) ;
if ( selectedFiles . length ( ) = = 1 )
{
QString selectedFile = selectedFiles . at ( 0 ) ;
if ( ! openFile ( selectedFile , true ) ) goto fileDialogPreOpen ;
}
}
settings . setValue ( " OpenDialogGeometry " , fileDialog . saveGeometry ( ) ) ;
settings . setValue ( " OpenDialogDirectory " , fileDialog . directory ( ) . absolutePath ( ) ) ;
settings . endGroup ( ) ;
}
bool UserInterface : : openFile ( QString selectedFile , bool warn )
{
QString selectedFileName = QFileInfo ( selectedFile ) . fileName ( ) ;
2021-03-26 14:58:54 +01:00
if ( QFile : : exists ( selectedFile ) ) {
if ( selectedFileName . left ( 4 ) = = " PGTA " | | selectedFileName . right ( 4 ) = = " .g5e " ) {
2017-10-09 08:35:48 +02:00
SnapmaticPicture * picture = new SnapmaticPicture ( selectedFile ) ;
2021-03-26 14:58:54 +01:00
if ( picture - > readingPicture ( ) ) {
2017-10-09 08:35:48 +02:00
openSnapmaticFile ( picture ) ;
delete picture ;
return true ;
}
2021-03-26 14:58:54 +01:00
else {
if ( warn )
QMessageBox : : warning ( this , tr ( " Open File " ) , ProfileInterface : : tr ( " Failed to read Snapmatic picture " ) ) ;
2017-10-09 08:35:48 +02:00
delete picture ;
return false ;
}
}
2021-03-26 14:58:54 +01:00
else if ( selectedFileName . left ( 4 ) = = " SGTA " ) {
2017-10-09 08:35:48 +02:00
SavegameData * savegame = new SavegameData ( selectedFile ) ;
2021-03-26 14:58:54 +01:00
if ( savegame - > readingSavegame ( ) ) {
2017-10-09 08:35:48 +02:00
openSavegameFile ( savegame ) ;
delete savegame ;
return true ;
}
2021-03-26 14:58:54 +01:00
else {
if ( warn )
QMessageBox : : warning ( this , tr ( " Open File " ) , ProfileInterface : : tr ( " Failed to read Savegame file " ) ) ;
2017-10-09 08:35:48 +02:00
delete savegame ;
return false ;
}
}
2021-03-26 14:58:54 +01:00
else {
2017-10-09 08:35:48 +02:00
SnapmaticPicture * picture = new SnapmaticPicture ( selectedFile ) ;
SavegameData * savegame = new SavegameData ( selectedFile ) ;
2021-03-26 14:58:54 +01:00
if ( picture - > readingPicture ( ) ) {
2017-10-09 08:35:48 +02:00
delete savegame ;
openSnapmaticFile ( picture ) ;
delete picture ;
return true ;
}
2021-03-26 14:58:54 +01:00
else if ( savegame - > readingSavegame ( ) ) {
2017-10-09 08:35:48 +02:00
delete picture ;
openSavegameFile ( savegame ) ;
delete savegame ;
return true ;
}
2021-03-26 14:58:54 +01:00
else {
2017-10-09 08:35:48 +02:00
delete savegame ;
delete picture ;
2021-03-26 14:58:54 +01:00
if ( warn )
QMessageBox : : warning ( this , tr ( " Open File " ) , tr ( " Can't open %1 because of not valid file format " ) . arg ( " \" " + selectedFileName + " \" " ) ) ;
2017-10-09 08:35:48 +02:00
return false ;
}
}
}
2021-03-26 14:58:54 +01:00
if ( warn )
QMessageBox : : warning ( this , tr ( " Open File " ) , ProfileInterface : : tr ( " No valid file is selected " ) ) ;
2017-10-09 08:35:48 +02:00
return false ;
}
void UserInterface : : openSnapmaticFile ( SnapmaticPicture * picture )
{
PictureDialog picDialog ( profileDB , crewDB , this ) ;
picDialog . setSnapmaticPicture ( picture , true ) ;
picDialog . setModal ( true ) ;
int crewID = picture - > getSnapmaticProperties ( ) . crewID ;
2020-11-23 03:13:07 +01:00
if ( crewID ! = 0 )
crewDB - > addCrew ( crewID ) ;
2017-10-09 08:35:48 +02:00
QObject : : connect ( threadDB , SIGNAL ( crewNameUpdated ( ) ) , & picDialog , SLOT ( crewNameUpdated ( ) ) ) ;
QObject : : connect ( threadDB , SIGNAL ( playerNameUpdated ( ) ) , & picDialog , SLOT ( playerNameUpdated ( ) ) ) ;
# ifdef Q_OS_ANDROID
// Android optimization should be put here
picDialog . showMaximized ( ) ;
# else
picDialog . show ( ) ;
picDialog . setMinimumSize ( picDialog . size ( ) ) ;
picDialog . setMaximumSize ( picDialog . size ( ) ) ;
# endif
picDialog . exec ( ) ;
}
void UserInterface : : openSavegameFile ( SavegameData * savegame )
{
SavegameDialog sgdDialog ( this ) ;
sgdDialog . setSavegameData ( savegame , savegame - > getSavegameFileName ( ) , true ) ;
sgdDialog . setModal ( true ) ;
# ifdef Q_OS_ANDROID
// Android optimization should be put here
sgdDialog . showMaximized ( ) ;
# else
sgdDialog . show ( ) ;
# endif
sgdDialog . exec ( ) ;
}
2017-10-12 22:21:45 +02:00
void UserInterface : : settingsApplied ( int _contentMode , bool languageChanged )
2017-10-09 08:35:48 +02:00
{
2021-03-26 14:58:54 +01:00
if ( languageChanged ) {
2017-10-09 08:35:48 +02:00
retranslateUi ( ) ;
}
contentMode = _contentMode ;
2021-03-26 14:58:54 +01:00
if ( profileOpen ) {
2017-10-12 22:21:45 +02:00
profileUI - > settingsApplied ( contentMode , languageChanged ) ;
2017-10-09 08:35:48 +02:00
}
}
2020-09-13 02:10:15 +02:00
# ifdef GTA5SYNC_MOTD
void UserInterface : : messagesArrived ( const QJsonObject & object )
{
QSettings settings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
settings . beginGroup ( " Messages " ) ;
QJsonObject : : const_iterator it = object . constBegin ( ) ;
QJsonObject : : const_iterator end = object . constEnd ( ) ;
QStringList messages ;
while ( it ! = end ) {
const QString key = it . key ( ) ;
const QJsonValue value = it . value ( ) ;
bool uintOk ;
uint messageId = key . toUInt ( & uintOk ) ;
if ( uintOk & & value . isString ( ) ) {
const QString valueStr = value . toString ( ) ;
settings . setValue ( QString : : number ( messageId ) , valueStr ) ;
messages < < valueStr ;
}
it + + ;
}
settings . endGroup ( ) ;
if ( ! messages . isEmpty ( ) )
showMessages ( messages ) ;
}
void UserInterface : : showMessages ( const QStringList messages )
{
QDialog * messageDialog = new QDialog ( this ) ;
messageDialog - > setWindowTitle ( tr ( " %1 - Messages " ) . arg ( GTA5SYNC_APPSTR ) ) ;
2021-03-26 14:58:54 +01:00
# if QT_VERSION >= 0x050900
messageDialog - > setWindowFlag ( Qt : : WindowContextHelpButtonHint , false ) ;
# else
2020-09-13 02:10:15 +02:00
messageDialog - > setWindowFlags ( messageDialog - > windowFlags ( ) ^ Qt : : WindowContextHelpButtonHint ) ;
2021-03-26 14:58:54 +01:00
# endif
2020-09-13 02:10:15 +02:00
QVBoxLayout * messageLayout = new QVBoxLayout ;
messageDialog - > setLayout ( messageLayout ) ;
QStackedWidget * stackWidget = new QStackedWidget ( messageDialog ) ;
for ( const QString message : messages ) {
QLabel * messageLabel = new QLabel ( messageDialog ) ;
messageLabel - > setText ( message ) ;
messageLabel - > setWordWrap ( true ) ;
stackWidget - > addWidget ( messageLabel ) ;
}
messageLayout - > addWidget ( stackWidget ) ;
QHBoxLayout * buttonLayout = new QHBoxLayout ;
QPushButton * backButton = new QPushButton ( messageDialog ) ;
QPushButton * nextButton = new QPushButton ( messageDialog ) ;
if ( QIcon : : hasThemeIcon ( " go-previous " ) & & QIcon : : hasThemeIcon ( " go-next " ) & & QIcon : : hasThemeIcon ( " list-add " ) ) {
backButton - > setIcon ( QIcon : : fromTheme ( " go-previous " ) ) ;
nextButton - > setIcon ( QIcon : : fromTheme ( " go-next " ) ) ;
}
else {
2021-04-02 19:51:05 +02:00
backButton - > setIcon ( QIcon ( AppEnv : : getImagesFolder ( ) % " /back.svgz " ) ) ;
nextButton - > setIcon ( QIcon ( AppEnv : : getImagesFolder ( ) % " /next.svgz " ) ) ;
2020-09-13 02:10:15 +02:00
}
backButton - > setEnabled ( false ) ;
if ( stackWidget - > count ( ) < = 1 ) {
nextButton - > setEnabled ( false ) ;
}
buttonLayout - > addWidget ( backButton ) ;
buttonLayout - > addWidget ( nextButton ) ;
buttonLayout - > addSpacerItem ( new QSpacerItem ( 0 , 0 , QSizePolicy : : Expanding , QSizePolicy : : Minimum ) ) ;
QPushButton * closeButton = new QPushButton ( messageDialog ) ;
closeButton - > setText ( tr ( " &Close " ) ) ;
if ( QIcon : : hasThemeIcon ( " dialog-close " ) ) {
closeButton - > setIcon ( QIcon : : fromTheme ( " dialog-close " ) ) ;
}
else if ( QIcon : : hasThemeIcon ( " gtk-close " ) ) {
closeButton - > setIcon ( QIcon : : fromTheme ( " gtk-close " ) ) ;
}
buttonLayout - > addWidget ( closeButton ) ;
messageLayout - > addLayout ( buttonLayout ) ;
QObject : : connect ( backButton , & QPushButton : : clicked , [ stackWidget , backButton , nextButton , closeButton ] ( ) {
int index = stackWidget - > currentIndex ( ) ;
if ( index > 0 ) {
index - - ;
stackWidget - > setCurrentIndex ( index ) ;
nextButton - > setEnabled ( true ) ;
if ( index > 0 ) {
backButton - > setEnabled ( true ) ;
}
else {
backButton - > setEnabled ( false ) ;
closeButton - > setFocus ( ) ;
}
}
} ) ;
QObject : : connect ( nextButton , & QPushButton : : clicked , [ stackWidget , backButton , nextButton , closeButton ] ( ) {
int index = stackWidget - > currentIndex ( ) ;
if ( index < stackWidget - > count ( ) - 1 ) {
index + + ;
stackWidget - > setCurrentIndex ( index ) ;
backButton - > setEnabled ( true ) ;
if ( index < stackWidget - > count ( ) - 1 ) {
nextButton - > setEnabled ( true ) ;
}
else {
nextButton - > setEnabled ( false ) ;
closeButton - > setFocus ( ) ;
}
}
} ) ;
QObject : : connect ( closeButton , & QPushButton : : clicked , messageDialog , & QDialog : : accept ) ;
QObject : : connect ( messageDialog , & QDialog : : finished , messageDialog , & QDialog : : deleteLater ) ;
2021-03-26 14:58:54 +01:00
QTimer : : singleShot ( 0 , closeButton , [ = ] ( ) {
closeButton - > setFocus ( ) ;
} ) ;
2020-09-13 02:10:15 +02:00
messageDialog - > show ( ) ;
}
void UserInterface : : updateCacheId ( uint cacheId )
{
QSettings settings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
settings . beginGroup ( " Messages " ) ;
settings . setValue ( " CacheId " , cacheId ) ;
settings . endGroup ( ) ;
}
# endif
2017-10-09 08:35:48 +02:00
void UserInterface : : on_actionSelect_GTA_Folder_triggered ( )
{
QString GTAV_Folder_Temp = QFileDialog : : getExistingDirectory ( this , tr ( " Select GTA V Folder... " ) , StandardPaths : : documentsLocation ( ) , QFileDialog : : ShowDirsOnly ) ;
2021-03-26 14:58:54 +01:00
if ( QFileInfo ( GTAV_Folder_Temp ) . exists ( ) ) {
if ( profileOpen ) {
2018-02-25 14:13:35 +01:00
closeProfile_p ( ) ;
}
2017-10-09 08:35:48 +02:00
GTAV_Folder = GTAV_Folder_Temp ;
QDir : : setCurrent ( GTAV_Folder ) ;
AppEnv : : setGameFolder ( GTAV_Folder ) ;
on_cmdReload_clicked ( ) ;
}
}
void UserInterface : : on_action_Enable_In_game_triggered ( )
{
if ( profileOpen )
profileUI - > enableSelected ( ) ;
}
void UserInterface : : on_action_Disable_In_game_triggered ( )
{
if ( profileOpen )
profileUI - > disableSelected ( ) ;
}
void UserInterface : : retranslateUi ( )
{
ui - > retranslateUi ( this ) ;
2021-03-26 14:58:54 +01:00
# ifdef GTA5SYNC_DONATE
# ifdef GTA5SYNC_DONATE_ADDRESSES
donateAction - > setText ( tr ( " &Donate " ) ) ;
# endif
# endif
2017-10-09 08:35:48 +02:00
ui - > actionAbout_gta5sync - > setText ( tr ( " &About %1 " ) . arg ( GTA5SYNC_APPSTR ) ) ;
2018-07-13 12:07:13 +02:00
QString appVersion = GTA5SYNC_APPVER ;
# ifndef GTA5SYNC_BUILDTYPE_REL
# ifdef GTA5SYNC_COMMIT
2021-03-26 14:58:54 +01:00
if ( ! appVersion . contains ( " - " ) )
appVersion = appVersion % " - " % GTA5SYNC_COMMIT ;
2018-07-13 12:07:13 +02:00
# endif
# endif
ui - > labVersion - > setText ( QString ( " %1 %2 " ) . arg ( GTA5SYNC_APPSTR , appVersion ) ) ;
2021-03-26 14:58:54 +01:00
if ( profileOpen ) {
2020-11-23 03:13:07 +01:00
setWindowTitle ( defaultWindowTitle . arg ( profileName ) ) ;
2017-10-09 08:35:48 +02:00
}
2021-03-26 14:58:54 +01:00
else {
2020-11-23 03:13:07 +01:00
setWindowTitle ( defaultWindowTitle . arg ( tr ( " Select Profile " ) ) ) ;
2017-10-09 08:35:48 +02:00
}
}
2017-12-17 13:03:43 +01:00
void UserInterface : : on_actionQualify_as_Avatar_triggered ( )
{
profileUI - > massTool ( MassTool : : Qualify ) ;
}
void UserInterface : : on_actionChange_Players_triggered ( )
{
profileUI - > massTool ( MassTool : : Players ) ;
}
void UserInterface : : on_actionSet_Crew_triggered ( )
{
profileUI - > massTool ( MassTool : : Crew ) ;
}
void UserInterface : : on_actionSet_Title_triggered ( )
{
profileUI - > massTool ( MassTool : : Title ) ;
}