From f9eee757575dd8ce97a0882a5fdaaae923cf61b8 Mon Sep 17 00:00:00 2001 From: Syping Date: Wed, 22 Nov 2017 14:59:40 +0100 Subject: [PATCH] add JSON Editor + Interface improvements --- .travis.yml | 8 +- CrewDatabase.cpp | 11 + CrewDatabase.h | 1 + JsonEditorDialog.cpp | 164 ++++++++++++++ JsonEditorDialog.h | 56 +++++ JsonEditorDialog.ui | 124 +++++++++++ MapLocationDialog.cpp | 1 + MapLocationDialog.h | 2 +- OptionsDialog.cpp | 86 +++++++- OptionsDialog.h | 3 + OptionsDialog.ui | 73 ++++++- PictureDialog.cpp | 117 +++++----- PictureDialog.h | 12 +- ProfileInterface.cpp | 57 +++-- ProfileInterface.h | 3 +- SnapmaticEditor.cpp | 13 +- SnapmaticPicture.cpp | 95 ++++++-- SnapmaticPicture.h | 3 +- SnapmaticWidget.cpp | 48 +++- SnapmaticWidget.h | 2 + anpro/JSHighlighter.cpp | 72 ++++++ anpro/JSHighlighter.h | 56 +++++ config.h | 2 +- gta5view.pro | 7 +- lang/gta5sync_no.ts | 473 ++++++++++++++++++++++++++-------------- main.cpp | 38 +++- res/app.rc | 4 +- res/gta5sync_de.qm | Bin 33883 -> 35652 bytes res/gta5sync_de.ts | 380 ++++++++++++++++++++------------ res/gta5sync_en_US.qm | Bin 18413 -> 18239 bytes res/gta5sync_en_US.ts | 364 +++++++++++++++++++------------ res/gta5sync_fr.qm | Bin 26687 -> 26755 bytes res/gta5sync_fr.ts | 368 +++++++++++++++++++------------ res/gta5sync_ru.qm | Bin 32539 -> 32511 bytes res/gta5sync_ru.ts | 366 +++++++++++++++++++------------ 35 files changed, 2153 insertions(+), 856 deletions(-) create mode 100644 JsonEditorDialog.cpp create mode 100644 JsonEditorDialog.h create mode 100644 JsonEditorDialog.ui create mode 100644 anpro/JSHighlighter.cpp create mode 100644 anpro/JSHighlighter.h diff --git a/.travis.yml b/.travis.yml index c1e15cf..7969f5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,14 +32,14 @@ before_script: script: - cd qt5 - - qmake -qt=5 GTA5SYNC_PREFIX=/usr QMAKE_CXXFLAGS+=-std=c++11 DEFINES+=GTA5SYNC_BUILDTYPE_DEV "DEFINES+=GTA5SYNC_APPVER=\\\\\\\"$PACKAGE_VERSION-dev3\\\\\\\"" DEFINES+=GTA5SYNC_QCONF ../../gta5view.pro + - qmake -qt=5 GTA5SYNC_PREFIX=/usr QMAKE_CXXFLAGS+=-std=c++11 DEFINES+=GTA5SYNC_BUILDTYPE_DEV "DEFINES+=GTA5SYNC_APPVER=\\\\\\\"$PACKAGE_VERSION-dev4\\\\\\\"" DEFINES+=GTA5SYNC_QCONF ../../gta5view.pro - make -j 4 - - sudo checkinstall -D --default --nodoc --install=no --pkgname=gta5view-qt5 --pkgversion=$PACKAGE_VERSION --pkgrelease=dev3 --pkggroup=utility --maintainer="Syping on Travis \" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5,qttranslations5-l10n --conflicts=gta5view,gta5view-qt4 --replaces=gta5view,gta5view-qt4 --pakdir=../../package + - sudo checkinstall -D --default --nodoc --install=no --pkgname=gta5view-qt5 --pkgversion=$PACKAGE_VERSION --pkgrelease=dev4 --pkggroup=utility --maintainer="Syping on Travis \" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5,qttranslations5-l10n --conflicts=gta5view,gta5view-qt4 --replaces=gta5view,gta5view-qt4 --pakdir=../../package - cd .. - cd qt4 - - qmake -qt=4 GTA5SYNC_PREFIX=/usr QMAKE_CXXFLAGS+=-std=c++11 DEFINES+=GTA5SYNC_BUILDTYPE_DEV "DEFINES+=GTA5SYNC_APPVER=\\\\\\\"$PACKAGE_VERSION-dev3\\\\\\\"" DEFINES+=GTA5SYNC_QCONF ../../gta5view.pro + - qmake -qt=4 GTA5SYNC_PREFIX=/usr QMAKE_CXXFLAGS+=-std=c++11 DEFINES+=GTA5SYNC_BUILDTYPE_DEV "DEFINES+=GTA5SYNC_APPVER=\\\\\\\"$PACKAGE_VERSION-dev4\\\\\\\"" DEFINES+=GTA5SYNC_QCONF ../../gta5view.pro - make -j 4 - - sudo checkinstall -D --default --nodoc --install=no --pkgname=gta5view-qt4 --pkgversion=$PACKAGE_VERSION --pkgrelease=dev3 --pkggroup=utility --maintainer="Syping on Travis \" --requires=libqtcore4,libqtgui4,libqt4-network,qtcore4-l10n --conflicts=gta5view,gta5view-qt5 --replaces=gta5view,gta5view-qt5 --pakdir=../../package + - sudo checkinstall -D --default --nodoc --install=no --pkgname=gta5view-qt4 --pkgversion=$PACKAGE_VERSION --pkgrelease=dev4 --pkggroup=utility --maintainer="Syping on Travis \" --requires=libqtcore4,libqtgui4,libqt4-network,qtcore4-l10n --conflicts=gta5view,gta5view-qt5 --replaces=gta5view,gta5view-qt5 --pakdir=../../package - cd .. deploy: diff --git a/CrewDatabase.cpp b/CrewDatabase.cpp index 69e4b06..73d9bed 100755 --- a/CrewDatabase.cpp +++ b/CrewDatabase.cpp @@ -92,6 +92,17 @@ QStringList CrewDatabase::getCompatibleCrews_p() return crewDB->childKeys(); } +QString CrewDatabase::getCrewName(QString crewID) +{ + QMutexLocker locker(&mutex); +#ifdef GTA5SYNC_DEBUG + qDebug() << "getCrewName" << crewID; +#endif + QString crewStr = crewDB->value(crewID, crewID).toString(); + if (crewID == "0") crewStr = tr("No Crew", ""); + return crewStr; +} + QString CrewDatabase::getCrewName(int crewID) { QMutexLocker locker(&mutex); diff --git a/CrewDatabase.h b/CrewDatabase.h index b5c7ee0..0bb9933 100755 --- a/CrewDatabase.h +++ b/CrewDatabase.h @@ -29,6 +29,7 @@ class CrewDatabase : public QObject Q_OBJECT public: explicit CrewDatabase(QObject *parent = 0); + QString getCrewName(QString crewID); QString getCrewName(int crewID); QStringList getCompatibleCrews(); QStringList getCrews(); diff --git a/JsonEditorDialog.cpp b/JsonEditorDialog.cpp new file mode 100644 index 0000000..ddf72bd --- /dev/null +++ b/JsonEditorDialog.cpp @@ -0,0 +1,164 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2017 Syping +* +* 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 . +*****************************************************************************/ + +#include "JsonEditorDialog.h" +#include "ui_JsonEditorDialog.h" +#include "SnapmaticEditor.h" +#include "AppEnv.h" +#include +#include +#include + +#if QT_VERSION >= 0x050200 +#include +#include +#endif + +JsonEditorDialog::JsonEditorDialog(SnapmaticPicture *picture, QWidget *parent) : + QDialog(parent), smpic(picture), + ui(new Ui::JsonEditorDialog) +{ + // Set Window Flags + setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint^Qt::WindowMinMaxButtonsHint); + + ui->setupUi(this); + if (QIcon::hasThemeIcon("dialog-close")) + { + ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); + } + jsonCode = picture->getJsonStr(); + +#if QT_VERSION >= 0x050200 + ui->txtJSON->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); +#endif + QFontMetrics fm(ui->txtJSON->font()); + ui->txtJSON->setTabStopWidth(fm.width(" ")); + + QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonCode.toUtf8()); + ui->txtJSON->setStyleSheet("QPlainTextEdit{background-color: rgb(46, 47, 48); color: rgb(238, 231, 172);}"); + ui->txtJSON->setPlainText(QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Indented)).trimmed()); + jsonHl = new JSHighlighter(ui->txtJSON->document()); + + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + ui->hlButtons->setContentsMargins(9 * screenRatio, 0, 9 * screenRatio, 0); + if (screenRatio > 1) + { + ui->lineJSON->setMinimumHeight(qRound(1 * screenRatio)); + ui->lineJSON->setMaximumHeight(qRound(1 * screenRatio)); + } + resize(450 * screenRatio, 550 * screenRatio); +} + +JsonEditorDialog::~JsonEditorDialog() +{ + delete jsonHl; + delete ui; +} + +void JsonEditorDialog::closeEvent(QCloseEvent *ev) +{ + QString jsonPatched = QString(ui->txtJSON->toPlainText()).replace("\t", " "); + QJsonDocument jsonNew = QJsonDocument::fromJson(jsonPatched.toUtf8()); + QJsonDocument jsonOriginal = QJsonDocument::fromJson(jsonCode.toUtf8()); + QString originalCode = QString::fromUtf8(jsonOriginal.toJson(QJsonDocument::Compact)); + QString newCode = QString::fromUtf8(jsonNew.toJson(QJsonDocument::Compact)); + if (newCode != originalCode) + { + QMessageBox::StandardButton button = QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("

Unsaved changes detected

