From ed559f3ce9e97f2c00f7e6d2ed9387959883a257 Mon Sep 17 00:00:00 2001 From: Syping <schiedelrafael@keppe.org> Date: Mon, 1 May 2017 05:05:55 +0200 Subject: [PATCH] DPI awareness and latest changes from gta5sync --- .travis.yml | 6 +- AboutDialog.cpp | 5 + AppEnv.cpp | 18 ++- AppEnv.h | 3 + ImportDialog.cpp | 12 +- ImportDialog.h | 2 + OptionsDialog.cpp | 4 + PictureDialog.cpp | 72 +++++++--- ProfileInterface.cpp | 6 + ProfileInterface.ui | 9 +- SavegameDialog.cpp | 5 + SavegameDialog.ui | 2 +- SavegameWidget.cpp | 8 ++ SavegameWidget.ui | 7 +- SnapmaticEditor.cpp | 5 + SnapmaticPicture.cpp | 1 + SnapmaticWidget.cpp | 4 + UserInterface.cpp | 11 +- config.h | 4 +- gta5view.pro | 6 +- lang/gta5sync_ru.ts | 336 +++++++++++++++++++++++-------------------- res/app.rc | 8 +- res/gta5view.desktop | 22 +-- res/gta5view.png | Bin 0 -> 7189 bytes 24 files changed, 343 insertions(+), 213 deletions(-) create mode 100644 res/gta5view.png diff --git a/.travis.yml b/.travis.yml index a4bbfb3..9a051ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,15 +24,15 @@ before_script: - echo "Grand Theft Auto V Snapmatic and Savegame viewer" > ./description-pak script: - - qmake -qt=5 "DEFINES+=GTA5SYNC_BUILDTYPE=\\\\\\\"Developer\\\\\\\"" "DEFINES+=GTA5SYNC_DAILYB=\\\\\\\"$PACKAGE_VERSION-dev2\\\\\\\"" ../gta5view.pro + - qmake -qt=5 "DEFINES+=GTA5SYNC_BUILDTYPE=\\\\\\\"Developer\\\\\\\"" "DEFINES+=GTA5SYNC_DAILYB=\\\\\\\"$PACKAGE_VERSION-dev4\\\\\\\"" ../gta5view.pro - make -j 4 - - sudo checkinstall -D --default --nodoc --pkgname=gta5view --pkgversion=$PACKAGE_VERSION --pkgrelease=dev2 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5 --pakdir=../package + - sudo checkinstall -D --default --nodoc --pkgname=gta5view --pkgversion=$PACKAGE_VERSION --pkgrelease=dev4 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5 --pakdir=../package deploy: provider: releases api_key: secure: "o7VneEz1aHfdVwZvOZLfopf6uJWNrFsZaBvunTmXFzpmNFhlNS1qwqgMUkIA2yBRbZ3wIzVs4vfwIHv7W9yE/PqK+AYL+R8+AwKGrwlgT4HqJNuk6VM/LNJ6GwT/qkQuaoOVw29bUjmzzgIRdHmw53SlJv6Hh1VE8HphlTT//aex6nCfcFhUZ0BETdZDWz5FSHwL3NalUoqfKfQrJeky5RXzCyCANQC2tKt0bV46GaWIgWrDo2KCTNqPtRWWf5GDmnkXE5IYRMQ3mXvO9iYh0v5Y2jo4PiXGUiFUU6Z3aAWFAiPdGclrBO697cf3lCTzDMhuCETR153qFYsLShUlFf61ITAmCeHAWETjZDri0lmPONo3GoNB6alGfYEA51qw14kXakrTpICtTJj7gw/gtUYOabW6hrzmieNzMBIy62RikDPjyakFnuwW2qNHRlD65e0jYv+6nCpb6E+OV16Ysh1zhV2vTfpfzVmSuyu2J+ELqXD3OZCXRSPpDIih9UQ8335p8FBji6jHORcgym/TRgdgRmENibh8tLzWp+UjpWHuWfcpvZgOskjfwU0iDMCayMJ7tDpOhXHcAhDRnd6XRIiOJ5YZCzflj2nEwmt3YUd7DwXS/AU+WHOmcNQBjXBxF/FJa35XXcy3HKJM5TTKqtph3medo30us5yXHeG6NNg=" - file: "../package/gta5view_$PACKAGE_VERSION-dev2_amd64.deb" + file: "../package/gta5view_$PACKAGE_VERSION-dev4_amd64.deb" skip_cleanup: true on: tags: true diff --git a/AboutDialog.cpp b/AboutDialog.cpp index 871d21a..31edc7d 100755 --- a/AboutDialog.cpp +++ b/AboutDialog.cpp @@ -19,6 +19,7 @@ #include <QStringBuilder> #include "AboutDialog.h" #include "ui_AboutDialog.h" +#include "AppEnv.h" #include "config.h" AboutDialog::AboutDialog(QWidget *parent) : @@ -51,6 +52,10 @@ AboutDialog::AboutDialog(QWidget *parent) : { ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); } + + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + resize(375 * screenRatio, 260 * screenRatio); } AboutDialog::~AboutDialog() diff --git a/AppEnv.cpp b/AppEnv.cpp index 52ba5fd..d5b9c08 100755 --- a/AppEnv.cpp +++ b/AppEnv.cpp @@ -20,10 +20,14 @@ #include "AppEnv.h" #include "StringParser.h" #include "StandardPaths.h" -#include <QDir> -#include <QDebug> #include <QtGlobal> +#include <QDesktopWidget> +#include <QApplication> #include <QSettings> +#include <QScreen> +#include <QDebug> +#include <QRect> +#include <QDir> #include <iostream> using namespace std; @@ -130,3 +134,13 @@ QUrl AppEnv::getPlayerFetchingUrl(QString crewID, QString pageNumber) { return QUrl(QString("https://socialclub.rockstargames.com/crewsapi/GetMembersList?crewId=%1&pageNumber=%2").arg(crewID, pageNumber)); } + +qreal AppEnv::screenRatio() +{ +#if QT_VERSION >= 0x050000 + qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch(); +#else + qreal dpi = qApp->desktop()->logicalDpiX(); +#endif + return (dpi / 96); +} diff --git a/AppEnv.h b/AppEnv.h index 56aefcd..332b6e1 100755 --- a/AppEnv.h +++ b/AppEnv.h @@ -37,6 +37,9 @@ public: static QByteArray getUserAgent(); static QUrl getCrewFetchingUrl(QString crewID); static QUrl getPlayerFetchingUrl(QString crewID, QString pageNumber); + + // Screen Stuff + static qreal screenRatio(); }; #endif // APPENV_H diff --git a/ImportDialog.cpp b/ImportDialog.cpp index ebce66c..19de296 100644 --- a/ImportDialog.cpp +++ b/ImportDialog.cpp @@ -18,6 +18,7 @@ #include "ImportDialog.h" #include "ui_ImportDialog.h" +#include "AppEnv.h" #include <QPainter> #include <QPixmap> #include <QImage> @@ -26,8 +27,6 @@ // IMAGES VALUES #define snapmaticResolutionW 960 #define snapmaticResolutionH 536 -#define snapmaticResolutionLW 430 -#define snapmaticResolutionLH 240 #define snapmaticAvatarResolution 470 #define snapmaticAvatarPlacementW 145 #define snapmaticAvatarPlacementH 66 @@ -50,6 +49,15 @@ ImportDialog::ImportDialog(QWidget *parent) : } ui->rbKeep->setChecked(true); + + qreal screenRatio = AppEnv::screenRatio(); + snapmaticResolutionLW = 430 * screenRatio; + snapmaticResolutionLH = 240 * screenRatio; + setMinimumSize(430 * screenRatio, 380 * screenRatio); + setMaximumSize(430 * screenRatio, 380 * screenRatio); + setFixedSize(430 * screenRatio, 380 * screenRatio); + ui->vlButtom->setSpacing(6 * screenRatio); + ui->vlButtom->setContentsMargins(9 * screenRatio, 6 * screenRatio, 9 * screenRatio, 9 * screenRatio); } ImportDialog::~ImportDialog() diff --git a/ImportDialog.h b/ImportDialog.h index 0503dd3..1da27fd 100644 --- a/ImportDialog.h +++ b/ImportDialog.h @@ -53,6 +53,8 @@ private: QImage workImage; QImage newImage; bool doImport; + int snapmaticResolutionLW; + int snapmaticResolutionLH; }; #endif // IMPORTDIALOG_H diff --git a/OptionsDialog.cpp b/OptionsDialog.cpp index 68bc8f9..f42c3c3 100755 --- a/OptionsDialog.cpp +++ b/OptionsDialog.cpp @@ -70,6 +70,10 @@ 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(); diff --git a/PictureDialog.cpp b/PictureDialog.cpp index dca0ef3..24ec3ee 100755 --- a/PictureDialog.cpp +++ b/PictureDialog.cpp @@ -26,6 +26,7 @@ #include "StringParser.h" #include "GlobalString.h" #include "UiModLabel.h" +#include "AppEnv.h" #ifdef GTA5SYNC_WIN #if QT_VERSION >= 0x050200 @@ -118,7 +119,15 @@ void PictureDialog::setupPictureDialog(bool withDatabase_) withDatabase = withDatabase_; // Avatar area - avatarAreaPicture = QImage(":/img/avatararea.png"); + qreal screenRatio = AppEnv::screenRatio(); + if (screenRatio != 1) + { + avatarAreaPicture = QImage(":/img/avatararea.png").scaledToHeight(536 * screenRatio, Qt::FastTransformation); + } + else + { + avatarAreaPicture = QImage(":/img/avatararea.png"); + } avatarLocX = 145; avatarLocY = 66; avatarSize = 470; @@ -147,6 +156,7 @@ void PictureDialog::setupPictureDialog(bool withDatabase_) installEventFilter(this); installEventFilter(ui->labPicture); + ui->labPicture->setFixedSize(960 * screenRatio, 536 * screenRatio); ui->labPicture->setFocusPolicy(Qt::StrongFocus); } @@ -343,28 +353,29 @@ void PictureDialog::dialogPreviousPictureRequested() void PictureDialog::renderOverlayPicture() { // Generating Overlay Preview - QRect preferedRect = QRect(0, 0, 200, 160); + qreal screenRatio = AppEnv::screenRatio(); + QRect preferedRect = QRect(0, 0, 200 * screenRatio, 160 * screenRatio); QString overlayText = tr("Key 1 - Avatar Preview Mode\nKey 2 - Toggle Overlay\nArrow Keys - Navigate"); QImage overlayImage(1, 1, QImage::Format_ARGB32_Premultiplied); overlayImage.fill(Qt::transparent); QPainter overlayPainter(&overlayImage); QFont overlayPainterFont; - overlayPainterFont.setPixelSize(12); + overlayPainterFont.setPixelSize(12 * screenRatio); overlayPainter.setFont(overlayPainterFont); QRect overlaySpace = overlayPainter.boundingRect(preferedRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextDontClip | Qt::TextWordWrap, overlayText); overlayPainter.end(); int hOverlay = Qt::AlignTop; - if (overlaySpace.height() < 74) + if (overlaySpace.height() < 74 * screenRatio) { hOverlay = Qt::AlignVCenter; - preferedRect.setHeight(71); - overlaySpace.setHeight(80); + preferedRect.setHeight(71 * screenRatio); + overlaySpace.setHeight(80 * screenRatio); } else { - overlaySpace.setHeight(overlaySpace.height() + 6); + overlaySpace.setHeight(overlaySpace.height() + 6 * screenRatio); } overlayImage = overlayImage.scaled(overlaySpace.size()); @@ -374,13 +385,13 @@ void PictureDialog::renderOverlayPicture() overlayPainter.drawText(preferedRect, Qt::AlignLeft | hOverlay | Qt::TextDontClip | Qt::TextWordWrap, overlayText); overlayPainter.end(); - if (overlaySpace.width() < 194) + if (overlaySpace.width() < 194 * screenRatio) { - overlaySpace.setWidth(200); + overlaySpace.setWidth(200 * screenRatio); } else { - overlaySpace.setWidth(overlaySpace.width() + 6); + overlaySpace.setWidth(overlaySpace.width() + 6 * screenRatio); } QImage overlayBorderImage(overlaySpace.width(), overlaySpace.height(), QImage::Format_ARGB6666_Premultiplied); @@ -390,7 +401,7 @@ void PictureDialog::renderOverlayPicture() overlayTempImage.fill(Qt::transparent); QPainter overlayTempPainter(&overlayTempImage); overlayTempPainter.drawImage(0, 0, overlayBorderImage); - overlayTempPainter.drawImage(3, 3, overlayImage); + overlayTempPainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayImage); overlayTempPainter.end(); } @@ -502,35 +513,58 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture) void PictureDialog::renderPicture() { + qreal screenRatio = AppEnv::screenRatio(); if (!previewMode) { if (overlayEnabled) { - QPixmap overlayAreaPixmap(960, 536); + QPixmap overlayAreaPixmap(960 * screenRatio, 536 * screenRatio); overlayAreaPixmap.fill(Qt::transparent); QPainter overlayAreaPainter(&overlayAreaPixmap); - overlayAreaPainter.drawImage(0, 0, snapmaticPicture); - overlayAreaPainter.drawImage(3, 3, overlayTempImage); + if (screenRatio == 1) + { + overlayAreaPainter.drawImage(0, 0, snapmaticPicture); + overlayAreaPainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayTempImage); + } + else + { + overlayAreaPainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation)); + overlayAreaPainter.drawImage(3 * screenRatio, 3 * screenRatio, overlayTempImage); + } overlayAreaPainter.end(); ui->labPicture->setPixmap(overlayAreaPixmap); } else { - ui->labPicture->setPixmap(QPixmap::fromImage(snapmaticPicture)); + if (screenRatio != 1) + { + ui->labPicture->setPixmap(QPixmap::fromImage(snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation))); + } + else + { + ui->labPicture->setPixmap(QPixmap::fromImage(snapmaticPicture)); + } } } else { // Generating Avatar Preview - QPixmap avatarPixmap(960, 536); + QPixmap avatarPixmap(960 * screenRatio, 536 * screenRatio); QPainter snapPainter(&avatarPixmap); QFont snapPainterFont; - snapPainterFont.setPixelSize(12); - snapPainter.drawImage(0, 0, snapmaticPicture); + snapPainterFont.setPixelSize(12 * screenRatio); + if (screenRatio == 1) + { + snapPainter.drawImage(0, 0, snapmaticPicture); + } + else + { + snapPainter.drawImage(0, 0, snapmaticPicture.scaledToHeight(536 * screenRatio, Qt::SmoothTransformation)); + } snapPainter.drawImage(0, 0, avatarAreaPicture); snapPainter.setPen(QColor::fromRgb(255, 255, 255, 255)); snapPainter.setFont(snapPainterFont); - snapPainter.drawText(QRect(3, 3, 140, 60), Qt::AlignLeft | Qt::TextWordWrap, tr("Avatar Preview Mode\nPress 1 for Default View")); + snapPainter.drawText(QRect(3 * screenRatio, 3 * screenRatio, 140 * screenRatio, 60 * screenRatio), Qt::AlignLeft | Qt::TextWordWrap, tr("Avatar Preview Mode\nPress 1 for Default View")); snapPainter.end(); ui->labPicture->setPixmap(avatarPixmap); } diff --git a/ProfileInterface.cpp b/ProfileInterface.cpp index 8a74524..0c33024 100755 --- a/ProfileInterface.cpp +++ b/ProfileInterface.cpp @@ -28,6 +28,7 @@ #include "ProfileLoader.h" #include "ExportThread.h" #include "ImportDialog.h" +#include "AppEnv.h" #include "config.h" #include <QProgressDialog> #include <QProgressBar> @@ -73,6 +74,11 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre { ui->cmdCloseProfile->setIcon(QIcon::fromTheme("dialog-close")); } + + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + ui->hlButtons->setSpacing(6 * screenRatio); + ui->hlButtons->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio); } ProfileInterface::~ProfileInterface() diff --git a/ProfileInterface.ui b/ProfileInterface.ui index 0e33355..1186939 100755 --- a/ProfileInterface.ui +++ b/ProfileInterface.ui @@ -27,7 +27,7 @@ <number>0</number> </property> <property name="bottomMargin"> - <number>9</number> + <number>0</number> </property> <item> <widget class="QStackedWidget" name="swProfile"> @@ -108,8 +108,8 @@ <rect> <x>0</x> <y>0</y> - <width>398</width> - <height>256</height> + <width>98</width> + <height>28</height> </rect> </property> <layout class="QVBoxLayout" name="vlProfile"> @@ -160,6 +160,9 @@ <property name="rightMargin"> <number>9</number> </property> + <property name="bottomMargin"> + <number>9</number> + </property> <item> <widget class="QLabel" name="labVersion"> <property name="text"> diff --git a/SavegameDialog.cpp b/SavegameDialog.cpp index b9ee746..99447ce 100755 --- a/SavegameDialog.cpp +++ b/SavegameDialog.cpp @@ -1,6 +1,7 @@ #include "SavegameDialog.h" #include "ui_SavegameDialog.h" #include "SavegameCopy.h" +#include "AppEnv.h" #include <QMessageBox> SavegameDialog::SavegameDialog(QWidget *parent) : @@ -18,6 +19,10 @@ SavegameDialog::SavegameDialog(QWidget *parent) : { ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close")); } + + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + resize(400 * screenRatio, 105 * screenRatio); } SavegameDialog::~SavegameDialog() diff --git a/SavegameDialog.ui b/SavegameDialog.ui index 75a2cc7..a0a5e52 100755 --- a/SavegameDialog.ui +++ b/SavegameDialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>400</width> - <height>104</height> + <height>105</height> </rect> </property> <property name="windowTitle"> diff --git a/SavegameWidget.cpp b/SavegameWidget.cpp index 200713d..6783bf9 100755 --- a/SavegameWidget.cpp +++ b/SavegameWidget.cpp @@ -23,6 +23,7 @@ #include "StandardPaths.h" #include "SavegameData.h" #include "SavegameCopy.h" +#include "AppEnv.h" #include <QFileDialog> #include <QMessageBox> #include <QSettings> @@ -46,6 +47,13 @@ SavegameWidget::SavegameWidget(QWidget *parent) : ui->cmdDelete->setVisible(false); ui->cbSelected->setVisible(false); + qreal screenRatio = AppEnv::screenRatio(); + ui->labSavegamePic->setFixedSize(48 * screenRatio, 27 * screenRatio); + + QPixmap savegamePixmap(":/img/savegame.png"); + if (screenRatio != 1) savegamePixmap = savegamePixmap.scaledToHeight(ui->labSavegamePic->height(), Qt::SmoothTransformation); + ui->labSavegamePic->setPixmap(savegamePixmap); + QString exportSavegameStr = tr("Export Savegame..."); Q_UNUSED(exportSavegameStr) diff --git a/SavegameWidget.ui b/SavegameWidget.ui index d148f66..81ea544 100755 --- a/SavegameWidget.ui +++ b/SavegameWidget.ui @@ -50,9 +50,6 @@ <property name="text"> <string/> </property> - <property name="pixmap"> - <pixmap resource="res/app.qrc">:/img/savegame.png</pixmap> - </property> </widget> </item> <item> @@ -130,8 +127,6 @@ </item> </layout> </widget> - <resources> - <include location="res/app.qrc"/> - </resources> + <resources/> <connections/> </ui> diff --git a/SnapmaticEditor.cpp b/SnapmaticEditor.cpp index b4cbb0a..046ce8e 100644 --- a/SnapmaticEditor.cpp +++ b/SnapmaticEditor.cpp @@ -20,6 +20,7 @@ #include "ui_SnapmaticEditor.h" #include "SnapmaticPicture.h" #include "StringParser.h" +#include "AppEnv.h" #include <QTextDocument> #include <QInputDialog> #include <QMessageBox> @@ -44,6 +45,10 @@ SnapmaticEditor::SnapmaticEditor(CrewDatabase *crewDB, QWidget *parent) : snapmaticTitle = ""; smpic = 0; + + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + resize(400 * screenRatio, 360 * screenRatio); } SnapmaticEditor::~SnapmaticEditor() diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp index b13aff0..d5cbf29 100755 --- a/SnapmaticPicture.cpp +++ b/SnapmaticPicture.cpp @@ -813,6 +813,7 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, const QString form } else { + delete picFile; return false; } } diff --git a/SnapmaticWidget.cpp b/SnapmaticWidget.cpp index 4f28c0c..ddb9b73 100755 --- a/SnapmaticWidget.cpp +++ b/SnapmaticWidget.cpp @@ -24,6 +24,7 @@ #include "PictureDialog.h" #include "PictureExport.h" #include "StringParser.h" +#include "AppEnv.h" #include "config.h" #include <QMessageBox> #include <QPixmap> @@ -87,6 +88,9 @@ void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture) picStr = picture->getPictureStr(); QObject::connect(picture, SIGNAL(updated()), this, SLOT(snapmaticUpdated())); + qreal screenRatio = AppEnv::screenRatio(); + ui->labPicture->setFixedSize(48 * screenRatio, 27 * screenRatio); + QPixmap SnapmaticPixmap = QPixmap::fromImage(picture->getImage().scaled(ui->labPicture->width(), ui->labPicture->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation), Qt::AutoColor); ui->labPicStr->setText(picStr + "\n" + picTitl + ""); ui->labPicture->setPixmap(SnapmaticPixmap); diff --git a/UserInterface.cpp b/UserInterface.cpp index d546bfd..60e7afb 100755 --- a/UserInterface.cpp +++ b/UserInterface.cpp @@ -78,6 +78,12 @@ UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, D ui->actionExit->setIcon(QIcon::fromTheme("application-exit")); #endif } + + // DPI calculation + qreal screenRatio = AppEnv::screenRatio(); + resize(625 * screenRatio, 500 * screenRatio); + ui->vlUserInterface->setSpacing(6 * screenRatio); + ui->vlUserInterface->setContentsMargins(9 * screenRatio, 9 * screenRatio, 9 * screenRatio, 9 * screenRatio); } void UserInterface::setupDirEnv() @@ -139,11 +145,12 @@ void UserInterface::setupDirEnv() void UserInterface::setupProfileUi() { + qreal screenRatio = AppEnv::screenRatio(); if (GTAV_Profiles.length() == 0) { QPushButton *changeDirBtn = new QPushButton(tr("Select >A V Folder..."), ui->swSelection); changeDirBtn->setObjectName("cmdChangeDir"); - changeDirBtn->setMinimumSize(0, 40); + changeDirBtn->setMinimumSize(0, 40 * screenRatio); changeDirBtn->setAutoDefault(true); ui->vlButtons->addWidget(changeDirBtn); profileBtns.append(changeDirBtn); @@ -154,7 +161,7 @@ void UserInterface::setupProfileUi() { QPushButton *profileBtn = new QPushButton(GTAV_Profile, ui->swSelection); profileBtn->setObjectName(GTAV_Profile); - profileBtn->setMinimumSize(0, 40); + profileBtn->setMinimumSize(0, 40 * screenRatio); profileBtn->setAutoDefault(true); ui->vlButtons->addWidget(profileBtn); profileBtns.append(profileBtn); diff --git a/config.h b/config.h index 71257a2..dfe4780 100755 --- a/config.h +++ b/config.h @@ -1,5 +1,5 @@ /***************************************************************************** -* gta5sync GRAND THEFT AUTO V SYNC +* gta5view Grand Theft Auto V Profile Viewer * Copyright (C) 2016-2017 Syping * * This program is free software: you can redistribute it and/or modify @@ -50,7 +50,7 @@ #ifndef GTA5SYNC_APPVER #ifndef GTA5SYNC_DAILYB -#define GTA5SYNC_APPVER "1.4.0-dev3" +#define GTA5SYNC_APPVER "1.4.0-dev4" #else #define GTA5SYNC_APPVER QString("%1").arg(GTA5SYNC_DAILYB) #endif diff --git a/gta5view.pro b/gta5view.pro index 7bace77..80327dd 100755 --- a/gta5view.pro +++ b/gta5view.pro @@ -21,11 +21,10 @@ QT += core gui network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): greaterThan(QT_MINOR_VERSION, 1): win32: QT += winextras -DEFINES += GTA5SYNC_DISABLED # disabling sync (remove it for building gta5sync) +DEFINES += GTA5SYNC_DISABLED DEPLOYMENT.display_name = gta5view TARGET = gta5view - TEMPLATE = app SOURCES += main.cpp \ @@ -118,6 +117,7 @@ DISTFILES += res/app.rc \ res/gta5sync_de.ts \ res/gta5sync_fr.ts \ res/gta5view.exe.manifest \ + res/gta5view.png \ lang/qtbase_ru.qm \ lang/gta5sync_ru.ts \ lang/qt_ru.qm \ @@ -157,6 +157,6 @@ isEqual(QT_MAJOR_VERSION, 4): SOURCES += qjson4/QJsonArray.cpp \ unix: !macx: appfiles.path = $$(INSTALL_PATH)/share/applications unix: !macx: appfiles.files = $$PWD/res/gta5view.desktop unix: !macx: pixmaps.path = $$(INSTALL_PATH)/share/pixmaps -unix: !macx: pixmaps.files = $$PWD/res/gta5view.xpm +unix: !macx: pixmaps.files = $$PWD/res/gta5view.png unix: !macx: target.path = $$(INSTALL_PATH)/bin unix: !macx: INSTALLS += target pixmaps appfiles diff --git a/lang/gta5sync_ru.ts b/lang/gta5sync_ru.ts index bd2cb52..cbfb4ed 100755 --- a/lang/gta5sync_ru.ts +++ b/lang/gta5sync_ru.ts @@ -40,18 +40,26 @@ Copyright &copy; <a href="%5">%6</a> %7<br/>%8 i <translation type="obsolete">Закрыть</translation> </message> <message> - <location filename="../AboutDialog.cpp" line="39"/> + <location filename="../AboutDialog.cpp" line="40"/> <source>A project for viewing Grand Theft Auto V Snapmatic<br/> Pictures and Savegames</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../AboutDialog.cpp" line="37"/> + <location filename="../AboutDialog.cpp" line="38"/> <source>A project for viewing and sync Grand Theft Auto V Snapmatic<br/> Pictures and Savegames</source> <translation type="unfinished"></translation> </message> </context> +<context> + <name>CrewDatabase</name> + <message> + <location filename="../CrewDatabase.cpp" line="64"/> + <source>No Crew</source> + <translation type="unfinished"></translation> + </message> +</context> <context> <name>ExportDialog</name> <message> @@ -315,44 +323,44 @@ Pictures and Savegames</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="125"/> + <location filename="../OptionsDialog.cpp" line="129"/> <source>System</source> <comment>System like PC System</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="125"/> + <location filename="../OptionsDialog.cpp" line="129"/> <source>%1 (%2 if available)</source> <comment>System like PC System = %1, System Language like Deutsch = %2</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="284"/> <location filename="../OptionsDialog.cpp" line="288"/> + <location filename="../OptionsDialog.cpp" line="292"/> <source>%1</source> <comment>%1</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="284"/> + <location filename="../OptionsDialog.cpp" line="288"/> <source>The new Custom Folder will initialize after you restart %1.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="288"/> + <location filename="../OptionsDialog.cpp" line="292"/> <source>The language change will take effect after you restart %1.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="298"/> + <location filename="../OptionsDialog.cpp" line="302"/> <source>No Profile</source> <comment>No Profile, as default</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../OptionsDialog.cpp" line="306"/> <location filename="../OptionsDialog.cpp" line="310"/> - <location filename="../OptionsDialog.cpp" line="312"/> + <location filename="../OptionsDialog.cpp" line="314"/> + <location filename="../OptionsDialog.cpp" line="316"/> <source>Profile: %1</source> <translation type="unfinished"></translation> </message> @@ -389,7 +397,6 @@ Pictures and Savegames</source> </message> <message> <location filename="../PictureDialog.ui" line="167"/> - <location filename="../PictureExport.cpp" line="221"/> <source>&Export</source> <translation type="unfinished"></translation> </message> @@ -400,6 +407,7 @@ Pictures and Savegames</source> </message> <message> <location filename="../PictureExport.cpp" line="89"/> + <location filename="../PictureExport.cpp" line="221"/> <source>Export</source> <translation type="unfinished">Экспорт</translation> </message> @@ -413,54 +421,54 @@ Pictures and Savegames</source> <translation>Закрыть</translation> </message> <message> - <location filename="../PictureDialog.cpp" line="128"/> + <location filename="../PictureDialog.cpp" line="132"/> <source>Export as &JPG picture...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../PictureDialog.cpp" line="129"/> + <location filename="../PictureDialog.cpp" line="133"/> <source>Export as &GTA Snapmatic...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../PictureDialog.cpp" line="343"/> + <location filename="../PictureDialog.cpp" line="347"/> <source>Key 1 - Avatar Preview Mode Key 2 - Toggle Overlay Arrow Keys - Navigate</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../PictureDialog.cpp" line="402"/> - <location filename="../PictureDialog.cpp" line="474"/> + <location filename="../PictureDialog.cpp" line="406"/> + <location filename="../PictureDialog.cpp" line="478"/> <source>Snapmatic Picture Viewer</source> <translation>Просмотрщик фотографий Snapmatic</translation> </message> <message> - <location filename="../PictureDialog.cpp" line="402"/> - <location filename="../PictureDialog.cpp" line="474"/> + <location filename="../PictureDialog.cpp" line="406"/> + <location filename="../PictureDialog.cpp" line="478"/> <source>Failed at %1</source> <translation>Ошибка при %1</translation> </message> <message> - <location filename="../PictureDialog.cpp" line="529"/> + <location filename="../PictureDialog.cpp" line="533"/> <source>Avatar Preview Mode Press 1 for Default View</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../PictureDialog.cpp" line="463"/> - <location filename="../PictureDialog.cpp" line="473"/> + <location filename="../PictureDialog.cpp" line="467"/> + <location filename="../PictureDialog.cpp" line="477"/> <source>No player</source> <translation>Игроков нет</translation> </message> <message> - <location filename="../PictureDialog.cpp" line="466"/> - <location filename="../PictureDialog.cpp" line="473"/> + <location filename="../PictureDialog.cpp" line="470"/> + <location filename="../PictureDialog.cpp" line="477"/> <source>No crew</source> <translation>Без группы</translation> </message> <message> - <location filename="../PictureDialog.cpp" line="473"/> + <location filename="../PictureDialog.cpp" line="477"/> <source>Unknown Location</source> <translation type="unfinished"></translation> </message> @@ -573,27 +581,27 @@ Press 1 for Default View</source> <translation>Загружается файл %1 из %2</translation> </message> <message> - <location filename="../ProfileInterface.ui" line="169"/> + <location filename="../ProfileInterface.ui" line="166"/> <source>%1 %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.ui" line="195"/> + <location filename="../ProfileInterface.ui" line="192"/> <source>Import exported file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.ui" line="198"/> + <location filename="../ProfileInterface.ui" line="195"/> <source>&Import...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.ui" line="214"/> + <location filename="../ProfileInterface.ui" line="211"/> <source>Close profile</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.ui" line="217"/> + <location filename="../ProfileInterface.ui" line="214"/> <source>&Close</source> <translation type="unfinished"></translation> </message> @@ -606,29 +614,29 @@ Press 1 for Default View</source> <translation type="obsolete">Закрыть профиль</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="111"/> + <location filename="../ProfileInterface.cpp" line="108"/> <source>Loading...</source> <translation>Загрузка...</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="369"/> - <location filename="../ProfileInterface.cpp" line="406"/> + <location filename="../ProfileInterface.cpp" line="384"/> + <location filename="../ProfileInterface.cpp" line="421"/> <source>Import...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="370"/> - <location filename="../ProfileInterface.cpp" line="460"/> - <location filename="../ProfileInterface.cpp" line="465"/> - <location filename="../ProfileInterface.cpp" line="492"/> - <location filename="../ProfileInterface.cpp" line="508"/> - <location filename="../ProfileInterface.cpp" line="658"/> - <location filename="../ProfileInterface.cpp" line="663"/> - <location filename="../ProfileInterface.cpp" line="681"/> - <location filename="../ProfileInterface.cpp" line="686"/> - <location filename="../ProfileInterface.cpp" line="697"/> - <location filename="../ProfileInterface.cpp" line="734"/> - <location filename="../ProfileInterface.cpp" line="740"/> + <location filename="../ProfileInterface.cpp" line="385"/> + <location filename="../ProfileInterface.cpp" line="475"/> + <location filename="../ProfileInterface.cpp" line="480"/> + <location filename="../ProfileInterface.cpp" line="507"/> + <location filename="../ProfileInterface.cpp" line="523"/> + <location filename="../ProfileInterface.cpp" line="673"/> + <location filename="../ProfileInterface.cpp" line="678"/> + <location filename="../ProfileInterface.cpp" line="696"/> + <location filename="../ProfileInterface.cpp" line="701"/> + <location filename="../ProfileInterface.cpp" line="712"/> + <location filename="../ProfileInterface.cpp" line="749"/> + <location filename="../ProfileInterface.cpp" line="755"/> <source>Import</source> <translation type="unfinished"></translation> </message> @@ -637,138 +645,138 @@ Press 1 for Default View</source> <translation type="vanished">Все файлы профиля (SGTA* PGTA*)</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="375"/> - <location filename="../UserInterface.cpp" line="335"/> + <location filename="../ProfileInterface.cpp" line="390"/> + <location filename="../UserInterface.cpp" line="344"/> <source>Savegames files (SGTA*)</source> <translation>Файлы сохранения (SGTA*)</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="376"/> - <location filename="../UserInterface.cpp" line="336"/> + <location filename="../ProfileInterface.cpp" line="391"/> + <location filename="../UserInterface.cpp" line="345"/> <source>Snapmatic pictures (PGTA*)</source> <translation>Картинка Snapmatic (PGTA*)</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="378"/> - <location filename="../UserInterface.cpp" line="337"/> + <location filename="../ProfileInterface.cpp" line="393"/> + <location filename="../UserInterface.cpp" line="346"/> <source>All files (**)</source> <translation>Все файлы (**)</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="407"/> <location filename="../ProfileInterface.cpp" line="422"/> + <location filename="../ProfileInterface.cpp" line="437"/> <source>Import file %1 of %2 files</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="460"/> + <location filename="../ProfileInterface.cpp" line="475"/> <source>Import failed with... %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="492"/> - <location filename="../UserInterface.cpp" line="377"/> + <location filename="../ProfileInterface.cpp" line="507"/> + <location filename="../UserInterface.cpp" line="386"/> <source>Failed to read Snapmatic picture</source> <translation>Не удалось загрузить картинку Snapmatic</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="508"/> - <location filename="../UserInterface.cpp" line="393"/> + <location filename="../ProfileInterface.cpp" line="523"/> + <location filename="../UserInterface.cpp" line="402"/> <source>Failed to read Savegame file</source> <translation>Не удалось загрузить файл сохранения</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="658"/> + <location filename="../ProfileInterface.cpp" line="673"/> <source>Can't import %1 because of not valid file format</source> <translation>Не получилось импортировать %1 из-за неправильного формата файла</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="465"/> - <location filename="../ProfileInterface.cpp" line="663"/> - <location filename="../UserInterface.cpp" line="425"/> + <location filename="../ProfileInterface.cpp" line="480"/> + <location filename="../ProfileInterface.cpp" line="678"/> + <location filename="../UserInterface.cpp" line="434"/> <source>No valid file is selected</source> <translation>Выбранный файл неверен</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="60"/> + <location filename="../ProfileInterface.cpp" line="61"/> <source>Enabled pictures: %1 of %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="373"/> + <location filename="../ProfileInterface.cpp" line="388"/> <source>Importable files (*.g5e *.jpg *.png SGTA* PGTA*)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="377"/> + <location filename="../ProfileInterface.cpp" line="392"/> <source>All image files (*.jpg *.png)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="681"/> + <location filename="../ProfileInterface.cpp" line="696"/> <source>Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="686"/> + <location filename="../ProfileInterface.cpp" line="701"/> <source>Failed to import the Snapmatic picture, the picture is already in the game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="697"/> + <location filename="../ProfileInterface.cpp" line="712"/> <source>Failed to import the Snapmatic picture, can't copy the file into profile</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="734"/> + <location filename="../ProfileInterface.cpp" line="749"/> <source>Failed to import the Savegame, can't copy the file into profile</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="740"/> + <location filename="../ProfileInterface.cpp" line="755"/> <source>Failed to import the Savegame, no Savegame slot is left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="826"/> - <location filename="../ProfileInterface.cpp" line="844"/> + <location filename="../ProfileInterface.cpp" line="841"/> + <location filename="../ProfileInterface.cpp" line="859"/> <source>JPG pictures and GTA Snapmatic</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="827"/> - <location filename="../ProfileInterface.cpp" line="849"/> + <location filename="../ProfileInterface.cpp" line="842"/> + <location filename="../ProfileInterface.cpp" line="864"/> <source>JPG pictures only</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="828"/> - <location filename="../ProfileInterface.cpp" line="853"/> + <location filename="../ProfileInterface.cpp" line="843"/> + <location filename="../ProfileInterface.cpp" line="868"/> <source>GTA Snapmatic only</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="940"/> - <location filename="../ProfileInterface.cpp" line="983"/> + <location filename="../ProfileInterface.cpp" line="953"/> + <location filename="../ProfileInterface.cpp" line="995"/> <source>No Snapmatic pictures or Savegames files are selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="948"/> - <location filename="../ProfileInterface.cpp" line="977"/> - <location filename="../ProfileInterface.cpp" line="983"/> + <location filename="../ProfileInterface.cpp" line="961"/> + <location filename="../ProfileInterface.cpp" line="989"/> + <location filename="../ProfileInterface.cpp" line="995"/> <source>Remove selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="948"/> + <location filename="../ProfileInterface.cpp" line="961"/> <source>You really want remove the selected Snapmatic picutres and Savegame files?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="977"/> + <location filename="../ProfileInterface.cpp" line="989"/> <source>Failed at remove the complete selected Snapmatic pictures and/or Savegame files</source> <translation type="unfinished"></translation> </message> @@ -789,30 +797,30 @@ Press 1 for Default View</source> <translation type="obsolete">Не получилось имортировать копию сохранения, потому что не осталось свободных под них слотов</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="803"/> - <location filename="../ProfileInterface.cpp" line="841"/> - <location filename="../ProfileInterface.cpp" line="918"/> - <location filename="../ProfileInterface.cpp" line="940"/> + <location filename="../ProfileInterface.cpp" line="818"/> + <location filename="../ProfileInterface.cpp" line="856"/> + <location filename="../ProfileInterface.cpp" line="933"/> + <location filename="../ProfileInterface.cpp" line="953"/> <source>Export selected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="841"/> + <location filename="../ProfileInterface.cpp" line="856"/> <source>%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:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="884"/> + <location filename="../ProfileInterface.cpp" line="899"/> <source>Export selected...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="885"/> + <location filename="../ProfileInterface.cpp" line="900"/> <source>Initializing export...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="918"/> + <location filename="../ProfileInterface.cpp" line="933"/> <source>Export failed with... %1</source> @@ -826,13 +834,13 @@ Press 1 for Default View</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UserInterface.cpp" line="333"/> + <location filename="../UserInterface.cpp" line="342"/> <source>All profile files (*.g5e SGTA* PGTA*)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="374"/> - <location filename="../UserInterface.cpp" line="334"/> + <location filename="../ProfileInterface.cpp" line="389"/> + <location filename="../UserInterface.cpp" line="343"/> <source>GTA V Export (*.g5e)</source> <translation type="unfinished"></translation> </message> @@ -854,7 +862,7 @@ Press 1 for Default View</source> <name>SavegameDialog</name> <message> <location filename="../SavegameDialog.ui" line="14"/> - <location filename="../SavegameDialog.cpp" line="29"/> + <location filename="../SavegameDialog.cpp" line="33"/> <source>Savegame Viewer</source> <translation>Просмотрщик сохранений</translation> </message> @@ -882,7 +890,7 @@ Press 1 for Default View</source> <translation type="obsolete">Закрыть</translation> </message> <message> - <location filename="../SavegameDialog.cpp" line="29"/> + <location filename="../SavegameDialog.cpp" line="33"/> <source>Failed at %1</source> <translation>Ошибка при %1</translation> </message> @@ -974,34 +982,34 @@ Press 1 for Default View</source> <translation>Не удалось удалить сохранение %1</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1106"/> + <location filename="../ProfileInterface.cpp" line="1118"/> <source>&View</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1108"/> + <location filename="../ProfileInterface.cpp" line="1120"/> <source>&Remove</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1112"/> - <location filename="../ProfileInterface.cpp" line="1123"/> + <location filename="../ProfileInterface.cpp" line="1124"/> + <location filename="../ProfileInterface.cpp" line="1135"/> <source>&Select</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1113"/> + <location filename="../ProfileInterface.cpp" line="1125"/> <source>&Deselect</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1114"/> - <location filename="../ProfileInterface.cpp" line="1124"/> + <location filename="../ProfileInterface.cpp" line="1126"/> + <location filename="../ProfileInterface.cpp" line="1136"/> <source>Select &All</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1117"/> + <location filename="../ProfileInterface.cpp" line="1129"/> <source>&Deselect All</source> <translation type="unfinished"></translation> </message> @@ -1011,7 +1019,7 @@ Press 1 for Default View</source> <translation>Копировать сохранение</translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1107"/> + <location filename="../ProfileInterface.cpp" line="1119"/> <source>&Export</source> <translation type="unfinished"></translation> </message> @@ -1071,7 +1079,7 @@ Press 1 for Default View</source> <message> <location filename="../SnapmaticEditor.ui" line="14"/> <location filename="../SnapmaticEditor.ui" line="81"/> - <location filename="../SnapmaticEditor.cpp" line="247"/> + <location filename="../SnapmaticEditor.cpp" line="239"/> <source>Snapmatic Properties</source> <translation type="unfinished"></translation> </message> @@ -1082,13 +1090,11 @@ Press 1 for Default View</source> </message> <message> <location filename="../SnapmaticEditor.ui" line="50"/> - <location filename="../SnapmaticEditor.ui" line="87"/> <source>Editor</source> <translation type="unfinished"></translation> </message> <message> <location filename="../SnapmaticEditor.ui" line="57"/> - <location filename="../SnapmaticEditor.ui" line="108"/> <source>Selfie</source> <translation type="unfinished"></translation> </message> @@ -1099,96 +1105,116 @@ Press 1 for Default View</source> </message> <message> <location filename="../SnapmaticEditor.ui" line="71"/> - <location filename="../SnapmaticEditor.ui" line="115"/> <source>Mugshot</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="101"/> + <location filename="../SnapmaticEditor.ui" line="94"/> <source>Director</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="94"/> + <location filename="../SnapmaticEditor.ui" line="104"/> + <source>Snapmatic Values</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SnapmaticEditor.ui" line="113"/> + <location filename="../SnapmaticEditor.cpp" line="194"/> + <source>Crew: %1 (%2)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SnapmaticEditor.ui" line="87"/> <source>Meme</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="125"/> - <location filename="../SnapmaticEditor.cpp" line="297"/> + <location filename="../SnapmaticEditor.cpp" line="289"/> <source>Snapmatic Title</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="140"/> - <location filename="../SnapmaticEditor.cpp" line="200"/> + <location filename="../SnapmaticEditor.ui" line="126"/> + <location filename="../SnapmaticEditor.cpp" line="179"/> <source>Title: %1 (%2)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="156"/> - <location filename="../SnapmaticEditor.cpp" line="204"/> - <location filename="../SnapmaticEditor.cpp" line="208"/> + <location filename="../SnapmaticEditor.ui" line="136"/> + <location filename="../SnapmaticEditor.cpp" line="183"/> + <location filename="../SnapmaticEditor.cpp" line="187"/> <source>Appropriate: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="169"/> + <location filename="../SnapmaticEditor.ui" line="149"/> <source>Extras</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="175"/> + <location filename="../SnapmaticEditor.ui" line="155"/> <source>Qualify as Avatar automatically at apply</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="188"/> + <location filename="../SnapmaticEditor.ui" line="168"/> <source>Qualify as Avatar allows you to use this Snapmatic as a Social Club profile picture</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="238"/> + <location filename="../SnapmaticEditor.ui" line="218"/> <source>&Apply</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.ui" line="251"/> + <location filename="../SnapmaticEditor.ui" line="231"/> <source>&Cancel</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.cpp" line="199"/> + <location filename="../SnapmaticEditor.cpp" line="178"/> + <location filename="../SnapmaticEditor.cpp" line="193"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.cpp" line="204"/> + <location filename="../SnapmaticEditor.cpp" line="183"/> <source>Yes</source> <comment>Yes, should work fine</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.cpp" line="208"/> + <location filename="../SnapmaticEditor.cpp" line="187"/> <source>No</source> <comment>No, could lead to issues</comment> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.cpp" line="247"/> + <location filename="../SnapmaticEditor.cpp" line="239"/> <source>Patching of Snapmatic Properties failed because of I/O Error</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SnapmaticEditor.cpp" line="297"/> + <location filename="../SnapmaticEditor.cpp" line="289"/> <source>New Snapmatic title:</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../SnapmaticEditor.cpp" line="314"/> + <source>Snapmatic Crew</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SnapmaticEditor.cpp" line="314"/> + <source>New Snapmatic crew:</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>SnapmaticPicture</name> <message> - <location filename="../SnapmaticPicture.cpp" line="370"/> + <location filename="../SnapmaticPicture.cpp" line="363"/> <source>PHOTO - %1</source> <translation type="unfinished"></translation> </message> @@ -1232,85 +1258,85 @@ Press 1 for Default View</source> </message> <message> <location filename="../SnapmaticWidget.ui" line="149"/> - <location filename="../SnapmaticWidget.cpp" line="150"/> - <location filename="../SnapmaticWidget.cpp" line="163"/> + <location filename="../SnapmaticWidget.cpp" line="159"/> + <location filename="../SnapmaticWidget.cpp" line="168"/> <source>Delete picture</source> <translation>Удалить картинку</translation> </message> <message> - <location filename="../SnapmaticWidget.cpp" line="150"/> + <location filename="../SnapmaticWidget.cpp" line="159"/> <source>Are you sure to delete %1 from your Snapmatic pictures?</source> <translation>Уверены, что хотите удалить %1 из коллекции картинок Snapmatic?</translation> </message> <message> - <location filename="../SnapmaticWidget.cpp" line="163"/> + <location filename="../SnapmaticWidget.cpp" line="168"/> <source>Failed at deleting %1 from your Snapmatic pictures</source> <translation>Не удалось удалить %1 из колелкции картинок Snapmatic </translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1065"/> + <location filename="../ProfileInterface.cpp" line="1077"/> <source>Edi&t</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1068"/> + <location filename="../ProfileInterface.cpp" line="1080"/> <source>Show &In-game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1072"/> + <location filename="../ProfileInterface.cpp" line="1084"/> <source>Hide &In-game</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1074"/> + <location filename="../ProfileInterface.cpp" line="1086"/> <source>&Edit Properties...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1075"/> + <location filename="../ProfileInterface.cpp" line="1087"/> <source>&Export</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1076"/> + <location filename="../ProfileInterface.cpp" line="1088"/> <source>Export as &JPG picture...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1077"/> + <location filename="../ProfileInterface.cpp" line="1089"/> <source>Export as &GTA Snapmatic...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1078"/> + <location filename="../ProfileInterface.cpp" line="1090"/> <source>&View</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1081"/> + <location filename="../ProfileInterface.cpp" line="1093"/> <source>&Remove</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1085"/> - <location filename="../ProfileInterface.cpp" line="1096"/> + <location filename="../ProfileInterface.cpp" line="1097"/> + <location filename="../ProfileInterface.cpp" line="1108"/> <source>&Select</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1086"/> + <location filename="../ProfileInterface.cpp" line="1098"/> <source>&Deselect</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1087"/> - <location filename="../ProfileInterface.cpp" line="1097"/> + <location filename="../ProfileInterface.cpp" line="1099"/> + <location filename="../ProfileInterface.cpp" line="1109"/> <source>Select &All</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ProfileInterface.cpp" line="1090"/> + <location filename="../ProfileInterface.cpp" line="1102"/> <source>&Deselect All</source> <translation type="unfinished"></translation> </message> @@ -1520,15 +1546,15 @@ Press 1 for Default View</source> </message> <message> <location filename="../UserInterface.cpp" line="62"/> - <location filename="../UserInterface.cpp" line="214"/> + <location filename="../UserInterface.cpp" line="213"/> <source>Select Profile</source> <translation type="unfinished"></translation> </message> <message> <location filename="../UserInterface.ui" line="306"/> - <location filename="../OptionsDialog.cpp" line="444"/> + <location filename="../OptionsDialog.cpp" line="448"/> <location filename="../UserInterface.cpp" line="93"/> - <location filename="../UserInterface.cpp" line="474"/> + <location filename="../UserInterface.cpp" line="488"/> <source>Select GTA V Folder...</source> <translation type="unfinished"></translation> </message> @@ -1545,20 +1571,20 @@ Press 1 for Default View</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UserInterface.cpp" line="330"/> + <location filename="../UserInterface.cpp" line="339"/> <source>Open File...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UserInterface.cpp" line="377"/> - <location filename="../UserInterface.cpp" line="393"/> - <location filename="../UserInterface.cpp" line="420"/> - <location filename="../UserInterface.cpp" line="425"/> + <location filename="../UserInterface.cpp" line="386"/> + <location filename="../UserInterface.cpp" line="402"/> + <location filename="../UserInterface.cpp" line="429"/> + <location filename="../UserInterface.cpp" line="434"/> <source>Open File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../UserInterface.cpp" line="420"/> + <location filename="../UserInterface.cpp" line="429"/> <source>Can't open %1 because of not valid file format</source> <translation type="unfinished"></translation> </message> diff --git a/res/app.rc b/res/app.rc index 1f7cbcb..8ec6e6c 100755 --- a/res/app.rc +++ b/res/app.rc @@ -7,8 +7,8 @@ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "gta5view.exe.manifest" #include <windows.h> VS_VERSION_INFO VERSIONINFO -FILEVERSION 1, 4, 0, 0 -PRODUCTVERSION 1, 4, 0, 0 +FILEVERSION 1, 4, 0, 4 +PRODUCTVERSION 1, 4, 0, 4 FILEFLAGSMASK 0x3fL FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 @@ -25,12 +25,12 @@ BEGIN BEGIN VALUE "CompanyName", "Syping" VALUE "FileDescription", "gta5view\0" - VALUE "FileVersion", "1.4.0-dev3\0" + VALUE "FileVersion", "1.4.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.4.0-dev3\0" + VALUE "ProductVersion", "1.4.0-dev4\0" END END END diff --git a/res/gta5view.desktop b/res/gta5view.desktop index 168bfd0..28c99d7 100644 --- a/res/gta5view.desktop +++ b/res/gta5view.desktop @@ -1,11 +1,11 @@ -[Desktop Entry] -Version=1.0 -Encoding=UTF-8 -Type=Application -Name=gta5view -Comment=gta5view -Categories=Qt;Application;Utility; -Exec=gta5view -Icon=gta5view -Terminal=false -StartupNotify=false +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +Type=Application +Name=gta5view +Comment=gta5view +Categories=Qt;Application;Utility; +Exec=gta5view +Icon=gta5view +Terminal=false +StartupNotify=false diff --git a/res/gta5view.png b/res/gta5view.png new file mode 100644 index 0000000000000000000000000000000000000000..bf41d479af7bb427e459e294b9b3f99f84de21a8 GIT binary patch literal 7189 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 A?*IS* literal 0 HcmV?d00001