more work towards supporting RDR 2, some export changes

This commit is contained in:
Syping 2023-10-06 00:20:48 +02:00
parent d6968792aa
commit e7721404b6
10 changed files with 302 additions and 610 deletions

View file

@ -78,6 +78,13 @@ QString AppEnv::getGTAVFolder(bool *ok)
GTAV_returnFolder = settings.value("dir", GTAV_defaultFolder).toString();
settings.endGroup();
settings.beginGroup("GameDirectory");
settings.beginGroup("GTA V");
forceDir = settings.value("ForceCustom", forceDir).toBool();
GTAV_returnFolder = settings.value("Directory", GTAV_returnFolder).toString();
settings.endGroup();
settings.endGroup();
if (forceDir) {
dir.setPath(GTAV_returnFolder);
if (dir.exists()) {
@ -108,13 +115,63 @@ QString AppEnv::getGTAVFolder(bool *ok)
return QString();
}
bool AppEnv::setGTAVFolder(QString gameFolder)
QString AppEnv::getRDR2Folder(bool *ok)
{
QDir dir;
dir.setPath(gameFolder);
if (dir.exists())
return true;
return false;
QString RDR2_FOLDER = QString::fromUtf8(qgetenv("RDR2_FOLDER"));
if (!RDR2_FOLDER.isEmpty()) {
dir.setPath(RDR2_FOLDER);
if (dir.exists()) {
if (ok)
*ok = true;
return dir.absolutePath();
}
}
#ifdef Q_OS_UNIX
// TODO: Try to locate the Steam Proton RDR 2 folder
const QString RDR2_defaultFolder = StandardPaths::documentsLocation() % "/Rockstar Games/Red Dead Redemption 2";
#else
const QString RDR2_defaultFolder = StandardPaths::documentsLocation() % "/Rockstar Games/Red Dead Redemption 2";
#endif
QString RDR2_returnFolder = RDR2_defaultFolder;
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("GameDirectory");
settings.beginGroup("RDR 2");
bool forceDir = settings.value("ForceCustom", false).toBool();
RDR2_returnFolder = settings.value("Directory", RDR2_defaultFolder).toString();
settings.endGroup();
settings.endGroup();
if (forceDir) {
dir.setPath(RDR2_returnFolder);
if (dir.exists()) {
if (ok)
*ok = true;
return dir.absolutePath();
}
}
dir.setPath(RDR2_defaultFolder);
if (dir.exists()) {
if (ok)
*ok = true;
return dir.absolutePath();
}
if (!forceDir) {
dir.setPath(RDR2_returnFolder);
if (dir.exists()) {
if (ok)
*ok = true;
return dir.absolutePath();
}
}
if (ok)
*ok = false;
return QString();
}
QString AppEnv::getExLangFolder()

View file

@ -36,7 +36,7 @@ public:
// Folder Stuff
static QString getGTAVFolder(bool *ok = 0);
static bool setGTAVFolder(QString gameFolder);
static QString getRDR2Folder(bool *ok = 0);
static QString getExLangFolder();
static QString getInLangFolder();
static QString getImagesFolder();

View file

@ -26,6 +26,7 @@
#include "config.h"
#include <QStringBuilder>
#include <QApplication>
#include <QSaveFile>
#include <QFileInfo>
#include <QFile>
@ -38,122 +39,50 @@
ExportThread::ExportThread(QMap<ProfileWidget*,QString> profileMap, QString exportDirectory, bool pictureCopyEnabled, bool pictureExportEnabled, int exportCount, QObject *parent) : QThread(parent),
profileMap(profileMap), exportDirectory(exportDirectory), pictureCopyEnabled(pictureCopyEnabled), pictureExportEnabled(pictureExportEnabled), exportCount(exportCount)
{
}
void ExportThread::run()
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
// Picture Settings
// Quality Settings
settings.beginGroup("Pictures");
int defaultQuality = 100;
int customQuality = settings.value("CustomQuality", defaultQuality).toInt();
if (customQuality < 1 || customQuality > 100)
customQuality = 100;
bool useCustomQuality = settings.value("CustomQualityEnabled", false).toBool();
// Size Settings
const QSize defExportSize = QSize(960, 536);
QSize cusExportSize = settings.value("CustomSize", defExportSize).toSize();
if (cusExportSize.width() > 7680) {
cusExportSize.setWidth(7680);
}
else if (cusExportSize.height() > 4320) {
cusExportSize.setHeight(4320);
}
if (cusExportSize.width() < 1) {
cusExportSize.setWidth(1);
}
else if (cusExportSize.height() < 1) {
cusExportSize.setHeight(1);
}
QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
settings.endGroup();
// End Picture Settings
int intExportProgress = 0;
for (ProfileWidget *widget : profileMap.keys())
{
if (widget->isSelected())
{
if (widget->getWidgetType() == "SnapmaticWidget")
{
size_t intExportProgress = 0;
for (ProfileWidget *widget : profileMap.keys()) {
if (widget->isSelected()) {
if (widget->getWidgetType() == "SnapmaticWidget") {
SnapmaticWidget *picWidget = qobject_cast<SnapmaticWidget*>(widget);
SnapmaticPicture *picture = picWidget->getPicture();
if (pictureExportEnabled)
{
if (pictureExportEnabled) {
QString exportFileName = PictureExport::getPictureFileName(picture);
if (exportFileName.right(4) != ".jpg" && exportFileName.right(4) != ".png")
{
if (!exportFileName.endsWith(".jpg"))
exportFileName += ".jpg";
}
intExportProgress++;
emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
emit exportProgressUpdate(intExportProgress);
// Scale Picture
QImage exportPicture = picture->getImage();
if (sizeMode == "Desktop")
{
#if QT_VERSION >= 0x050000
qreal screenRatioPR = AppEnv::screenRatioPR();
QRect desktopResolution = QApplication::primaryScreen()->geometry();
int desktopSizeWidth = qRound((double)desktopResolution.width() * screenRatioPR);
int desktopSizeHeight = qRound((double)desktopResolution.height() * screenRatioPR);
#else
QRect desktopResolution = QApplication::desktop()->screenGeometry();
int desktopSizeWidth = desktopResolution.width();
int desktopSizeHeight = desktopResolution.height();
#endif
exportPicture = exportPicture.scaled(desktopSizeWidth, desktopSizeHeight, aspectRatio, Qt::SmoothTransformation);
}
else if (sizeMode == "Custom")
{
exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
}
bool isSaved;
if (useCustomQuality)
{
isSaved = exportPicture.save(exportDirectory % "/" % exportFileName, "JPEG", customQuality);
}
else
{
isSaved = exportPicture.save(exportDirectory % "/" % exportFileName, "JPEG", 100);
}
QSaveFile exportFile(exportDirectory % "/" % exportFileName);
exportFile.write(picture->getPictureStream());
bool isSaved = exportFile.commit();
if (!isSaved)
{
failedExportPictures += exportFileName;
}
}
if (pictureCopyEnabled)
{
if (pictureCopyEnabled) {
QString exportFileName = PictureExport::getPictureFileName(picture);
if (exportFileName.right(4) != ".g5e")
{
if (!exportFileName.endsWith(".g5e"))
exportFileName += ".g5e";
}
intExportProgress++;
emit exportStringUpdate(ProfileInterface::tr("Export file %1 of %2 files").arg(QString::number(intExportProgress), QString::number(exportCount)));
emit exportProgressUpdate(intExportProgress);
QString exportFilePath = exportDirectory % "/" % exportFileName;
if (QFile::exists(exportFilePath)) {QFile::remove(exportFilePath);}
if (QFile::exists(exportFilePath))
QFile::remove(exportFilePath);
if (!picture->exportPicture(exportDirectory % "/" % exportFileName, SnapmaticFormat::G5E_Format))
{
failedCopyPictures += exportFileName;
}
}
}
else if (widget->getWidgetType() == "SavegameWidget")
{
else if (widget->getWidgetType() == "SavegameWidget") {
SavegameWidget *sgdWidget = qobject_cast<SavegameWidget*>(widget);
SavegameData *savegame = sgdWidget->getSavegame();
@ -166,14 +95,13 @@ void ExportThread::run()
emit exportProgressUpdate(intExportProgress);
QString exportFilePath = exportDirectory % "/" % exportFileName;
if (QFile::exists(exportFilePath)) {QFile::remove(exportFilePath);}
if (QFile::exists(exportFilePath))
QFile::remove(exportFilePath);
if (!QFile::copy(originalFileName, exportFilePath))
{
failedSavegames += exportFileName;
}
}
}
}
emit exportFinished();
}

View file

@ -60,26 +60,10 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
// Setup User Interface
ui->setupUi(this);
ui->tabWidget->setCurrentIndex(0);
ui->labPicCustomRes->setVisible(false);
ui->cmdCancel->setDefault(true);
ui->cmdCancel->setFocus();
qreal screenRatioPR = AppEnv::screenRatioPR();
QRect desktopResolution = QApplication::primaryScreen()->geometry();
int desktopSizeWidth = qRound((double)desktopResolution.width() * screenRatioPR);
int desktopSizeHeight = qRound((double)desktopResolution.height() * screenRatioPR);
aspectRatio = Qt::KeepAspectRatio;
defExportSize = QSize(960, 536);
cusExportSize = defExportSize;
defaultQuality = 100;
customQuality = 100;
contentMode = 0;
settings = new QSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
percentString = ui->labPicQuality->text();
ui->labPicQuality->setText(percentString.arg(QString::number(defaultQuality)));
ui->rbPicDesktopRes->setText(ui->rbPicDesktopRes->text().arg(QString::number(desktopSizeWidth), QString::number(desktopSizeHeight)));
ui->rbPicDefaultRes->setText(ui->rbPicDefaultRes->text().arg(QString::number(defExportSize.width()), QString::number(defExportSize.height())));
// Set Icon for OK Button
if (QIcon::hasThemeIcon("dialog-ok")) {
@ -102,15 +86,15 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
ui->cmdCopyStatsID->setIcon(QIcon::fromTheme("edit-copy"));
}
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
setupTreeWidget();
setupLanguageBox();
setupRadioButtons();
setupDefaultProfile();
setupPictureSettings();
setupCustomGTAFolder();
setupInterfaceSettings();
setupStatisticsSettings();
setupSnapmaticPictureViewer();
setupLanguageBox(&settings);
setupRadioButtons(&settings);
setupDefaultProfile(&settings);
setupCustomGameFolder(&settings);
setupInterfaceSettings(&settings);
setupStatisticsSettings(&settings);
setupSnapmaticPictureViewer(&settings);
setupWindowsGameSettings();
#ifndef Q_QS_ANDROID
@ -126,7 +110,6 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
OptionsDialog::~OptionsDialog()
{
delete settings;
qDeleteAll(playerItems.begin(), playerItems.end());
playerItems.clear();
delete ui;
@ -158,7 +141,7 @@ void OptionsDialog::setupTreeWidget()
}
}
void OptionsDialog::setupLanguageBox()
void OptionsDialog::setupLanguageBox(QSettings *settings)
{
settings->beginGroup("Interface");
currentLanguage = settings->value("Language", "System").toString();
@ -259,7 +242,7 @@ void OptionsDialog::setupLanguageBox()
ui->labCurrentAreaLanguage->setText(tr("Current: %1").arg(currentLocale.nativeLanguageName() % " (" % currentLocale.nativeCountryName() % ") [" % aCurrentAreaLanguage % "]"));
}
void OptionsDialog::setupRadioButtons()
void OptionsDialog::setupRadioButtons(QSettings *settings)
{
bool contentModeOk;
settings->beginGroup("Profile");
@ -291,7 +274,7 @@ void OptionsDialog::setupRadioButtons()
}
}
void OptionsDialog::setupInterfaceSettings()
void OptionsDialog::setupInterfaceSettings(QSettings *settings)
{
settings->beginGroup("Startup");
const QString currentStyle = QApplication::style()->objectName();
@ -339,24 +322,25 @@ void OptionsDialog::on_cmdOK_clicked()
void OptionsDialog::applySettings()
{
settings->beginGroup("Interface");
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("Interface");
#if QT_VERSION >= 0x050000
settings->setValue("Language", ui->cbLanguage->currentData());
settings->setValue("AreaLanguage", ui->cbAreaLanguage->currentData());
settings.setValue("Language", ui->cbLanguage->currentData());
settings.setValue("AreaLanguage", ui->cbAreaLanguage->currentData());
#else
settings->setValue("Language", ui->cbLanguage->itemData(ui->cbLanguage->currentIndex()));
settings->setValue("AreaLanguage", ui->cbAreaLanguage->itemData(ui->cbAreaLanguage->currentIndex()));
#endif
#ifdef Q_OS_WIN
#if QT_VERSION >= 0x050200
settings->setValue("NavigationBar", ui->cbSnapmaticNavigationBar->isChecked());
settings.setValue("NavigationBar", ui->cbSnapmaticNavigationBar->isChecked());
#endif
#else
settings->setValue("NavigationBar", ui->cbSnapmaticNavigationBar->isChecked());
settings.setValue("NavigationBar", ui->cbSnapmaticNavigationBar->isChecked());
#endif
settings->endGroup();
settings.endGroup();
settings->beginGroup("Profile");
settings.beginGroup("Profile");
int newContentMode = 20;
if (ui->rbModern->isChecked()) {
newContentMode = 20;
@ -367,66 +351,56 @@ void OptionsDialog::applySettings()
if (ui->cbDoubleclick->isChecked()) {
newContentMode++;
}
settings->setValue("ContentMode", newContentMode);
settings.setValue("ContentMode", newContentMode);
#if QT_VERSION >= 0x050000
settings->setValue("Default", ui->cbProfiles->currentData());
settings.setValue("Default", ui->cbProfiles->currentData());
#else
settings->setValue("Default", ui->cbProfiles->itemData(ui->cbProfiles->currentIndex()));
#endif
settings->endGroup();
settings.endGroup();
settings->beginGroup("Pictures");
if (ui->cbPicCustomQuality->isChecked()) {
settings->setValue("CustomQuality", ui->hsPicQuality->value());
}
settings->setValue("CustomQualityEnabled", ui->cbPicCustomQuality->isChecked());
QString sizeMode = "Default";
if (ui->rbPicDesktopRes->isChecked()) {
sizeMode = "Desktop";
}
else if (ui->rbPicCustomRes->isChecked()) {
sizeMode = "Custom";
settings->setValue("CustomSize", QSize(ui->sbPicExportWidth->value(), ui->sbPicExportHeight->value()));
}
settings->setValue("ExportSizeMode", sizeMode);
settings->setValue("AspectRatio", aspectRatio);
settings->endGroup();
const bool forceCustomFolder = ui->cbForceCustomFolder->isChecked();
const bool forceCustomFolder_RDR2 = ui->cbForceCustomFolder_RDR2->isChecked();
settings.beginGroup("GameDirectory");
settings.beginGroup("GTA V");
settings.setValue("Directory", ui->txtFolder->text());
settings.setValue("ForceCustom", forceCustomFolder);
settings.endGroup();
settings.beginGroup("RDR 2");
settings.setValue("Directory", ui->txtFolder_RDR2->text());
settings.setValue("ForceCustom", forceCustomFolder_RDR2);
settings.endGroup();
settings.endGroup();
bool forceCustomFolder = ui->cbForceCustomFolder->isChecked();
settings->beginGroup("dir");
settings->setValue("dir", ui->txtFolder->text());
settings->setValue("force", forceCustomFolder);
settings->endGroup();
bool defaultStyle = ui->cbDefaultStyle->isChecked();
settings->beginGroup("Startup");
const bool defaultStyle = ui->cbDefaultStyle->isChecked();
settings.beginGroup("Startup");
if (!defaultStyle) {
QString newStyle = ui->cbStyleList->currentText();
settings->setValue("CustomStyle", true);
settings->setValue("AppStyle", newStyle);
settings.setValue("CustomStyle", true);
settings.setValue("AppStyle", newStyle);
QApplication::setStyle(QStyleFactory::create(newStyle));
}
else {
settings->setValue("CustomStyle", false);
settings.setValue("CustomStyle", false);
}
bool defaultFont = ui->cbDefaultFont->isChecked();
const bool defaultFont = ui->cbDefaultFont->isChecked();
if (!defaultFont) {
QFont newFont = ui->cbFont->currentFont();
settings->setValue("CustomFont", true);
settings->setValue("AppFont", newFont);
settings.setValue("CustomFont", true);
settings.setValue("AppFont", newFont);
QApplication::setFont(newFont);
}
else {
settings->setValue("CustomFont", false);
settings.setValue("CustomFont", false);
}
settings->endGroup();
settings.endGroup();
#ifdef GTA5SYNC_TELEMETRY
settings->beginGroup("Telemetry");
settings->setValue("PushAppConf", ui->cbAppConfigStats->isChecked());
settings->setValue("PushUsageData", ui->cbUsageData->isChecked());
if (!Telemetry->isStateForced()) { settings->setValue("IsEnabled", ui->cbParticipateStats->isChecked()); }
settings->endGroup();
settings.beginGroup("Telemetry");
settings.setValue("PushAppConf", ui->cbAppConfigStats->isChecked());
settings.setValue("PushUsageData", ui->cbUsageData->isChecked());
if (!Telemetry->isStateForced()) { settings.setValue("IsEnabled", ui->cbParticipateStats->isChecked()); }
settings.endGroup();
Telemetry->refresh();
Telemetry->work();
if (ui->cbUsageData->isChecked() && Telemetry->canPush()) {
@ -459,7 +433,7 @@ void OptionsDialog::applySettings()
Translator->initUserLanguage();
}
settings->sync();
settings.sync();
emit settingsApplied(newContentMode, languageChanged);
if ((forceCustomFolder && ui->txtFolder->text() != currentCFolder) || (forceCustomFolder != currentFFolder && forceCustomFolder)) {
@ -467,14 +441,14 @@ void OptionsDialog::applySettings()
}
}
void OptionsDialog::setupDefaultProfile()
void OptionsDialog::setupDefaultProfile(QSettings *settings)
{
settings->beginGroup("Profile");
defaultProfile = settings->value("Default", "").toString();
defaultProfile = settings->value("Default", QString()).toString();
settings->endGroup();
QString cbNoneStr = tr("No Profile", "No Profile, as default");
ui->cbProfiles->addItem(cbNoneStr, "");
ui->cbProfiles->addItem(cbNoneStr, QString());
}
void OptionsDialog::commitProfiles(const QStringList &profiles)
@ -492,77 +466,7 @@ void OptionsDialog::commitProfiles(const QStringList &profiles)
}
}
void OptionsDialog::on_rbPicCustomRes_toggled(bool checked)
{
ui->labPicCustomRes->setEnabled(checked);
ui->sbPicExportWidth->setEnabled(checked);
ui->sbPicExportHeight->setEnabled(checked);
ui->labPicXDescription->setEnabled(checked);
}
void OptionsDialog::on_cbPicCustomQuality_toggled(bool checked)
{
ui->hsPicQuality->setEnabled(checked);
ui->labPicQuality->setEnabled(checked);
ui->labPicQualityDescription->setEnabled(checked);
}
void OptionsDialog::on_hsPicQuality_valueChanged(int value)
{
customQuality = value;
ui->labPicQuality->setText(percentString.arg(QString::number(value)));
}
void OptionsDialog::setupPictureSettings()
{
settings->beginGroup("Pictures");
// Quality Settings
customQuality = settings->value("CustomQuality", defaultQuality).toInt();
if (customQuality < 1 || customQuality > 100)
customQuality = 100;
ui->hsPicQuality->setValue(customQuality);
ui->cbPicCustomQuality->setChecked(settings->value("CustomQualityEnabled", false).toBool());
// Size Settings
cusExportSize = settings->value("CustomSize", defExportSize).toSize();
if (cusExportSize.width() > 7680) {
cusExportSize.setWidth(7680);
}
else if (cusExportSize.height() > 4320) {
cusExportSize.setHeight(4320);
}
if (cusExportSize.width() < 1) {
cusExportSize.setWidth(1);
}
else if (cusExportSize.height() < 1) {
cusExportSize.setHeight(1);
}
ui->sbPicExportWidth->setMaximum(7680);
ui->sbPicExportWidth->setValue(cusExportSize.width());
ui->sbPicExportHeight->setMaximum(4320);
ui->sbPicExportHeight->setValue(cusExportSize.height());
QString sizeMode = settings->value("ExportSizeMode", "Default").toString();
if (sizeMode == "Desktop") {
ui->rbPicDesktopRes->setChecked(true);
}
else if (sizeMode == "Custom") {
ui->rbPicCustomRes->setChecked(true);
}
else {
ui->rbPicDefaultRes->setChecked(true);
}
aspectRatio = static_cast<Qt::AspectRatioMode>(settings->value("AspectRatio", Qt::KeepAspectRatio).toInt());
if (aspectRatio == Qt::IgnoreAspectRatio) {
ui->cbIgnoreAspectRatio->setChecked(true);
}
settings->endGroup();
}
void OptionsDialog::setupStatisticsSettings()
void OptionsDialog::setupStatisticsSettings(QSettings *settings)
{
#ifdef GTA5SYNC_TELEMETRY
ui->cbParticipateStats->setText(tr("Participate in %1 User Statistics").arg(GTA5SYNC_APPSTR));
@ -648,32 +552,36 @@ void OptionsDialog::setupWindowsGameSettings()
#endif
}
void OptionsDialog::on_cbIgnoreAspectRatio_toggled(bool checked)
void OptionsDialog::setupCustomGameFolder(QSettings *settings)
{
if (checked) {
aspectRatio = Qt::IgnoreAspectRatio;
}
else {
aspectRatio = Qt::KeepAspectRatio;
}
}
void OptionsDialog::setupCustomGTAFolder()
{
bool ok;
QString defaultGameFolder = AppEnv::getGTAVFolder(&ok);
bool ok_GTAV, ok_RDR2;
const QString defaultGameFolder = AppEnv::getGTAVFolder(&ok_GTAV);
const QString defaultGameFolderR = AppEnv::getRDR2Folder(&ok_RDR2);
settings->beginGroup("dir");
currentCFolder = settings->value("dir", "").toString();
currentCFolder = settings->value("dir", QString()).toString();
currentFFolder = settings->value("force", false).toBool();
if (currentCFolder == "" && ok) {
settings->endGroup();
settings->beginGroup("GameDirectory");
settings->beginGroup("GTA V");
currentCFolder = settings->value("Directory", currentCFolder).toString();
currentFFolder = settings->value("ForceCustom", currentFFolder).toBool();
settings->endGroup();
settings->beginGroup("RDR 2");
currentCFolderR = settings->value("Directory", QString()).toString();
currentFFolderR = settings->value("ForceCustom", false).toBool();
settings->endGroup();
settings->endGroup();
if (currentCFolder.isEmpty() && ok_GTAV)
currentCFolder = defaultGameFolder;
}
if (currentCFolderR.isEmpty() && ok_RDR2)
currentCFolderR = defaultGameFolderR;
ui->txtFolder->setText(currentCFolder);
ui->cbForceCustomFolder->setChecked(currentFFolder);
settings->endGroup();
ui->txtFolder_RDR2->setText(currentCFolderR);
ui->cbForceCustomFolder_RDR2->setChecked(currentFFolderR);
}
void OptionsDialog::setupSnapmaticPictureViewer()
void OptionsDialog::setupSnapmaticPictureViewer(QSettings *settings)
{
#ifdef Q_OS_WIN
#if QT_VERSION >= 0x050200

View file

@ -41,10 +41,6 @@ public:
private slots:
void on_cmdOK_clicked();
void on_rbPicCustomRes_toggled(bool checked);
void on_cbPicCustomQuality_toggled(bool checked);
void on_hsPicQuality_valueChanged(int value);
void on_cbIgnoreAspectRatio_toggled(bool checked);
void on_cmdExploreFolder_clicked();
void on_cbDefaultStyle_toggled(bool checked);
void on_cbDefaultFont_toggled(bool checked);
@ -63,25 +59,21 @@ private:
QString currentAreaLanguage;
QString currentLanguage;
QString currentCFolder;
QString currentCFolderR;
QString defaultProfile;
QString percentString;
QSettings *settings;
bool withoutPlayers;
bool currentFFolder;
bool currentFFolderR;
int contentMode;
int customQuality;
int defaultQuality;
QSize defExportSize;
QSize cusExportSize;
void setupTreeWidget();
void setupLanguageBox();
void setupRadioButtons();
void setupDefaultProfile();
void setupPictureSettings();
void setupCustomGTAFolder();
void setupInterfaceSettings();
void setupStatisticsSettings();
void setupSnapmaticPictureViewer();
void setupLanguageBox(QSettings *settings);
void setupRadioButtons(QSettings *settings);
void setupDefaultProfile(QSettings *settings);
void setupCustomGameFolder(QSettings *settings);
void setupInterfaceSettings(QSettings *settings);
void setupStatisticsSettings(QSettings *settings);
void setupSnapmaticPictureViewer(QSettings *settings);
void setupWindowsGameSettings();
void applySettings();
};

View file

@ -102,6 +102,36 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gbDefaultFolder_RDR2">
<property name="title">
<string>Custom RDR 2 Folder</string>
</property>
<layout class="QVBoxLayout" name="vlCustomRDR2Folder">
<item>
<widget class="QCheckBox" name="cbForceCustomFolder_RDR2">
<property name="text">
<string>Force using Custom Folder</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="hlDefaultFolder_RDR2">
<item>
<widget class="QLineEdit" name="txtFolder_RDR2"/>
</item>
<item>
<widget class="QToolButton" name="cmdExploreFolder_RDR2">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="vsProfile">
<property name="orientation">
@ -122,181 +152,6 @@
<string>Pictures</string>
</attribute>
<layout class="QVBoxLayout" name="vlTabPictures">
<item>
<widget class="QGroupBox" name="gbPicResolution">
<property name="title">
<string>Export Size</string>
</property>
<layout class="QVBoxLayout" name="vlGbPicRes">
<item>
<widget class="QRadioButton" name="rbPicDefaultRes">
<property name="text">
<string>Default: %1x%2</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbPicDesktopRes">
<property name="text">
<string>Screen Resolution: %1x%2</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="hlCustomRes">
<item>
<widget class="QRadioButton" name="rbPicCustomRes">
<property name="text">
<string>Custom Size:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labPicCustomRes">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Custom Size:</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="sbPicExportWidth">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>3840</number>
</property>
<property name="value">
<number>960</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labPicXDescription">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="sbPicExportHeight">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>2160</number>
</property>
<property name="value">
<number>536</number>
</property>
</widget>
</item>
<item>
<spacer name="hsPicCustomSize">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="hlAspectRatio">
<item>
<widget class="QCheckBox" name="cbIgnoreAspectRatio">
<property name="text">
<string>Ignore Aspect Ratio</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gbPicQuality">
<property name="title">
<string>Export Quality</string>
</property>
<layout class="QVBoxLayout" name="vlHlPicQuality">
<item>
<widget class="QCheckBox" name="cbPicCustomQuality">
<property name="text">
<string>Enable Custom Quality</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="hlPicQuality">
<item>
<widget class="QLabel" name="labPicQualityDescription">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Quality:</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="hsPicQuality">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labPicQuality">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>%1%</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gbSnapmaticPictureViewer">
<property name="title">

View file

@ -26,16 +26,9 @@
#include <QMessageBox>
#include <QFileDialog>
#include <QSettings>
#include <QDebug>
#if QT_VERSION < 0x050000
#include <QDesktopWidget>
#endif
#if QT_VERSION >= 0x050000
#include <QSaveFile>
#include <QScreen>
#endif
#include <QDebug>
PictureExport::PictureExport()
{
@ -48,29 +41,6 @@ void PictureExport::exportAsPicture(QWidget *parent, SnapmaticPicture *picture)
// Picture Settings
// Quality Settings
settings.beginGroup("Pictures");
int defaultQuality = 100;
int customQuality = settings.value("CustomQuality", defaultQuality).toInt();
if (customQuality < 1 || customQuality > 100)
customQuality = 100;
bool useCustomQuality = settings.value("CustomQualityEnabled", false).toBool();
// Size Settings
const QSize defExportSize = QSize(960, 536);
QSize cusExportSize = settings.value("CustomSize", defExportSize).toSize();
if (cusExportSize.width() > 7680) {
cusExportSize.setWidth(7680);
}
else if (cusExportSize.height() > 4320) {
cusExportSize.setHeight(4320);
}
if (cusExportSize.width() < 1) {
cusExportSize.setWidth(1);
}
else if (cusExportSize.height() < 1) {
cusExportSize.setHeight(1);
}
QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
QString defaultExportFormat = settings.value("DefaultExportFormat", ".jpg").toString();
settings.endGroup();
// End Picture Settings
@ -87,7 +57,7 @@ fileDialogPreSave: //Work?
fileDialog.setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
fileDialog.setDefaultSuffix("suffix");
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
fileDialog.setWindowFlag(Qt::WindowContextHelpButtonHint, false);
fileDialog.setWindowTitle(PictureDialog::tr("Export as Picture..."));
fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("Export"));
@ -107,16 +77,13 @@ fileDialogPreSave: //Work?
QString saveFileFormat;
QString selectedFile = selectedFiles.at(0);
if (selectedFile.right(4) == ".jpg") {
if (selectedFile.endsWith(".jpg") || selectedFile.endsWith(".jpeg")) {
saveFileFormat = "JPEG";
}
else if (selectedFile.right(4) == ".jpeg") {
saveFileFormat = "JPEG";
}
else if (selectedFile.right(4) == ".png") {
else if (selectedFile.endsWith(".png")) {
saveFileFormat = "PNG";
}
else if (selectedFile.right(7) == ".suffix") {
else if (selectedFile.endsWith(".suffix")) {
if (fileDialog.selectedNameFilter() == "JPEG picture (*.jpg)") {
selectedFile.replace(".suffix", ".jpg");
}
@ -134,49 +101,23 @@ fileDialogPreSave: //Work?
}
}
// Scale Picture
QImage exportPicture = picture->getImage();
if (sizeMode == "Desktop") {
#if QT_VERSION >= 0x050000
qreal screenRatioPR = AppEnv::screenRatioPR();
QRect desktopResolution = QApplication::primaryScreen()->geometry();
int desktopSizeWidth = qRound((double)desktopResolution.width() * screenRatioPR);
int desktopSizeHeight = qRound((double)desktopResolution.height() * screenRatioPR);
#else
QRect desktopResolution = QApplication::desktop()->screenGeometry();
int desktopSizeWidth = desktopResolution.width();
int desktopSizeHeight = desktopResolution.height();
#endif
exportPicture = exportPicture.scaled(desktopSizeWidth, desktopSizeHeight, aspectRatio, Qt::SmoothTransformation);
}
else if (sizeMode == "Custom") {
exportPicture = exportPicture.scaled(cusExportSize, aspectRatio, Qt::SmoothTransformation);
}
int errorId = 0;
bool isSaved = false;
#if QT_VERSION >= 0x050000
QSaveFile *picFile = new QSaveFile(selectedFile);
#else
QFile *picFile = new QFile(selectedFile);
#endif
if (picFile->open(QIODevice::WriteOnly)) {
isSaved = exportPicture.save(picFile, saveFileFormat.toStdString().c_str(), useCustomQuality ? customQuality : defaultQuality);
#if QT_VERSION >= 0x050000
QSaveFile picFile(selectedFile);
if (picFile.open(QIODevice::WriteOnly)) {
isSaved = exportPicture.save(&picFile, saveFileFormat.toStdString().c_str(), 100);
if (isSaved) {
isSaved = picFile->commit();
isSaved = picFile.commit();
}
else {
errorId = 1;
}
#else
picFile->close();
#endif
}
else {
errorId = 2;
}
delete picFile;
if (!isSaved) {
switch (errorId) {
@ -225,7 +166,7 @@ fileDialogPreSave: //Work?
fileDialog.setOption(QFileDialog::DontUseNativeDialog, dontUseNativeDialog);
fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
fileDialog.setDefaultSuffix(".rem");
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
fileDialog.setWindowFlag(Qt::WindowContextHelpButtonHint, false);
fileDialog.setWindowTitle(PictureDialog::tr("Export as Snapmatic..."));
fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("Export"));
@ -246,14 +187,14 @@ fileDialogPreSave: //Work?
QString selectedFile = selectedFiles.at(0);
bool isAutoExt = false;
#ifndef GTA5SYNC_FLATPAK
if (selectedFile.right(5) == ".auto") {
if (selectedFile.endsWith(".auto")) {
isAutoExt = true;
QString dirPath = QFileInfo(selectedFile).dir().path();
QString stockFileName = sgdFileInfo.fileName();
selectedFile = dirPath % "/" % stockFileName;
}
#endif
if (selectedFile.right(4) == ".rem") {
if (selectedFile.endsWith(".rem")) {
selectedFile.remove(selectedFile.length() - 4, 4);
}
@ -263,7 +204,7 @@ fileDialogPreSave: //Work?
}
}
if (selectedFile.right(4) == ".g5e") {
if (selectedFile.endsWith(".g5e")) {
bool isExported = picture->exportPicture(selectedFile, SnapmaticFormat::G5E_Format);
if (!isExported) {
QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));

View file

@ -309,32 +309,19 @@ UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, D
ui->vlUserInterface->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio);
}
void UserInterface::setupDirEnv(bool showFolderDialog)
void UserInterface::setupDirEnv(bool showFolderWindow)
{
// settings init
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
bool folderExists;
GTAV_Folder = AppEnv::getGTAVFolder(&folderExists);
if (!folderExists && showFolderDialog) {
const QString GTAV_Folder_Temp = QFileDialog::getExistingDirectory(this, tr("Select GTA V Folder..."), StandardPaths::documentsLocation(), QFileDialog::ShowDirsOnly);
if (!GTAV_Folder_Temp.isEmpty() && QDir(GTAV_Folder_Temp).exists()) {
GTAV_Folder = GTAV_Folder_Temp;
folderExists = true;
AppEnv::setGTAVFolder(GTAV_Folder);
// First time folder selection save
settings.beginGroup("dir");
if (settings.value("dir", "").toString().isEmpty()) {
settings.setValue("dir", GTAV_Folder);
}
settings.endGroup();
}
}
bool folderExists_GTAV, folderExists_RDR2;
GTAV_Folder = AppEnv::getGTAVFolder(&folderExists_GTAV);
RDR2_Folder = AppEnv::getRDR2Folder(&folderExists_RDR2);
// profiles init
settings.beginGroup("Profile");
QString defaultProfile = settings.value("Default", "").toString();
QString defaultProfile = settings.value("Default", QString()).toString();
settings.endGroup();
contentMode = settings.value("ContentMode", 0).toInt();
if (contentMode == 1) {
@ -344,51 +331,78 @@ void UserInterface::setupDirEnv(bool showFolderDialog)
contentMode = 20;
}
if (folderExists) {
if (folderExists_GTAV) {
QDir GTAV_ProfilesDir;
GTAV_ProfilesDir.setPath(GTAV_Folder % "/Profiles");
GTAV_Profiles = GTAV_ProfilesDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
setupProfileUi();
if (GTAV_Profiles.length() == 1) {
openProfile(GTAV_Profiles.at(0), RagePhoto::PhotoFormat::GTA5);
}
else if(GTAV_Profiles.contains(defaultProfile)) {
openProfile(defaultProfile, RagePhoto::PhotoFormat::GTA5);
}
}
else {
GTAV_Profiles = QStringList();
setupProfileUi();
}
settings.endGroup();
if (folderExists_RDR2) {
QDir RDR2_ProfilesDir;
RDR2_ProfilesDir.setPath(RDR2_Folder % "/Profiles");
RDR2_Profiles = RDR2_ProfilesDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
}
else {
RDR2_Profiles = QStringList();
}
setupProfileUi();
if (GTAV_Profiles.contains(defaultProfile)) {
openProfile(defaultProfile, RagePhoto::PhotoFormat::GTA5);
}
else if (GTAV_Profiles.length() == 1 && RDR2_Profiles.length() == 0) {
openProfile(GTAV_Profiles.at(0), RagePhoto::PhotoFormat::GTA5);
}
else if (GTAV_Profiles.length() == 0 && RDR2_Profiles.length() == 1) {
openProfile(RDR2_Profiles.at(0), RagePhoto::PhotoFormat::RDR2);
}
}
void UserInterface::setupProfileUi()
{
qreal screenRatio = AppEnv::screenRatio();
if (GTAV_Profiles.isEmpty()) {
QPushButton *changeDirBtn = new QPushButton(tr("Select &GTA 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()));
}
else for (const QString &GTAV_Profile : GTAV_Profiles) {
QPushButton *profileBtn = new QPushButton(GTAV_Profile, ui->swSelection);
if (!GTAV_Profiles.isEmpty()) {
int row = 1;
for (const QString &GTAV_Profile : GTAV_Profiles) {
QPushButton *profileBtn = new QPushButton(tr("Profile: %1").arg(GTAV_Profile), ui->swSelection);
profileBtn->setObjectName(GTAV_Profile);
profileBtn->setMinimumSize(0, 40 * screenRatio);
profileBtn->setAutoDefault(true);
ui->vlButtons->addWidget(profileBtn);
ui->glProfiles->addWidget(profileBtn, row++, 0);
profileBtns += profileBtn;
QObject::connect(profileBtn, SIGNAL(clicked(bool)), this, SLOT(profileButton_clicked()));
QObject::connect(profileBtn, &QPushButton::clicked, this, [=](){
openProfile(profileBtn->objectName(), RagePhoto::PhotoFormat::GTA5);
});
}
ui->labGTAV->setVisible(true);
}
else {
ui->labGTAV->setVisible(false);
}
if (!RDR2_Profiles.isEmpty()) {
int row = 1;
for (const QString &RDR2_Profile : RDR2_Profiles) {
QPushButton *profileBtn = new QPushButton(tr("Profile: %1").arg(RDR2_Profile), ui->swSelection);
profileBtn->setObjectName(RDR2_Profile);
profileBtn->setMinimumSize(0, 40 * screenRatio);
profileBtn->setAutoDefault(true);
ui->glProfiles->addWidget(profileBtn, row++, 1);
profileBtns += profileBtn;
QObject::connect(profileBtn, &QPushButton::clicked, this, [=](){
openProfile(profileBtn->objectName(), RagePhoto::PhotoFormat::RDR2);
});
}
ui->labRDR2->setVisible(true);
}
else {
ui->labRDR2->setVisible(false);
}
profileBtns.at(0)->setFocus();
}
void UserInterface::changeFolder_clicked()
@ -399,19 +413,13 @@ void UserInterface::changeFolder_clicked()
void UserInterface::on_cmdReload_clicked()
{
for (QPushButton *profileBtn : profileBtns) {
ui->vlButtons->removeWidget(profileBtn);
ui->glProfiles->removeWidget(profileBtn);
delete profileBtn;
}
profileBtns.clear();
setupDirEnv();
}
void UserInterface::profileButton_clicked()
{
QPushButton *profileBtn = (QPushButton*)sender();
openProfile(profileBtn->objectName(), RagePhoto::PhotoFormat::GTA5);
}
void UserInterface::openProfile(const QString &profileName_, quint32 gameFormat)
{
profileOpen = true;
@ -529,16 +537,13 @@ void UserInterface::on_actionDelete_selected_triggered()
void UserInterface::on_actionOptions_triggered()
{
OptionsDialog *optionsDialog = new OptionsDialog(profileDB, this);
optionsDialog->setWindowIcon(windowIcon());
optionsDialog->commitProfiles(GTAV_Profiles);
QObject::connect(optionsDialog, SIGNAL(settingsApplied(int, bool)), this, SLOT(settingsApplied(int, bool)));
optionsDialog->setModal(true);
optionsDialog->show();
optionsDialog->exec();
delete optionsDialog;
OptionsDialog optionsDialog(profileDB, this);
optionsDialog.setWindowIcon(windowIcon());
optionsDialog.commitProfiles(GTAV_Profiles); // TODO: Diff. GTA V and RDR 2 profiles
QObject::connect(&optionsDialog, &OptionsDialog::settingsApplied, this, &UserInterface::settingsApplied);
optionsDialog.setModal(true);
optionsDialog.show();
optionsDialog.exec();
}
void UserInterface::on_action_Import_triggered()
@ -810,7 +815,6 @@ void UserInterface::on_actionSelect_GTA_Folder_triggered()
closeProfile_p();
}
GTAV_Folder = GTAV_Folder_Temp;
AppEnv::setGTAVFolder(GTAV_Folder);
on_cmdReload_clicked();
}
}

View file

@ -48,14 +48,13 @@ public:
#else
explicit UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
#endif
void setupDirEnv(bool showFolderDialog = true);
void setupDirEnv(bool showFolderWindow = true);
~UserInterface();
private slots:
void closeProfile();
void profileLoaded();
void changeFolder_clicked();
void profileButton_clicked();
void on_cmdReload_clicked();
void on_actionExit_triggered();
void on_actionSelect_profile_triggered();

View file

@ -69,20 +69,28 @@
</spacer>
</item>
<item>
<widget class="QLabel" name="labSelectProfile">
<layout class="QGridLayout" name="glProfiles">
<item row="0" column="1">
<widget class="QLabel" name="labRDR2">
<property name="text">
<string>Select profile</string>
<string>RDR 2</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labGTAV">
<property name="text">
<string>GTA V</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="vlButtons"/>
</layout>
</item>
<item>
<spacer name="vsFooter">
@ -171,7 +179,7 @@
<x>0</x>
<y>0</y>
<width>625</width>
<height>23</height>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">