You want to save the JSON content before you quit?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); + if (button == QMessageBox::Yes) + { + if (saveJsonContent()) + { + ev->accept(); + } + else + { + ev->ignore(); + } + return; + } + else if (button == QMessageBox::No) + { + ev->accept(); + return; + } + else + { + ev->ignore(); + return; + } + } +} + +bool JsonEditorDialog::saveJsonContent() +{ + QString jsonPatched = QString(ui->txtJSON->toPlainText()).replace("\t", " "); + QJsonDocument jsonNew = QJsonDocument::fromJson(jsonPatched.toUtf8()); + if (!jsonNew.isEmpty()) + { + QJsonDocument jsonOriginal = QJsonDocument::fromJson(jsonCode.toUtf8()); + QString originalCode = QString::fromUtf8(jsonOriginal.toJson(QJsonDocument::Compact)); + QString newCode = QString::fromUtf8(jsonNew.toJson(QJsonDocument::Compact)); + if (newCode != originalCode) + { + QString currentFilePath = smpic->getPictureFilePath(); + QString originalFilePath = smpic->getOriginalPictureFilePath(); + QString backupFileName = originalFilePath % ".bak"; + if (!QFile::exists(backupFileName)) + { + QFile::copy(currentFilePath, backupFileName); + } + smpic->setJsonStr(newCode, true); + if (!smpic->isJsonOk()) + { + QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("Patching of Snapmatic Properties failed because of JSON Error")); + smpic->setJsonStr(originalCode, true); + return false; + } + if (!smpic->exportPicture(currentFilePath)) + { + QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("Patching of Snapmatic Properties failed because of I/O Error")); + smpic->setJsonStr(originalCode, true); + return false; + } + jsonCode = newCode; + smpic->emitUpdate(); + return true; + } + return true; + } + else + { + QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("Patching of Snapmatic Properties failed because of JSON Error")); + return false; + } +} + +void JsonEditorDialog::on_cmdClose_clicked() +{ + this->close(); +} + +void JsonEditorDialog::on_cmdSave_clicked() +{ + if (saveJsonContent()) + { + this->close(); + } +} diff --git a/JsonEditorDialog.h b/JsonEditorDialog.h new file mode 100644 index 0000000..b881088 --- /dev/null +++ b/JsonEditorDialog.h @@ -0,0 +1,56 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2017 Syping +* +* 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 . +*****************************************************************************/ + +#ifndef JSONEDITORDIALOG_H +#define JSONEDITORDIALOG_H + +#include "SnapmaticPicture.h" +#include "JSHighlighter.h" +#include + +namespace Ui { +class JsonEditorDialog; +} + +class JsonEditorDialog : public QDialog +{ + Q_OBJECT + +public: + explicit JsonEditorDialog(SnapmaticPicture *picture, QWidget *parent = 0); + bool saveJsonContent(); + ~JsonEditorDialog(); + +protected: + void closeEvent(QCloseEvent *ev); + +private slots: + void on_cmdClose_clicked(); + void on_cmdSave_clicked(); + +signals: + void codeUpdated(QString jsonCode); + +private: + QString jsonCode; + JSHighlighter *jsonHl; + SnapmaticPicture *smpic; + Ui::JsonEditorDialog *ui; +}; + +#endif // JSONEDITORDIALOG_H diff --git a/JsonEditorDialog.ui b/JsonEditorDialog.ui new file mode 100644 index 0000000..3221c12 --- /dev/null +++ b/JsonEditorDialog.ui @@ -0,0 +1,124 @@ + + + JsonEditorDialog + + + + 0 + 0 + 550 + 450 + + + + Snapmatic JSON Editor + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + + 0 + 1 + + + + + 16777215 + 1 + + + + QFrame[frameShape="4"] +{ + color: black; +} + + + QFrame::Plain + + + 1 + + + Qt::Horizontal + + + + + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + &Save + + + + + + + &Close + + + + + + + + + + diff --git a/MapLocationDialog.cpp b/MapLocationDialog.cpp index 03c2a45..64f7271 100644 --- a/MapLocationDialog.cpp +++ b/MapLocationDialog.cpp @@ -34,6 +34,7 @@ MapLocationDialog::MapLocationDialog(double x, double y, QWidget *parent) : ui->cmdApply->setVisible(false); ui->cmdRevert->setVisible(false); ui->cmdDone->setCursor(Qt::ArrowCursor); + ui->cmdClose->setCursor(Qt::ArrowCursor); // DPI calculation qreal screenRatio = AppEnv::screenRatio(); diff --git a/MapLocationDialog.h b/MapLocationDialog.h index 5d0793a..1abfa93 100644 --- a/MapLocationDialog.h +++ b/MapLocationDialog.h @@ -51,13 +51,13 @@ private slots: void on_cmdClose_clicked(); private: - Ui::MapLocationDialog *ui; double xpos_old; double ypos_old; double xpos_new; double ypos_new; bool propUpdate; bool changeMode; + Ui::MapLocationDialog *ui; }; #endif // MAPLOCATIONDIALOG_H diff --git a/OptionsDialog.cpp b/OptionsDialog.cpp index a9d8fea..a7b9ce7 100755 --- a/OptionsDialog.cpp +++ b/OptionsDialog.cpp @@ -25,6 +25,7 @@ #include "config.h" #include #include +#include #include #include #include @@ -72,18 +73,19 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) : ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel")); } - // DPI calculation - qreal screenRatio = AppEnv::screenRatio(); - resize(435 * screenRatio, 405 * screenRatio); - setupTreeWidget(); setupLanguageBox(); setupRadioButtons(); setupDefaultProfile(); setupPictureSettings(); setupCustomGTAFolder(); + setupInterfaceSettings(); setupSnapmaticPictureViewer(); + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + resize(435 * screenRatio, 405 * screenRatio); + #ifdef GTA5SYNC_DISABLED ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabSync)); #endif @@ -239,6 +241,61 @@ void OptionsDialog::setupRadioButtons() } } +void OptionsDialog::setupInterfaceSettings() +{ + settings->beginGroup("Startup"); + bool alwaysUseMessageFont = settings->value("AlwaysUseMessageFont", false).toBool(); + ui->cbAlwaysUseMessageFont->setChecked(alwaysUseMessageFont); +#ifdef GTA5SYNC_WIN + if (QSysInfo::windowsVersion() >= 0x0080) + { + ui->gbFont->setVisible(false); + ui->cbAlwaysUseMessageFont->setVisible(false); + } +#else + ui->gbFont->setVisible(false); + ui->cbAlwaysUseMessageFont->setVisible(false); +#endif + QString currentStyle = qApp->style()->objectName(); + QString appStyle = settings->value("AppStyle", currentStyle).toString(); + bool customStyle = settings->value("CustomStyle", false).toBool(); + const QStringList availableStyles = QStyleFactory::keys(); + ui->cbStyleList->addItems(availableStyles); + if (availableStyles.contains(appStyle, Qt::CaseInsensitive)) + { + // use 'for' for select to be sure it's case insensitive + int currentIndex = 0; + for (QString currentStyleFF : availableStyles) + { + if (currentStyleFF.toLower() == appStyle.toLower()) + { + ui->cbStyleList->setCurrentIndex(currentIndex); + } + currentIndex++; + } + } + else + { + if (availableStyles.contains(currentStyle, Qt::CaseInsensitive)) + { + int currentIndex = 0; + for (QString currentStyleFF : availableStyles) + { + if (currentStyleFF.toLower() == currentStyle.toLower()) + { + ui->cbStyleList->setCurrentIndex(currentIndex); + } + currentIndex++; + } + } + } + if (customStyle) + { + ui->cbDefaultStyle->setChecked(false); + } + settings->endGroup(); +} + void OptionsDialog::on_cmdOK_clicked() { applySettings(); @@ -310,6 +367,22 @@ void OptionsDialog::applySettings() settings->setValue("force", forceCustomFolder); settings->endGroup(); + bool defaultStyle = ui->cbDefaultStyle->isChecked(); + settings->beginGroup("Startup"); + if (!defaultStyle) + { + QString newStyle = ui->cbStyleList->currentText(); + settings->setValue("CustomStyle", true); + settings->setValue("AppStyle", newStyle); + qApp->setStyle(QStyleFactory::create(newStyle)); + } + else + { + settings->setValue("CustomStyle", false); + } + settings->setValue("AlwaysUseMessageFont", ui->cbAlwaysUseMessageFont->isChecked()); + settings->endGroup(); + #if QT_VERSION >= 0x050000 bool languageChanged = ui->cbLanguage->currentData().toString() != currentLanguage; bool languageAreaChanged = ui->cbAreaLanguage->currentData().toString() != currentAreaLanguage; @@ -494,3 +567,8 @@ void OptionsDialog::on_cmdExploreFolder_clicked() ui->txtFolder->setText(GTAV_Folder); } } + +void OptionsDialog::on_cbDefaultStyle_toggled(bool checked) +{ + ui->cbStyleList->setDisabled(checked); +} diff --git a/OptionsDialog.h b/OptionsDialog.h index 18715b6..03d2e81 100755 --- a/OptionsDialog.h +++ b/OptionsDialog.h @@ -46,6 +46,7 @@ private slots: void on_hsPicQuality_valueChanged(int value); void on_cbIgnoreAspectRatio_toggled(bool checked); void on_cmdExploreFolder_clicked(); + void on_cbDefaultStyle_toggled(bool checked); signals: void settingsApplied(int contentMode, bool languageChanged); @@ -61,6 +62,7 @@ private: QString defaultProfile; QString percentString; QSettings *settings; + bool withoutPlayers; bool currentFFolder; int contentMode; int customQuality; @@ -73,6 +75,7 @@ private: void setupDefaultProfile(); void setupPictureSettings(); void setupCustomGTAFolder(); + void setupInterfaceSettings(); void setupSnapmaticPictureViewer(); void applySettings(); }; diff --git a/OptionsDialog.ui b/OptionsDialog.ui index c23d9ba..1a70c0f 100755 --- a/OptionsDialog.ui +++ b/OptionsDialog.ui @@ -314,7 +314,7 @@ - + Qt::Vertical @@ -382,15 +382,15 @@ - + - Language + Interface - + - Interface + Language for Interface @@ -409,9 +409,9 @@ - Areas + Language for Areas - + @@ -425,6 +425,65 @@ + + + + Style + + + + + + Use Default Style (Restart) + + + true + + + + + + + + + Style: + + + + + + + false + + + + 0 + 0 + + + + + + + + + + + + + Font + + + + + + Always use Message Font (Windows 2003 and earlier) + + + + + + diff --git a/PictureDialog.cpp b/PictureDialog.cpp index d8c1646..1e8837c 100755 --- a/PictureDialog.cpp +++ b/PictureDialog.cpp @@ -22,6 +22,7 @@ #include "ui_PictureDialog.h" #include "SidebarGenerator.h" #include "MapLocationDialog.h" +#include "JsonEditorDialog.h" #include "SnapmaticEditor.h" #include "StandardPaths.h" #include "PictureExport.h" @@ -62,6 +63,17 @@ #include #include +// Macros for better Overview + RAM +#define locX QString::number(picture->getSnapmaticProperties().location.x) +#define locY QString::number(picture->getSnapmaticProperties().location.y) +#define locZ QString::number(picture->getSnapmaticProperties().location.z) +#define crewID QString::number(picture->getSnapmaticProperties().crewID) +#define picArea picture->getSnapmaticProperties().location.area +#define picPath picture->getPictureFilePath() +#define picTitl StringParser::escapeString(picture->getPictureTitle()) +#define plyrsList picture->getSnapmaticProperties().playersList +#define created picture->getSnapmaticProperties().createdDateTime.toString(Qt::DefaultLocaleShortDate) + PictureDialog::PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent) : QDialog(parent), profileDB(profileDB), crewDB(crewDB), ui(new Ui::PictureDialog) @@ -102,22 +114,13 @@ void PictureDialog::setupPictureDialog(bool withDatabase_) windowTitleStr = this->windowTitle(); jsonDrawString = ui->labJSON->text(); ui->cmdManage->setEnabled(false); - plyrsList = QStringList(); fullscreenWidget = nullptr; rqFullscreen = false; previewMode = false; naviEnabled = false; indexed = false; - picArea = ""; - picTitl = ""; - picPath = ""; - created = ""; - crewStr = ""; - crewID = ""; - locX = ""; - locY = ""; - locZ = ""; smpic = nullptr; + crewStr = ""; // With datebase withDatabase = withDatabase_; @@ -145,9 +148,11 @@ void PictureDialog::setupPictureDialog(bool withDatabase_) jpegExportAction = manageMenu->addAction(tr("Export as &Picture..."), this, SLOT(exportSnapmaticPicture())); pgtaExportAction = manageMenu->addAction(tr("Export as &Snapmatic..."), this, SLOT(copySnapmaticPicture())); manageMenuSep1 = manageMenu->addSeparator(); - openViewerAction = manageMenu->addAction(tr("Open &Map View..."), this, SLOT(openPreviewMap())); - openViewerAction->setShortcut(Qt::Key_M); propEditorAction = manageMenu->addAction(tr("&Edit Properties..."), this, SLOT(editSnapmaticProperties())); + manageMenuSep2 = manageMenu->addSeparator(); + openViewerAction = manageMenu->addAction(tr("Open &Map Viewer..."), this, SLOT(openPreviewMap())); + openViewerAction->setShortcut(Qt::Key_M); + jsonEditorAction = manageMenu->addAction(tr("Open &JSON Editor..."), this, SLOT(editSnapmaticRawJson())); ui->cmdManage->setMenu(manageMenu); // Global map @@ -176,9 +181,11 @@ PictureDialog::~PictureDialog() { delete propEditorAction; delete openViewerAction; + delete jsonEditorAction; delete jpegExportAction; delete pgtaExportAction; delete manageMenuSep1; + delete manageMenuSep2; delete manageMenu; delete ui; } @@ -426,7 +433,6 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, snapmaticPicture = QImage(); indexed = _indexed; index = _index; - picPath = picture->getPictureFilePath(); smpic = picture; if (!readOk) { @@ -441,23 +447,14 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, } if (picture->isJsonOk()) { - locX = QString::number(picture->getSnapmaticProperties().location.x); - locY = QString::number(picture->getSnapmaticProperties().location.y); - locZ = QString::number(picture->getSnapmaticProperties().location.z); if (withDatabase) { - crewID = QString::number(picture->getSnapmaticProperties().crewID); - crewStr = crewDB->getCrewName(picture->getSnapmaticProperties().crewID); + crewStr = crewDB->getCrewName(crewID); } else { - crewID = QString::number(picture->getSnapmaticProperties().crewID); - crewStr = QString::number(picture->getSnapmaticProperties().crewID); + crewStr = crewID; } - created = picture->getSnapmaticProperties().createdDateTime.toString(Qt::DefaultLocaleShortDate); - plyrsList = picture->getSnapmaticProperties().playersList; - picTitl = StringParser::escapeString(picture->getPictureTitle()); - picArea = picture->getSnapmaticProperties().location.area; if (globalMap.contains(picArea)) { picAreaStr = globalMap[picArea]; @@ -565,15 +562,18 @@ void PictureDialog::renderPicture() void PictureDialog::crewNameUpdated() { - if (withDatabase && crewID == crewStr) + SnapmaticPicture *picture = smpic; // used by macro + QString crewIDStr = crewID; + if (withDatabase && crewIDStr == crewStr) { - crewStr = crewDB->getCrewName(crewID.toInt()); + crewStr = crewDB->getCrewName(crewIDStr); ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created)); } } void PictureDialog::playerNameUpdated() { + SnapmaticPicture *picture = smpic; // used by macro if (plyrsList.count() >= 1) { ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created)); @@ -582,19 +582,23 @@ void PictureDialog::playerNameUpdated() QString PictureDialog::generateCrewString() { - if (crewID != "0" && !crewID.isEmpty()) + SnapmaticPicture *picture = smpic; // used by macro + QString crewIDStr = crewID; // save operation time + if (crewIDStr != "0" && !crewIDStr.isEmpty()) { - return QString("" % crewStr % ""); + return QString("" % crewStr % ""); } return tr("No Crew"); } QString PictureDialog::generatePlayersString() { + SnapmaticPicture *picture = smpic; // used by macro + const QStringList playersList = plyrsList; // save operation time QString plyrsStr; - if (plyrsList.length() >= 1) + if (playersList.length() >= 1) { - for (QString player : plyrsList) + for (QString player : playersList) { QString playerName; if (withDatabase) @@ -691,14 +695,15 @@ int PictureDialog::getIndex() void PictureDialog::openPreviewMap() { + SnapmaticPicture *picture = smpic; MapLocationDialog *mapLocDialog; if (rqFullscreen && fullscreenWidget != nullptr) { - mapLocDialog = new MapLocationDialog(smpic->getSnapmaticProperties().location.x, smpic->getSnapmaticProperties().location.y, fullscreenWidget); + mapLocDialog = new MapLocationDialog(picture->getSnapmaticProperties().location.x, picture->getSnapmaticProperties().location.y, fullscreenWidget); } else { - mapLocDialog = new MapLocationDialog(smpic->getSnapmaticProperties().location.x, smpic->getSnapmaticProperties().location.y, this); + mapLocDialog = new MapLocationDialog(picture->getSnapmaticProperties().location.x, picture->getSnapmaticProperties().location.y, this); } mapLocDialog->setWindowIcon(windowIcon()); mapLocDialog->setModal(true); @@ -707,25 +712,25 @@ void PictureDialog::openPreviewMap() if (mapLocDialog->propUpdated()) { // Update Snapmatic Properties - SnapmaticProperties localSpJson = smpic->getSnapmaticProperties(); + SnapmaticProperties localSpJson = picture->getSnapmaticProperties(); localSpJson.location.x = mapLocDialog->getXpos(); localSpJson.location.y = mapLocDialog->getYpos(); localSpJson.location.z = 0; // Update Snapmatic Picture - QString currentFilePath = smpic->getPictureFilePath(); - QString originalFilePath = smpic->getOriginalPictureFilePath(); + QString currentFilePath = picture->getPictureFilePath(); + QString originalFilePath = picture->getOriginalPictureFilePath(); QString backupFileName = originalFilePath % ".bak"; if (!QFile::exists(backupFileName)) { QFile::copy(currentFilePath, backupFileName); } - SnapmaticProperties fallbackProperties = smpic->getSnapmaticProperties(); - smpic->setSnapmaticProperties(localSpJson); - if (!smpic->exportPicture(currentFilePath)) + SnapmaticProperties fallbackProperties = picture->getSnapmaticProperties(); + picture->setSnapmaticProperties(localSpJson); + if (!picture->exportPicture(currentFilePath)) { QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("Patching of Snapmatic Properties failed because of I/O Error")); - smpic->setSnapmaticProperties(fallbackProperties); + picture->setSnapmaticProperties(fallbackProperties); } else { @@ -737,6 +742,7 @@ void PictureDialog::openPreviewMap() void PictureDialog::editSnapmaticProperties() { + SnapmaticPicture *picture = smpic; SnapmaticEditor *snapmaticEditor; if (rqFullscreen && fullscreenWidget != nullptr) { @@ -746,29 +752,42 @@ void PictureDialog::editSnapmaticProperties() { snapmaticEditor = new SnapmaticEditor(crewDB, this); } - snapmaticEditor->setWindowFlags(snapmaticEditor->windowFlags()^Qt::WindowContextHelpButtonHint); snapmaticEditor->setWindowIcon(windowIcon()); - snapmaticEditor->setSnapmaticPicture(smpic); + snapmaticEditor->setSnapmaticPicture(picture); snapmaticEditor->setModal(true); + snapmaticEditor->show(); snapmaticEditor->exec(); delete snapmaticEditor; } +void PictureDialog::editSnapmaticRawJson() +{ + SnapmaticPicture *picture = smpic; + JsonEditorDialog *jsonEditor = new JsonEditorDialog(picture, this); + jsonEditor->setModal(true); + jsonEditor->show(); + jsonEditor->exec(); + delete jsonEditor; +} + void PictureDialog::updated() { + SnapmaticPicture *picture = smpic; // used by macro if (withDatabase) { - crewID = QString::number(smpic->getSnapmaticProperties().crewID); - crewStr = crewDB->getCrewName(smpic->getSnapmaticProperties().crewID); + crewStr = crewDB->getCrewName(crewID); } else { - crewID = QString::number(smpic->getSnapmaticProperties().crewID); - crewStr = QString::number(smpic->getSnapmaticProperties().crewID); + crewStr = crewID; + } + if (globalMap.contains(picArea)) + { + picAreaStr = globalMap[picArea]; + } + else + { + picAreaStr = picArea; } - locX = QString::number(smpic->getSnapmaticProperties().location.x); - locY = QString::number(smpic->getSnapmaticProperties().location.y); - locZ = QString::number(smpic->getSnapmaticProperties().location.z); - picTitl = StringParser::escapeString(smpic->getPictureTitle()); ui->labJSON->setText(jsonDrawString.arg(locX, locY, locZ, generatePlayersString(), generateCrewString(), picTitl, picAreaStr, created)); } diff --git a/PictureDialog.h b/PictureDialog.h index 6a02338..89d154e 100755 --- a/PictureDialog.h +++ b/PictureDialog.h @@ -69,6 +69,7 @@ private slots: void nextPictureRequestedSlot(); void previousPictureRequestedSlot(); void editSnapmaticProperties(); + void editSnapmaticRawJson(); void renderOverlayPicture(); void renderPicture(); void openPreviewMap(); @@ -100,23 +101,16 @@ private: QAction *pgtaExportAction; QAction *propEditorAction; QAction *openViewerAction; + QAction *jsonEditorAction; QAction *manageMenuSep1; + QAction *manageMenuSep2; QImage avatarAreaPicture; QImage snapmaticPicture; QImage overlayTempImage; QString jsonDrawString; QString windowTitleStr; - QStringList plyrsList; QString picAreaStr; - QString picArea; - QString picTitl; - QString picPath; - QString created; QString crewStr; - QString crewID; - QString locX; - QString locY; - QString locZ; bool overlayEnabled; bool withDatabase; bool rqFullscreen; diff --git a/ProfileInterface.cpp b/ProfileInterface.cpp index 88dbcdd..50ea5c5 100755 --- a/ProfileInterface.cpp +++ b/ProfileInterface.cpp @@ -54,6 +54,9 @@ #include #include +#define importTimeFormat "HHmmss" +#define findRetryLimit 500 + ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent) : QWidget(parent), profileDB(profileDB), crewDB(crewDB), threadDB(threadDB), ui(new Ui::ProfileInterface) @@ -446,7 +449,9 @@ fileDialogPreOpen: //Work? if (selectedFiles.length() == 1) { QString selectedFile = selectedFiles.at(0); - if (!importFile(selectedFile, true)) goto fileDialogPreOpen; //Work? + QDateTime importDateTime = QDateTime::currentDateTime(); + int currentTime = importDateTime.toString(importTimeFormat).toInt(); + if (!importFile(selectedFile, importDateTime, ¤tTime, true)) goto fileDialogPreOpen; //Work? } else if (selectedFiles.length() > 1) { @@ -486,13 +491,14 @@ void ProfileInterface::importFilesProgress(QStringList selectedFiles) pbBar.at(0)->setTextVisible(false); pbDialog.show(); - QTime t; - t.start(); + QDateTime importDateTime = QDateTime::currentDateTime(); + int currentTime = importDateTime.time().toString(importTimeFormat).toInt(); for (QString selectedFile : selectedFiles) { pbDialog.setValue(overallId); pbDialog.setLabelText(tr("Import file %1 of %2 files").arg(QString::number(overallId), QString::number(maximumId))); - if (!importFile(selectedFile, false)) + importDateTime = QDateTime::currentDateTime(); + if (!importFile(selectedFile, importDateTime, ¤tTime, false)) { failedFiles << QFileInfo(selectedFile).fileName(); } @@ -510,7 +516,7 @@ void ProfileInterface::importFilesProgress(QStringList selectedFiles) } } -bool ProfileInterface::importFile(QString selectedFile, bool notMultiple) +bool ProfileInterface::importFile(QString selectedFile, QDateTime importDateTime, int *currentTime, bool notMultiple) { QString selectedFileName = QFileInfo(selectedFile).fileName(); if (QFile::exists(selectedFile)) @@ -590,7 +596,7 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple) diffWidth = diffWidth / 2; } snapmaticPainter.drawImage(145 + diffWidth, 66 + diffHeight, snapmaticImage); - customImageTitle = "Custom Avatar"; + customImageTitle = ImportDialog::tr("Custom Avatar", "Custom Avatar Description in SC, don't use Special Character!"); } else { @@ -609,7 +615,7 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple) diffHeight = diffHeight / 2; } snapmaticPainter.drawImage(0 + diffWidth, 0 + diffHeight, snapmaticImage); - customImageTitle = "Custom Picture"; + customImageTitle = ImportDialog::tr("Custom Picture", "Custom Picture Description in SC, don't use Special Character!"); } snapmaticPainter.end(); if (!picture->setImage(snapmaticPixmap.toImage())) @@ -617,23 +623,22 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple) delete picture; return false; } - QString currentTime = QTime::currentTime().toString("HHmmss"); SnapmaticProperties spJson = picture->getSnapmaticProperties(); - spJson.uid = QString(currentTime % - QString::number(QDate::currentDate().dayOfYear())).toInt(); + spJson.uid = QString(QString::number(*currentTime) % + QString::number(importDateTime.date().dayOfYear())).toInt(); bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid)); bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden"); int cEnough = 0; - while ((fExists || fExistsHidden) && cEnough < 5000) + while ((fExists || fExistsHidden) && cEnough < findRetryLimit) { - currentTime = QString::number(currentTime.toInt() - 1); - spJson.uid = QString(currentTime % - QString::number(QDate::currentDate().dayOfYear())).toInt(); + *currentTime = *currentTime - 1; + spJson.uid = QString(QString::number(*currentTime) % + QString::number(importDateTime.date().dayOfYear())).toInt(); fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid)); fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden"); cEnough++; } - spJson.createdDateTime = QDateTime::currentDateTime(); + spJson.createdDateTime = importDateTime; spJson.createdTimestamp = spJson.createdDateTime.toTime_t(); picture->setSnapmaticProperties(spJson); picture->setPicFileName(QString("PGTA5%1").arg(QString::number(spJson.uid))); @@ -672,23 +677,22 @@ bool ProfileInterface::importFile(QString selectedFile, bool notMultiple) { if (picture->setImage(importDialog->image())) { - QString currentTime = QTime::currentTime().toString("HHmmss"); SnapmaticProperties spJson = picture->getSnapmaticProperties(); - spJson.uid = QString(currentTime + - QString::number(QDate::currentDate().dayOfYear())).toInt(); + spJson.uid = QString(QString::number(*currentTime) % + QString::number(importDateTime.date().dayOfYear())).toInt(); bool fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid)); bool fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden"); int cEnough = 0; - while ((fExists || fExistsHidden) && cEnough < 25) + while ((fExists || fExistsHidden) && cEnough < findRetryLimit) { - currentTime = QString::number(currentTime.toInt() - 1); - spJson.uid = QString(currentTime % - QString::number(QDate::currentDate().dayOfYear())).toInt(); + *currentTime = *currentTime - 1; + spJson.uid = QString(QString::number(*currentTime) % + QString::number(importDateTime.date().dayOfYear())).toInt(); fExists = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid)); fExistsHidden = QFile::exists(profileFolder % "/PGTA5" % QString::number(spJson.uid) % ".hidden"); cEnough++; } - spJson.createdDateTime = QDateTime::currentDateTime(); + spJson.createdDateTime = importDateTime; spJson.createdTimestamp = spJson.createdDateTime.toTime_t(); picture->setSnapmaticProperties(spJson); picture->setPicFileName(QString("PGTA5%1").arg(QString::number(spJson.uid))); @@ -1158,6 +1162,9 @@ void ProfileInterface::contextMenuTriggeredPIC(QContextMenuEvent *ev) editMenu.addAction(SnapmaticWidget::tr("Hide &In-game"), picWidget, SLOT(makePictureHiddenSlot())); } editMenu.addAction(PictureDialog::tr("&Edit Properties..."), picWidget, SLOT(editSnapmaticProperties())); + editMenu.addSeparator(); + editMenu.addAction(PictureDialog::tr("Open &Map Viewer..."), picWidget, SLOT(openMapViewer())); + editMenu.addAction(PictureDialog::tr("Open &JSON Editor..."), picWidget, SLOT(editSnapmaticRawJson())); QMenu exportMenu(SnapmaticWidget::tr("&Export"), this); exportMenu.addAction(PictureDialog::tr("Export as &Picture..."), picWidget, SLOT(on_cmdExport_clicked())); exportMenu.addAction(PictureDialog::tr("Export as &Snapmatic..."), picWidget, SLOT(on_cmdCopy_clicked())); @@ -1231,7 +1238,9 @@ void ProfileInterface::on_saProfileContent_dropped(const QMimeData *mimeData) if (pathList.length() == 1) { QString selectedFile = pathList.at(0); - importFile(selectedFile, true); + QDateTime importDateTime = QDateTime::currentDateTime(); + int currentTime = importDateTime.toString(importTimeFormat).toInt(); + importFile(selectedFile, QDateTime::currentDateTime(), ¤tTime, true); } else if (pathList.length() > 1) { diff --git a/ProfileInterface.h b/ProfileInterface.h index f93297c..8ccf76b 100755 --- a/ProfileInterface.h +++ b/ProfileInterface.h @@ -31,6 +31,7 @@ #include "CrewDatabase.h" #include #include +#include #include #include #include @@ -107,7 +108,7 @@ private: int contentMode; bool isSupportedImageFile(QString selectedFileName); - bool importFile(QString selectedFile, bool notMultiple); + bool importFile(QString selectedFile, QDateTime importDateTime, int *currentTime, bool notMultiple); void importFilesProgress(QStringList selectedFiles); bool importSnapmaticPicture(SnapmaticPicture *picture, bool warn = true); bool importSavegameData(SavegameData *savegame, QString sgdPath, bool warn = true); diff --git a/SnapmaticEditor.cpp b/SnapmaticEditor.cpp index 619e855..768013a 100644 --- a/SnapmaticEditor.cpp +++ b/SnapmaticEditor.cpp @@ -32,13 +32,24 @@ SnapmaticEditor::SnapmaticEditor(CrewDatabase *crewDB, QWidget *parent) : QDialog(parent), crewDB(crewDB), ui(new Ui::SnapmaticEditor) { + // Set Window Flags + setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint); + ui->setupUi(this); ui->cmdApply->setDefault(true); - if (QIcon::hasThemeIcon("dialog-apply")) + if (QIcon::hasThemeIcon("dialog-ok-apply")) + { + ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok-apply")); + } + else if (QIcon::hasThemeIcon("dialog-apply")) { ui->cmdApply->setIcon(QIcon::fromTheme("dialog-apply")); } + else if (QIcon::hasThemeIcon("dialog-ok")) + { + ui->cmdApply->setIcon(QIcon::fromTheme("dialog-ok")); + } if (QIcon::hasThemeIcon("dialog-cancel")) { ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel")); diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp index e1ca220..4d9147e 100755 --- a/SnapmaticPicture.cpp +++ b/SnapmaticPicture.cpp @@ -774,60 +774,119 @@ void SnapmaticPicture::parseJsonContent() { QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonStr.toUtf8()); QJsonObject jsonObject = jsonDocument.object(); - QVariantMap jsonMap = jsonObject.toVariantMap(); // backward compatibility + QVariantMap jsonMap = jsonObject.toVariantMap(); + bool jsonIncomplete = false; + bool jsonError = false; if (jsonObject.contains("loc")) { - QJsonObject locObject = jsonObject["loc"].toObject(); - if (locObject.contains("x")) { localSpJson.location.x = locObject["x"].toDouble(); } - if (locObject.contains("y")) { localSpJson.location.y = locObject["y"].toDouble(); } - if (locObject.contains("z")) { localSpJson.location.z = locObject["z"].toDouble(); } + if (jsonObject["loc"].isObject()) + { + QJsonObject locObject = jsonObject["loc"].toObject(); + if (locObject.contains("x")) + { + if (locObject["x"].isDouble()) { localSpJson.location.x = locObject["x"].toDouble(); } + else { jsonError = true; } + } + else { jsonIncomplete = true; } + if (locObject.contains("y")) + { + if (locObject["y"].isDouble()) { localSpJson.location.y = locObject["y"].toDouble(); } + else { jsonError = true; } + } + else { jsonIncomplete = true; } + if (locObject.contains("z")) + { + if (locObject["z"].isDouble()) { localSpJson.location.z = locObject["z"].toDouble(); } + else { jsonError = true; } + } + else { jsonIncomplete = true; } + } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("uid")) { - localSpJson.uid = jsonObject["uid"].toInt(); + bool uidOk; + localSpJson.uid = jsonMap["uid"].toInt(&uidOk); + if (!uidOk) { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("area")) { - localSpJson.location.area = jsonObject["area"].toString(); + if (jsonObject["area"].isString()) { localSpJson.location.area = jsonObject["area"].toString(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("crewid")) { - localSpJson.crewID = jsonObject["crewid"].toInt(); + bool crewIDOk; + localSpJson.crewID = jsonMap["crewid"].toInt(&crewIDOk); + if (!crewIDOk) { jsonError = true; } } + else { jsonIncomplete = true; } + if (jsonObject.contains("street")) + { + bool streetIDOk; + localSpJson.streetID = jsonMap["street"].toInt(&streetIDOk); + if (!streetIDOk) { jsonError = true; } + } + else { jsonIncomplete = true; } if (jsonObject.contains("creat")) { + bool timestampOk; QDateTime createdTimestamp; - localSpJson.createdTimestamp = jsonMap["creat"].toUInt(); + localSpJson.createdTimestamp = jsonMap["creat"].toUInt(×tampOk); createdTimestamp.setTime_t(localSpJson.createdTimestamp); localSpJson.createdDateTime = createdTimestamp; + if (!timestampOk) { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("plyrs")) { - localSpJson.playersList = jsonMap["plyrs"].toStringList(); + if (jsonObject["plyrs"].isArray()) { localSpJson.playersList = jsonMap["plyrs"].toStringList(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("meme")) { - localSpJson.isMeme = jsonObject["meme"].toBool(); + if (jsonObject["meme"].isBool()) { localSpJson.isMeme = jsonObject["meme"].toBool(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("mug")) { - localSpJson.isMug = jsonObject["mug"].toBool(); + if (jsonObject["mug"].isBool()) { localSpJson.isMug = jsonObject["mug"].toBool(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("slf")) { - localSpJson.isSelfie = jsonObject["slf"].toBool(); + if (jsonObject["slf"].isBool()) { localSpJson.isSelfie = jsonObject["slf"].toBool(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("drctr")) { - localSpJson.isFromDirector = jsonObject["drctr"].toBool(); + if (jsonObject["drctr"].isBool()) { localSpJson.isFromDirector = jsonObject["drctr"].toBool(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } if (jsonObject.contains("rsedtr")) { - localSpJson.isFromRSEditor = jsonObject["rsedtr"].toBool(); + if (jsonObject["rsedtr"].isBool()) { localSpJson.isFromRSEditor = jsonObject["rsedtr"].toBool(); } + else { jsonError = true; } } + else { jsonIncomplete = true; } - jsonOk = true; + if (!jsonIncomplete && !jsonError) + { + jsonOk = true; + } + else + { + jsonOk = false; + } } bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson) @@ -844,6 +903,7 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson) jsonObject["uid"] = newSpJson.uid; jsonObject["area"] = newSpJson.location.area; jsonObject["crewid"] = newSpJson.crewID; + jsonObject["street"] = newSpJson.streetID; jsonObject["creat"] = QJsonValue::fromVariant(newSpJson.createdTimestamp); jsonObject["plyrs"] = QJsonValue::fromVariant(newSpJson.playersList); jsonObject["meme"] = newSpJson.isMeme; @@ -862,7 +922,7 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson) return false; } -bool SnapmaticPicture::setJsonStr(const QString &newJsonStr) +bool SnapmaticPicture::setJsonStr(const QString &newJsonStr, bool updateProperties) { if (newJsonStr.length() < jsonStreamEditorLength) { @@ -887,6 +947,7 @@ bool SnapmaticPicture::setJsonStr(const QString &newJsonStr) { jsonStr = newJsonStr; if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); } + if (updateProperties) { parseJsonContent(); } return true; } else diff --git a/SnapmaticPicture.h b/SnapmaticPicture.h index e0db134..206a9ec 100755 --- a/SnapmaticPicture.h +++ b/SnapmaticPicture.h @@ -37,6 +37,7 @@ struct SnapmaticProperties { }; int uid; int crewID; + int streetID; QStringList playersList; uint createdTimestamp; QDateTime createdDateTime; @@ -96,7 +97,7 @@ public: QString getJsonStr(); SnapmaticProperties getSnapmaticProperties(); bool setSnapmaticProperties(SnapmaticProperties newSpJson); - bool setJsonStr(const QString &jsonStr); + bool setJsonStr(const QString &jsonStr, bool updateProperties = false); // VISIBILITY bool isHidden(); diff --git a/SnapmaticWidget.cpp b/SnapmaticWidget.cpp index dd5ca98..789c2e9 100755 --- a/SnapmaticWidget.cpp +++ b/SnapmaticWidget.cpp @@ -18,6 +18,8 @@ #include "SnapmaticWidget.h" #include "ui_SnapmaticWidget.h" +#include "MapLocationDialog.h" +#include "JsonEditorDialog.h" #include "SnapmaticPicture.h" #include "SnapmaticEditor.h" #include "DatabaseThread.h" @@ -283,13 +285,57 @@ void SnapmaticWidget::makePictureVisibleSlot() void SnapmaticWidget::editSnapmaticProperties() { SnapmaticEditor *snapmaticEditor = new SnapmaticEditor(crewDB, this); - snapmaticEditor->setWindowFlags(snapmaticEditor->windowFlags()^Qt::WindowContextHelpButtonHint); snapmaticEditor->setSnapmaticPicture(smpic); snapmaticEditor->setModal(true); + snapmaticEditor->show(); snapmaticEditor->exec(); delete snapmaticEditor; } +void SnapmaticWidget::editSnapmaticRawJson() +{ + JsonEditorDialog *jsonEditor = new JsonEditorDialog(smpic, this); + jsonEditor->setModal(true); + jsonEditor->show(); + jsonEditor->exec(); + delete jsonEditor; +} + +void SnapmaticWidget::openMapViewer() +{ + SnapmaticPicture *picture = smpic; + MapLocationDialog *mapLocDialog; + mapLocDialog = new MapLocationDialog(picture->getSnapmaticProperties().location.x, picture->getSnapmaticProperties().location.y, this); + mapLocDialog->setModal(true); + mapLocDialog->show(); + mapLocDialog->exec(); + if (mapLocDialog->propUpdated()) + { + // Update Snapmatic Properties + SnapmaticProperties localSpJson = picture->getSnapmaticProperties(); + localSpJson.location.x = mapLocDialog->getXpos(); + localSpJson.location.y = mapLocDialog->getYpos(); + localSpJson.location.z = 0; + + // Update Snapmatic Picture + QString currentFilePath = picture->getPictureFilePath(); + QString originalFilePath = picture->getOriginalPictureFilePath(); + QString backupFileName = originalFilePath % ".bak"; + if (!QFile::exists(backupFileName)) + { + QFile::copy(currentFilePath, backupFileName); + } + SnapmaticProperties fallbackProperties = picture->getSnapmaticProperties(); + picture->setSnapmaticProperties(localSpJson); + if (!picture->exportPicture(currentFilePath)) + { + QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("Patching of Snapmatic Properties failed because of I/O Error")); + picture->setSnapmaticProperties(fallbackProperties); + } + } + delete mapLocDialog; +} + bool SnapmaticWidget::isSelected() { return ui->cbSelected->isChecked(); diff --git a/SnapmaticWidget.h b/SnapmaticWidget.h index 9a7b3f3..bc5b087 100755 --- a/SnapmaticWidget.h +++ b/SnapmaticWidget.h @@ -68,6 +68,8 @@ private slots: void makePictureVisibleSlot(); void makePictureHiddenSlot(); void editSnapmaticProperties(); + void editSnapmaticRawJson(); + void openMapViewer(); void snapmaticUpdated(); protected: diff --git a/anpro/JSHighlighter.cpp b/anpro/JSHighlighter.cpp new file mode 100644 index 0000000..6d3b93c --- /dev/null +++ b/anpro/JSHighlighter.cpp @@ -0,0 +1,72 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2017 Syping +* +* 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 . +*****************************************************************************/ + +#include "JSHighlighter.h" +#include + +JSHighlighter::JSHighlighter(QTextDocument *parent) : + QSyntaxHighlighter(parent) +{ + HighlightingRule rule; + + QBrush keywordBrush(QColor::fromRgb(66, 137, 244)); + keywordFormat.setForeground(keywordBrush); + keywordFormat.setFontItalic(true); + QStringList keywordPatterns; + keywordPatterns << "\\btrue\\b" << "\\bfalse\\b"; + for (QString pattern : keywordPatterns) + { + rule.pattern = QRegExp(pattern); + rule.format = keywordFormat; + highlightingRules.append(rule); + } + + QBrush doubleBrush(QColor::fromRgb(66, 137, 244)); + doubleFormat.setForeground(doubleBrush); + rule.pattern = QRegExp("[+-]?\\d*\\.?\\d+"); + rule.format = doubleFormat; + highlightingRules.append(rule); + + QBrush quotationBrush(QColor::fromRgb(66, 244, 104)); + quotationFormat.setForeground(quotationBrush); + rule.pattern = QRegExp("\"[^\"]*\""); + rule.format = quotationFormat; + highlightingRules.append(rule); + + QBrush objectBrush(QColor::fromRgb(255, 80, 80)); + objectFormat.setForeground(objectBrush); + rule.pattern = QRegExp("\"[^\"]*\"(?=:)"); + rule.format = objectFormat; + highlightingRules.append(rule); +} + +void JSHighlighter::highlightBlock(const QString &text) +{ + for (HighlightingRule rule : highlightingRules) + { + QRegExp expression(rule.pattern); + int index = expression.indexIn(text); + while (index >= 0) + { + int length = expression.matchedLength(); + setFormat(index, length, rule.format); + index = expression.indexIn(text, index + length); + } + } + setCurrentBlockState(0); +} diff --git a/anpro/JSHighlighter.h b/anpro/JSHighlighter.h new file mode 100644 index 0000000..08a0eb5 --- /dev/null +++ b/anpro/JSHighlighter.h @@ -0,0 +1,56 @@ +/***************************************************************************** +* gta5sync GRAND THEFT AUTO V SYNC +* Copyright (C) 2017 Syping +* +* 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 . +*****************************************************************************/ + +#ifndef JSHIGHLIGHTER_H +#define JSHIGHLIGHTER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class QTextDocument; + +class JSHighlighter : public QSyntaxHighlighter +{ + Q_OBJECT + +public: + struct HighlightingRule + { + QRegExp pattern; + QTextCharFormat format; + }; + QVector highlightingRules; + + QTextCharFormat keywordFormat; + QTextCharFormat doubleFormat; + QTextCharFormat quotationFormat; + QTextCharFormat objectFormat; + + JSHighlighter(QTextDocument *parent = 0); + +protected: + void highlightBlock(const QString &text) override; +}; + +#endif // JSHIGHLIGHTER_H diff --git a/config.h b/config.h index f43dc83..0848287 100755 --- a/config.h +++ b/config.h @@ -50,7 +50,7 @@ #ifndef GTA5SYNC_APPVER #ifndef GTA5SYNC_DAILYB -#define GTA5SYNC_APPVER "1.5.0-dev3" +#define GTA5SYNC_APPVER "1.5.0-dev4" #else #define GTA5SYNC_APPVER GTA5SYNC_DAILYB #endif diff --git a/gta5view.pro b/gta5view.pro index 9d7ec08..61fb0d4 100755 --- a/gta5view.pro +++ b/gta5view.pro @@ -38,6 +38,7 @@ SOURCES += main.cpp \ GlobalString.cpp \ IconLoader.cpp \ ImportDialog.cpp \ + JsonEditorDialog.cpp \ MapLocationDialog.cpp \ OptionsDialog.cpp \ PictureDialog.cpp \ @@ -59,6 +60,7 @@ SOURCES += main.cpp \ StringParser.cpp \ TranslationClass.cpp \ UserInterface.cpp \ + anpro/JSHighlighter.cpp \ uimod/UiModLabel.cpp \ uimod/UiModWidget.cpp @@ -72,6 +74,7 @@ HEADERS += \ GlobalString.h \ IconLoader.h \ ImportDialog.h \ + JsonEditorDialog.h \ MapLocationDialog.h \ OptionsDialog.h \ PictureDialog.h \ @@ -93,6 +96,7 @@ HEADERS += \ StringParser.h \ TranslationClass.h \ UserInterface.h \ + anpro/JSHighlighter.h \ uimod/UiModLabel.h \ uimod/UiModWidget.h @@ -100,6 +104,7 @@ FORMS += \ AboutDialog.ui \ ExportDialog.ui \ ImportDialog.ui \ + JsonEditorDialog.ui \ MapLocationDialog.ui \ OptionsDialog.ui \ PictureDialog.ui \ @@ -131,7 +136,7 @@ DISTFILES += res/app.rc \ lang/gta5sync_no.ts \ lang/README.txt -INCLUDEPATH += ./uimod +INCLUDEPATH += ./anpro ./uimod # GTA5SYNC/GTA5VIEW ONLY diff --git a/lang/gta5sync_no.ts b/lang/gta5sync_no.ts index 81a61d4..c6a588e 100644 --- a/lang/gta5sync_no.ts +++ b/lang/gta5sync_no.ts @@ -114,6 +114,7 @@ Pictures and Savegames CrewDatabase + No Crew @@ -196,7 +197,7 @@ Pictures and Savegames - + Background Colour: <span style="color: %1">%1</span> @@ -236,29 +237,93 @@ Pictures and Savegames - + + + Custom Avatar + Custom Avatar Description in SC, don't use Special Character! + + + + + + Custom Picture + Custom Picture Description in SC, don't use Special Character! + + + + Are you sure to use a square image outside of the Avatar Zone? When you want to use it as Avatar the image will be detached! - + Snapmatic Avatar Zone - + Select Colour... - MapPreviewDialog + JsonEditorDialog - + + Snapmatic JSON Editor + + + + + &Save + + + + + &Close + + + + + MapLocationDialog + + Snapmatic Map Viewer + + + &Close + + + + + &Apply + + + + + &Revert + + + + + &Set + + + + + &Done + + + + + X: %1 +Y: %2 + X and Y position + + OptionsDialog @@ -395,75 +460,129 @@ When you want to use it as Avatar the image will be detached! - - Language + Interface - + + Language for Interface + + + + + + + + Current: %1 + + + + + Language for Areas + + + + + Style + + + + + Use Default Style (Restart) + + + + + Style: + + + + + Font + + + + + Always use Message Font (Windows 2003 and earlier) + + + + Sync - + Sync is not implemented at current time - + Apply changes - + &OK OK, Cancel, Apply - + Discard changes - + &Cancel OK, Cancel, Apply - + %1 (Next Closest Language) First language a person can talk with a different person/application. "Native" or "Not Native". - + System System in context of System default - + + %1 (Closest to Interface) + Next closest language compared to the Interface + + + + + Auto + Automatic language choice. + + + + %1 %1 - + The new Custom Folder will initialise after you restart %1. - + No Profile No Profile, as default - - - + + + Profile: %1 @@ -504,66 +623,73 @@ When you want to use it as Avatar the image will be detached! - - + + Export as &Picture... - - + + Export as &Snapmatic... - - Open &Map View... - - - - - + + &Edit Properties... - + + + Open &Map Viewer... + + + + + + Open &JSON Editor... + + + + Key 1 - Avatar Preview Mode Key 2 - Toggle Overlay Arrow Keys - Navigate - - + + Snapmatic Picture Viewer - - + + Failed at %1 - - + + No Crew - + Unknown Location - - + + No Players - + Avatar Preview Mode Press 1 for Default View @@ -717,212 +843,212 @@ Press 1 for Default View - + Enabled pictures: %1 of %2 - + Loading... - - + + Import... - - - - - - - - - - - - + + + + + + + + + + + + Import - - + + GTA V Export (*.g5e) - - + + Savegames files (SGTA*) - - + + Snapmatic pictures (PGTA*) - + Importable files (%1) - + All image files (%1) - - + + All files (**) - - - + + + No valid file is selected - - + + Import file %1 of %2 files - + Import failed with... %1 - - + + Failed to read Snapmatic picture - - + + Failed to read Savegame file - + Can't import %1 because file can't be parsed properly - + Can't import %1 because file format can't be detected - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e - + Failed to import the Snapmatic picture, the picture is already in the game - + Failed to import the Snapmatic picture, can't copy the file into profile - + Failed to import the Savegame, can't copy the file into profile - + Failed to import the Savegame, no Savegame slot is left - - - - + + + + Export selected - - + + JPG pictures and GTA Snapmatic - - + + JPG pictures only - - + + GTA Snapmatic only - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: - + Export selected... - + Initialising export... - + Export failed with... %1 - - + + No Snapmatic pictures or Savegames files are selected - - + + Remove selected - + You really want remove the selected Snapmatic picutres and Savegame files? - + Failed at remove the complete selected Snapmatic pictures and/or Savegame files - + All profile files (*.g5e SGTA* PGTA*) @@ -930,15 +1056,20 @@ Press 1 for Default View QApplication - + Font - + Selected Font: %1 + + + <h4>Welcome to %1!</h4>You want to configure %1 before you start using it? + + SavegameDialog @@ -1013,37 +1144,37 @@ Press 1 for Default View - + &View - + &Export - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All @@ -1137,7 +1268,13 @@ Press 1 for Default View - + + + + + + + Snapmatic Properties @@ -1183,20 +1320,20 @@ Press 1 for Default View - + Crew: %1 (%2) - + Title: %1 (%2) - - + + Appropriate: %1 @@ -1226,45 +1363,59 @@ Press 1 for Default View - - + + Edit - + Yes Yes, should work fine - + No No, could lead to issues - + + <h4>Unsaved changes detected</h4>You want to save the JSON content before you quit? + + + + + + Patching of Snapmatic Properties failed because of JSON Error + + + + + + + Patching of Snapmatic Properties failed because of I/O Error - + Snapmatic Title - + New Snapmatic title: - + Snapmatic Crew - + New Snapmatic crew: @@ -1321,8 +1472,8 @@ Press 1 for Default View - - + + Delete picture @@ -1332,62 +1483,62 @@ Press 1 for Default View - + Edi&t - + Show &In-game - + Hide &In-game - + &Export - + &View - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All - + Are you sure to delete %1 from your Snapmatic pictures? - + Failed at deleting %1 from your Snapmatic pictures @@ -1396,7 +1547,7 @@ Press 1 for Default View UserInterface - + %2 - %1 @@ -1458,8 +1609,8 @@ Press 1 for Default View - - + + &About %1 @@ -1565,15 +1716,15 @@ Press 1 for Default View - + Select &GTA V Folder... - - - + + + Select GTA V Folder... @@ -1603,27 +1754,27 @@ Press 1 for Default View - - - + + + Select Profile - + Open File... - - - - + + + + Open File - + Can't open %1 because of not valid file format diff --git a/main.cpp b/main.cpp index ebd7d6b..d8d6a3b 100755 --- a/main.cpp +++ b/main.cpp @@ -21,6 +21,7 @@ #include "ProfileDatabase.h" #include "DatabaseThread.h" #include "SavegameDialog.h" +#include "OptionsDialog.h" #include "PictureDialog.h" #include "UserInterface.h" #include "CrewDatabase.h" @@ -28,8 +29,11 @@ #include "IconLoader.h" #include "AppEnv.h" #include "config.h" +#include #include +#include #include +#include #include #include #include @@ -52,9 +56,25 @@ int main(int argc, char *argv[]) a.setApplicationVersion(GTA5SYNC_APPVER); a.setQuitOnLastWindowClosed(false); + QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR); + settings.beginGroup("Startup"); + + bool isFirstStart = settings.value("IsFirstStart", true).toBool(); + bool customStyle = settings.value("CustomStyle", false).toBool(); + QString appStyle = settings.value("AppStyle", "Default").toString(); + + if (customStyle) + { + if (QStyleFactory::keys().contains(appStyle, Qt::CaseInsensitive)) + { + a.setStyle(QStyleFactory::create(appStyle)); + } + } + #ifdef GTA5SYNC_WIN #if QT_VERSION >= 0x050400 - if (QSysInfo::windowsVersion() >= 0x0080) + bool alwaysUseMessageFont = settings.value("AlwaysUseMessageFont", false).toBool(); + if (QSysInfo::windowsVersion() >= 0x0080 || alwaysUseMessageFont) { // Get Windows Font NONCLIENTMETRICS ncm; @@ -83,6 +103,22 @@ int main(int argc, char *argv[]) TCInstance->initUserLanguage(); TCInstance->loadTranslation(&a); + if (isFirstStart) + { + QMessageBox::StandardButton button = QMessageBox::information(a.desktop(), QString("%1 %2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER), QApplication::tr("

