better RDR 2 support, bug fixes + optimisation, libragephoto upstream

This commit is contained in:
Syping 2023-02-27 14:17:50 +01:00
parent b19152fdae
commit 2d0830254b
10 changed files with 136 additions and 145 deletions

View File

@ -25,6 +25,7 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QMessageBox> #include <QMessageBox>
#include <QFile>
#if QT_VERSION >= 0x050200 #if QT_VERSION >= 0x050200
#include <QFontDatabase> #include <QFontDatabase>
@ -190,7 +191,7 @@ bool JsonEditorDialog::saveJsonContent()
QJsonDocument jsonDocument; QJsonDocument jsonDocument;
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "JSONEdited"; jsonObject["Type"] = "JSONEdited";
jsonObject["EditedSize"] = QString::number(smpic->ragePhoto()->photoSize()); jsonObject["EditedSize"] = QString::number(smpic->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else

View File

@ -183,12 +183,10 @@ void PictureDialog::setupPictureDialog()
globalMap = GlobalString::getGlobalMap(); globalMap = GlobalString::getGlobalMap();
// Set Icon for Close Button // Set Icon for Close Button
if (QIcon::hasThemeIcon("dialog-close")) { if (QIcon::hasThemeIcon("dialog-close"))
ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
} else if (QIcon::hasThemeIcon("gtk-close"))
else if (QIcon::hasThemeIcon("gtk-close")) {
ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close")); ui->cmdClose->setIcon(QIcon::fromTheme("gtk-close"));
}
installEventFilter(this); installEventFilter(this);
@ -251,9 +249,8 @@ void PictureDialog::styliseDialog()
MARGINS margins = {0, 0, qRound(layout()->menuBar()->height() * AppEnv::screenRatioPR()), 0}; MARGINS margins = {0, 0, qRound(layout()->menuBar()->height() * AppEnv::screenRatioPR()), 0};
HRESULT hr = S_OK; HRESULT hr = S_OK;
hr = DwmExtendFrameIntoClientArea(reinterpret_cast<HWND>(winId()), &margins); hr = DwmExtendFrameIntoClientArea(reinterpret_cast<HWND>(winId()), &margins);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr))
setStyleSheet("PictureDialog{background:transparent}"); setStyleSheet("PictureDialog{background:transparent}");
}
} }
else { else {
MARGINS margins = {0, 0, 0, 0}; MARGINS margins = {0, 0, 0, 0};
@ -261,9 +258,8 @@ void PictureDialog::styliseDialog()
bool colorOk = false; bool colorOk = false;
QSettings dwmRegistry("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\DWM", QSettings::NativeFormat); QSettings dwmRegistry("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\DWM", QSettings::NativeFormat);
QRgb color = dwmRegistry.value("ColorizationColor").toUInt(&colorOk); QRgb color = dwmRegistry.value("ColorizationColor").toUInt(&colorOk);
if (colorOk) { if (colorOk)
setStyleSheet(QString("PictureDialog{background:%1}").arg(QColor::fromRgba(color).name())); setStyleSheet(QString("PictureDialog{background:%1}").arg(QColor::fromRgba(color).name()));
}
else { else {
HRESULT hr = S_OK; HRESULT hr = S_OK;
BOOL isOpaqueBlend; BOOL isOpaqueBlend;
@ -291,9 +287,8 @@ bool PictureDialog::nativeEvent(const QByteArray &eventType, void *message, long
#endif #endif
{ {
MSG *msg = reinterpret_cast<MSG*>(message); MSG *msg = reinterpret_cast<MSG*>(message);
if (msg->message == 0x031e || msg->message == 0x0320) { if (msg->message == 0x031e || msg->message == 0x0320)
styliseDialog(); styliseDialog();
}
return QWidget::nativeEvent(eventType, message, result); return QWidget::nativeEvent(eventType, message, result);
} }
#endif #endif
@ -337,11 +332,13 @@ bool PictureDialog::eventFilter(QObject *obj, QEvent *ev)
case Qt::Key_2: case Qt::Key_2:
if (overlayEnabled) { if (overlayEnabled) {
overlayEnabled = false; overlayEnabled = false;
if (!previewMode) renderPicture(); if (!previewMode)
renderPicture();
} }
else { else {
overlayEnabled = true; overlayEnabled = true;
if (!previewMode) renderPicture(); if (!previewMode)
renderPicture();
} }
break; break;
case Qt::Key_M: case Qt::Key_M:
@ -376,9 +373,8 @@ bool PictureDialog::eventFilter(QObject *obj, QEvent *ev)
if (ev->type() == QEvent::MouseButtonRelease) { if (ev->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(ev); QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(ev);
if (mouseEvent->pos().y() <= layout()->menuBar()->height()) { if (mouseEvent->pos().y() <= layout()->menuBar()->height()) {
if (mouseEvent->button() == Qt::LeftButton) { if (mouseEvent->button() == Qt::LeftButton)
dragStart = false; dragStart = false;
}
} }
} }
if (dragStart && ev->type() == QEvent::MouseMove) { if (dragStart && ev->type() == QEvent::MouseMove) {
@ -447,9 +443,8 @@ void PictureDialog::renderOverlayPicture()
preferedRect.setHeight(71 * screenRatio * screenRatioPR); preferedRect.setHeight(71 * screenRatio * screenRatioPR);
overlaySpace.setHeight(80 * screenRatio * screenRatioPR); overlaySpace.setHeight(80 * screenRatio * screenRatioPR);
} }
else { else
overlaySpace.setHeight(overlaySpace.height() + 6 * screenRatio * screenRatioPR); overlaySpace.setHeight(overlaySpace.height() + 6 * screenRatio * screenRatioPR);
}
QImage overlayImage(overlaySpace.size(), QImage::Format_ARGB32_Premultiplied); QImage overlayImage(overlaySpace.size(), QImage::Format_ARGB32_Premultiplied);
overlayImage.fill(Qt::transparent); overlayImage.fill(Qt::transparent);
@ -460,12 +455,10 @@ void PictureDialog::renderOverlayPicture()
overlayPainter.drawText(preferedRect, Qt::AlignLeft | hOverlay | Qt::TextDontClip | Qt::TextWordWrap, overlayText); overlayPainter.drawText(preferedRect, Qt::AlignLeft | hOverlay | Qt::TextDontClip | Qt::TextWordWrap, overlayText);
overlayPainter.end(); overlayPainter.end();
if (overlaySpace.width() < 194 * screenRatio * screenRatioPR) { if (overlaySpace.width() < 194 * screenRatio * screenRatioPR)
overlaySpace.setWidth(200 * screenRatio * screenRatioPR); overlaySpace.setWidth(200 * screenRatio * screenRatioPR);
} else
else {
overlaySpace.setWidth(overlaySpace.width() + 6 * screenRatio * screenRatioPR); overlaySpace.setWidth(overlaySpace.width() + 6 * screenRatio * screenRatioPR);
}
QImage overlayBorderImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied); QImage overlayBorderImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied);
overlayBorderImage.fill(QColor(15, 15, 15, 162)); overlayBorderImage.fill(QColor(15, 15, 15, 162));
@ -492,6 +485,7 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk,
QMessageBox::warning(this, tr("Snapmatic Picture Viewer"), tr("Failed at %1").arg(picture->getLastStep())); QMessageBox::warning(this, tr("Snapmatic Picture Viewer"), tr("Failed at %1").arg(picture->getLastStep()));
return; return;
} }
setWindowTitle(windowTitleStr.arg(picture->getPictureTitle()));
if (picture->isPicOk()) { if (picture->isPicOk()) {
snapmaticPicture = picture->getImage(); snapmaticPicture = picture->getImage();
renderPicture(); renderPicture();
@ -499,13 +493,10 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk,
} }
if (picture->isJsonOk()) { if (picture->isJsonOk()) {
crewStr = crewDB->getCrewName(crewID); crewStr = crewDB->getCrewName(crewID);
if (globalMap.contains(picArea)) { if (globalMap.contains(picArea))
picAreaStr = globalMap.value(picArea); picAreaStr = globalMap.value(picArea);
} else
else {
picAreaStr = picArea; picAreaStr = picArea;
}
setWindowTitle(windowTitleStr.arg(picTitl));
ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created)); ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created));
QTimer::singleShot(0, this, &PictureDialog::adaptDialogSize); QTimer::singleShot(0, this, &PictureDialog::adaptDialogSize);
} }
@ -548,15 +539,12 @@ void PictureDialog::renderPicture()
shownImagePixmap.fill(Qt::black); shownImagePixmap.fill(Qt::black);
QPainter shownImagePainter(&shownImagePixmap); QPainter shownImagePainter(&shownImagePixmap);
const QImage renderImage = snapmaticPicture.scaled(renderResolution, Qt::KeepAspectRatio, Qt::SmoothTransformation); const QImage renderImage = snapmaticPicture.scaled(renderResolution, Qt::KeepAspectRatio, Qt::SmoothTransformation);
if (renderImage.width() < renderResolution.width()) { if (renderImage.width() < renderResolution.width())
shownImagePainter.drawImage((renderResolution.width() - renderImage.width()) / 2, 0, renderImage, Qt::AutoColor); shownImagePainter.drawImage((renderResolution.width() - renderImage.width()) / 2, 0, renderImage, Qt::AutoColor);
} else if (renderImage.height() < renderResolution.height())
else if (renderImage.height() < renderResolution.height()) {
shownImagePainter.drawImage(0, (renderResolution.height() - renderImage.height()) / 2, renderImage, Qt::AutoColor); shownImagePainter.drawImage(0, (renderResolution.height() - renderImage.height()) / 2, renderImage, Qt::AutoColor);
} else
else {
shownImagePainter.drawImage(0, 0, renderImage, Qt::AutoColor); shownImagePainter.drawImage(0, 0, renderImage, Qt::AutoColor);
}
if (previewMode) { if (previewMode) {
QFont shownImagePainterFont; QFont shownImagePainterFont;
shownImagePainterFont.setPixelSize(12 * screenRatio * screenRatioPR); shownImagePainterFont.setPixelSize(12 * screenRatio * screenRatioPR);
@ -565,9 +553,8 @@ void PictureDialog::renderPicture()
shownImagePainter.setFont(shownImagePainterFont); shownImagePainter.setFont(shownImagePainterFont);
shownImagePainter.drawText(QRect(3 * screenRatio * screenRatioPR, 3 * screenRatio * screenRatioPR, 140 * screenRatio * screenRatioPR, snapmaticResolution.height() * screenRatio * screenRatioPR), Qt::AlignLeft | Qt::TextWordWrap, tr("Avatar Preview Mode\nPress 1 for Default View")); shownImagePainter.drawText(QRect(3 * screenRatio * screenRatioPR, 3 * screenRatio * screenRatioPR, 140 * screenRatio * screenRatioPR, snapmaticResolution.height() * screenRatio * screenRatioPR), Qt::AlignLeft | Qt::TextWordWrap, tr("Avatar Preview Mode\nPress 1 for Default View"));
} }
else if (overlayEnabled) { else if (overlayEnabled)
shownImagePainter.drawImage(3 * screenRatio * screenRatioPR, 3 * screenRatio * screenRatioPR, overlayTempImage, Qt::AutoColor); shownImagePainter.drawImage(3 * screenRatio * screenRatioPR, 3 * screenRatio * screenRatioPR, overlayTempImage, Qt::AutoColor);
}
shownImagePainter.end(); shownImagePainter.end();
shownImagePixmap.setDevicePixelRatio(screenRatioPR); shownImagePixmap.setDevicePixelRatio(screenRatioPR);
ui->labPicture->setPixmap(shownImagePixmap); ui->labPicture->setPixmap(shownImagePixmap);
@ -598,12 +585,10 @@ QString PictureDialog::generateCrewString()
SnapmaticPicture *picture = smpic; // used by macro SnapmaticPicture *picture = smpic; // used by macro
const QString crewIDStr = crewID; // save operation time const QString crewIDStr = crewID; // save operation time
if (crewIDStr != "0" && !crewIDStr.isEmpty()) { if (crewIDStr != "0" && !crewIDStr.isEmpty()) {
if (crewIDStr != crewStr) { if (crewIDStr != crewStr)
return QString("<a href=\"https://socialclub.rockstargames.com/crew/" % QString(crewStr).replace(" ", "_") % "/" % crewIDStr % "\">" % crewStr % "</a>"); return QString("<a href=\"https://socialclub.rockstargames.com/crew/" % QString(crewStr).replace(" ", "_") % "/" % crewIDStr % "\">" % crewStr % "</a>");
} else
else {
return QString(crewIDStr); return QString(crewIDStr);
}
} }
return tr("No Crew"); return tr("No Crew");
} }
@ -633,12 +618,10 @@ QString PictureDialog::generatePlayersString()
void PictureDialog::exportSnapmaticPicture() void PictureDialog::exportSnapmaticPicture()
{ {
if (rqFullscreen && fullscreenWidget != nullptr) { if (rqFullscreen && fullscreenWidget != nullptr)
PictureExport::exportAsPicture(fullscreenWidget, smpic); PictureExport::exportAsPicture(fullscreenWidget, smpic);
} else
else {
PictureExport::exportAsPicture(this, smpic); PictureExport::exportAsPicture(this, smpic);
}
} }
void PictureDialog::copySnapmaticPicture() void PictureDialog::copySnapmaticPicture()
@ -751,7 +734,7 @@ void PictureDialog::openPreviewMap()
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "LocationEdited"; jsonObject["Type"] = "LocationEdited";
jsonObject["ExtraFlags"] = "Viewer"; jsonObject["ExtraFlags"] = "Viewer";
jsonObject["EditedSize"] = QString::number(picture->ragePhoto()->photoSize()); jsonObject["EditedSize"] = QString::number(picture->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -779,11 +762,7 @@ void PictureDialog::editSnapmaticProperties()
snapmaticEditor->setWindowIcon(windowIcon()); snapmaticEditor->setWindowIcon(windowIcon());
snapmaticEditor->setSnapmaticPicture(picture); snapmaticEditor->setSnapmaticPicture(picture);
snapmaticEditor->setModal(true); snapmaticEditor->setModal(true);
#ifndef Q_OS_ANDROID
snapmaticEditor->show(); snapmaticEditor->show();
#else
snapmaticEditor->showMaximized();
#endif
snapmaticEditor->exec(); snapmaticEditor->exec();
delete snapmaticEditor; delete snapmaticEditor;
} }
@ -829,7 +808,7 @@ void PictureDialog::editSnapmaticImage()
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "ImageEdited"; jsonObject["Type"] = "ImageEdited";
jsonObject["ExtraFlags"] = "Viewer"; jsonObject["ExtraFlags"] = "Viewer";
jsonObject["EditedSize"] = QString::number(smpic->ragePhoto()->photoSize()); jsonObject["EditedSize"] = QString::number(smpic->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -869,12 +848,10 @@ void PictureDialog::updated()
{ {
SnapmaticPicture *picture = smpic; // used by macro SnapmaticPicture *picture = smpic; // used by macro
crewStr = crewDB->getCrewName(crewID); crewStr = crewDB->getCrewName(crewID);
if (globalMap.contains(picArea)) { if (globalMap.contains(picArea))
picAreaStr = globalMap[picArea]; picAreaStr = globalMap[picArea];
} else
else {
picAreaStr = picArea; picAreaStr = picArea;
}
setWindowTitle(windowTitleStr.arg(picTitl)); setWindowTitle(windowTitleStr.arg(picTitl));
ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created)); ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created));
QTimer::singleShot(0, this, &PictureDialog::adaptDialogSize); QTimer::singleShot(0, this, &PictureDialog::adaptDialogSize);

