2017-10-09 08:35:48 +02:00
/*****************************************************************************
2018-05-24 22:32:00 +02:00
* gta5view Grand Theft Auto V Profile Viewer
2021-01-29 19:46:01 +01: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 "TranslationClass.h"
# include "SnapmaticPicture.h"
# include "ProfileDatabase.h"
# include "DatabaseThread.h"
# include "SavegameDialog.h"
2017-11-22 14:59:40 +01:00
# include "OptionsDialog.h"
2017-10-09 08:35:48 +02:00
# include "PictureDialog.h"
# include "UserInterface.h"
# include "CrewDatabase.h"
# include "SavegameData.h"
2018-01-16 00:13:08 +01:00
# include "UiModWidget.h"
# include "UiModLabel.h"
2017-10-09 08:35:48 +02:00
# include "IconLoader.h"
# include "AppEnv.h"
# include "config.h"
# include <QStringBuilder>
2018-01-16 00:13:08 +01:00
# include <QSignalMapper>
2017-11-22 14:59:40 +01:00
# include <QStyleFactory>
2017-10-09 08:35:48 +02:00
# include <QApplication>
2018-01-16 00:13:08 +01:00
# include <QPushButton>
# include <QSpacerItem>
# include <QVBoxLayout>
# include <QHBoxLayout>
2017-11-22 14:59:40 +01:00
# include <QMessageBox>
2017-10-09 08:35:48 +02:00
# include <QStringList>
# include <QTranslator>
2018-06-09 20:38:12 +02:00
# include <QResource>
2018-01-16 00:13:08 +01:00
# include <QCheckBox>
2017-10-09 08:35:48 +02:00
# include <QFileInfo>
# include <QSysInfo>
2018-01-16 00:13:08 +01:00
# include <QLayout>
2017-10-09 08:35:48 +02:00
# include <QObject>
# include <QString>
# include <QFont>
# include <QFile>
2020-09-28 05:33:04 +02:00
# if QT_VERSION < 0x060000
# include <QDesktopWidget>
# endif
2020-09-26 16:12:55 +02:00
# ifdef Q_OS_WIN
2017-10-09 08:35:48 +02:00
# include "windows.h"
# include <iostream>
# endif
2020-09-13 02:10:15 +02:00
# ifdef GTA5SYNC_MOTD
# include "MessageThread.h"
# endif
2018-01-11 08:41:00 +01:00
# ifdef GTA5SYNC_TELEMETRY
# include "TelemetryClass.h"
# endif
2017-10-09 08:35:48 +02:00
int main ( int argc , char * argv [ ] )
{
2019-01-13 14:32:12 +01:00
# if QT_VERSION >= 0x050600
2020-09-28 05:33:04 +02:00
# if QT_VERSION < 0x060000
2019-01-13 14:32:12 +01:00
QApplication : : setAttribute ( Qt : : AA_EnableHighDpiScaling , true ) ;
QApplication : : setAttribute ( Qt : : AA_UseHighDpiPixmaps , true ) ;
2020-09-28 05:33:04 +02:00
# endif
2019-01-13 14:32:12 +01:00
# endif
2017-10-09 08:35:48 +02:00
QApplication a ( argc , argv ) ;
a . setApplicationName ( GTA5SYNC_APPSTR ) ;
a . setApplicationVersion ( GTA5SYNC_APPVER ) ;
2017-10-21 05:59:10 +02:00
a . setQuitOnLastWindowClosed ( false ) ;
2017-10-09 08:35:48 +02:00
2017-11-22 14:59:40 +01:00
QSettings settings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
settings . beginGroup ( " Startup " ) ;
2018-07-28 04:55:55 +02:00
# ifdef GTA5SYNC_TELEMETRY
// Increase Start count at every startup
uint startCount = settings . value ( " StartCount " , 0 ) . toUInt ( ) ;
startCount + + ;
settings . setValue ( " StartCount " , startCount ) ;
settings . sync ( ) ;
# endif
2017-11-22 14:59:40 +01:00
bool customStyle = settings . value ( " CustomStyle " , false ) . toBool ( ) ;
2020-11-17 04:43:04 +01:00
if ( customStyle ) {
const QString appStyle = settings . value ( " AppStyle " , " Default " ) . toString ( ) ;
if ( QStyleFactory : : keys ( ) . contains ( appStyle , Qt : : CaseInsensitive ) ) {
2017-11-22 14:59:40 +01:00
a . setStyle ( QStyleFactory : : create ( appStyle ) ) ;
}
}
2020-09-26 16:12:55 +02:00
# ifdef Q_OS_WIN
2021-02-11 23:09:49 +01:00
# if QT_VERSION >= 0x060000
a . setFont ( QApplication : : font ( " QMenu " ) ) ;
# elif QT_VERSION >= 0x050400
# else
2020-11-17 04:43:04 +01:00
if ( QSysInfo : : windowsVersion ( ) > = 0x0080 ) {
2020-09-26 16:12:55 +02:00
a . setFont ( QApplication : : font ( " QMenu " ) ) ;
2017-10-09 08:35:48 +02:00
}
# endif
# endif
2020-11-17 04:43:04 +01:00
bool customFont = settings . value ( " CustomFont " , false ) . toBool ( ) ;
if ( customFont ) {
const QFont appFont = qvariant_cast < QFont > ( settings . value ( " AppFont " , a . font ( ) ) ) ;
a . setFont ( appFont ) ;
}
2018-01-11 08:41:00 +01:00
QStringList applicationArgs = a . arguments ( ) ;
QString selectedAction ;
QString arg1 ;
applicationArgs . removeAt ( 0 ) ;
2018-01-16 00:13:08 +01:00
Translator - > initUserLanguage ( ) ;
Translator - > loadTranslation ( & a ) ;
# ifdef GTA5SYNC_TELEMETRY
2018-05-31 06:12:47 +02:00
Telemetry - > init ( ) ;
Telemetry - > work ( ) ;
2018-01-16 00:13:08 +01:00
# endif
2017-10-09 08:35:48 +02:00
2018-01-11 08:41:00 +01:00
# ifdef GTA5SYNC_TELEMETRY
2018-05-31 06:12:47 +02:00
bool telemetryWindowLaunched = settings . value ( " PersonalUsageDataWindowLaunched " , false ) . toBool ( ) ;
bool pushUsageData = settings . value ( " PushUsageData " , false ) . toBool ( ) ;
2021-01-29 19:46:01 +01:00
if ( ! telemetryWindowLaunched & & ! pushUsageData ) {
2018-01-17 01:42:20 +01:00
QDialog * telemetryDialog = new QDialog ( ) ;
telemetryDialog - > setObjectName ( QStringLiteral ( " TelemetryDialog " ) ) ;
telemetryDialog - > setWindowTitle ( QString ( " %1 %2 " ) . arg ( GTA5SYNC_APPSTR , GTA5SYNC_APPVER ) ) ;
telemetryDialog - > setWindowFlags ( telemetryDialog - > windowFlags ( ) ^ Qt : : WindowContextHelpButtonHint ^ Qt : : WindowCloseButtonHint ) ;
telemetryDialog - > setWindowIcon ( IconLoader : : loadingAppIcon ( ) ) ;
QVBoxLayout * telemetryLayout = new QVBoxLayout ( telemetryDialog ) ;
telemetryLayout - > setObjectName ( QStringLiteral ( " TelemetryLayout " ) ) ;
telemetryDialog - > setLayout ( telemetryLayout ) ;
UiModLabel * telemetryLabel = new UiModLabel ( telemetryDialog ) ;
telemetryLabel - > setObjectName ( QStringLiteral ( " TelemetryLabel " ) ) ;
2018-05-31 06:12:47 +02:00
telemetryLabel - > setText ( QString ( " <h4>%2</h4>%1 " ) . arg (
QApplication : : translate ( " TelemetryDialog " , " You want help %1 to improve in the future by including personal usage data in your submission? " ) . arg ( GTA5SYNC_APPSTR ) ,
QApplication : : translate ( " TelemetryDialog " , " %1 User Statistics " ) . arg ( GTA5SYNC_APPSTR ) ) ) ;
2018-01-17 01:42:20 +01:00
telemetryLayout - > addWidget ( telemetryLabel ) ;
QCheckBox * telemetryCheckBox = new QCheckBox ( telemetryDialog ) ;
telemetryCheckBox - > setObjectName ( QStringLiteral ( " TelemetryCheckBox " ) ) ;
2018-05-31 06:12:47 +02:00
telemetryCheckBox - > setText ( QApplication : : translate ( " TelemetryDialog " , " Yes, I want include personal usage data. " ) ) ;
2018-01-17 01:42:20 +01:00
telemetryLayout - > addWidget ( telemetryCheckBox ) ;
QHBoxLayout * telemetryButtonLayout = new QHBoxLayout ( ) ;
telemetryButtonLayout - > setObjectName ( QStringLiteral ( " TelemetryButtonLayout " ) ) ;
telemetryLayout - > addLayout ( telemetryButtonLayout ) ;
QSpacerItem * telemetryButtonSpacer = new QSpacerItem ( 0 , 0 , QSizePolicy : : Expanding , QSizePolicy : : Minimum ) ;
telemetryButtonLayout - > addSpacerItem ( telemetryButtonSpacer ) ;
QPushButton * telemetryButton = new QPushButton ( telemetryDialog ) ;
telemetryButton - > setObjectName ( QStringLiteral ( " TelemetryButton " ) ) ;
telemetryButton - > setText ( QApplication : : translate ( " TelemetryDialog " , " &OK " ) ) ;
telemetryButtonLayout - > addWidget ( telemetryButton ) ;
QObject : : connect ( telemetryButton , SIGNAL ( clicked ( bool ) ) , telemetryDialog , SLOT ( close ( ) ) ) ;
telemetryDialog - > setFixedSize ( telemetryDialog - > sizeHint ( ) ) ;
telemetryDialog - > exec ( ) ;
QObject : : disconnect ( telemetryButton , SIGNAL ( clicked ( bool ) ) , telemetryDialog , SLOT ( close ( ) ) ) ;
2021-01-29 19:46:01 +01:00
if ( telemetryCheckBox - > isChecked ( ) ) {
2018-01-16 00:13:08 +01:00
QSettings telemetrySettings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
telemetrySettings . beginGroup ( " Telemetry " ) ;
2018-05-31 06:12:47 +02:00
telemetrySettings . setValue ( " PushUsageData " , true ) ;
2018-07-28 04:55:55 +02:00
telemetrySettings . setValue ( " PushAppConf " , true ) ;
2018-01-16 00:13:08 +01:00
telemetrySettings . endGroup ( ) ;
2018-07-28 04:55:55 +02:00
telemetrySettings . sync ( ) ;
2018-01-11 08:41:00 +01:00
Telemetry - > init ( ) ;
2018-01-16 00:13:08 +01:00
Telemetry - > work ( ) ;
2018-01-11 08:41:00 +01:00
}
2018-05-31 06:12:47 +02:00
settings . setValue ( " PersonalUsageDataWindowLaunched " , true ) ;
2018-01-17 01:42:20 +01:00
delete telemetryDialog ;
2018-01-11 08:41:00 +01:00
}
# endif
2018-01-16 00:13:08 +01:00
settings . endGroup ( ) ;
2021-01-29 19:46:01 +01:00
for ( const QString & currentArg : applicationArgs ) {
2017-10-09 08:35:48 +02:00
QString reworkedArg ;
2021-01-29 19:46:01 +01:00
if ( currentArg . left ( 9 ) = = " -showpic= " & & selectedAction = = " " ) {
reworkedArg = QString ( currentArg ) . remove ( 0 , 9 ) ;
2017-10-09 08:35:48 +02:00
arg1 = reworkedArg ;
selectedAction = " showpic " ;
}
2021-01-29 19:46:01 +01:00
else if ( currentArg . left ( 9 ) = = " -showsgd= " & & selectedAction = = " " ) {
reworkedArg = QString ( currentArg ) . remove ( 0 , 9 ) ;
2017-10-09 08:35:48 +02:00
arg1 = reworkedArg ;
selectedAction = " showsgd " ;
}
2021-01-29 19:46:01 +01:00
else if ( selectedAction = = " " ) {
2017-10-09 08:35:48 +02:00
QFile argumentFile ( currentArg ) ;
QFileInfo argumentFileInfo ( argumentFile ) ;
2021-01-29 19:46:01 +01:00
if ( argumentFile . exists ( ) ) {
2017-10-09 08:35:48 +02:00
QString argumentFileName = argumentFileInfo . fileName ( ) ;
QString argumentFileType = argumentFileName . left ( 4 ) ;
QString argumentFileExt = argumentFileName . right ( 4 ) ;
2021-01-29 19:46:01 +01:00
if ( argumentFileType = = " PGTA " | | argumentFileExt = = " .g5e " ) {
2017-10-09 08:35:48 +02:00
arg1 = currentArg ;
selectedAction = " showpic " ;
}
2021-01-29 19:46:01 +01:00
else if ( argumentFileType = = " SGTA " ) {
2017-10-09 08:35:48 +02:00
arg1 = currentArg ;
selectedAction = " showsgd " ;
}
2021-01-29 19:46:01 +01:00
else if ( argumentFileType = = " MISR " ) {
2017-10-09 08:35:48 +02:00
arg1 = currentArg ;
selectedAction = " showsgd " ;
}
}
}
}
2021-01-29 19:46:01 +01:00
if ( selectedAction = = " showpic " ) {
2017-10-09 08:35:48 +02:00
CrewDatabase crewDB ;
ProfileDatabase profileDB ;
DatabaseThread threadDB ( & crewDB ) ;
PictureDialog picDialog ( true , & profileDB , & crewDB ) ;
SnapmaticPicture picture ;
bool readOk = picture . readingPictureFromFile ( arg1 ) ;
picDialog . setWindowIcon ( IconLoader : : loadingAppIcon ( ) ) ;
picDialog . setSnapmaticPicture ( & picture , readOk ) ;
2017-12-17 13:03:43 +01:00
picDialog . setWindowFlags ( picDialog . windowFlags ( ) ^ Qt : : Dialog ^ Qt : : Window ) ;
2017-10-09 08:35:48 +02:00
int crewID = picture . getSnapmaticProperties ( ) . crewID ;
2021-01-29 19:46:01 +01:00
if ( crewID ! = 0 )
crewDB . addCrew ( crewID ) ;
if ( ! readOk )
return 1 ;
2017-10-09 08:35:48 +02:00
QObject : : connect ( & threadDB , SIGNAL ( crewNameFound ( int , QString ) ) , & crewDB , SLOT ( setCrewName ( int , QString ) ) ) ;
QObject : : connect ( & threadDB , SIGNAL ( crewNameUpdated ( ) ) , & picDialog , SLOT ( crewNameUpdated ( ) ) ) ;
QObject : : connect ( & threadDB , SIGNAL ( playerNameFound ( int , QString ) ) , & profileDB , SLOT ( setPlayerName ( int , QString ) ) ) ;
QObject : : connect ( & threadDB , SIGNAL ( playerNameUpdated ( ) ) , & picDialog , SLOT ( playerNameUpdated ( ) ) ) ;
2017-11-12 15:58:59 +01:00
QObject : : connect ( & threadDB , SIGNAL ( finished ( ) ) , & a , SLOT ( quit ( ) ) ) ;
QObject : : connect ( & picDialog , SIGNAL ( endDatabaseThread ( ) ) , & threadDB , SLOT ( terminateThread ( ) ) ) ;
2017-10-09 08:35:48 +02:00
threadDB . start ( ) ;
picDialog . show ( ) ;
2017-11-12 15:58:59 +01:00
return a . exec ( ) ;
2017-10-09 08:35:48 +02:00
}
2021-01-29 19:46:01 +01:00
else if ( selectedAction = = " showsgd " ) {
2017-10-09 08:35:48 +02:00
SavegameDialog savegameDialog ;
SavegameData savegame ;
bool readOk = savegame . readingSavegameFromFile ( arg1 ) ;
savegameDialog . setWindowIcon ( IconLoader : : loadingAppIcon ( ) ) ;
savegameDialog . setSavegameData ( & savegame , arg1 , readOk ) ;
2017-12-17 13:03:43 +01:00
savegameDialog . setWindowFlags ( savegameDialog . windowFlags ( ) ^ Qt : : Dialog ^ Qt : : Window ) ;
2017-10-09 08:35:48 +02:00
2021-01-29 19:46:01 +01:00
if ( ! readOk )
return 1 ;
2017-10-09 08:35:48 +02:00
2017-11-12 15:58:59 +01:00
a . setQuitOnLastWindowClosed ( true ) ;
2017-10-09 08:35:48 +02:00
savegameDialog . show ( ) ;
return a . exec ( ) ;
}
CrewDatabase crewDB ;
ProfileDatabase profileDB ;
DatabaseThread threadDB ( & crewDB ) ;
QObject : : connect ( & threadDB , SIGNAL ( crewNameFound ( int , QString ) ) , & crewDB , SLOT ( setCrewName ( int , QString ) ) ) ;
QObject : : connect ( & threadDB , SIGNAL ( playerNameFound ( int , QString ) ) , & profileDB , SLOT ( setPlayerName ( int , QString ) ) ) ;
2017-10-21 05:59:10 +02:00
QObject : : connect ( & threadDB , SIGNAL ( finished ( ) ) , & a , SLOT ( quit ( ) ) ) ;
2017-10-09 08:35:48 +02:00
threadDB . start ( ) ;
2020-09-13 02:10:15 +02:00
# ifdef GTA5SYNC_MOTD
uint cacheId ;
{
QSettings messageSettings ( GTA5SYNC_APPVENDOR , GTA5SYNC_APPSTR ) ;
messageSettings . beginGroup ( " Messages " ) ;
cacheId = messageSettings . value ( " CacheId " , 0 ) . toUInt ( ) ;
messageSettings . endGroup ( ) ;
}
MessageThread threadMessage ( cacheId ) ;
QObject : : connect ( & threadMessage , SIGNAL ( finished ( ) ) , & threadDB , SLOT ( terminateThread ( ) ) ) ;
threadMessage . start ( ) ;
# endif
# ifdef GTA5SYNC_MOTD
UserInterface uiWindow ( & profileDB , & crewDB , & threadDB , & threadMessage ) ;
QObject : : connect ( & threadMessage , SIGNAL ( messagesArrived ( QJsonObject ) ) , & uiWindow , SLOT ( messagesArrived ( QJsonObject ) ) ) ;
QObject : : connect ( & threadMessage , SIGNAL ( updateCacheId ( uint ) ) , & uiWindow , SLOT ( updateCacheId ( uint ) ) ) ;
# else
2017-10-09 08:35:48 +02:00
UserInterface uiWindow ( & profileDB , & crewDB , & threadDB ) ;
2020-09-13 02:10:15 +02:00
# endif
2017-10-09 08:35:48 +02:00
uiWindow . setWindowIcon ( IconLoader : : loadingAppIcon ( ) ) ;
2020-10-21 19:14:20 +02:00
# ifdef GTA5SYNC_FLATPAK
uiWindow . setupDirEnv ( false ) ;
# else
2017-10-09 08:35:48 +02:00
uiWindow . setupDirEnv ( ) ;
2020-10-21 19:14:20 +02:00
# endif
2017-10-09 08:35:48 +02:00
# ifdef Q_OS_ANDROID
uiWindow . showMaximized ( ) ;
# else
uiWindow . show ( ) ;
# endif
2017-11-12 15:58:59 +01:00
return a . exec ( ) ;
2017-10-09 08:35:48 +02:00
}