Welcome to %1!

You want to configure %1 before you start using it?").arg(GTA5SYNC_APPSTR), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (button == QMessageBox::Yes) + { + ProfileDatabase profileDB; + OptionsDialog optionsDialog(&profileDB); + optionsDialog.setWindowIcon(IconLoader::loadingAppIcon()); + optionsDialog.show(); + optionsDialog.exec(); + } + settings.setValue("IsFirstStart", false); + } + + settings.endGroup(); + QStringList applicationArgs = a.arguments(); QString selectedAction; QString arg1; diff --git a/res/app.rc b/res/app.rc index ee9308c..3cfc1b1 100755 --- a/res/app.rc +++ b/res/app.rc @@ -25,12 +25,12 @@ BEGIN BEGIN VALUE "CompanyName", "Syping" VALUE "FileDescription", "gta5view\0" - VALUE "FileVersion", "1.5.0-dev3\0" + VALUE "FileVersion", "1.5.0-dev4\0" VALUE "InternalName", "gta5view\0" VALUE "LegalCopyright", "Copyright 2016-2017 Syping\0" VALUE "OriginalFilename", "gta5view.exe\0" VALUE "ProductName", "gta5view\0" - VALUE "ProductVersion", "1.5.0-dev3\0" + VALUE "ProductVersion", "1.5.0-dev4\0" END END END diff --git a/res/gta5sync_de.qm b/res/gta5sync_de.qm index c934152338f2f829b6bc74e5b7a40975a4431b77..dcb336bee2c3375338532808ab313a139c686fb9 100755 GIT binary patch delta 3886 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 F`Css}3-SN} delta 2621 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 diff --git a/res/gta5sync_de.ts b/res/gta5sync_de.ts index a6b2420..f920076 100755 --- a/res/gta5sync_de.ts +++ b/res/gta5sync_de.ts @@ -259,6 +259,7 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen CrewDatabase + No Crew Keine Crew @@ -426,12 +427,14 @@ Wenn du planst es als Avatar zu verwenden das Bild wird abgetrennt! + Custom Avatar Custom Avatar Description in SC, don't use Special Character! Eigener Avatar + Custom Picture Custom Picture Description in SC, don't use Special Character! Eigenes Bild @@ -454,6 +457,28 @@ Wenn du es als Avatar verwenden möchtest wird es abgetrennt! Farbe auswählen...
+ + JsonEditorDialog + + + Snapmatic JSON Editor + Snapmatic JSON Editor + + + + &Save + &Speichern + + + + &Close + S&chließen + + + Patching of Snapmatic Properties failed because of JSON Error + Patchen von Snapmatic Eigenschaften fehlgeschlagen wegen JSON Fehler + + MapLocationDialog @@ -502,7 +527,7 @@ Y: %2 &Fertig - + X: %1 Y: %2 X and Y position @@ -672,56 +697,93 @@ Y: %2 Name - - Language - Sprache + + Language for Areas + Sprache für Standorte - + + Style + Stil + + + + Use Default Style (Restart) + Benutze Standard Stil (Neustart) + + + Use Default Style + Benutze Standard Stil + + + + Style: + Stil: + + + + Font + Schrift + + + + Always use Message Font (Windows 2003 and earlier) + Immer Nachrichtenschrift nutzen (Windows 2003 und früher) + + + Language + Sprache + + + Interface Oberfläche + + + Language for Interface + Sprache für Oberfläche + - - + + Current: %1 Aktuell: %1 - Areas - Standorte + Standorte - + Sync Sync - + Sync is not implemented at current time Sync wurde bisher nicht implementiert - + Apply changes Änderungen übernehmen - + &OK OK, Cancel, Apply &OK - + Discard changes Änderungen verwerfen - + &Cancel OK, Cancel, Apply Abbre&chen @@ -742,7 +804,7 @@ Y: %2 %1 (%2 wenn verfügbar) - + %1 %1 %1 @@ -756,31 +818,31 @@ Y: %2 Der eigene Ordner initialisiert sobald du %1 neugestartet hast. - + %1 (Next Closest Language) First language a person can talk with a different person/application. "Native" or "Not Native". %1 (Erste näheste Sprache) - + System System in context of System default System - + %1 (Closest to Interface) Next closest language compared to the Interface %1 (Näheste zur Oberfläche) - + Auto Automatic language choice. Automatisch - + The new Custom Folder will initialise after you restart %1. Der eigene Ordner wird initialisiert sobald du %1 neugestartet hast. @@ -789,15 +851,15 @@ Y: %2 Die Änderung der Sprache nimmt Effekt sobald du %1 neugestartet hast. - + No Profile No Profile, as default Kein Profil - - - + + + Profile: %1 Profil: %1 @@ -911,8 +973,8 @@ Y: %2 Exportiere als &JPG Bild... - - + + Export as &Picture... Als &Bild exportieren... @@ -921,8 +983,8 @@ Y: %2 Exportiere als &GTA Snapmatic... - - + + Export as &Snapmatic... Als &Snapmatic exportieren... @@ -931,13 +993,12 @@ Y: %2 Bearbei&ten - Open &Map View... - &Kartenansicht öffnen... + &Kartenansicht öffnen... - - + + &Edit Properties... Eigenschaften bearb&eiten... @@ -951,7 +1012,13 @@ Y: %2 Erweitert (&A) - + + + Open &Map Viewer... + &Kartenansicht öffnen... + + + Key 1 - Avatar Preview Mode Key 2 - Toggle Overlay Arrow Keys - Navigate @@ -960,31 +1027,31 @@ Taste 2 - Overlay umschalten Pfeiltasten - Navigieren - - + + Snapmatic Picture Viewer Snapmatic Bildansicht - - + + Failed at %1 Fehlgeschlagen bei %1 - - + + No Crew Keine Crew - - + + No Players Keine Spieler - + Avatar Preview Mode Press 1 for Default View Avatar Vorschaumodus @@ -1029,7 +1096,7 @@ Drücke A für Standardansicht Keine Crew - + Unknown Location Unbekannter Standort @@ -1198,6 +1265,12 @@ Drücke A für Standardansicht No valid file is selected Keine gültige Datei wurde ausgewählt + + + + Open &JSON Editor... + &JSON Editor öffnen... + ProfileInterface @@ -1258,30 +1331,30 @@ Drücke A für Standardansicht Profil schließen - + Loading... Lade... - - + + Import... Importieren... - - - - - - - - - - - - - + + + + + + + + + + + + + Import Importieren @@ -1294,13 +1367,13 @@ Drücke A für Standardansicht Importfähige Dateien (*.g5e *.jpg *.png SGTA* PGTA*) - + Savegames files (SGTA*) Spielstanddateien (SGTA*) - + Snapmatic pictures (PGTA*) Snapmatic Bilder (PGTA*) @@ -1310,29 +1383,29 @@ Drücke A für Standardansicht Alle Bilddateien (*.jpg *.png) - + Importable files (%1) Importfähige Dateien (%1) - + All image files (%1) Alle Bilddateien (%1) - + All files (**) Alle Dateien (**) - - + + Import file %1 of %2 files Importiere Datei %1 von %2 Dateien - + Import failed with... %1 @@ -1341,29 +1414,29 @@ Drücke A für Standardansicht %1 - + Failed to read Snapmatic picture Fehler beim Lesen vom Snapmatic Bild - + Failed to read Savegame file Fehler beim Lesen von Spielstanddatei - + Can't import %1 because file can't be parsed properly Kann %1 nicht importieren weil die Datei nicht richtig gelesen werden kann - + Can't import %1 because file format can't be detected Kann %1 nicht importieren weil das Dateiformat nicht erkannt werden kann - + Initialising export... Initialisiere Export... @@ -1372,29 +1445,29 @@ Drücke A für Standardansicht Kann %1 nicht importieren weil das Dateiformat nicht gültig ist - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA oder endet mit .g5e - + Failed to import the Snapmatic picture, the picture is already in the game Fehlgeschlagen beim Importieren vom Snapmatic Bild, dieses Bild ist bereits im Spiel - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1Exportiere Snapmatic Bilder%2<br><br>JPG Bilder machen es möglich sie mit ein Bildansicht Programm zu öffnen<br>Das GTA Snapmatic Format macht es möglich sie wieder ins Game zu importieren<br><br>Exportieren als: - - + + No valid file is selected Keine gültige Datei wurde ausgewählt - + Enabled pictures: %1 of %2 Aktivierte Bilder: %1 von %2 @@ -1403,35 +1476,35 @@ Drücke A für Standardansicht Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA - + Failed to import the Snapmatic picture, can't copy the file into profile Fehlgeschlagen beim Importieren vom Snapmatic Bild, kann Snapmatic Bild nicht ins Profil kopieren - + Failed to import the Savegame, can't copy the file into profile Fehlgeschlagen beim Importieren vom Spielstand, kann Spielstanddatei nicht ins Profil kopieren - + Failed to import the Savegame, no Savegame slot is left Fehlgeschlagen beim Importieren vom Spielstand, kein Spielstandslot mehr frei - - + + JPG pictures and GTA Snapmatic JPG Bilder und GTA Snapmatic - - + + JPG pictures only Nur JPG Bilder - - + + GTA Snapmatic only Nur GTA Snapmatic @@ -1450,25 +1523,25 @@ Das GTA Snapmatic Format macht es möglich sie wieder ins Game zu importieren Exportieren als: - - + + No Snapmatic pictures or Savegames files are selected Keine Snapmatic Bilder oder Spielstände ausgewählt - - - + + + Remove selected Auswahl löschen - + You really want remove the selected Snapmatic picutres and Savegame files? Möchtest du wirklich die ausgewählten Snapmatic Bilder und Spielstanddateien löschen? - + Failed at remove the complete selected Snapmatic pictures and/or Savegame files Fehlgeschlagen beim kompletten entfernen der ausgewählten Snapmatic Bilder und/oder der Spielstanddateien @@ -1489,10 +1562,10 @@ Exportieren als: Fehlgeschlagenen beim Import vom Spielstand weil kein Spielstandslot mehr übrig ist - - - - + + + + Export selected Auswahl exportieren @@ -1513,7 +1586,7 @@ Exportieren als: Wie sollen wir mit den Snapmatic Bilder umgehen? - + Export selected... Auswahl exportieren... @@ -1526,7 +1599,7 @@ Exportieren als: Initialisierung... - + Export failed with... %1 @@ -1561,7 +1634,7 @@ Exportieren als: Alle Profildateien (*.g5e SGTA* PGTA*) - + GTA V Export (*.g5e) GTA V Export (*.g5e) @@ -1570,15 +1643,20 @@ Exportieren als: QApplication - + Font Schrift - + Selected Font: %1 Ausgewähle Schrift: %1 + + + <h4>Welcome to %1!</h4>You want to configure %1 before you start using it? + <h4>Willkommen zu %1!</h4>Möchtest du %1 einstellen bevor du es nutzt? + SavegameDialog @@ -1725,32 +1803,32 @@ Exportieren als: Fehlgeschlagen beim Löschen %1 von deinen Spielständen - + &View A&nsehen - + &Remove Entfe&rnen - + &Select Au&swählen - + &Deselect A&bwählen - + Select &All &Alles auswählen - + &Deselect All Alles a&bwählen @@ -1789,7 +1867,7 @@ Exportieren als: Spielstand kopieren - + &Export &Exportieren @@ -1865,8 +1943,13 @@ Exportieren als: - - + + + + + + + Snapmatic Properties Snapmatic Eigenschaften @@ -1910,7 +1993,7 @@ Exportieren als: Meme - + Snapmatic Title Snapmatic Titel @@ -1921,20 +2004,20 @@ Exportieren als: - + Crew: %1 (%2) Crew: %1 (%2) - + Title: %1 (%2) Titel: %1 (%2) - - + + Appropriate: %1 Angemessen: %1 @@ -1972,41 +2055,54 @@ Exportieren als: Cancel - - + + Edit Bearbeiten - + Yes Yes, should work fine Ja - + No No, could lead to issues Nein - - + + <h4>Unsaved changes detected</h4>You want to save the JSON content before you quit? + <h4>Ungespeicherte Änderungen erkannt</h4>Möchtest du den JSON Inhalt speichern bevor du verlässt? + + + + + Patching of Snapmatic Properties failed because of JSON Error + Patchen von Snapmatic Eigenschaften fehlgeschlagen wegen JSON Fehler + + + + + + Patching of Snapmatic Properties failed because of I/O Error Patchen von Snapmatic Eigenschaften fehlgeschlagen wegen I/O Fehler - + New Snapmatic title: Neuer Snapmatic Titel: - + Snapmatic Crew Snapmatic Crew - + New Snapmatic crew: Neue Snapmatic Crew: @@ -2053,18 +2149,18 @@ Exportieren als: - - + + Delete picture Bild löschen - + Are you sure to delete %1 from your Snapmatic pictures? Bist du sicher %1 von deine Snapmatic Bilder zu löschen? - + Edi&t Bearbei&ten @@ -2077,7 +2173,7 @@ Exportieren als: &Im Spiel deaktivieren - + &Export &Exportieren @@ -2090,12 +2186,12 @@ Exportieren als: Exportiere als &GTA Snapmatic - + Show &In-game &Im Spiel anzeigen - + Hide &In-game &Im Spiel ausblenden @@ -2128,32 +2224,32 @@ Exportieren als: Exportiere als &Snapmatic... - + &View A&nsehen - + &Remove Entfe&rnen - + &Select Au&swählen - + &Deselect A&bwählen - + Select &All Alles &auswählen - + &Deselect All Alles a&bwählen @@ -2201,7 +2297,7 @@ Exportieren als: Bist du sicher %1 von deinen Snapmatic Bilder zu löschen? - + Failed at deleting %1 from your Snapmatic pictures Fehlgeschlagen beim Löschen von %1 von deinen Snapmatic Bildern @@ -2499,7 +2595,7 @@ Exportieren als: - + Select GTA V Folder... diff --git a/res/gta5sync_en_US.qm b/res/gta5sync_en_US.qm index a017ab7fb6f68d45df27e8578c6f80bd1e12bf79..f097a03af3f3321ccba17fb238037e4e7d104ed9 100644 GIT binary patch delta 2332 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 CrewDatabase + No Crew @@ -237,12 +238,14 @@ Pictures and Savegames + Custom Avatar Custom Avatar Description in SC, don't use Special Character! + Custom Picture Custom Picture Description in SC, don't use Special Character! @@ -264,6 +267,24 @@ When you want to use it as Avatar the image will be detached! Select Color... + + JsonEditorDialog + + + Snapmatic JSON Editor + + + + + &Save + + + + + &Close + + + MapLocationDialog @@ -297,7 +318,7 @@ When you want to use it as Avatar the image will be detached! - + X: %1 Y: %2 X and Y position @@ -437,106 +458,131 @@ Y: %2 Name + + + Language for Areas + + + + + Style + + + + + Style: + + + + + Font + + + + + Always use Message Font (Windows 2003 and earlier) + + - Language - + Interface + - Interface + Language for Interface - - + + Current: %1 - - Areas + + Use Default Style (Restart) - + Sync - + Sync is not implemented at current time - + Apply changes - + &OK OK, Cancel, Apply - + Discard changes - + &Cancel OK, Cancel, Apply - + %1 (Next Closest Language) First language a person can talk with a different person/application. "Native" or "Not Native". - + System System in context of System default - + %1 (Closest to Interface) Next closest language compared to the Interface - + Auto Automatic language choice. - + %1 %1 - + The new Custom Folder will initialise after you restart %1. The new Custom Folder will initialize after you restart %1. - + No Profile No Profile, as default - - - + + + Profile: %1 @@ -577,66 +623,67 @@ Y: %2 - - + + Export as &Picture... - - + + Export as &Snapmatic... - - Open &Map View... - - - - - + + &Edit Properties... - + + + Open &Map Viewer... + + + + Key 1 - Avatar Preview Mode Key 2 - Toggle Overlay Arrow Keys - Navigate - - + + Snapmatic Picture Viewer - - + + Failed at %1 - - + + No Players - - + + No Crew - + Unknown Location - + Avatar Preview Mode Press 1 for Default View @@ -744,6 +791,12 @@ Press 1 for Default View Exported Snapmatic to "%1" because of using the .auto extension. + + + + Open &JSON Editor... + + ProfileInterface @@ -790,207 +843,207 @@ Press 1 for Default View - + Enabled pictures: %1 of %2 - + Loading... - - + + Import... - - - - - - - - - - - - - + + + + + + + + + + + + + Import - + Importable files (%1) - + GTA V Export (*.g5e) - + Savegames files (SGTA*) - + Snapmatic pictures (PGTA*) - + All image files (%1) - + All files (**) - - + + No valid file is selected - - + + Import file %1 of %2 files - + Import failed with... %1 - + Failed to read Snapmatic picture - + Failed to read Savegame file - + Can't import %1 because file can't be parsed properly - + Can't import %1 because file format can't be detected - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e - + Failed to import the Snapmatic picture, the picture is already in the game - + Failed to import the Snapmatic picture, can't copy the file into profile - + Failed to import the Savegame, can't copy the file into profile - + Failed to import the Savegame, no Savegame slot is left - - - - + + + + Export selected - - + + JPG pictures and GTA Snapmatic - - + + JPG pictures only - - + + GTA Snapmatic only - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: - + Export selected... - + Initialising export... Initializing export... - + Export failed with... %1 - - + + No Snapmatic pictures or Savegames files are selected - - - + + + Remove selected - + You really want remove the selected Snapmatic picutres and Savegame files? - + Failed at remove the complete selected Snapmatic pictures and/or Savegame files @@ -1003,15 +1056,20 @@ Press 1 for Default View QApplication - + Font - + Selected Font: %1 + + + <h4>Welcome to %1!</h4>You want to configure %1 before you start using it? + + SavegameDialog @@ -1086,37 +1144,37 @@ Press 1 for Default View - + &View - + &Export - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All @@ -1210,8 +1268,13 @@ Press 1 for Default View - - + + + + + + + Snapmatic Properties @@ -1257,20 +1320,20 @@ Press 1 for Default View - + Crew: %1 (%2) - + Title: %1 (%2) - - + + Appropriate: %1 @@ -1300,46 +1363,59 @@ Press 1 for Default View - - + + Edit - + Yes Yes, should work fine - + No No, could lead to issues - - + + <h4>Unsaved changes detected</h4>You want to save the JSON content before you quit? + + + + + + Patching of Snapmatic Properties failed because of JSON Error + + + + + + + Patching of Snapmatic Properties failed because of I/O Error - + Snapmatic Title - + New Snapmatic title: - + Snapmatic Crew - + New Snapmatic crew: @@ -1396,8 +1472,8 @@ Press 1 for Default View - - + + Delete picture @@ -1407,62 +1483,62 @@ Press 1 for Default View - + Edi&t - + Show &In-game - + Hide &In-game - + &Export - + &View - + &Remove - + &Select - + &Deselect - + Select &All - + &Deselect All - + Are you sure to delete %1 from your Snapmatic pictures? - + Failed at deleting %1 from your Snapmatic pictures @@ -1646,7 +1722,7 @@ Press 1 for Default View - + Select GTA V Folder... diff --git a/res/gta5sync_fr.qm b/res/gta5sync_fr.qm index 1750a3e81909b81a84f8b685ddb765cde1b67899..53ccfdd44cfc6d84d33aeda2d23be8b26914b9f8 100644 GIT binary patch delta 1994 zcmXAqeN+_Z6~>=kW|*Cs{SaBQQNcv05f&tfd`J}JLqNJLi0(o~5RE}=6-ZTxo}P3u znkHIAn=P6~jDeyDh1L%wdV-n*Xj8O`5NotGCNYv|NTX6|3^Ce=Gk^VN-9fzV49wL!Sz0{k9p^dv+`{)7rC9q$bO#TG>w^2Yr z48l)k0nZd5d^BESfX3VoB+f{O2h%c;u@afDlkur=w2*ll;3>!h0v!1Lp?+4d z8~a}J0}_^^bqm#yig0|Sl7Y`);4;5g197`i1hNKjzdQ#B`Anx=j{s&q(U{Yq(fzS5 z=s++q=C*Em{%|&6o2*+q{Q;0ZTlZ@HVjw6@ch5xGqp#_UKBC<7{-iH^-32UsMgQKC zX~4t@8fO~x&95Y|CCM7oYrGe9HczYmU|b#W+>pkEZjJ6e`qrfbK++n0dpmVbDbv5- z6#^tL)1MZ?SYD34XQu_2bWz{?YrZe~TK`#(gMFyd-`sBnToL*oqx{*}WFL9|KY{sw z_ld0>=6a)#yY)?AoYQA}fed)Yyy0`Pn(0et1YeapO)L>&e|&)rTP4J&aKoHIVcv|r zKx($|rr!dl-z?N@WkZb8kkbRmS6+WSD^3X-xE?k2f!kxYJ1{)YU4JVZVrzZ6=w zb61g#)UlyO4nFvB!6URr>|@2}G|u~4Xl*G5d~XPcHWdKMDxpJtkz*ykvDUve0j*VKYF|Jx;$~`IcQ8)c+m8SlMoHW(@ zlaI}FNm}&<-8dy&s`%t45PVef1*)vo<^tj<}2NN(Kk!>G#0y+M&?bBo)FhPFq zVF>+|B!{hM0Oh(yzZN-jS1l7Qm5Ze|mRT#mxQmIVRmiL7(k^b7ym~q5E6QuWkLK7p z<#lg$(GG?&a!q6`=lL7CsWS&CepT*C_Rtohe5vT?Z0iI0N@P3`=#=kXVMQgK?>c3#mHbg*c_R>KGue z(3miyaaMuGoDt>9Gj0|bqFg;V1X!jhw~qDzG24_o=RI^zj8)aW|6BHSr8@4|S$^=j zTG+=*5;N6JW-1WyH?=0#MIYMLnv4NpmRDnLyjuG>kOuEnx8oKkEm5tr@xpNgtM%cV z`CXsJ+$!~S8RM3elH6Y+t7nq#&~triZ~i(Syx6Sv?i;_a#fole zwCpqr@1(Oe8Af?<7?@gRw7%ibUS=7CPLAiF&mv=Z=zm$rpmD8($~=F-`yXH1xOQW` zPM~x0jZGG&72jz5;O<)9lX2c4$>wpJ?EkLgS?#9yEgU0bp2o4)OvxttEiA&6y74lN zY%{s6Y-h*{jWdEx$4_x6C;p%@I?>dPF@ IczlZU|3{rGkN^Mx delta 2029 zcmXAqeNr6y>l4`VMhgDl2v&TLKKiUnbXVyF6Y?jLhL_vQCI_j#W0 z^E|Wj3*qC7!ahIOMF1}XYK>0&CxBrGpd|z1CBSzDU|I!a?E!+L`MehhOW^s>bb1E> zi@kaOK&SUgplk@pI|}jecAy{xVxI`Cd=sLFEPVmuSl&H_>?KA5bho`eYg}G%#%GjOeAZKC^?w=tuFu?;jUqQ)rNWOe|P-07&%_ciYym zgEoncuTePBYn5&I7;1v0Be&$c&!K#$H9 zAvz1|M9-<6d@qSVIQ!U{W8%Y+b7X_~^M}#Y_?2#qtROm?t{?dH^bZES;Y&ACTBz^W7G{1eR4_bYRC+uLl1 zCI05E0~PGEcgzisU1k52nEMAgMmg)vXV0+u!7rJ|`xuD#bF%&80lxoIwtth%{<uY9f3wpq?>X=1=3vQz5jSgw{gwlLtdCGwUmwvA)Dyrq)#GRe>X6vcK( zu*r4%se;)@Zj6ZLJpV)P7{~{lDe`c#3rHH4FP1(*c~8lgBVsAPO&-6@%*u9=hsci< zVT=JRA67K~c~tX)GB+=ZAO1v{-@t`3FH(tI%F3l@DG8OW4CF_hYx1Ya4>)%yd80g- zwp}S6_XgG%D$jrw@XJ#EmQ4e7zfSFj&WtAIRG>c))2^Hwt7icBmGh|r7tW;O+13Nd zRXXGPbtVSr%5} z4f`|Cxpl6JSNp5!w=9ID{rdCj8Q1brV4+*})bYd45q0FP3Ly70^nk9}V; zqnkRdYc1m6Gk8w1$YT>gc)Z2$)oIi++cN8;nf%k4V+jks&xDRyYI9hb$Ez)S(%iJy zEG^-@R~A}Y1(B>kdXrBJ7Dm6oirDTD85sXH!lg0E>sev~pOOlRzO+6SjO!Lv{6j1sh=b^bh` zq}{Bc-_V0jZ*gh~hLw8vZ1@8!5u-C{i*@E78Q9`h>+*ZlHe=XYGjf6%_FA89q6BiA zwf$EIuwtXN^E@5-wOfZyv2u}h)`>SG`23%Awjsa!o|LY2Z}Wde>|QW4P?&8&F3M4Z fD%7LGJhe-`_%r90*HqP)S2f$FPw!3*NXh#Rq+lm9 diff --git a/res/gta5sync_fr.ts b/res/gta5sync_fr.ts index caa233d..096568d 100644 --- a/res/gta5sync_fr.ts +++ b/res/gta5sync_fr.ts @@ -223,6 +223,7 @@ et les fichiers de sauvegarde de Grand Theft Auto V CrewDatabase + No Crew Aucun crew @@ -362,12 +363,14 @@ et les fichiers de sauvegarde de Grand Theft Auto V + Custom Avatar Custom Avatar Description in SC, don't use Special Character! + Custom Picture Custom Picture Description in SC, don't use Special Character! @@ -389,6 +392,24 @@ When you want to use it as Avatar the image will be detached! + + JsonEditorDialog + + + Snapmatic JSON Editor + + + + + &Save + + + + + &Close + + + MapLocationDialog @@ -422,7 +443,7 @@ When you want to use it as Avatar the image will be detached! - + X: %1 Y: %2 X and Y position @@ -570,56 +591,85 @@ Y: %2 Nom - + + Language for Areas + + + + + Style + + + + + Style: + + + + + Font + Police + + + + Always use Message Font (Windows 2003 and earlier) + + + Language - Langue + Langue + + + + Interface + - Interface + Language for Interface - - + + Current: %1 - - Areas + + Use Default Style (Restart) - + Sync Synchronisation - + Sync is not implemented at current time La synchronisation n'est pas encore implémentée - + Apply changes - + &OK OK, Cancel, Apply &OK - + Discard changes - + &Cancel OK, Cancel, Apply &Annuler @@ -635,37 +685,37 @@ Y: %2 Système - + %1 (Next Closest Language) First language a person can talk with a different person/application. "Native" or "Not Native". - + System System in context of System default Système - + %1 (Closest to Interface) Next closest language compared to the Interface - + Auto Automatic language choice. - + %1 %1 %1 - + The new Custom Folder will initialise after you restart %1. @@ -678,15 +728,15 @@ Y: %2 Le changement de langue sera actif au prochain lancement de %1. - + No Profile No Profile, as default Aucun profil - - - + + + Profile: %1 Profil : %1 @@ -852,8 +902,8 @@ Y: %2 Exporter comme image &JPG... - - + + Export as &Picture... @@ -862,8 +912,8 @@ Y: %2 Exporter comme &GTA Snapmatic... - - + + Export as &Snapmatic... @@ -872,18 +922,19 @@ Y: %2 Édi&ter - - Open &Map View... - - - - - + + &Edit Properties... Modifier les &propriétés... - + + + Open &Map Viewer... + + + + Key 1 - Avatar Preview Mode Key 2 - Toggle Overlay Arrow Keys - Navigate @@ -892,31 +943,31 @@ Touche 2 - Activer/désactiver l'overlay Touches fléchées - Naviguer - - + + Snapmatic Picture Viewer Visionneuse de photo Snapmatic - - + + Failed at %1 Echec de %1 - - + + No Crew Aucun crew - - + + No Players Aucun joueurs - + Avatar Preview Mode Press 1 for Default View Mode Aperçu Avatar @@ -935,7 +986,7 @@ Appuyer sur 1 pour le mode par défaut Aucun crew - + Unknown Location Emplacement inconnu @@ -968,6 +1019,12 @@ Appuyer sur 1 pour le mode par défaut Failed to export current Snapmatic picture Échec de l'export de la photo Snapmatic + + + + Open &JSON Editor... + + ProfileInterface @@ -1018,35 +1075,35 @@ Appuyer sur 1 pour le mode par défaut Copie du fichier %1 sur %2 - + Enabled pictures: %1 of %2 Photos activées : %1 sur %2 - + Loading... Chargement... - - + + Import... Importer... - - - - - - - - - - - - - + + + + + + + + + + + + + Import Importer @@ -1055,36 +1112,36 @@ Appuyer sur 1 pour le mode par défaut Fichiers de profil GTA (SGTA* PGTA*) - + Savegames files (SGTA*) Fichiers de sauvegarde GTA (SGTA*) - + Snapmatic pictures (PGTA*) Photos Snapmatic (PGTA*) - + All image files (%1) - + All files (**) Tous les fichiers (**) - - + + Import file %1 of %2 files Importation du fichier %1 sur %2 - + Import failed with... %1 @@ -1093,25 +1150,25 @@ Appuyer sur 1 pour le mode par défaut %1 - - + + No valid file is selected Fichier invalide - + Importable files (%1) - + Failed to read Snapmatic picture Impossible d'ouvrir la photo Snapmatic - + Failed to read Savegame file Impossible de lire le fichier de sauvegarde @@ -1133,78 +1190,78 @@ Appuyer sur 1 pour le mode par défaut Tous les fichiers image (*.jpg *.png) - + Can't import %1 because file can't be parsed properly - + Can't import %1 because file format can't be detected - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Impossible d'importer la photo Snapmatic,nom de fichier incorrect (PGTA*, *.g5e) - + Failed to import the Snapmatic picture, the picture is already in the game Impossible d'importer la photo Snapmatic, un fichier du même nom existe déjà - + Failed to import the Snapmatic picture, can't copy the file into profile Impossible d'importer la photo Snapmatic, impossible de copier le fichier dans le profil - + Failed to import the Savegame, can't copy the file into profile Impossible d'importer la sauvegarde, impossible de copier le fichier dans le profil - + Failed to import the Savegame, no Savegame slot is left Impossible d'importer la sauvegarde, aucun emplacement libre - - - - + + + + Export selected Exporter la sélection - - + + JPG pictures and GTA Snapmatic Images JPG et GTA Snapmatic - - + + JPG pictures only Images JPG seulement - - + + GTA Snapmatic only GTA Snapmatic seulement - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1Exporter les photos Snapmatic%2<br><br>Les fichiers JPG permettent d'ouvrir les photos avec une visionneuse d'images<br>Les GTA Snapmatic permettent d'importer les photos dans le jeu<br><br>Exporter comme : - + Export selected... Exporter la sélection... - + Initialising export... @@ -1213,7 +1270,7 @@ Appuyer sur 1 pour le mode par défaut Initialisation de l'export... - + Export failed with... %1 @@ -1222,25 +1279,25 @@ Appuyer sur 1 pour le mode par défaut %1 - - + + No Snapmatic pictures or Savegames files are selected Aucun fichier de sauvegarde ou photo Snapmatic sélectionné - - - + + + Remove selected Supprimer la sélection - + You really want remove the selected Snapmatic picutres and Savegame files? Supprimer la sélection ? - + Failed at remove the complete selected Snapmatic pictures and/or Savegame files Impossible de supprimer la sélection @@ -1250,7 +1307,7 @@ Appuyer sur 1 pour le mode par défaut Tous les fichiers de profil (*.g5e SGTA* PGTA*) - + GTA V Export (*.g5e) GTA V Export (*.g5e) @@ -1259,15 +1316,20 @@ Appuyer sur 1 pour le mode par défaut QApplication - + Font Police - + Selected Font: %1 Police sélectionnée : %1 + + + <h4>Welcome to %1!</h4>You want to configure %1 before you start using it? + + SavegameDialog @@ -1342,7 +1404,7 @@ Appuyer sur 1 pour le mode par défaut Supprimer - + &Export &Exporter @@ -1433,32 +1495,32 @@ Appuyer sur 1 pour le mode par défaut Impossible de supprimer %1 - + &View &Voir - + &Remove &Supprimer - + &Select &Sélectionner - + &Deselect &Déselectionner - + Select &All Sélectionner to&ut - + &Deselect All &Déselectionner tout @@ -1468,8 +1530,13 @@ Appuyer sur 1 pour le mode par défaut - - + + + + + + + Snapmatic Properties Propriétés Snapmatic @@ -1513,7 +1580,7 @@ Appuyer sur 1 pour le mode par défaut Meme - + Snapmatic Title Titre Snapmatic @@ -1524,20 +1591,20 @@ Appuyer sur 1 pour le mode par défaut - + Crew: %1 (%2) Crew : %1 (%2) - + Title: %1 (%2) Titre : %1 (%2) - - + + Appropriate: %1 Valide : %1 @@ -1567,43 +1634,56 @@ Appuyer sur 1 pour le mode par défaut A&nnuler - - + + Edit Éditer - + Yes Yes, should work fine Oui, devrait fonctionner Oui - + No No, could lead to issues Non, pourrait causer des erreurs Non - - + + <h4>Unsaved changes detected</h4>You want to save the JSON content before you quit? + + + + + + Patching of Snapmatic Properties failed because of JSON Error + + + + + + + Patching of Snapmatic Properties failed because of I/O Error La modification des propriétés Snapmatic a échoué : erreur d'entrée/sortie - + New Snapmatic title: Nouveau titre Snapmatic : - + Snapmatic Crew Crew Snapmatic - + New Snapmatic crew: Nouveau crew Snapmatic : @@ -1660,8 +1740,8 @@ Appuyer sur 1 pour le mode par défaut - - + + Delete picture Supprimer la photo @@ -1671,27 +1751,27 @@ Appuyer sur 1 pour le mode par défaut Supprimer - + Are you sure to delete %1 from your Snapmatic pictures? Supprimer %1 ? - + Failed at deleting %1 from your Snapmatic pictures Impossible de supprimer %1 - + Edi&t Édi&ter - + Show &In-game &Visible en jeu - + Hide &In-game &Invisible en jeu @@ -1700,7 +1780,7 @@ Appuyer sur 1 pour le mode par défaut Modifier les &propriétés... - + &Export &Exporter @@ -1713,32 +1793,32 @@ Appuyer sur 1 pour le mode par défaut Exporter comme &GTA Snapmatic... - + &View &Voir - + &Remove S&upprimer - + &Select &Sélectionner - + &Deselect &Déselectionner - + Select &All Sélectionner &tout - + &Deselect All &Déselectionner tout @@ -1912,7 +1992,7 @@ Appuyer sur 1 pour le mode par défaut - + Select GTA V Folder... diff --git a/res/gta5sync_ru.qm b/res/gta5sync_ru.qm index 8579c33255d6edb154d0109202a0e5d00730acbe..71a4dafadf758d144676dcffe6583704e8e702e4 100644 GIT binary patch delta 2372 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 C@}nI9 diff --git a/res/gta5sync_ru.ts b/res/gta5sync_ru.ts index f73b9a3..272f721 100644 --- a/res/gta5sync_ru.ts +++ b/res/gta5sync_ru.ts @@ -184,6 +184,7 @@ Grand Theft Auto V Snapmatic картинок и сохраненийCrewDatabase + No Crew Вне банды @@ -325,12 +326,14 @@ Grand Theft Auto V Snapmatic картинок и сохранений + Custom Avatar Custom Avatar Description in SC, don't use Special Character! + Custom Picture Custom Picture Description in SC, don't use Special Character! @@ -352,6 +355,24 @@ When you want to use it as Avatar the image will be detached! Выбрать цвет... + + JsonEditorDialog + + + Snapmatic JSON Editor + + + + + &Save + + + + + &Close + &Закрыть + + MapLocationDialog @@ -392,7 +413,7 @@ Y: %2 - + X: %1 Y: %2 X and Y position @@ -534,56 +555,85 @@ Y: %2 Имя - + + Language for Areas + + + + + Style + + + + + Style: + + + + + Font + Шрифт + + + + Always use Message Font (Windows 2003 and earlier) + + + Language - Язык + Язык + + + + Interface + - Interface + Language for Interface - - + + Current: %1 - - Areas + + Use Default Style (Restart) - + Sync Sync - + Sync is not implemented at current time Синхронизация пока ещё не реализована - + Apply changes Применить изменения - + &OK OK, Cancel, Apply &ОК - + Discard changes Отвергнуть изменения - + &Cancel OK, Cancel, Apply От&мена @@ -600,37 +650,37 @@ Y: %2 %1 (%2 если имеется) - + %1 (Next Closest Language) First language a person can talk with a different person/application. "Native" or "Not Native". - + System System in context of System default Система - + %1 (Closest to Interface) Next closest language compared to the Interface - + Auto Automatic language choice. - + %1 %1 %1 - + The new Custom Folder will initialise after you restart %1. Другая папка будет загружена после перезапуска %1. @@ -643,15 +693,15 @@ Y: %2 Язык изменится после перезапуска %1. - + No Profile No Profile, as default Нет профиля - - - + + + Profile: %1 Профиль: %1 @@ -731,8 +781,8 @@ Y: %2 Эксп&ортировать как картинку JPG... - - + + Export as &Picture... Экспортировать как &картинку... @@ -741,8 +791,8 @@ Y: %2 Экс&портировать как GTA Snapmatic... - - + + Export as &Snapmatic... Экспортировать как &Snapmatic... @@ -751,18 +801,23 @@ Y: %2 &Правка - Open &Map View... - Открыть &карту... + Открыть &карту... - - + + &Edit Properties... &Изменить свойства... - + + + Open &Map Viewer... + + + + Key 1 - Avatar Preview Mode Key 2 - Toggle Overlay Arrow Keys - Navigate @@ -771,31 +826,31 @@ Arrow Keys - Navigate Стрелки - Навигация - - + + Snapmatic Picture Viewer Просмотрщик фотографий Snapmatic - - + + Failed at %1 Ошибка при %1 - - + + No Crew Вне банды - - + + No Players Игроков нет - + Avatar Preview Mode Press 1 for Default View Режим просмотра аватарок @@ -810,7 +865,7 @@ Press 1 for Default View Без группы - + Unknown Location Неизвестное место @@ -947,6 +1002,12 @@ Press 1 for Default View Failed to copy current Snapmatic picture Не удалось скопировать текущую картинку Snapmatic + + + + Open &JSON Editor... + + ProfileInterface @@ -998,30 +1059,30 @@ Press 1 for Default View Закрыть профиль - + Loading... Загрузка... - - + + Import... Импортировать... - - - - - - - - - - - - - + + + + + + + + + + + + + Import Импортировать @@ -1030,31 +1091,31 @@ Press 1 for Default View Все файлы профиля (SGTA* PGTA*) - + Savegames files (SGTA*) Файлы сохранения (SGTA*) - + Snapmatic pictures (PGTA*) Картинка Snapmatic (PGTA*) - + All files (**) Все файлы (**) - - + + Import file %1 of %2 files Импортируются файлы %1 из %2 - + Import failed with... %1 @@ -1063,13 +1124,13 @@ Press 1 for Default View %1 - + Failed to read Snapmatic picture Не удалось загрузить картинку Snapmatic - + Failed to read Savegame file Не удалось загрузить файл сохранения @@ -1079,14 +1140,14 @@ Press 1 for Default View Не получилось импортировать %1 из-за неправильного формата файла - - + + No valid file is selected Выбранный файл неверен - + Enabled pictures: %1 of %2 Включенные картинки: %1 из %2 @@ -1099,93 +1160,93 @@ Press 1 for Default View Все изображения (*.jpg *.png) - + Importable files (%1) Файлы для импорта (%1) - + All image files (%1) Все файлы изображений (%1) - + Can't import %1 because file can't be parsed properly Не получилось импортировать %1, файл не может быть правильно обработан - + Can't import %1 because file format can't be detected Не получилось импортировать %1, не удалось определить формат файла - + Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e Не удалось импортировать картинку Snapmatic, название не начинается с PGTA или не заканчивается с .g5e - + Failed to import the Snapmatic picture, the picture is already in the game Не удалось импортировать картинку Snapmatic, картинка уже в игре - + Failed to import the Snapmatic picture, can't copy the file into profile Не удалось импортировать картинку Snapmatic, не получилось скопировать файл в профиль - + Failed to import the Savegame, can't copy the file into profile Не удалось импортировать сохранение, не получилось скопировать файл в профиль - + Failed to import the Savegame, no Savegame slot is left Не удалось импортировать сохранение, нет пустых ячеек под сохранения - - + + JPG pictures and GTA Snapmatic Картинки JPG и GTA Snapmatic - - + + JPG pictures only Только картинки JPG - - + + GTA Snapmatic only Только GTA Snapmatic - + Initialising export... Подготовка к экспорту... - - + + No Snapmatic pictures or Savegames files are selected Не выделены ни один Snapmatic или сохранение - - - + + + Remove selected Снять выделение - + You really want remove the selected Snapmatic picutres and Savegame files? Точно ли хочешь удалить выбранные картинки Snapmatic и файлы сохранений? - + Failed at remove the complete selected Snapmatic pictures and/or Savegame files Не удалось удалить полностью выбранные картинки Snapmatic и/или файлы сохранений @@ -1206,20 +1267,20 @@ Press 1 for Default View Не получилось имортировать копию сохранения, потому что не осталось свободных под них слотов - - - - + + + + Export selected Экспортировать выделенное - + %1Export Snapmatic pictures%2<br><br>JPG pictures make it possible to open the picture with a Image Viewer<br>GTA Snapmatic make it possible to import the picture into the game<br><br>Export as: %1Эскпортировать картинки Snapmatic%2<br><br>Картинки JPG можно открыть любым просмотрщиком<br>Картинки формата GTA Snapmatic можно снова импортировать в игру<br><br>Экспортировать как: - + Export selected... Экпортировать выделенное... @@ -1228,7 +1289,7 @@ Press 1 for Default View Подготавливаю эскпорт... - + Export failed with... %1 @@ -1249,7 +1310,7 @@ Press 1 for Default View Все файлы профиля (*.g5e SGTA* PGTA*) - + GTA V Export (*.g5e) GTA V Export (*.g5e) @@ -1258,15 +1319,20 @@ Press 1 for Default View QApplication - + Font Шрифт - + Selected Font: %1 Выбранный шрифт: %1 + + + <h4>Welcome to %1!</h4>You want to configure %1 before you start using it? + + SavegameDialog @@ -1400,32 +1466,32 @@ Press 1 for Default View Не удалось удалить сохранение %1 - + &View &Просмотр - + &Remove &Удалить - + &Select &Выбрать - + &Deselect Сн&ять выбор - + Select &All В&ыбрать все - + &Deselect All Снять выбо&р со всех @@ -1435,7 +1501,7 @@ Press 1 for Default View Копировать сохранение - + &Export &Экспортировать @@ -1495,8 +1561,13 @@ Press 1 for Default View - - + + + + + + + Snapmatic Properties Свойства Snapmatic @@ -1537,7 +1608,7 @@ Press 1 for Default View - + Crew: %1 (%2) Банда: %1 (%2) @@ -1547,20 +1618,20 @@ Press 1 for Default View Meme - + Snapmatic Title Заголовок Snapmatic - + Title: %1 (%2) Заголовок: %1 (%2) - - + + Appropriate: %1 Подходит: %1 @@ -1590,41 +1661,54 @@ Press 1 for Default View &Отмена - - + + Edit Правка - + Yes Yes, should work fine Да - + No No, could lead to issues Нет - - + + <h4>Unsaved changes detected</h4>You want to save the JSON content before you quit? + + + + + + Patching of Snapmatic Properties failed because of JSON Error + + + + + + + Patching of Snapmatic Properties failed because of I/O Error Не удалось измененить свойства Snapmatic из-за проблемы ввода/вывода - + New Snapmatic title: Новый заголовок Snapmatic: - + Snapmatic Crew Банда на Snapmatic - + New Snapmatic crew: Новая банда на Snapmatic: @@ -1676,33 +1760,33 @@ Press 1 for Default View - - + + Delete picture Удалить картинку - + Are you sure to delete %1 from your Snapmatic pictures? Уверены, что хотите удалить %1 из коллекции картинок Snapmatic? - + Failed at deleting %1 from your Snapmatic pictures Не удалось удалить %1 из колелкции картинок Snapmatic - + Edi&t &Правка - + Show &In-game Показывать в &игре - + Hide &In-game Ск&рыть в игре @@ -1711,7 +1795,7 @@ Press 1 for Default View &Изменить свойства... - + &Export &Экспорт @@ -1724,32 +1808,32 @@ Press 1 for Default View Экс&портировать как GTA Snapmatic... - + &View По&казать - + &Remove У&далить - + &Select &Выделить - + &Deselect Сн&ять выделение - + Select &All В&ыбрать все - + &Deselect All Снять выбо&р со всех @@ -1977,7 +2061,7 @@ Press 1 for Default View - + Select GTA V Folder...