View File

@ -281,7 +281,7 @@ fileDialogPreSave: //Work?
} }
} }
else { else {
bool isCopied = picture->exportPicture(selectedFile, SnapmaticFormat::PGTA_Format); bool isCopied = picture->exportPicture(selectedFile, SnapmaticFormat::PGTA5_Format);
if (!isCopied) { if (!isCopied) {
QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture")); QMessageBox::warning(parent, PictureDialog::tr("Export as Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
goto fileDialogPreSave; //Work? goto fileDialogPreSave; //Work?

View File

@ -660,7 +660,7 @@ bool ProfileInterface::importFile(QString selectedFile, QDateTime importDateTime
QJsonDocument jsonDocument; QJsonDocument jsonDocument;
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "ImportSuccess"; jsonObject["Type"] = "ImportSuccess";
jsonObject["ImportSize"] = QString::number(picture->ragePhoto()->photoSize()); jsonObject["ImportSize"] = QString::number(picture->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["ImportTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["ImportTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -872,7 +872,7 @@ bool ProfileInterface::importFile(QString selectedFile, QDateTime importDateTime
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "ImportSuccess"; jsonObject["Type"] = "ImportSuccess";
jsonObject["ExtraFlag"] = "Dialog"; jsonObject["ExtraFlag"] = "Dialog";
jsonObject["ImportSize"] = QString::number(picture->ragePhoto()->photoSize()); jsonObject["ImportSize"] = QString::number(picture->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["ImportTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["ImportTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -919,7 +919,7 @@ bool ProfileInterface::importFile(QString selectedFile, QDateTime importDateTime
QJsonDocument jsonDocument; QJsonDocument jsonDocument;
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "ImportSuccess"; jsonObject["Type"] = "ImportSuccess";
jsonObject["ImportSize"] = QString::number(picture->ragePhoto()->photoSize()); jsonObject["ImportSize"] = QString::number(picture->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["ImportTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["ImportTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -1202,12 +1202,10 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool wa
adjustedFileName = picture->getOriginalPictureFileName(); adjustedFileName = picture->getOriginalPictureFileName();
} }
} }
if (picture->exportPicture(profileFolder % "/" % adjustedFileName, SnapmaticFormat::PGTA_Format)) { if (picture->exportPicture(profileFolder % "/" % adjustedFileName, SnapmaticFormat::PGTA5_Format)) {
picture->setSnapmaticFormat(SnapmaticFormat::PGTA_Format); picture->setSnapmaticFormat(SnapmaticFormat::PGTA5_Format);
picture->setPicFilePath(profileFolder % "/" % adjustedFileName); picture->setPicFilePath(profileFolder % "/" % adjustedFileName);
#if QT_VERSION >= 0x050000
snapmaticPics << picture->getPictureFileName(); snapmaticPics << picture->getPictureFileName();
#endif
pictureLoaded(picture, true); pictureLoaded(picture, true);
return true; return true;
} }
@ -1278,9 +1276,8 @@ void ProfileInterface::profileWidgetDeselected()
int scrollBarValue = ui->saProfile->verticalScrollBar()->value(); int scrollBarValue = ui->saProfile->verticalScrollBar()->value();
for (const QString &widgetStr : qAsConst(widgets)) { for (const QString &widgetStr : qAsConst(widgets)) {
ProfileWidget *widget = widgets.key(widgetStr, nullptr); ProfileWidget *widget = widgets.key(widgetStr, nullptr);
if (widget != nullptr && contentMode != 2) { if (widget != nullptr && contentMode != 2)
widget->setSelectionMode(false); widget->setSelectionMode(false);
}
} }
ui->saProfile->verticalScrollBar()->setValue(scrollBarValue); ui->saProfile->verticalScrollBar()->setValue(scrollBarValue);
} }

View File

@ -100,8 +100,8 @@ void ProfileLoader::run()
SnapmaticPicture *picture = new SnapmaticPicture(picturePath); SnapmaticPicture *picture = new SnapmaticPicture(picturePath);
if (picture->readingPicture(true)) { if (picture->readingPicture(true)) {
if (picture->isFormatSwitched()) { if (picture->isFormatSwitched()) {
picture->setSnapmaticFormat(SnapmaticFormat::PGTA_Format); picture->setSnapmaticFormat(SnapmaticFormat::PGTA5_Format);
if (picture->exportPicture(picturePath, SnapmaticFormat::PGTA_Format)) { if (picture->exportPicture(picturePath, SnapmaticFormat::PGTA5_Format)) {
emit pictureFixed(picture); emit pictureFixed(picture);
} }
} }

View File

@ -306,7 +306,7 @@ void SnapmaticEditor::on_cmdApply_clicked()
QJsonDocument jsonDocument; QJsonDocument jsonDocument;
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "PropertyEdited"; jsonObject["Type"] = "PropertyEdited";
jsonObject["EditedSize"] = QString::number(smpic->ragePhoto()->photoSize()); jsonObject["EditedSize"] = QString::number(smpic->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else

View File

@ -22,10 +22,9 @@
#include <QJsonObject> #include <QJsonObject>
#include <QStringList> #include <QStringList>
#include <QVariantMap> #include <QVariantMap>
#include <QJsonArray>
#include <QFileInfo> #include <QFileInfo>
#include <QPainter>
#include <QString> #include <QString>
#include <cstring>
#include <QBuffer> #include <QBuffer>
#include <QDebug> #include <QDebug>
#include <QImage> #include <QImage>
@ -409,6 +408,11 @@ inline void gta5view_export_save(QIODevice *ioDevice, RagePhotoData *data)
ioDevice->write(uInt32Buffer, 4); ioDevice->write(uInt32Buffer, 4);
} }
inline bool gta5view_isGTAVFormat(uint32_t photoFormat)
{
return (photoFormat == G5EPhotoFormat::G5EX || photoFormat == RagePhoto::PhotoFormat::GTA5);
}
// SNAPMATIC PICTURE CLASS // SNAPMATIC PICTURE CLASS
SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : QObject(parent), picFilePath(fileName) SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : QObject(parent), picFilePath(fileName)
{ {
@ -704,62 +708,62 @@ bool SnapmaticPicture::setPictureTitl(const QString &newTitle_)
{ {
QString newTitle = newTitle_; QString newTitle = newTitle_;
if (newTitle.length() > 39) if (newTitle.length() > 39)
newTitle = newTitle.left(39); newTitle.resize(39);
p_ragePhoto.setTitle(newTitle.toStdString().c_str()); p_ragePhoto.setTitle(newTitle.toStdString().c_str());
return true; return true;
} }
QString SnapmaticPicture::getExportPictureFileName() const QString SnapmaticPicture::getExportPictureFileName()
{ {
return picExportFileName; return picExportFileName;
} }
QString SnapmaticPicture::getOriginalPictureFileName() const QString SnapmaticPicture::getOriginalPictureFileName()
{ {
QString newPicFileName = picFileName; QString newPicFileName = picFileName;
if (picFileName.right(4) == ".bak") if (picFileName.endsWith(".bak", Qt::CaseInsensitive))
newPicFileName = QString(picFileName).remove(picFileName.length() - 4, 4); newPicFileName.resize(newPicFileName.length() - 4);
if (picFileName.right(7) == ".hidden") if (picFileName.endsWith(".hidden", Qt::CaseInsensitive))
newPicFileName = QString(picFileName).remove(picFileName.length() - 7, 7); newPicFileName.resize(newPicFileName.length() - 7);
return newPicFileName; return newPicFileName;
} }
QString SnapmaticPicture::getOriginalPictureFilePath() const QString SnapmaticPicture::getOriginalPictureFilePath()
{ {
QString newPicFilePath = picFilePath; QString newPicFilePath = picFilePath;
if (picFilePath.right(4) == ".bak") if (picFileName.endsWith(".bak", Qt::CaseInsensitive))
newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 4, 4); newPicFilePath.resize(newPicFilePath.length() - 4);
if (picFilePath.right(7) == ".hidden") if (picFileName.endsWith(".hidden", Qt::CaseInsensitive))
newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 7, 7); newPicFilePath.resize(newPicFilePath.length() - 7);
return newPicFilePath; return newPicFilePath;
} }
QString SnapmaticPicture::getPictureFileName() const QString SnapmaticPicture::getPictureFileName()
{ {
return picFileName; return picFileName;
} }
QString SnapmaticPicture::getPictureFilePath() const QString SnapmaticPicture::getPictureFilePath()
{ {
return picFilePath; return picFilePath;
} }
QString SnapmaticPicture::getPictureSortStr() const QString SnapmaticPicture::getPictureSortStr()
{ {
return sortStr; return sortStr;
} }
QString SnapmaticPicture::getPictureTitl() const QString SnapmaticPicture::getPictureTitl()
{ {
return p_ragePhoto.title(); return QString::fromUtf8(p_ragePhoto.title());
} }
QString SnapmaticPicture::getPictureStr() const QString SnapmaticPicture::getPictureStr()
{ {
return pictureStr; return pictureStr;
} }
QString SnapmaticPicture::getLastStep(bool readable) const QString SnapmaticPicture::getLastStep(bool readable)
{ {
if (readable) { if (readable) {
QStringList lastStepList = lastStep.split(";/"); QStringList lastStepList = lastStep.split(";/");
@ -816,7 +820,7 @@ QString SnapmaticPicture::getLastStep(bool readable)
} }
QImage SnapmaticPicture::getImage() const QImage SnapmaticPicture::getImage()
{ {
if (cacheEnabled) if (cacheEnabled)
return cachePicture; return cachePicture;
@ -825,7 +829,7 @@ QImage SnapmaticPicture::getImage()
return QImage(); return QImage();
} }
QByteArray SnapmaticPicture::getPictureStream() const QByteArray SnapmaticPicture::getPictureStream()
{ {
return QByteArray::fromRawData(p_ragePhoto.jpegData(), p_ragePhoto.jpegSize()); return QByteArray::fromRawData(p_ragePhoto.jpegData(), p_ragePhoto.jpegSize());
} }
@ -858,7 +862,7 @@ bool SnapmaticPicture::isJsonOk()
return jsonOk; return jsonOk;
} }
QString SnapmaticPicture::getJsonStr() const QString SnapmaticPicture::getJsonStr()
{ {
return QString::fromUtf8(p_ragePhoto.json()); return QString::fromUtf8(p_ragePhoto.json());
} }
@ -870,6 +874,7 @@ SnapmaticProperties SnapmaticPicture::getSnapmaticProperties()
void SnapmaticPicture::parseJsonContent() void SnapmaticPicture::parseJsonContent()
{ {
const uint32_t format = p_ragePhoto.format();
QVariantMap jsonMap = jsonObject.toVariantMap(); QVariantMap jsonMap = jsonObject.toVariantMap();
bool jsonIncomplete = false; bool jsonIncomplete = false;
@ -906,7 +911,7 @@ void SnapmaticPicture::parseJsonContent()
if (jsonObject["area"].isString()) { localProperties.location.area = jsonObject["area"].toString(); } if (jsonObject["area"].isString()) { localProperties.location.area = jsonObject["area"].toString(); }
else { jsonError = true; } else { jsonError = true; }
} }
else { jsonIncomplete = true; } else if (gta5view_isGTAVFormat(format)) { jsonIncomplete = true; }
if (jsonObject.contains("crewid")) { if (jsonObject.contains("crewid")) {
bool crewIDOk; bool crewIDOk;
localProperties.crewID = jsonMap["crewid"].toInt(&crewIDOk); localProperties.crewID = jsonMap["crewid"].toInt(&crewIDOk);
@ -918,7 +923,7 @@ void SnapmaticPicture::parseJsonContent()
localProperties.streetID = jsonMap["street"].toInt(&streetIDOk); localProperties.streetID = jsonMap["street"].toInt(&streetIDOk);
if (!streetIDOk) { jsonError = true; } if (!streetIDOk) { jsonError = true; }
} }
else { jsonIncomplete = true; } else if (gta5view_isGTAVFormat(format)) { jsonIncomplete = true; }
if (jsonObject.contains("creat")) { if (jsonObject.contains("creat")) {
bool timestampOk; bool timestampOk;
QDateTime createdTimestamp; QDateTime createdTimestamp;
@ -996,9 +1001,7 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties properties)
t_jsonObject["loc"] = locObject; t_jsonObject["loc"] = locObject;
t_jsonObject["uid"] = properties.uid; t_jsonObject["uid"] = properties.uid;
t_jsonObject["area"] = properties.location.area;
t_jsonObject["crewid"] = properties.crewID; t_jsonObject["crewid"] = properties.crewID;
t_jsonObject["street"] = properties.streetID;
t_jsonObject["creat"] = QJsonValue::fromVariant(properties.createdTimestamp); t_jsonObject["creat"] = QJsonValue::fromVariant(properties.createdTimestamp);
t_jsonObject["plyrs"] = QJsonValue::fromVariant(properties.playersList); t_jsonObject["plyrs"] = QJsonValue::fromVariant(properties.playersList);
t_jsonObject["meme"] = properties.isMeme; t_jsonObject["meme"] = properties.isMeme;
@ -1006,7 +1009,11 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties properties)
t_jsonObject["slf"] = properties.isSelfie; t_jsonObject["slf"] = properties.isSelfie;
t_jsonObject["drctr"] = properties.isFromDirector; t_jsonObject["drctr"] = properties.isFromDirector;
t_jsonObject["rsedtr"] = properties.isFromRSEditor; t_jsonObject["rsedtr"] = properties.isFromRSEditor;
t_jsonObject["onislandx"] = properties.location.isCayoPerico; if (gta5view_isGTAVFormat(p_ragePhoto.format())) {
t_jsonObject["area"] = properties.location.area;
t_jsonObject["street"] = properties.streetID;
t_jsonObject["onislandx"] = properties.location.isCayoPerico;
}
const QJsonDocument jsonDocument(t_jsonObject); const QJsonDocument jsonDocument(t_jsonObject);
if (setJsonStr(QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Compact)))) { if (setJsonStr(QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Compact)))) {
@ -1032,17 +1039,17 @@ bool SnapmaticPicture::setJsonStr(const QString &newJsonStr, bool updateProperti
// FILE MANAGEMENT // FILE MANAGEMENT
bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat format_) bool SnapmaticPicture::exportPicture(const QString &fileName, SnapmaticFormat format)
{ {
// Keep current format when Auto_Format is used if (format == SnapmaticFormat::Auto_Format) {
SnapmaticFormat format = format_; if (p_ragePhoto.format() == G5EPhotoFormat::G5EX)
if (format_ == SnapmaticFormat::Auto_Format) {
if (p_ragePhoto.format() == G5EPhotoFormat::G5EX) {
format = SnapmaticFormat::G5E_Format; format = SnapmaticFormat::G5E_Format;
} else if (p_ragePhoto.format() == RagePhoto::PhotoFormat::GTA5)
else { format = SnapmaticFormat::PGTA5_Format;
format = SnapmaticFormat::PGTA_Format; else if (p_ragePhoto.format() == RagePhoto::PhotoFormat::RDR2)
} format = SnapmaticFormat::PRDR3_Format;
else
format = SnapmaticFormat::Unknown_Format;
} }
bool saveSuccess = false; bool saveSuccess = false;
@ -1159,7 +1166,12 @@ SnapmaticFormat SnapmaticPicture::getSnapmaticFormat()
{ {
if (p_ragePhoto.format() == G5EPhotoFormat::G5EX) if (p_ragePhoto.format() == G5EPhotoFormat::G5EX)
return SnapmaticFormat::G5E_Format; return SnapmaticFormat::G5E_Format;
return SnapmaticFormat::PGTA_Format; else if (p_ragePhoto.format() == RagePhoto::PhotoFormat::GTA5)
return SnapmaticFormat::PGTA5_Format;
else if (p_ragePhoto.format() == RagePhoto::PhotoFormat::RDR2)
return SnapmaticFormat::PRDR3_Format;
else
return SnapmaticFormat::Unknown_Format;
} }
void SnapmaticPicture::setSnapmaticFormat(SnapmaticFormat format) void SnapmaticPicture::setSnapmaticFormat(SnapmaticFormat format)
@ -1168,11 +1180,15 @@ void SnapmaticPicture::setSnapmaticFormat(SnapmaticFormat format)
p_ragePhoto.setFormat(G5EPhotoFormat::G5EX); p_ragePhoto.setFormat(G5EPhotoFormat::G5EX);
return; return;
} }
else if (format == SnapmaticFormat::PGTA_Format) { else if (format == SnapmaticFormat::PGTA5_Format) {
p_ragePhoto.setFormat(RagePhoto::PhotoFormat::GTA5); p_ragePhoto.setFormat(RagePhoto::PhotoFormat::GTA5);
return; return;
} }
qDebug() << "setSnapmaticFormat: Invalid SnapmaticFormat defined, valid SnapmaticFormats are G5E_Format and PGTA_Format"; else if (format == SnapmaticFormat::PRDR3_Format) {
p_ragePhoto.setFormat(RagePhoto::PhotoFormat::RDR2);
return;
}
qDebug() << "setSnapmaticFormat: Invalid SnapmaticFormat defined, valid SnapmaticFormats are G5E_Format, PGTA5_Format and PRDR3_Format";
} }
bool SnapmaticPicture::isFormatSwitched() bool SnapmaticPicture::isFormatSwitched()

View File

@ -31,9 +31,8 @@ typedef RagePhotoA RagePhoto;
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QImage> #include <QImage>
#include <QFile>
enum class SnapmaticFormat : int { Auto_Format = 0, PGTA_Format = 1, JPEG_Format = 2, G5E_Format = 3 }; enum class SnapmaticFormat : int32_t { Auto_Format = 0, PGTA5_Format = 1, PRDR3_Format = 2, JPEG_Format = 3, G5E_Format = 4, Unknown_Format = -1 };
enum G5EExportFormat : uint32_t { enum G5EExportFormat : uint32_t {
G5E1P = 0x454C0010UL, G5E1P = 0x454C0010UL,
G5E2P = 0x01000032UL, G5E2P = 0x01000032UL,
@ -79,17 +78,17 @@ public:
bool readingPicture(bool cacheEnabled = false); bool readingPicture(bool cacheEnabled = false);
bool isPicOk(); // Please use isPictureOk instead bool isPicOk(); // Please use isPictureOk instead
void clearCache(); void clearCache();
QImage getImage(); const QImage getImage();
QByteArray getPictureStream(); const QByteArray getPictureStream();
QString getLastStep(bool readable = true); const QString getLastStep(bool readable = true);
QString getPictureStr(); const QString getPictureStr();
QString getPictureTitl(); const QString getPictureTitl();
QString getPictureSortStr(); const QString getPictureSortStr();
QString getPictureFileName(); const QString getPictureFileName();
QString getPictureFilePath(); const QString getPictureFilePath();
QString getExportPictureFileName(); const QString getExportPictureFileName();
QString getOriginalPictureFileName(); const QString getOriginalPictureFileName();
QString getOriginalPictureFilePath(); const QString getOriginalPictureFilePath();
bool setImage(const QImage &picture, bool eXtendMode = false); bool setImage(const QImage &picture, bool eXtendMode = false);
bool setPictureTitl(const QString &newTitle); // Please use setPictureTitle instead bool setPictureTitl(const QString &newTitle); // Please use setPictureTitle instead
bool setPictureStream(const QByteArray &streamArray); bool setPictureStream(const QByteArray &streamArray);
@ -99,39 +98,40 @@ public:
// FILE MANAGEMENT // FILE MANAGEMENT
bool exportPicture(const QString &fileName, SnapmaticFormat format = SnapmaticFormat::Auto_Format); bool exportPicture(const QString &fileName, SnapmaticFormat format = SnapmaticFormat::Auto_Format);
void setPicFileName(const QString &picFileName); // Please use setPictureFileName instead void setPicFileName(const QString &picFileName);
void setPicFilePath(const QString &picFilePath); // Please use setPictureFilePath instead void setPicFilePath(const QString &picFilePath);
bool deletePicFile(); // Please use deletePictureFile instead bool deletePicFile();
// JSON // JSON
bool isJsonOk(); bool isJsonOk();
QString getJsonStr(); // Please use getPictureJson instead const QString getJsonStr();
SnapmaticProperties getSnapmaticProperties(); SnapmaticProperties getSnapmaticProperties();
bool setSnapmaticProperties(SnapmaticProperties properties); bool setSnapmaticProperties(SnapmaticProperties properties);
bool setJsonStr(const QString &jsonStr, bool updateProperties = false); // Please use setPictureJson instead bool setJsonStr(const QString &jsonStr, bool updateProperties = false);
// VISIBILITY // VISIBILITY
bool isHidden(); // Please use isPictureHidden instead bool isHidden();
bool isVisible(); // Please use isPictureVisible instead bool isVisible();
bool setPictureHidden(); bool setPictureHidden();
bool setPictureVisible(); bool setPictureVisible();
// ALTERNATIVES (MORE DEVELOPER FRIENDLY FUNCTION CALLS) // ALTERNATIVES (MORE DEVELOPER FRIENDLY FUNCTION CALLS)
QString getJsonString() { return getJsonStr(); } // Please use getPictureJson instead inline QString getJsonString() { return getJsonStr(); }
QString getPictureJson() { return getJsonStr(); } inline QString getPictureJson() { return getJsonStr(); }
QString getPictureTitle() { return getPictureTitl(); } inline QString getPictureTitle() { return getPictureTitl(); }
QString getPictureString() { return getPictureStr(); } inline uint32_t getPictureSize() { return ragePhoto()->jpegSize(); }
bool setJsonString(const QString &jsonString, bool updateProperties = false) { return setJsonStr(jsonString, updateProperties); } // Please use setPictureJson instead inline QString getPictureString() { return getPictureStr(); }
bool setPictureJson(const QString &json, bool updateProperties = false) { return setJsonStr(json, updateProperties); } inline bool setJsonString(const QString &jsonString, bool updateProperties = false) { return setJsonStr(jsonString, updateProperties); } // Please use setPictureJson instead
bool setPictureTitle(const QString &title) { return setPictureTitl(title); } inline bool setPictureJson(const QString &json, bool updateProperties = false) { return setJsonStr(json, updateProperties); }
void setPictureFileName(const QString &fileName) { return setPicFileName(fileName); } inline bool setPictureTitle(const QString &title) { return setPictureTitl(title); }
void setPictureFilePath(const QString &filePath) { return setPicFilePath(filePath); } inline void setPictureFileName(const QString &fileName) { return setPicFileName(fileName); }
bool deletePictureFile() { return deletePicFile(); } inline void setPictureFilePath(const QString &filePath) { return setPicFilePath(filePath); }
bool isPictureOk() { return isPicOk(); } inline bool deletePictureFile() { return deletePicFile(); }
bool isPictureHidden() { return isHidden(); } inline bool isPictureOk() { return isPicOk(); }
bool isPictureVisible() { return isVisible(); } inline bool isPictureHidden() { return isHidden(); }
bool setHidden() { return setPictureHidden(); } // Please use setPictureHidden instead inline bool isPictureVisible() { return isVisible(); }
bool setVisible() { return setPictureVisible(); } // Please use setPictureVisible instead inline bool setHidden() { return setPictureHidden(); }
inline bool setVisible() { return setPictureVisible(); }
// PREDEFINED PROPERTIES // PREDEFINED PROPERTIES
static QSize getSnapmaticResolution(); static QSize getSnapmaticResolution();

View File

@ -195,7 +195,7 @@ bool SnapmaticWidget::deletePicture()
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "DeleteSuccess"; jsonObject["Type"] = "DeleteSuccess";
jsonObject["ExtraFlags"] = "Snapmatic"; jsonObject["ExtraFlags"] = "Snapmatic";
jsonObject["DeletedSize"] = QString::number(smpic->ragePhoto()->photoSize()); jsonObject["DeletedSize"] = QString::number(smpic->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["DeletedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["DeletedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -381,7 +381,7 @@ void SnapmaticWidget::editSnapmaticImage()
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "ImageEdited"; jsonObject["Type"] = "ImageEdited";
jsonObject["ExtraFlags"] = "Interface"; jsonObject["ExtraFlags"] = "Interface";
jsonObject["EditedSize"] = QString::number(smpic->ragePhoto()->photoSize()); jsonObject["EditedSize"] = QString::number(smpic->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else
@ -439,7 +439,7 @@ void SnapmaticWidget::openMapViewer()
QJsonObject jsonObject; QJsonObject jsonObject;
jsonObject["Type"] = "LocationEdited"; jsonObject["Type"] = "LocationEdited";
jsonObject["ExtraFlags"] = "Interface"; jsonObject["ExtraFlags"] = "Interface";
jsonObject["EditedSize"] = QString::number(smpic->ragePhoto()->photoSize()); jsonObject["EditedSize"] = QString::number(smpic->getPictureSize());
#if QT_VERSION >= 0x060000 #if QT_VERSION >= 0x060000
jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch()); jsonObject["EditedTime"] = QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
#else #else

@ -1 +1 @@
Subproject commit d75eba2a46ebee7c155502c0080ffb2b7fe32bcd Subproject commit 4ca8ac9297c571087836aab334a55f7414870876