diff --git a/AboutDialog.cpp b/AboutDialog.cpp
index 682acc5..7b1747e 100755
--- a/AboutDialog.cpp
+++ b/AboutDialog.cpp
@@ -31,8 +31,8 @@ AboutDialog::AboutDialog(QWidget *parent) :
QString appVersion = qApp->applicationVersion();
QString buildType = GTA5SYNC_BUILDTYPE;
buildType.replace("_", " ");
- QString projectBuild = QString("%1, %2").arg(__DATE__, __TIME__);
- QString buildStr = QString("%1, %2").arg(QT_VERSION_STR, GTA5SYNC_COMPILER);
+ QString projectBuild = GTA5SYNC_BUILDDATETIME;
+ QString buildStr = GTA5SYNC_BUILDSTRING;
#ifdef GTA5SYNC_ENABLED
QString projectDes = tr("A project for viewing and sync Grand Theft Auto V Snapmatic
\nPictures and Savegames");
#else
@@ -40,6 +40,11 @@ AboutDialog::AboutDialog(QWidget *parent) :
#endif
ui->labAbout->setText(aboutStr.arg(appVersion % " (" % buildType % ")", buildStr, qVersion(), projectBuild, GTA5SYNC_APPVENDORLINK, GTA5SYNC_APPVENDOR, GTA5SYNC_COPYRIGHT, GTA5SYNC_APPSTR, projectDes));
this->setWindowTitle(titleStr.arg(GTA5SYNC_APPSTR));
+
+ if (QIcon::hasThemeIcon("dialog-close"))
+ {
+ ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+ }
}
AboutDialog::~AboutDialog()
diff --git a/AboutDialog.h b/AboutDialog.h
index d998819..ef78bd5 100755
--- a/AboutDialog.h
+++ b/AboutDialog.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/AboutDialog.ui b/AboutDialog.ui
index 6ac855e..891e50e 100755
--- a/AboutDialog.ui
+++ b/AboutDialog.ui
@@ -74,9 +74,6 @@ Copyright © <a href="%5">%6</a> %7<br/>%8 i
&Close
-
-
-
diff --git a/AppEnv.cpp b/AppEnv.cpp
index 11b67d7..52ba5fd 100755
--- a/AppEnv.cpp
+++ b/AppEnv.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/AppEnv.h b/AppEnv.h
index ed24295..56aefcd 100755
--- a/AppEnv.h
+++ b/AppEnv.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/CrewDatabase.cpp b/CrewDatabase.cpp
index 9a34a50..c4fb1f1 100755
--- a/CrewDatabase.cpp
+++ b/CrewDatabase.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/CrewDatabase.h b/CrewDatabase.h
index 6204fe9..471b236 100755
--- a/CrewDatabase.h
+++ b/CrewDatabase.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/DatabaseThread.cpp b/DatabaseThread.cpp
index 8ca7ac0..8b351f7 100755
--- a/DatabaseThread.cpp
+++ b/DatabaseThread.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/DatabaseThread.h b/DatabaseThread.h
index 068b55c..169e2b3 100755
--- a/DatabaseThread.h
+++ b/DatabaseThread.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ExportDialog.cpp b/ExportDialog.cpp
index 37cb338..6210ea3 100755
--- a/ExportDialog.cpp
+++ b/ExportDialog.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ExportDialog.h b/ExportDialog.h
index 3202812..cf5a5cd 100755
--- a/ExportDialog.h
+++ b/ExportDialog.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ExportDialog.ui b/ExportDialog.ui
index 5f92f26..6e8c254 100755
--- a/ExportDialog.ui
+++ b/ExportDialog.ui
@@ -13,6 +13,9 @@
Dialog
+
+ true
+
0
@@ -207,9 +210,6 @@
&Close
-
-
-
diff --git a/ExportThread.cpp b/ExportThread.cpp
index aad9c29..669adac 100755
--- a/ExportThread.cpp
+++ b/ExportThread.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -96,7 +96,7 @@ void ExportThread::run()
emit exportProgressUpdate(intExportProgress);
// Scale Picture
- QImage exportPicture = picture->getPicture();
+ QImage exportPicture = picture->getImage();
if (sizeMode == "Desktop")
{
QRect desktopResolution = QApplication::desktop()->screenGeometry();
diff --git a/ExportThread.h b/ExportThread.h
index e6d380e..ecd0cd7 100755
--- a/ExportThread.h
+++ b/ExportThread.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/GlobalString.cpp b/GlobalString.cpp
index 8fe6eb6..00289c3 100755
--- a/GlobalString.cpp
+++ b/GlobalString.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/GlobalString.h b/GlobalString.h
index 65abad2..c9b5bde 100755
--- a/GlobalString.h
+++ b/GlobalString.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/IconLoader.cpp b/IconLoader.cpp
index f093fb7..13ef339 100755
--- a/IconLoader.cpp
+++ b/IconLoader.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/IconLoader.h b/IconLoader.h
index 3fd8f07..c7d5107 100755
--- a/IconLoader.h
+++ b/IconLoader.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/LICENSE b/LICENSE
index 3ebc8c9..94a0453 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1 +1,621 @@
-The license for GRAND THEFT AUTO V SYNC is GNU GPLv3
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
diff --git a/OptionsDialog.cpp b/OptionsDialog.cpp
index 2125f2d..41a761e 100755
--- a/OptionsDialog.cpp
+++ b/OptionsDialog.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -57,6 +57,15 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
ui->rbPicDesktopRes->setText(ui->rbPicDesktopRes->text().arg(QString::number(desktopSizeWidth), QString::number(desktopSizeHeight)));
ui->rbPicDefaultRes->setText(ui->rbPicDefaultRes->text().arg(QString::number(defExportSize.width()), QString::number(defExportSize.height())));
+ if (QIcon::hasThemeIcon("dialog-ok"))
+ {
+ ui->cmdOK->setIcon(QIcon::fromTheme("dialog-ok"));
+ }
+ if (QIcon::hasThemeIcon("dialog-cancel"))
+ {
+ ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
+ }
+
setupTreeWidget();
setupLanguageBox();
setupRadioButtons();
@@ -65,6 +74,10 @@ OptionsDialog::OptionsDialog(ProfileDatabase *profileDB, QWidget *parent) :
setupCustomGTAFolder();
setupSnapmaticPictureViewer();
+#ifdef GTA5SYNC_DISABLED
+ ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tabSync));
+#endif
+
this->setWindowTitle(windowTitle().arg(GTA5SYNC_APPSTR));
}
diff --git a/OptionsDialog.h b/OptionsDialog.h
index 7630dc2..83aa3e3 100755
--- a/OptionsDialog.h
+++ b/OptionsDialog.h
@@ -1,6 +1,6 @@
/******************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/OptionsDialog.ui b/OptionsDialog.ui
index c83a658..995ae79 100755
--- a/OptionsDialog.ui
+++ b/OptionsDialog.ui
@@ -414,6 +414,26 @@
+
+
+ Sync
+
+
+ -
+
+
+ Sync is not implemented at current time
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+
+
-
@@ -442,13 +462,10 @@
&OK
-
-
-
-
-
+
0
@@ -458,9 +475,6 @@
&Cancel
-
-
-
@@ -470,7 +484,7 @@
- cmdClose
+ cmdCancel
clicked()
OptionsDialog
close()
diff --git a/PictureCopy.cpp b/PictureCopy.cpp
deleted file mode 100755
index cf99d75..0000000
--- a/PictureCopy.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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 "config.h"
-#include "PictureCopy.h"
-#include "PictureDialog.h"
-#include "StandardPaths.h"
-#include "SidebarGenerator.h"
-#include
-#include
-#include
-
-PictureCopy::PictureCopy()
-{
-
-}
-
-void PictureCopy::copyPicture(QWidget *parent, QString picPath, SnapmaticPicture *picture)
-{
- QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
- settings.beginGroup("FileDialogs");
- settings.beginGroup("PictureCopy");
-
- QString adjustedPicPath = picPath;
- if (adjustedPicPath.right(7) == ".hidden") // for the hidden file system
- {
- adjustedPicPath.remove(adjustedPicPath.length() - 7, 7);
- }
-
-fileDialogPreSave:
- QFileInfo sgdFileInfo(adjustedPicPath);
- QFileDialog fileDialog(parent);
- fileDialog.setFileMode(QFileDialog::AnyFile);
- fileDialog.setViewMode(QFileDialog::Detail);
- fileDialog.setAcceptMode(QFileDialog::AcceptSave);
- fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
- fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
- fileDialog.setDefaultSuffix(".rem");
- fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
- fileDialog.setWindowTitle(PictureDialog::tr("Export as GTA Snapmatic..."));
- fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("&Export"));
-
- QStringList filters;
- filters << PictureDialog::tr("GTA V Export (*.g5e)");
- filters << PictureDialog::tr("GTA V Raw Export (*.auto)");
- filters << PictureDialog::tr("Snapmatic pictures (PGTA*)");
- fileDialog.setNameFilters(filters);
-
- QList sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
-
- fileDialog.setSidebarUrls(sidebarUrls);
- fileDialog.setDirectory(settings.value("Directory", StandardPaths::documentsLocation()).toString());
- fileDialog.selectFile(QString(picture->getExportPictureFileName() + ".g5e"));
- fileDialog.restoreGeometry(settings.value(parent->objectName() + "+Geomtery", "").toByteArray());
-
-
- if (fileDialog.exec())
- {
- QStringList selectedFiles = fileDialog.selectedFiles();
- if (selectedFiles.length() == 1)
- {
- QString selectedFile = selectedFiles.at(0);
-
- if (QFile::exists(selectedFile))
- {
- if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
- {
- if (!QFile::remove(selectedFile))
- {
- QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
- goto fileDialogPreSave;
- }
- }
- else
- {
- goto fileDialogPreSave;
- }
- }
-
- if (selectedFile.right(4) == ".g5e")
- {
- bool isExported = picture->exportPicture(selectedFile, true);
- if (!isExported)
- {
- QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
- goto fileDialogPreSave;
- }
- }
- else
- {
- bool isAutoExt = false;
- if (selectedFile.right(5) == ".auto")
- {
- isAutoExt = true;
- QString dirPath = QFileInfo(selectedFile).dir().path();
- QString stockFileName = sgdFileInfo.fileName();
- selectedFile = dirPath + "/" + stockFileName;
- }
- else if (selectedFile.right(4) == ".rem")
- {
- selectedFile.remove(".rem");
- }
- bool isCopied = picture->exportPicture(selectedFile, false);
- if (!isCopied)
- {
- QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
- goto fileDialogPreSave;
- }
- else
- {
- if (isAutoExt) QMessageBox::information(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Exported Snapmatic to \"%1\" because of using the .auto extension.").arg(selectedFile));
- }
- }
- }
- else
- {
- QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("No valid file is selected"));
- goto fileDialogPreSave;
- }
- }
-
- settings.setValue(parent->objectName() + "+Geometry", fileDialog.saveGeometry());
- settings.setValue("Directory", fileDialog.directory().absolutePath());
- settings.endGroup();
-}
diff --git a/PictureCopy.h b/PictureCopy.h
deleted file mode 100755
index 850b438..0000000
--- a/PictureCopy.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*****************************************************************************
-* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 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 PICTURECOPY_H
-#define PICTURECOPY_H
-
-#include "SnapmaticPicture.h"
-#include
-#include
-
-class PictureCopy
-{
-public:
- PictureCopy();
- static void copyPicture(QWidget *parent, QString picPath, SnapmaticPicture *picture);
-};
-
-#endif // PICTURECOPY_H
diff --git a/PictureDialog.cpp b/PictureDialog.cpp
index 40d4cc8..4fa83bd 100755
--- a/PictureDialog.cpp
+++ b/PictureDialog.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -24,7 +24,6 @@
#include "StandardPaths.h"
#include "PictureExport.h"
#include "GlobalString.h"
-#include "PictureCopy.h"
#include "UiModLabel.h"
#ifdef GTA5SYNC_WIN
@@ -103,6 +102,12 @@ PictureDialog::PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, Q
// Event connects
connect(ui->labJSON, SIGNAL(resized(QSize)), this, SLOT(adaptNewDialogSize(QSize)));
+ // Dialog buttons
+ if (QIcon::hasThemeIcon("dialog-close"))
+ {
+ ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+ }
+
installEventFilter(this);
installEventFilter(ui->labPicture);
ui->labPicture->setFocusPolicy(Qt::StrongFocus);
@@ -340,12 +345,12 @@ void PictureDialog::renderOverlayPicture()
overlayTempImage = overlayTempPixmap.toImage();
}
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, QString picturePath, bool readOk, bool _indexed, int _index)
+void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, bool _indexed, int _index)
{
snapmaticPicture = QImage();
indexed = _indexed;
index = _index;
- picPath = picturePath;
+ picPath = picture->getPictureFilePath();
smpic = picture;
if (!readOk)
{
@@ -354,7 +359,7 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, QString pictu
}
if (picture->isPicOk())
{
- snapmaticPicture = picture->getPicture();
+ snapmaticPicture = picture->getImage();
renderPicture();
ui->cmdExport->setEnabled(true);
}
@@ -367,7 +372,7 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, QString pictu
created = picture->getSnapmaticProperties().createdDateTime.toString(Qt::DefaultLocaleShortDate);
plyrsList = picture->getSnapmaticProperties().playersList;
picTitl = picture->getPictureTitl();
- picArea = picture->getSnapmaticProperties().area;
+ picArea = picture->getSnapmaticProperties().location.area;
if (globalMap.contains(picArea))
{
picAreaStr = globalMap[picArea];
@@ -411,24 +416,14 @@ void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, QString pictu
emit newPictureCommited(snapmaticPicture);
}
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, QString picPath, bool readOk)
-{
- setSnapmaticPicture(picture, picPath, readOk, false, 0);
-}
-
-void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, QString picPath)
-{
- setSnapmaticPicture(picture, picPath, true);
-}
-
void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, int index)
{
- setSnapmaticPicture(picture, picture->getPictureFileName(), readOk, true, index);
+ setSnapmaticPicture(picture, readOk, true, index);
}
void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, bool readOk)
{
- setSnapmaticPicture(picture, picture->getPictureFileName(), readOk);
+ setSnapmaticPicture(picture, readOk, false, 0);
}
void PictureDialog::setSnapmaticPicture(SnapmaticPicture *picture, int index)
@@ -509,11 +504,11 @@ void PictureDialog::exportSnapmaticPicture()
{
if (rqfullscreen && fullscreenWidget)
{
- PictureExport::exportPicture(fullscreenWidget, smpic);
+ PictureExport::exportAsPicture(fullscreenWidget, smpic);
}
else
{
- PictureExport::exportPicture(this, smpic);
+ PictureExport::exportAsPicture(this, smpic);
}
}
@@ -521,11 +516,11 @@ void PictureDialog::copySnapmaticPicture()
{
if (rqfullscreen && fullscreenWidget)
{
- PictureCopy::copyPicture(fullscreenWidget, picPath, smpic);
+ PictureExport::exportAsSnapmatic(fullscreenWidget, smpic);
}
else
{
- PictureCopy::copyPicture(this, picPath, smpic);
+ PictureExport::exportAsSnapmatic(this, smpic);
}
}
@@ -537,9 +532,9 @@ void PictureDialog::on_labPicture_mouseDoubleClicked(Qt::MouseButton button)
PictureWidget *pictureWidget = new PictureWidget(this);
pictureWidget->setObjectName("PictureWidget");
#if QT_VERSION >= 0x050600
- pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::MaximizeUsingFullscreenGeometryHint);
+ pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::WindowStaysOnTopHint^Qt::MaximizeUsingFullscreenGeometryHint);
#else
- pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint);
+ pictureWidget->setWindowFlags(pictureWidget->windowFlags()^Qt::FramelessWindowHint^Qt::WindowStaysOnTopHint);
#endif
pictureWidget->setWindowTitle(this->windowTitle());
pictureWidget->setStyleSheet("QLabel#pictureLabel{background-color: black;}");
diff --git a/PictureDialog.h b/PictureDialog.h
index c16f3c7..c05bd6a 100755
--- a/PictureDialog.h
+++ b/PictureDialog.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -36,9 +36,7 @@ class PictureDialog : public QDialog
Q_OBJECT
public:
explicit PictureDialog(ProfileDatabase *profileDB, CrewDatabase *crewDB, QWidget *parent = 0);
- void setSnapmaticPicture(SnapmaticPicture *picture, QString picPath, bool readOk, bool indexed, int index);
- void setSnapmaticPicture(SnapmaticPicture *picture, QString picPath, bool readOk);
- void setSnapmaticPicture(SnapmaticPicture *picture, QString picPath);
+ void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, bool indexed, int index);
void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk, int index);
void setSnapmaticPicture(SnapmaticPicture *picture, bool readOk);
void setSnapmaticPicture(SnapmaticPicture *picture, int index);
diff --git a/PictureDialog.ui b/PictureDialog.ui
index ecf1214..c658d32 100755
--- a/PictureDialog.ui
+++ b/PictureDialog.ui
@@ -188,9 +188,6 @@
&Close
-
-
-
false
diff --git a/PictureExport.cpp b/PictureExport.cpp
index 2007c28..df23f72 100755
--- a/PictureExport.cpp
+++ b/PictureExport.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -33,7 +33,7 @@ PictureExport::PictureExport()
}
-void PictureExport::exportPicture(QWidget *parent, SnapmaticPicture *picture)
+void PictureExport::exportAsPicture(QWidget *parent, SnapmaticPicture *picture)
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
@@ -69,11 +69,12 @@ void PictureExport::exportPicture(QWidget *parent, SnapmaticPicture *picture)
}
QString sizeMode = settings.value("ExportSizeMode", "Default").toString();
Qt::AspectRatioMode aspectRatio = (Qt::AspectRatioMode)settings.value("AspectRatio", Qt::KeepAspectRatio).toInt();
+ QString defaultExportFormat = settings.value("DefaultExportFormat", ".jpg").toString();
settings.endGroup();
// End Picture Settings
settings.beginGroup("FileDialogs");
- settings.beginGroup("ExportPicture");
+ settings.beginGroup("ExportAsPicture");
fileDialogPreSave:
QFileDialog fileDialog(parent);
@@ -98,7 +99,7 @@ fileDialogPreSave:
fileDialog.setDirectory(settings.value("Directory", StandardPaths::picturesLocation()).toString());
fileDialog.restoreGeometry(settings.value(parent->objectName() + "+Geomtery", "").toByteArray());
- QString newPictureFileName = getPictureFileName(picture);
+ QString newPictureFileName = getPictureFileName(picture) + defaultExportFormat;
fileDialog.selectFile(newPictureFileName);
if (fileDialog.exec())
@@ -154,7 +155,7 @@ fileDialogPreSave:
}
// Scale Picture
- QImage exportPicture = picture->getPicture();
+ QImage exportPicture = picture->getImage();
if (sizeMode == "Desktop")
{
QRect desktopResolution = QApplication::desktop()->screenGeometry();
@@ -194,6 +195,115 @@ fileDialogPreSave:
settings.endGroup();
}
+void PictureExport::exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture)
+{
+ QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
+ settings.beginGroup("FileDialogs");
+ settings.beginGroup("ExportAsSnapmatic");
+
+ QString adjustedPicPath = picture->getPictureFileName();
+ if (adjustedPicPath.right(7) == ".hidden") // for the hidden file system
+ {
+ adjustedPicPath.remove(adjustedPicPath.length() - 7, 7);
+ }
+
+fileDialogPreSave:
+ QFileInfo sgdFileInfo(adjustedPicPath);
+ QFileDialog fileDialog(parent);
+ fileDialog.setFileMode(QFileDialog::AnyFile);
+ fileDialog.setViewMode(QFileDialog::Detail);
+ fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+ fileDialog.setOption(QFileDialog::DontUseNativeDialog, false);
+ fileDialog.setOption(QFileDialog::DontConfirmOverwrite, true);
+ fileDialog.setDefaultSuffix(".rem");
+ fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
+ fileDialog.setWindowTitle(PictureDialog::tr("Export as GTA Snapmatic..."));
+ fileDialog.setLabelText(QFileDialog::Accept, PictureDialog::tr("&Export"));
+
+ QStringList filters;
+ filters << PictureDialog::tr("GTA V Export (*.g5e)");
+ filters << PictureDialog::tr("GTA V Raw Export (*.auto)");
+ filters << PictureDialog::tr("Snapmatic pictures (PGTA*)");
+ fileDialog.setNameFilters(filters);
+
+ QList sidebarUrls = SidebarGenerator::generateSidebarUrls(fileDialog.sidebarUrls());
+
+ fileDialog.setSidebarUrls(sidebarUrls);
+ fileDialog.setDirectory(settings.value("Directory", StandardPaths::documentsLocation()).toString());
+ fileDialog.selectFile(QString(picture->getExportPictureFileName() + ".g5e"));
+ fileDialog.restoreGeometry(settings.value(parent->objectName() + "+Geomtery", "").toByteArray());
+
+
+ if (fileDialog.exec())
+ {
+ QStringList selectedFiles = fileDialog.selectedFiles();
+ if (selectedFiles.length() == 1)
+ {
+ QString selectedFile = selectedFiles.at(0);
+
+ if (QFile::exists(selectedFile))
+ {
+ if (QMessageBox::Yes == QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Overwrite %1 with current Snapmatic picture?").arg("\""+selectedFile+"\""), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes))
+ {
+ if (!QFile::remove(selectedFile))
+ {
+ QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to overwrite %1 with current Snapmatic picture").arg("\""+selectedFile+"\""));
+ goto fileDialogPreSave;
+ }
+ }
+ else
+ {
+ goto fileDialogPreSave;
+ }
+ }
+
+ if (selectedFile.right(4) == ".g5e")
+ {
+ bool isExported = picture->exportPicture(selectedFile, true);
+ if (!isExported)
+ {
+ QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
+ goto fileDialogPreSave;
+ }
+ }
+ else
+ {
+ bool isAutoExt = false;
+ if (selectedFile.right(5) == ".auto")
+ {
+ isAutoExt = true;
+ QString dirPath = QFileInfo(selectedFile).dir().path();
+ QString stockFileName = sgdFileInfo.fileName();
+ selectedFile = dirPath + "/" + stockFileName;
+ }
+ else if (selectedFile.right(4) == ".rem")
+ {
+ selectedFile.remove(".rem");
+ }
+ bool isCopied = picture->exportPicture(selectedFile, false);
+ if (!isCopied)
+ {
+ QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Failed to export current Snapmatic picture"));
+ goto fileDialogPreSave;
+ }
+ else
+ {
+ if (isAutoExt) QMessageBox::information(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("Exported Snapmatic to \"%1\" because of using the .auto extension.").arg(selectedFile));
+ }
+ }
+ }
+ else
+ {
+ QMessageBox::warning(parent, PictureDialog::tr("Export as GTA Snapmatic"), PictureDialog::tr("No valid file is selected"));
+ goto fileDialogPreSave;
+ }
+ }
+
+ settings.setValue(parent->objectName() + "+Geometry", fileDialog.saveGeometry());
+ settings.setValue("Directory", fileDialog.directory().absolutePath());
+ settings.endGroup();
+}
+
QString PictureExport::getPictureFileName(SnapmaticPicture *picture)
{
return picture->getExportPictureFileName();
diff --git a/PictureExport.h b/PictureExport.h
index 76e224e..f7aeee9 100755
--- a/PictureExport.h
+++ b/PictureExport.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -27,7 +27,8 @@ class PictureExport
{
public:
PictureExport();
- static void exportPicture(QWidget *parent, SnapmaticPicture *picture);
+ static void exportAsPicture(QWidget *parent, SnapmaticPicture *picture);
+ static void exportAsSnapmatic(QWidget *parent, SnapmaticPicture *picture);
static QString getPictureFileName(SnapmaticPicture *picture);
};
diff --git a/PictureWidget.cpp b/PictureWidget.cpp
index 5811f0c..95d51a1 100644
--- a/PictureWidget.cpp
+++ b/PictureWidget.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/PictureWidget.h b/PictureWidget.h
index f9066d9..2ebd21c 100644
--- a/PictureWidget.h
+++ b/PictureWidget.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ProfileDatabase.cpp b/ProfileDatabase.cpp
index a809c82..b7bc1c7 100755
--- a/ProfileDatabase.cpp
+++ b/ProfileDatabase.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ProfileDatabase.h b/ProfileDatabase.h
index e32b1c4..b92fb4f 100755
--- a/ProfileDatabase.h
+++ b/ProfileDatabase.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ProfileInterface.cpp b/ProfileInterface.cpp
index 847d072..e65cb0b 100755
--- a/ProfileInterface.cpp
+++ b/ProfileInterface.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -27,6 +27,7 @@
#include "StandardPaths.h"
#include "ProfileLoader.h"
#include "ExportThread.h"
+#include "ImportDialog.h"
#include "config.h"
#include
#include
@@ -39,6 +40,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -65,6 +67,11 @@ ProfileInterface::ProfileInterface(ProfileDatabase *profileDB, CrewDatabase *cre
QColor baseColor = palette.base().color();
ui->labVersion->setText(ui->labVersion->text().arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
ui->saProfile->setStyleSheet(QString("QWidget#saProfileContent{background-color: rgb(%1, %2, %3)}").arg(QString::number(baseColor.red()),QString::number(baseColor.green()),QString::number(baseColor.blue())));
+
+ if (QIcon::hasThemeIcon("dialog-close"))
+ {
+ ui->cmdCloseProfile->setIcon(QIcon::fromTheme("dialog-close"));
+ }
}
ProfileInterface::~ProfileInterface()
@@ -103,19 +110,19 @@ void ProfileInterface::setupProfileInterface()
{
ui->labProfileLoading->setText(tr("Loading..."));
profileLoader = new ProfileLoader(profileFolder, crewDB);
- QObject::connect(profileLoader, SIGNAL(savegameLoaded(SavegameData*, QString)), this, SLOT(savegameLoaded(SavegameData*, QString)));
- QObject::connect(profileLoader, SIGNAL(pictureLoaded(SnapmaticPicture*, QString)), this, SLOT(pictureLoaded(SnapmaticPicture*, QString)));
+ QObject::connect(profileLoader, SIGNAL(savegameLoaded(SavegameData*, QString)), this, SLOT(savegameLoaded_event(SavegameData*, QString)));
+ QObject::connect(profileLoader, SIGNAL(pictureLoaded(SnapmaticPicture*)), this, SLOT(pictureLoaded_event(SnapmaticPicture*)));
QObject::connect(profileLoader, SIGNAL(loadingProgress(int,int)), this, SLOT(loadingProgress(int,int)));
QObject::connect(profileLoader, SIGNAL(finished()), this, SLOT(profileLoaded_p()));
profileLoader->start();
}
-void ProfileInterface::savegameLoaded(SavegameData *savegame, QString savegamePath)
+void ProfileInterface::savegameLoaded_event(SavegameData *savegame, QString savegamePath)
{
- savegameLoaded_f(savegame, savegamePath, false);
+ savegameLoaded(savegame, savegamePath, false);
}
-void ProfileInterface::savegameLoaded_f(SavegameData *savegame, QString savegamePath, bool inserted)
+void ProfileInterface::savegameLoaded(SavegameData *savegame, QString savegamePath, bool inserted)
{
SavegameWidget *sgdWidget = new SavegameWidget(this);
sgdWidget->setSavegameData(savegame, savegamePath);
@@ -123,7 +130,7 @@ void ProfileInterface::savegameLoaded_f(SavegameData *savegame, QString savegame
widgets[sgdWidget] = "SGD" + QFileInfo(savegamePath).fileName();
savegames.append(savegame);
if (selectedWidgts != 0 || contentMode == 2) { sgdWidget->setSelectionMode(true); }
- QObject::connect(sgdWidget, SIGNAL(savegameDeleted()), this, SLOT(savegameDeleted()));
+ QObject::connect(sgdWidget, SIGNAL(savegameDeleted()), this, SLOT(savegameDeleted_event()));
QObject::connect(sgdWidget, SIGNAL(widgetSelected()), this, SLOT(profileWidgetSelected()));
QObject::connect(sgdWidget, SIGNAL(widgetDeselected()), this, SLOT(profileWidgetDeselected()));
QObject::connect(sgdWidget, SIGNAL(allWidgetsSelected()), this, SLOT(selectAllWidgets()));
@@ -131,20 +138,20 @@ void ProfileInterface::savegameLoaded_f(SavegameData *savegame, QString savegame
if (inserted) { insertSavegameIPI(sgdWidget); }
}
-void ProfileInterface::pictureLoaded(SnapmaticPicture *picture, QString picturePath)
+void ProfileInterface::pictureLoaded_event(SnapmaticPicture *picture)
{
- pictureLoaded_f(picture, picturePath, false);
+ pictureLoaded(picture, false);
}
-void ProfileInterface::pictureLoaded_f(SnapmaticPicture *picture, QString picturePath, bool inserted)
+void ProfileInterface::pictureLoaded(SnapmaticPicture *picture, bool inserted)
{
SnapmaticWidget *picWidget = new SnapmaticWidget(profileDB, crewDB, threadDB, this);
- picWidget->setSnapmaticPicture(picture, picturePath);
+ picWidget->setSnapmaticPicture(picture);
picWidget->setContentMode(contentMode);
widgets[picWidget] = "PIC" + picture->getPictureSortStr();
pictures.append(picture);
if (selectedWidgts != 0 || contentMode == 2) { picWidget->setSelectionMode(true); }
- QObject::connect(picWidget, SIGNAL(pictureDeleted()), this, SLOT(pictureDeleted()));
+ QObject::connect(picWidget, SIGNAL(pictureDeleted()), this, SLOT(pictureDeleted_event()));
QObject::connect(picWidget, SIGNAL(widgetSelected()), this, SLOT(profileWidgetSelected()));
QObject::connect(picWidget, SIGNAL(widgetDeselected()), this, SLOT(profileWidgetDeselected()));
QObject::connect(picWidget, SIGNAL(allWidgetsSelected()), this, SLOT(selectAllWidgets()));
@@ -307,12 +314,12 @@ void ProfileInterface::profileLoaded_p()
emit profileLoaded();
}
-void ProfileInterface::savegameDeleted()
+void ProfileInterface::savegameDeleted_event()
{
- savegameDeleted_f((SavegameWidget*)sender());
+ savegameDeleted((SavegameWidget*)sender());
}
-void ProfileInterface::savegameDeleted_f(QWidget *sgdWidget_)
+void ProfileInterface::savegameDeleted(QWidget *sgdWidget_)
{
SavegameWidget *sgdWidget = (SavegameWidget*)sgdWidget_;
SavegameData *savegame = sgdWidget->getSavegame();
@@ -324,12 +331,12 @@ void ProfileInterface::savegameDeleted_f(QWidget *sgdWidget_)
delete savegame;
}
-void ProfileInterface::pictureDeleted()
+void ProfileInterface::pictureDeleted_event()
{
- pictureDeleted_f((SnapmaticWidget*)sender());
+ pictureDeleted((SnapmaticWidget*)sender());
}
-void ProfileInterface::pictureDeleted_f(QWidget *picWidget_)
+void ProfileInterface::pictureDeleted(QWidget *picWidget_)
{
SnapmaticWidget *picWidget = (SnapmaticWidget*)picWidget_;
SnapmaticPicture *picture = picWidget->getPicture();
@@ -363,10 +370,11 @@ fileDialogPreOpen:
fileDialog.setLabelText(QFileDialog::Accept, tr("Import"));
QStringList filters;
- filters << tr("All profile files (*.g5e SGTA* PGTA*)");
+ filters << tr("Importable files (*.g5e *.jpg *.png SGTA* PGTA*)");
filters << tr("GTA V Export (*.g5e)");
filters << tr("Savegames files (SGTA*)");
filters << tr("Snapmatic pictures (PGTA*)");
+ filters << tr("All image files (*.jpg *.png)");
filters << tr("All files (**)");
fileDialog.setNameFilters(filters);
@@ -382,19 +390,66 @@ fileDialogPreOpen:
if (selectedFiles.length() == 1)
{
QString selectedFile = selectedFiles.at(0);
- if (!importFile(selectedFile, true)) goto fileDialogPreOpen;
+ if (!importFile(selectedFile, true, 0)) goto fileDialogPreOpen;
}
else if (selectedFiles.length() > 1)
{
+ int maximumId = selectedFiles.length();
+ int overallId = 1;
+ int currentId = 0;
QString errorStr;
QStringList failedFiles;
+
+ // Progress dialog
+ QProgressDialog pbDialog(this);
+ pbDialog.setWindowFlags(pbDialog.windowFlags()^Qt::WindowContextHelpButtonHint^Qt::WindowCloseButtonHint);
+ pbDialog.setWindowTitle(tr("Import..."));
+ pbDialog.setLabelText(tr("Import file %1 of %2 files").arg(QString::number(overallId), QString::number(maximumId)));
+ pbDialog.setRange(1, maximumId);
+ pbDialog.setValue(1);
+ pbDialog.setModal(true);
+ QList pbBtn = pbDialog.findChildren();
+ pbBtn.at(0)->setDisabled(true);
+ QList pbBar = pbDialog.findChildren();
+ pbBar.at(0)->setTextVisible(false);
+ pbDialog.show();
+
+ QTime t;
+ t.start();
foreach(const QString &selectedFile, selectedFiles)
{
- if (!importFile(selectedFile, false))
+ pbDialog.setValue(overallId);
+ pbDialog.setLabelText(tr("Import file %1 of %2 files").arg(QString::number(overallId), QString::number(maximumId)));
+ if (currentId == 10)
+ {
+ // Break until two seconds are over (this prevent import failures)
+ int elapsedTime = t.elapsed();
+ if (elapsedTime > 2000)
+ {
+ }
+ else if (elapsedTime < 0)
+ {
+ QEventLoop loop;
+ QTimer::singleShot(2000, &loop, SLOT(quit()));
+ loop.exec();
+ }
+ else
+ {
+ QEventLoop loop;
+ QTimer::singleShot(2000 - elapsedTime, &loop, SLOT(quit()));
+ loop.exec();
+ }
+ currentId = 0;
+ t.restart();
+ }
+ if (!importFile(selectedFile, false, currentId))
{
failedFiles << QFileInfo(selectedFile).fileName();
}
+ overallId++;
+ currentId++;
}
+ pbDialog.close();
foreach (const QString &curErrorStr, failedFiles)
{
errorStr.append(", " + curErrorStr);
@@ -418,7 +473,7 @@ fileDialogPreOpen:
settings.endGroup();
}
-bool ProfileInterface::importFile(QString selectedFile, bool warn)
+bool ProfileInterface::importFile(QString selectedFile, bool notMultiple, int currentId)
{
QString selectedFileName = QFileInfo(selectedFile).fileName();
if (QFile::exists(selectedFile))
@@ -428,14 +483,13 @@ bool ProfileInterface::importFile(QString selectedFile, bool warn)
SnapmaticPicture *picture = new SnapmaticPicture(selectedFile);
if (picture->readingPicture())
{
- bool success = importSnapmaticPicture(picture, selectedFile, warn);
+ bool success = importSnapmaticPicture(picture, notMultiple);
if (!success) delete picture;
return success;
}
else
{
- if (warn) QMessageBox::warning(this, tr("Import"), tr("Failed to read Snapmatic picture"));
- picture->deleteLater();
+ if (notMultiple) QMessageBox::warning(this, tr("Import"), tr("Failed to read Snapmatic picture"));
delete picture;
return false;
}
@@ -445,60 +499,175 @@ bool ProfileInterface::importFile(QString selectedFile, bool warn)
SavegameData *savegame = new SavegameData(selectedFile);
if (savegame->readingSavegame())
{
- bool success = importSavegameData(savegame, selectedFile, warn);
+ bool success = importSavegameData(savegame, selectedFile, notMultiple);
if (!success) delete savegame;
return success;
}
else
{
- if (warn) QMessageBox::warning(this, tr("Import"), tr("Failed to read Savegame file"));
- savegame->deleteLater();
+ if (notMultiple) QMessageBox::warning(this, tr("Import"), tr("Failed to read Savegame file"));
delete savegame;
return false;
}
}
+ else if(selectedFileName.right(4) == ".jpg" || selectedFileName.right(4) == ".png")
+ {
+ SnapmaticPicture *picture = new SnapmaticPicture(":/template/template.g5e");
+ if (picture->readingPicture(true, false))
+ {
+ if (!notMultiple)
+ {
+ QImage snapmaticImage;
+ QString customImageTitle;
+ QPixmap snapmaticPixmap(960, 536);
+ snapmaticPixmap.fill(Qt::black);
+ QPainter snapmaticPainter(&snapmaticPixmap);
+ if (!snapmaticImage.load(selectedFile))
+ {
+ delete picture;
+ return false;
+ }
+ if (snapmaticImage.height() == snapmaticImage.width())
+ {
+ // Avatar mode
+ int diffWidth = 0;
+ int diffHeight = 0;
+ snapmaticImage = snapmaticImage.scaled(470, 470, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ if (snapmaticImage.width() > snapmaticImage.height())
+ {
+ diffHeight = 470 - snapmaticImage.height();
+ diffHeight = diffHeight / 2;
+ }
+ else if (snapmaticImage.width() < snapmaticImage.height())
+ {
+ diffWidth = 470 - snapmaticImage.width();
+ diffWidth = diffWidth / 2;
+ }
+ snapmaticPainter.drawImage(145 + diffWidth, 66 + diffHeight, snapmaticImage);
+ customImageTitle = "Custom Avatar";
+ }
+ else
+ {
+ // Picture mode
+ int diffWidth = 0;
+ int diffHeight = 0;
+ snapmaticImage = snapmaticImage.scaled(960, 536, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ if (snapmaticImage.width() != 960)
+ {
+ diffWidth = 960 - snapmaticImage.width();
+ diffWidth = diffWidth / 2;
+ }
+ else if (snapmaticImage.height() != 536)
+ {
+ diffHeight = 536 - snapmaticImage.height();
+ diffHeight = diffHeight / 2;
+ }
+ snapmaticPainter.drawImage(0 + diffWidth, 0 + diffHeight, snapmaticImage);
+ customImageTitle = "Custom Picture";
+ }
+ snapmaticPainter.end();
+ if (!picture->setImage(snapmaticPixmap.toImage()))
+ {
+ delete picture;
+ return false;
+ }
+ SnapmaticProperties spJson = picture->getSnapmaticProperties();
+ spJson.uid = QString(QTime::currentTime().toString("HHmmss") +
+ QString::number(currentId) +
+ QString::number(QDate::currentDate().dayOfYear())).toInt();
+ spJson.createdDateTime = QDateTime::currentDateTime();
+ spJson.createdTimestamp = spJson.createdDateTime.toTime_t();
+ picture->setSnapmaticProperties(spJson);
+ picture->setPicFileName(QString("PGTA5%1").arg(QString::number(spJson.uid)));
+ picture->setPictureTitle(customImageTitle);
+ picture->updateStrings();
+ bool success = importSnapmaticPicture(picture, notMultiple);
+ if (!success) delete picture;
+ return success;
+ }
+ else
+ {
+ bool success = false;
+ QImage snapmaticImage;
+ if (!snapmaticImage.load(selectedFile))
+ {
+ delete picture;
+ return false;
+ }
+ ImportDialog *importDialog = new ImportDialog(this);
+ importDialog->setWindowFlags(importDialog->windowFlags()^Qt::WindowContextHelpButtonHint);
+ importDialog->setImage(snapmaticImage);
+ importDialog->setModal(true);
+ importDialog->show();
+ importDialog->exec();
+ if (importDialog->isDoImport())
+ {
+ if (picture->setImage(importDialog->image()))
+ {
+ SnapmaticProperties spJson = picture->getSnapmaticProperties();
+ spJson.uid = QString(QTime::currentTime().toString("HHmmss") +
+ QString::number(currentId) +
+ QString::number(QDate::currentDate().dayOfYear())).toInt();
+ spJson.createdDateTime = QDateTime::currentDateTime();
+ spJson.createdTimestamp = spJson.createdDateTime.toTime_t();
+ picture->setSnapmaticProperties(spJson);
+ picture->setPicFileName(QString("PGTA5%1").arg(QString::number(spJson.uid)));
+ picture->setPictureTitle(importDialog->getImageTitle());
+ picture->updateStrings();
+ success = importSnapmaticPicture(picture, notMultiple);
+ }
+ }
+ else
+ {
+ delete picture;
+ success = true;
+ }
+ delete importDialog;
+ if (!success) delete picture;
+ return success;
+ }
+ }
+ else
+ {
+ delete picture;
+ return false;
+ }
+ }
else
{
SnapmaticPicture *picture = new SnapmaticPicture(selectedFile);
SavegameData *savegame = new SavegameData(selectedFile);
if (picture->readingPicture())
{
- bool success = importSnapmaticPicture(picture, selectedFile, warn);
+ bool success = importSnapmaticPicture(picture, notMultiple);
delete savegame;
if (!success) delete picture;
return success;
}
else if (savegame->readingSavegame())
{
- bool success = importSavegameData(savegame, selectedFile, warn);
+ bool success = importSavegameData(savegame, selectedFile, notMultiple);
delete picture;
if (!success) delete savegame;
return success;
}
else
{
- savegame->deleteLater();
- picture->deleteLater();
delete savegame;
delete picture;
- if (warn) QMessageBox::warning(this, tr("Import"), tr("Can't import %1 because of not valid file format").arg("\""+selectedFileName+"\""));
+ if (notMultiple) QMessageBox::warning(this, tr("Import"), tr("Can't import %1 because of not valid file format").arg("\""+selectedFileName+"\""));
return false;
}
}
}
- if (warn) QMessageBox::warning(this, tr("Import"), tr("No valid file is selected"));
+ if (notMultiple) QMessageBox::warning(this, tr("Import"), tr("No valid file is selected"));
return false;
}
-bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, QString picPath, bool warn)
+bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, bool warn)
{
- QFileInfo picFileInfo(picPath);
- QString picFileName = picFileInfo.fileName();
+ QString picFileName = picture->getPictureFileName();
QString adjustedFileName = picFileName;
- if (adjustedFileName.right(4) == ".g5e")
- {
- adjustedFileName = picture->getPictureFileName();
- }
if (adjustedFileName.right(7) == ".hidden") // for the hidden file system
{
adjustedFileName.remove(adjustedFileName.length() - 7, 7);
@@ -507,7 +676,7 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, QString
{
adjustedFileName.remove(adjustedFileName.length() - 4, 4);
}
- if (picFileName.left(4) != "PGTA" && picFileName.right(4) != ".g5e")
+ if (picFileName.left(4) != "PGTA")
{
if (warn) QMessageBox::warning(this, tr("Import"), tr("Failed to import the Snapmatic picture, file not begin with PGTA or end with .g5e"));
return false;
@@ -519,8 +688,8 @@ bool ProfileInterface::importSnapmaticPicture(SnapmaticPicture *picture, QString
}
else if (picture->exportPicture(profileFolder + QDir::separator() + adjustedFileName, false))
{
- picture->setPicFileName(profileFolder + QDir::separator() + adjustedFileName);
- pictureLoaded_f(picture, profileFolder + QDir::separator() + adjustedFileName, true);
+ picture->setPicFilePath(profileFolder + QDir::separator() + adjustedFileName);
+ pictureLoaded(picture, true);
return true;
}
else
@@ -557,7 +726,7 @@ bool ProfileInterface::importSavegameData(SavegameData *savegame, QString sgdPat
if (QFile::copy(sgdPath, profileFolder + QDir::separator() + sgdFileName))
{
savegame->setSavegameFileName(profileFolder + QDir::separator() + sgdFileName);
- savegameLoaded_f(savegame, profileFolder + QDir::separator() + sgdFileName, true);
+ savegameLoaded(savegame, profileFolder + QDir::separator() + sgdFileName, true);
return true;
}
else
@@ -788,7 +957,7 @@ void ProfileInterface::deleteSelected()
QString fileName = picWidget->getPicturePath();
if (!QFile::exists(fileName) || QFile::remove(fileName))
{
- pictureDeleted_f(picWidget);
+ pictureDeleted(picWidget);
}
}
else if (widget->getWidgetType() == "SavegameWidget")
@@ -798,7 +967,7 @@ void ProfileInterface::deleteSelected()
QString fileName = savegame->getSavegameFileName();
if (!QFile::exists(fileName) || QFile::remove(fileName))
{
- savegameDeleted_f(sgdWidget);
+ savegameDeleted(sgdWidget);
}
}
}
diff --git a/ProfileInterface.h b/ProfileInterface.h
index 692d888..eff2843 100755
--- a/ProfileInterface.h
+++ b/ProfileInterface.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -62,11 +62,11 @@ public slots:
private slots:
void on_cmdCloseProfile_clicked();
void on_cmdImport_clicked();
- void pictureLoaded(SnapmaticPicture *picture, QString picturePath);
- void savegameLoaded(SavegameData *savegame, QString savegamePath);
+ void pictureLoaded_event(SnapmaticPicture *picture);
+ void savegameLoaded_event(SavegameData *savegame, QString savegamePath);
void loadingProgress(int value, int maximum);
- void pictureDeleted();
- void savegameDeleted();
+ void pictureDeleted_event();
+ void savegameDeleted_event();
void profileLoaded_p();
void profileWidgetSelected();
void profileWidgetDeselected();
@@ -91,13 +91,13 @@ private:
int selectedWidgts;
int contentMode;
- bool importFile(QString selectedFile, bool warn);
- bool importSnapmaticPicture(SnapmaticPicture *picture, QString picPath, bool warn = true);
+ bool importFile(QString selectedFile, bool notMultiple, int currentId);
+ bool importSnapmaticPicture(SnapmaticPicture *picture, bool warn = true);
bool importSavegameData(SavegameData *savegame, QString sgdPath, bool warn = true);
- void pictureLoaded_f(SnapmaticPicture *picture, QString picturePath, bool inserted);
- void savegameLoaded_f(SavegameData *savegame, QString savegamePath, bool inserted);
- void savegameDeleted_f(QWidget *sgdWidget);
- void pictureDeleted_f(QWidget *picWidget);
+ void pictureLoaded(SnapmaticPicture *picture, bool inserted);
+ void savegameLoaded(SavegameData *savegame, QString savegamePath, bool inserted);
+ void savegameDeleted(QWidget *sgdWidget);
+ void pictureDeleted(QWidget *picWidget);
void insertSnapmaticIPI(QWidget *widget);
void insertSavegameIPI(QWidget *widget);
void sortingProfileInterface();
diff --git a/ProfileInterface.ui b/ProfileInterface.ui
index 65f7ce9..1186939 100755
--- a/ProfileInterface.ui
+++ b/ProfileInterface.ui
@@ -216,9 +216,6 @@
&Close
-
-
-
true
diff --git a/ProfileLoader.cpp b/ProfileLoader.cpp
index d8e4f15..013bf6e 100755
--- a/ProfileLoader.cpp
+++ b/ProfileLoader.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -75,7 +75,7 @@ void ProfileLoader::run()
SnapmaticPicture *picture = new SnapmaticPicture(picturePath);
if (picture->readingPicture())
{
- emit pictureLoaded(picture, picturePath);
+ emit pictureLoaded(picture);
int crewNumber = picture->getSnapmaticProperties().crewID;
if (!crewList.contains(crewNumber))
{
diff --git a/ProfileLoader.h b/ProfileLoader.h
index c0ed9b4..6b5bac2 100755
--- a/ProfileLoader.h
+++ b/ProfileLoader.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -40,7 +40,7 @@ private:
ProfileLoader *profileLoader;
signals:
- void pictureLoaded(SnapmaticPicture *picture, QString picturePath);
+ void pictureLoaded(SnapmaticPicture *picture);
void savegameLoaded(SavegameData *savegame, QString savegamePath);
void loadingProgress(int value, int maximum);
};
diff --git a/ProfileWidget.cpp b/ProfileWidget.cpp
index 1b208e2..58828ef 100755
--- a/ProfileWidget.cpp
+++ b/ProfileWidget.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/ProfileWidget.h b/ProfileWidget.h
index cde3218..6fab255 100755
--- a/ProfileWidget.h
+++ b/ProfileWidget.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SavegameCopy.cpp b/SavegameCopy.cpp
index c08a604..f1e0018 100755
--- a/SavegameCopy.cpp
+++ b/SavegameCopy.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -45,7 +45,7 @@ fileDialogPreSave:
fileDialog.setDefaultSuffix("");
fileDialog.setWindowFlags(fileDialog.windowFlags()^Qt::WindowContextHelpButtonHint);
fileDialog.setWindowTitle(SavegameWidget::tr(("Export Savegame...")));
- fileDialog.setLabelText(QFileDialog::Accept, SavegameWidget::tr("&Export"));
+ fileDialog.setLabelText(QFileDialog::Accept, SavegameWidget::tr("Export"));
QStringList filters;
filters << SavegameWidget::tr("Savegame files (SGTA*)");
diff --git a/SavegameCopy.h b/SavegameCopy.h
index c60edfd..1ea5cf6 100755
--- a/SavegameCopy.h
+++ b/SavegameCopy.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SavegameData.cpp b/SavegameData.cpp
index ac3feb8..c88a6d7 100755
--- a/SavegameData.cpp
+++ b/SavegameData.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SavegameData.h b/SavegameData.h
index 46c64fd..2eae21e 100755
--- a/SavegameData.h
+++ b/SavegameData.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SavegameDialog.cpp b/SavegameDialog.cpp
index c4a74aa..66c51f4 100755
--- a/SavegameDialog.cpp
+++ b/SavegameDialog.cpp
@@ -9,6 +9,11 @@ SavegameDialog::SavegameDialog(QWidget *parent) :
{
ui->setupUi(this);
savegameLabStr = ui->labSavegameText->text();
+
+ if (QIcon::hasThemeIcon("dialog-close"))
+ {
+ ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+ }
}
SavegameDialog::~SavegameDialog()
diff --git a/SavegameDialog.ui b/SavegameDialog.ui
index 035b5f9..75a2cc7 100755
--- a/SavegameDialog.ui
+++ b/SavegameDialog.ui
@@ -13,6 +13,9 @@
Savegame Viewer
+
+ true
+
-
@@ -72,9 +75,6 @@
&Close
-
-
-
diff --git a/SavegameWidget.cpp b/SavegameWidget.cpp
index ef58f21..dcee9bb 100755
--- a/SavegameWidget.cpp
+++ b/SavegameWidget.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SavegameWidget.h b/SavegameWidget.h
index 85e8fb2..66dcb67 100755
--- a/SavegameWidget.h
+++ b/SavegameWidget.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SidebarGenerator.cpp b/SidebarGenerator.cpp
index c2eecdc..2675dae 100755
--- a/SidebarGenerator.cpp
+++ b/SidebarGenerator.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SidebarGenerator.h b/SidebarGenerator.h
index d01bba0..35716c0 100755
--- a/SidebarGenerator.h
+++ b/SidebarGenerator.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/SnapmaticEditor.cpp b/SnapmaticEditor.cpp
index a959ccb..28261c0 100644
--- a/SnapmaticEditor.cpp
+++ b/SnapmaticEditor.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -32,6 +32,16 @@ SnapmaticEditor::SnapmaticEditor(QWidget *parent) :
ui->cbMugshot->setVisible(false);
ui->cbEditor->setVisible(false);
ui->cmdApply->setDefault(true);
+
+ if (QIcon::hasThemeIcon("dialog-apply"))
+ {
+ ui->cmdApply->setIcon(QIcon::fromTheme("dialog-apply"));
+ }
+ if (QIcon::hasThemeIcon("dialog-cancel"))
+ {
+ ui->cmdCancel->setIcon(QIcon::fromTheme("dialog-cancel"));
+ }
+
smpic = 0;
}
@@ -189,7 +199,7 @@ void SnapmaticEditor::on_cmdApply_clicked()
localSpJson.isMeme = ui->cbMeme->isChecked();
if (smpic)
{
- QString originalFileName = smpic->getPictureFileName();
+ QString originalFileName = smpic->getPictureFilePath();
QString adjustedFileName = originalFileName;
if (adjustedFileName.right(7) == ".hidden") // for the hidden file system
{
diff --git a/SnapmaticEditor.h b/SnapmaticEditor.h
index e22960c..895b26c 100644
--- a/SnapmaticEditor.h
+++ b/SnapmaticEditor.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -46,7 +46,6 @@ private slots:
void on_rbCustom_toggled(bool checked);
void on_cmdCancel_clicked();
void on_cmdApply_clicked();
-
void on_cbQualify_toggled(bool checked);
private:
diff --git a/SnapmaticEditor.ui b/SnapmaticEditor.ui
index 61830e6..27dd512 100644
--- a/SnapmaticEditor.ui
+++ b/SnapmaticEditor.ui
@@ -7,12 +7,15 @@
0
0
375
- 305
+ 319
Snapmatic Properties
+
+ true
+
-
@@ -190,9 +193,6 @@
&Apply
-
-
-
-
@@ -206,9 +206,6 @@
&Cancel
-
-
-
diff --git a/SnapmaticPicture.cpp b/SnapmaticPicture.cpp
index 98c044c..1bcf128 100755
--- a/SnapmaticPicture.cpp
+++ b/SnapmaticPicture.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -30,7 +30,7 @@
#include
#include
-SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : QObject(parent), picFileName(fileName)
+SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : QObject(parent), picFilePath(fileName)
{
// PARSE INT INIT - DO NOT CHANGE THIS VALUES
snapmaticHeaderLength = 278;
@@ -46,11 +46,29 @@ SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : Q
jpegStreamEditorBegin = 292;
jsonStreamEditorBegin = 524588;
jsonStreamEditorLength = 3072;
+ titlStreamEditorBegin = 527668;
+ titlStreamEditorLength = 256;
+ titlStreamCharacterMax = 39;
+ rawPicContent = "";
+
+ reset();
+}
+
+SnapmaticPicture::~SnapmaticPicture()
+{
+}
+
+void SnapmaticPicture::reset()
+{
+ // PARSE EDITOR INIT
rawPicContent = "";
// INIT PIC
cachePicture = QImage(0, 0, QImage::Format_RGB32);
+ jpegRawContentSize = 0;
picExportFileName = "";
+ isCustomFormat = 0;
+ pictureHead = "";
pictureStr = "";
lastStep = "";
sortStr = "";
@@ -63,10 +81,6 @@ SnapmaticPicture::SnapmaticPicture(const QString &fileName, QObject *parent) : Q
jsonStr = "";
}
-SnapmaticPicture::~SnapmaticPicture()
-{
-}
-
bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
{
// Start opening file
@@ -76,22 +90,27 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
writeEnabled = writeEnabled_;
cacheEnabled = cacheEnabled_;
- QFile *picFile = new QFile(picFileName);
+ QFile *picFile = new QFile(picFilePath);
+ picFileName = QFileInfo(picFilePath).fileName();
+
QIODevice *picStream;
if (!picFile->open(QFile::ReadOnly))
{
- lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(picFileName);
+ lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(picFilePath);
picFile->deleteLater();
delete picFile;
return false;
}
- if (picFileName.right(4) != ".g5e")
+ if (picFilePath.right(4) != ".g5e")
{
rawPicContent = picFile->read(snapmaticFileMaxSize);
picFile->close();
delete picFile;
+
+ // Set Custom Format
+ isCustomFormat = false;
}
else
{
@@ -99,6 +118,9 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
picFile->close();
delete picFile;
+ // Set Custom Format
+ isCustomFormat = true;
+
// Reading g5e Content
g5eContent.remove(0, 1);
if (g5eContent.left(3) == "G5E")
@@ -124,31 +146,31 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
}
else
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",4,G5E_FORMATERROR";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",4,G5E_FORMATERROR";
return false;
}
}
else
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",3,G5E_FORMATERROR";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",3,G5E_FORMATERROR";
return false;
}
}
else
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",2,G5E_FORMATERROR";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,G5E_FORMATERROR";
return false;
}
}
else
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",1,G5E_NOTCOMPATIBLE";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",1,G5E_NOTCOMPATIBLE";
return false;
}
}
else
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",1,G5E_FORMATERROR";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",1,G5E_FORMATERROR";
return false;
}
}
@@ -159,19 +181,19 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
// Reading Snapmatic Header
if (!picStream->isReadable())
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",1,NOHEADER";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",1,NOHEADER";
picStream->close();
picStream->deleteLater();
delete picStream;
return false;
}
QByteArray snapmaticHeaderLine = picStream->read(snapmaticHeaderLength);
- pictureStr = getSnapmaticPictureString(snapmaticHeaderLine);
+ pictureHead = getSnapmaticHeaderString(snapmaticHeaderLine);
// Reading JPEG Header Line
if (!picStream->isReadable())
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",2,NOHEADER";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,NOHEADER";
picStream->close();
picStream->deleteLater();
delete picStream;
@@ -183,7 +205,7 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
jpegHeaderLine.remove(0, jpegHeaderLineDifStr);
if (jpegHeaderLine.left(4) != "JPEG")
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",2,NOJPEG";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,NOJPEG";
picStream->close();
picStream->deleteLater();
delete picStream;
@@ -193,13 +215,24 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
// Read JPEG Stream
if (!picStream->isReadable())
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",2,NOPIC";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,NOPIC";
picStream->close();
picStream->deleteLater();
delete picStream;
return false;
}
QByteArray jpegRawContent = picStream->read(jpegPicStreamLength);
+ if (jpegRawContent.contains(QByteArray::fromHex("FFD9")))
+ {
+ int jpegRawContentSizeT = jpegRawContent.indexOf(QByteArray::fromHex("FFD9")) + 2;
+ jpegRawContentSize = jpegRawContentSizeT;
+ if (jpegRawContent.contains(QByteArray::fromHex("FF454F49")))
+ {
+ jpegRawContentSizeT = jpegRawContent.indexOf(QByteArray::fromHex("FF454F49"));
+ }
+ jpegRawContent = jpegRawContent.left(jpegRawContentSize);
+ jpegRawContentSize = jpegRawContentSizeT;
+ }
if (cacheEnabled) picOk = cachePicture.loadFromData(jpegRawContent, "JPEG");
if (!cacheEnabled)
{
@@ -210,19 +243,19 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
// Read JSON Stream
if (!picStream->isReadable())
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",3,NOJSON";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",3,NOJSON";
picStream->close();
picStream->deleteLater();
delete picStream;
- return picOk;
+ return false;
}
else if (picStream->read(4) != "JSON")
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",3,CTJSON";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",3,CTJSON";
picStream->close();
picStream->deleteLater();
delete picStream;
- return picOk;
+ return false;
}
QByteArray jsonRawContent = picStream->read(jsonStreamLength);
jsonStr = getSnapmaticJSONString(jsonRawContent);
@@ -230,26 +263,26 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
if (!picStream->isReadable())
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",4,NOTITL";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",4,NOTITL";
picStream->close();
picStream->deleteLater();
delete picStream;
- return picOk;
+ return false;
}
else if (picStream->read(4) != "TITL")
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",4,CTTITL";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",4,CTTITL";
picStream->close();
picStream->deleteLater();
delete picStream;
- return picOk;
+ return false;
}
QByteArray titlRawContent = picStream->read(tideStreamLength);
titlStr = getSnapmaticTIDEString(titlRawContent);
if (!picStream->isReadable())
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",5,NODESC";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",5,NODESC";
picStream->close();
picStream->deleteLater();
delete picStream;
@@ -257,16 +290,16 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
}
else if (picStream->read(4) != "DESC")
{
- lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFileName) + ",5,CTDESC";
+ lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",5,CTDESC";
picStream->close();
picStream->deleteLater();
delete picStream;
- return picOk;
+ return false;
}
QByteArray descRawContent = picStream->read(tideStreamLength);
descStr = getSnapmaticTIDEString(descRawContent);
- parseSnapmaticExportAndSortString();
+ updateStrings();
picStream->close();
picStream->deleteLater();
@@ -275,7 +308,7 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_)
return picOk;
}
-QString SnapmaticPicture::getSnapmaticPictureString(const QByteArray &snapmaticHeader)
+QString SnapmaticPicture::getSnapmaticHeaderString(const QByteArray &snapmaticHeader)
{
QByteArray snapmaticBytes = snapmaticHeader.left(snapmaticUsefulLength);
QList snapmaticBytesList = snapmaticBytes.split(char(0x01));
@@ -300,50 +333,29 @@ QString SnapmaticPicture::getSnapmaticTIDEString(const QByteArray &tideBytes)
return QString::fromUtf8(tideUsefulBytesList.at(0)).trimmed();
}
-void SnapmaticPicture::parseSnapmaticExportAndSortString()
+void SnapmaticPicture::updateStrings()
{
- QStringList pictureStrList = pictureStr.split(" - ");
- if (pictureStrList.length() <= 2)
- {
- QString dtStr = pictureStrList.at(1);
- QStringList dtStrList = dtStr.split(" ");
- if (dtStrList.length() <= 2)
- {
- QString dayStr;
- QString yearStr;
- QString monthStr;
- QString dateStr = dtStrList.at(0);
- QString timeStr = dtStrList.at(1);
- timeStr.replace(":","");
- QStringList dateStrList = dateStr.split("/");
- if (dateStrList.length() <= 3)
- {
- dayStr = dateStrList.at(1);
- yearStr = dateStrList.at(2);
- monthStr = dateStrList.at(0);
- }
- QString cmpPicTitl = titlStr;
- cmpPicTitl.replace("\"", "''");
- cmpPicTitl.replace(" ", "_");
- cmpPicTitl.replace(":", "-");
- cmpPicTitl.replace("\\", "");
- cmpPicTitl.replace("/", "");
- cmpPicTitl.replace("<", "");
- cmpPicTitl.replace(">", "");
- cmpPicTitl.replace("*", "");
- cmpPicTitl.replace("?", "");
- cmpPicTitl.replace(".", "");
- sortStr = yearStr + monthStr + dayStr + timeStr;
- picExportFileName = sortStr + "_" + cmpPicTitl;
- }
- }
+ QString cmpPicTitl = titlStr;
+ cmpPicTitl.replace("\"", "''");
+ cmpPicTitl.replace(" ", "_");
+ cmpPicTitl.replace(":", "-");
+ cmpPicTitl.replace("\\", "");
+ cmpPicTitl.replace("/", "");
+ cmpPicTitl.replace("<", "");
+ cmpPicTitl.replace(">", "");
+ cmpPicTitl.replace("*", "");
+ cmpPicTitl.replace("?", "");
+ cmpPicTitl.replace(".", "");
+ pictureStr = tr("PHOTO - %1").arg(localSpJson.createdDateTime.toString("MM/dd/yy HH:mm:ss"));
+ sortStr = localSpJson.createdDateTime.toString("yyMMddHHmmss") + QString::number(localSpJson.uid);
+ picExportFileName = sortStr + "_" + cmpPicTitl;
}
bool SnapmaticPicture::readingPictureFromFile(const QString &fileName, bool writeEnabled_, bool cacheEnabled_)
{
if (fileName != "")
{
- picFileName = fileName;
+ picFilePath = fileName;
return readingPicture(writeEnabled_, cacheEnabled_);
}
else
@@ -352,52 +364,68 @@ bool SnapmaticPicture::readingPictureFromFile(const QString &fileName, bool writ
}
}
-bool SnapmaticPicture::setPicture(const QImage &picture)
+bool SnapmaticPicture::setImage(const QImage &picture) // dirty method
{
if (writeEnabled)
{
QByteArray picByteArray;
+ int comLvl = 100;
+ bool saveSuccess = false;
+ while (comLvl != 0 && !saveSuccess)
+ {
+ QByteArray picByteArrayT;
+ QBuffer picStreamT(&picByteArrayT);
+ picStreamT.open(QIODevice::WriteOnly);
+ saveSuccess = picture.save(&picStreamT, "JPEG", comLvl);
+ picStreamT.close();
+ if (saveSuccess)
+ {
+ if (picByteArrayT.length() > jpegRawContentSize)
+ {
+ comLvl--;
+ saveSuccess = false;
+ }
+ else
+ {
+ picByteArray = picByteArrayT;
+ }
+ }
+ }
+ if (saveSuccess) return setPictureStream(picByteArray);
+ }
+ return false;
+}
+
+bool SnapmaticPicture::setPictureStream(const QByteArray &picByteArray_) // clean method
+{
+ if (writeEnabled)
+ {
+ bool lvlEoi = false;
+ QByteArray picByteArray = picByteArray_;
QBuffer snapmaticStream(&rawPicContent);
snapmaticStream.open(QIODevice::ReadWrite);
- if (snapmaticStream.seek(jpegStreamEditorBegin))
+ if (!snapmaticStream.seek(jpegStreamEditorBegin)) return false;
+ if (picByteArray.length() > jpegPicStreamLength) return false;
+ if (picByteArray.length() < jpegRawContentSize && jpegRawContentSize + 4 < jpegPicStreamLength)
{
- bool saveSuccess;
- Q_UNUSED(saveSuccess)
- QByteArray picByteArray1;
- QBuffer picStream1(&picByteArray1);
- picStream1.open(QIODevice::WriteOnly);
- saveSuccess = picture.save(&picStream1, "JPEG", 95);
- picStream1.close();
-
- if (picByteArray1.length() > jpegPicStreamLength)
- {
- QByteArray picByteArray2;
- QBuffer picStream2(&picByteArray2);
- picStream2.open(QIODevice::WriteOnly);
- saveSuccess = picture.save(&picStream2, "JPEG", 80);
- picStream2.close();
- if (picByteArray2.length() > jpegPicStreamLength)
- {
- snapmaticStream.close();
- return false;
- }
- picByteArray = picByteArray2;
- }
- else
- {
- picByteArray = picByteArray1;
- }
+ lvlEoi = true;
}
while (picByteArray.length() != jpegPicStreamLength)
{
picByteArray.append((char)0x00);
}
+ if (lvlEoi)
+ {
+ picByteArray.replace(jpegRawContentSize, 4, QByteArray::fromHex("FF454F49"));
+ }
int result = snapmaticStream.write(picByteArray);
if (result != 0)
{
if (cacheEnabled)
{
- cachePicture = picture;
+ QImage replacedPicture;
+ replacedPicture.loadFromData(picByteArray);
+ cachePicture = replacedPicture;
}
return true;
}
@@ -406,6 +434,34 @@ bool SnapmaticPicture::setPicture(const QImage &picture)
return false;
}
+bool SnapmaticPicture::setPictureTitl(const QString &newTitle_)
+{
+ if (writeEnabled)
+ {
+ QString newTitle = newTitle_;
+ QBuffer snapmaticStream(&rawPicContent);
+ snapmaticStream.open(QIODevice::ReadWrite);
+ if (!snapmaticStream.seek(titlStreamEditorBegin)) return false;
+ if (newTitle.length() > titlStreamCharacterMax)
+ {
+ newTitle = newTitle.left(titlStreamCharacterMax);
+ }
+ QByteArray newTitleArray = newTitle.toUtf8();
+ while (newTitleArray.length() != titlStreamEditorLength)
+ {
+ newTitleArray.append((char)0x00);
+ }
+ int result = snapmaticStream.write(newTitleArray);
+ if (result != 0)
+ {
+ titlStr = newTitle;
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+
bool SnapmaticPicture::exportPicture(const QString &fileName, bool customFormat)
{
QFile *picFile = new QFile(fileName);
@@ -421,8 +477,7 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, bool customFormat)
else
{
// Modern compressed export
- QString stockFileName = QFileInfo(picFileName).fileName();
- QByteArray stockFileNameUTF8 = stockFileName.toUtf8();
+ QByteArray stockFileNameUTF8 = picFileName.toUtf8();
QByteArray numberLength = QByteArray::number(stockFileNameUTF8.length());
if (numberLength.length() == 1)
{
@@ -462,6 +517,11 @@ QString SnapmaticPicture::getPictureFileName()
return picFileName;
}
+QString SnapmaticPicture::getPictureFilePath()
+{
+ return picFilePath;
+}
+
QString SnapmaticPicture::getPictureSortStr()
{
return sortStr;
@@ -477,6 +537,11 @@ QString SnapmaticPicture::getPictureTitl()
return titlStr;
}
+QString SnapmaticPicture::getPictureHead()
+{
+ return pictureHead;
+}
+
QString SnapmaticPicture::getPictureStr()
{
return pictureStr;
@@ -487,7 +552,7 @@ QString SnapmaticPicture::getLastStep()
return lastStep;
}
-QImage SnapmaticPicture::getPicture()
+QImage SnapmaticPicture::getImage()
{
if (cacheEnabled)
{
@@ -518,10 +583,10 @@ QImage SnapmaticPicture::getPicture()
QImage returnPicture;
QIODevice *picStream;
- QFile *picFile = new QFile(picFileName);
+ QFile *picFile = new QFile(picFilePath);
if (!picFile->open(QFile::ReadOnly))
{
- lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(picFileName);
+ lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(picFilePath);
picFile->deleteLater();
delete picFile;
return QImage(0, 0, QImage::Format_RGB32);
@@ -548,6 +613,11 @@ QImage SnapmaticPicture::getPicture()
return QImage(0, 0, QImage::Format_RGB32);
}
+int SnapmaticPicture::getContentMaxLength()
+{
+ return jpegRawContentSize;
+}
+
bool SnapmaticPicture::isPicOk()
{
return picOk;
@@ -558,6 +628,11 @@ void SnapmaticPicture::setPicFileName(QString picFileName_)
picFileName = picFileName_;
}
+void SnapmaticPicture::setPicFilePath(QString picFilePath_)
+{
+ picFilePath = picFilePath_;
+}
+
void SnapmaticPicture::clearCache()
{
cacheEnabled = false;
@@ -579,9 +654,13 @@ void SnapmaticPicture::parseJsonContent()
if (locObject.contains("y")) { localSpJson.location.y = locObject["y"].toDouble(); }
if (locObject.contains("z")) { localSpJson.location.z = locObject["z"].toDouble(); }
}
+ if (jsonObject.contains("uid"))
+ {
+ localSpJson.uid = jsonObject["uid"].toInt();
+ }
if (jsonObject.contains("area"))
{
- localSpJson.area = jsonObject["area"].toString();
+ localSpJson.location.area = jsonObject["area"].toString();
}
if (jsonObject.contains("crewid"))
{
@@ -648,7 +727,8 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson)
locObject["z"] = newSpJson.location.z;
jsonObject["loc"] = locObject;
- jsonObject["area"] = newSpJson.area;
+ jsonObject["uid"] = newSpJson.uid;
+ jsonObject["area"] = newSpJson.location.area;
jsonObject["crewid"] = newSpJson.crewID;
jsonObject["creat"] = QJsonValue::fromVariant(newSpJson.createdTimestamp);
jsonObject["plyrs"] = QJsonValue::fromVariant(newSpJson.playersList);
@@ -703,7 +783,7 @@ bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties newSpJson)
bool SnapmaticPicture::isHidden()
{
- if (picFileName.right(7) == ".hidden")
+ if (picFilePath.right(7) == ".hidden")
{
return true;
}
@@ -712,12 +792,16 @@ bool SnapmaticPicture::isHidden()
bool SnapmaticPicture::setPictureHidden()
{
+ if (isCustomFormat)
+ {
+ return false;
+ }
if (!isHidden())
{
- QString newPicFileName = QString(picFileName + ".hidden");
- if (QFile::rename(picFileName, newPicFileName))
+ QString newPicFilePath = QString(picFilePath + ".hidden");
+ if (QFile::rename(picFilePath, newPicFilePath))
{
- picFileName = newPicFileName;
+ picFilePath = newPicFilePath;
return true;
}
return false;
@@ -727,12 +811,16 @@ bool SnapmaticPicture::setPictureHidden()
bool SnapmaticPicture::setPictureVisible()
{
+ if (isCustomFormat)
+ {
+ return false;
+ }
if (isHidden())
{
- QString newPicFileName = QString(picFileName).remove(picFileName.length() - 7, 7);
- if (QFile::rename(picFileName, newPicFileName))
+ QString newPicFilePath = QString(picFilePath).remove(picFilePath.length() - 7, 7);
+ if (QFile::rename(picFilePath, newPicFilePath))
{
- picFileName = newPicFileName;
+ picFilePath = newPicFilePath;
return true;
}
return false;
diff --git a/SnapmaticPicture.h b/SnapmaticPicture.h
index 33785c9..db04c3f 100755
--- a/SnapmaticPicture.h
+++ b/SnapmaticPicture.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -28,12 +28,13 @@
struct SnapmaticProperties {
struct SnapmaticLocation {
+ QString area;
double x;
double y;
double z;
};
+ int uid;
int crewID;
- QString area;
QStringList playersList;
uint createdTimestamp;
QDateTime createdDateTime;
@@ -51,22 +52,35 @@ class SnapmaticPicture : public QObject
public:
explicit SnapmaticPicture(const QString &fileName = "", QObject *parent = 0);
~SnapmaticPicture();
- bool readingPictureFromFile(const QString &fileName, bool writeEnabled = true, bool cacheEnabled = true);
+ void reset();
+ bool readingPictureFromFile(const QString &fileName, bool writeEnabled = true, bool cacheEnabled = false);
bool readingPicture(bool writeEnabled = true, bool cacheEnabled = true);
bool isPicOk();
void clearCache();
- QImage getPicture();
+ QImage getImage();
QString getLastStep();
QString getPictureStr();
+ QString getPictureHead();
QString getPictureTitl();
QString getPictureDesc();
QString getPictureSortStr();
QString getPictureFileName();
+ QString getPictureFilePath();
QString getExportPictureFileName();
- QDateTime getCreatedDateTime();
- bool setPicture(const QImage &picture);
+ int getContentMaxLength();
+ bool setImage(const QImage &picture);
+ bool setPictureTitl(const QString &newTitle);
+ bool setPictureStream(const QByteArray &picByteArray);
bool exportPicture(const QString &fileName, bool customFormat = false);
- void setPicFileName(QString picFileName_);
+ void setPicFileName(QString picFileName);
+ void setPicFilePath(QString picFilePath);
+ void updateStrings();
+
+ // ALTERNATIVES
+ QString getPictureTitle() { return getPictureTitl(); }
+ QString getPictureString() { return getPictureStr(); }
+ QString getPictureDescription() { return getPictureDesc(); }
+ bool setPictureTitle(const QString &newTitle) { return setPictureTitl(newTitle); }
// JSON
bool isJsonOk();
@@ -80,13 +94,14 @@ public:
bool setPictureVisible();
private:
- QString getSnapmaticPictureString(const QByteArray &snapmaticHeader);
+ QString getSnapmaticHeaderString(const QByteArray &snapmaticHeader);
QString getSnapmaticJSONString(const QByteArray &jsonBytes);
QString getSnapmaticTIDEString(const QByteArray &tideBytes);
- void parseSnapmaticExportAndSortString();
QImage cachePicture;
QString picExportFileName;
QString picFileName;
+ QString picFilePath;
+ QString pictureHead;
QString pictureStr;
QString lastStep;
QString sortStr;
@@ -95,6 +110,8 @@ private:
bool picOk;
bool writeEnabled;
bool cacheEnabled;
+ bool isCustomFormat;
+ int jpegRawContentSize;
// PARSE INT
int snapmaticHeaderLength;
@@ -110,6 +127,9 @@ private:
int jpegStreamEditorBegin;
int jsonStreamEditorBegin;
int jsonStreamEditorLength;
+ int titlStreamEditorBegin;
+ int titlStreamEditorLength;
+ int titlStreamCharacterMax;
QByteArray rawPicContent;
// JSON
diff --git a/SnapmaticWidget.cpp b/SnapmaticWidget.cpp
index 4f5060a..6b1b413 100755
--- a/SnapmaticWidget.cpp
+++ b/SnapmaticWidget.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -23,7 +23,6 @@
#include "DatabaseThread.h"
#include "PictureDialog.h"
#include "PictureExport.h"
-#include "PictureCopy.h"
#include "config.h"
#include
#include
@@ -80,14 +79,14 @@ bool SnapmaticWidget::eventFilter(QObject *obj, QEvent *ev)
return false;
}
-void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture, QString picturePath)
+void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture)
{
smpic = picture;
- picPath = picturePath;
- picStr = picture->getPictureStr();
+ picPath = picture->getPictureFilePath();
picTitl = picture->getPictureTitl();
+ picStr = picture->getPictureStr();
- QPixmap SnapmaticPixmap = QPixmap::fromImage(picture->getPicture().scaled(ui->labPicture->width(), ui->labPicture->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::AutoColor);
+ QPixmap SnapmaticPixmap = QPixmap::fromImage(picture->getImage().scaled(ui->labPicture->width(), ui->labPicture->height(), Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::AutoColor);
ui->labPicStr->setText(picStr + "\n" + picTitl + "");
ui->labPicture->setPixmap(SnapmaticPixmap);
@@ -96,11 +95,6 @@ void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture, QString pic
adjustTextColor();
}
-void SnapmaticWidget::setSnapmaticPicture(SnapmaticPicture *picture)
-{
- setSnapmaticPicture(picture, picture->getPictureFileName());
-}
-
void SnapmaticWidget::on_cmdView_clicked()
{
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
@@ -110,7 +104,7 @@ void SnapmaticWidget::on_cmdView_clicked()
PictureDialog *picDialog = new PictureDialog(profileDB, crewDB, this);
picDialog->setWindowFlags(picDialog->windowFlags()^Qt::WindowContextHelpButtonHint);
- picDialog->setSnapmaticPicture(smpic, picPath, true);
+ picDialog->setSnapmaticPicture(smpic, true);
picDialog->setModal(true);
// be ready for playerName updated
@@ -133,12 +127,12 @@ void SnapmaticWidget::on_cmdView_clicked()
void SnapmaticWidget::on_cmdCopy_clicked()
{
- PictureCopy::copyPicture(this, picPath, smpic);
+ PictureExport::exportAsSnapmatic(this, smpic);
}
void SnapmaticWidget::on_cmdExport_clicked()
{
- PictureExport::exportPicture(this, smpic);
+ PictureExport::exportAsPicture(this, smpic);
}
void SnapmaticWidget::on_cmdDelete_clicked()
@@ -285,7 +279,7 @@ bool SnapmaticWidget::makePictureHidden()
SnapmaticPicture *picture = (SnapmaticPicture*)smpic;
if (picture->setPictureHidden())
{
- picPath = picture->getPictureFileName();
+ picPath = picture->getPictureFilePath();
adjustTextColor();
return true;
}
@@ -297,7 +291,7 @@ bool SnapmaticWidget::makePictureVisible()
SnapmaticPicture *picture = (SnapmaticPicture*)smpic;
if (picture->setPictureVisible())
{
- picPath = picture->getPictureFileName();
+ picPath = picture->getPictureFilePath();
adjustTextColor();
return true;
}
diff --git a/SnapmaticWidget.h b/SnapmaticWidget.h
index d4b8eaf..df7e3c1 100755
--- a/SnapmaticWidget.h
+++ b/SnapmaticWidget.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
@@ -40,7 +40,6 @@ class SnapmaticWidget : public ProfileWidget
public:
SnapmaticWidget(ProfileDatabase *profileDB, CrewDatabase *crewDB, DatabaseThread *threadDB, QWidget *parent = 0);
- void setSnapmaticPicture(SnapmaticPicture *picture, QString picturePath);
void setSnapmaticPicture(SnapmaticPicture *picture);
void setSelectionMode(bool selectionMode);
void setSelected(bool isSelected);
diff --git a/StandardPaths.cpp b/StandardPaths.cpp
index 3e9f38a..dda73a3 100755
--- a/StandardPaths.cpp
+++ b/StandardPaths.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/StandardPaths.h b/StandardPaths.h
index d78f25c..203953b 100755
--- a/StandardPaths.h
+++ b/StandardPaths.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/StringParser.cpp b/StringParser.cpp
index aebe01a..1c0f9c5 100755
--- a/StringParser.cpp
+++ b/StringParser.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/StringParser.h b/StringParser.h
index 44346b6..8906fc8 100755
--- a/StringParser.h
+++ b/StringParser.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/UserInterface.cpp b/UserInterface.cpp
index 647f3ac..ce78086 100755
--- a/UserInterface.cpp
+++ b/UserInterface.cpp
@@ -60,6 +60,11 @@ UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, D
this->setWindowTitle(defaultWindowTitle.arg(tr("Select Profile")));
ui->labVersion->setText(ui->labVersion->text().arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER));
+
+ if (QIcon::hasThemeIcon("dialog-close"))
+ {
+ ui->cmdClose->setIcon(QIcon::fromTheme("dialog-close"));
+ }
}
void UserInterface::setupDirEnv()
diff --git a/UserInterface.h b/UserInterface.h
index 9f9a74a..8b423b0 100755
--- a/UserInterface.h
+++ b/UserInterface.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/UserInterface.ui b/UserInterface.ui
index 38e0ecf..4f4f6bf 100755
--- a/UserInterface.ui
+++ b/UserInterface.ui
@@ -146,9 +146,6 @@
&Close
-
-
-
true
diff --git a/config.h b/config.h
index 2def024..4837e86 100755
--- a/config.h
+++ b/config.h
@@ -50,7 +50,7 @@
#ifndef GTA5SYNC_APPVER
#ifndef GTA5SYNC_DAILYB
-#define GTA5SYNC_APPVER "1.2.0"
+#define GTA5SYNC_APPVER "1.3.0"
#else
#define GTA5SYNC_APPVER QString("%1").arg(GTA5SYNC_DAILYB)
#endif
@@ -90,4 +90,12 @@
#endif
#endif
+#ifndef GTA5SYNC_BUILDDATETIME
+#define GTA5SYNC_BUILDDATETIME QString("%1, %2").arg(__DATE__, __TIME__);
+#endif
+
+#ifndef GTA5SYNC_BUILDSTRING
+#define GTA5SYNC_BUILDSTRING QString("%1, %2").arg(QT_VERSION_STR, GTA5SYNC_COMPILER);
+#endif
+
#endif // CONFIG_H
diff --git a/gta5view.pro b/gta5view.pro
index 0485b2e..13d019d 100755
--- a/gta5view.pro
+++ b/gta5view.pro
@@ -37,8 +37,8 @@ SOURCES += main.cpp \
ExportThread.cpp \
GlobalString.cpp \
IconLoader.cpp \
+ ImportDialog.cpp \
OptionsDialog.cpp \
- PictureCopy.cpp \
PictureDialog.cpp \
PictureExport.cpp \
PictureWidget.cpp \
@@ -62,15 +62,14 @@ SOURCES += main.cpp \
HEADERS += \
AboutDialog.h \
AppEnv.h \
- config.h \
CrewDatabase.h \
DatabaseThread.h \
ExportDialog.h \
ExportThread.h \
GlobalString.h \
IconLoader.h \
+ ImportDialog.h \
OptionsDialog.h \
- PictureCopy.h \
PictureDialog.h \
PictureExport.h \
PictureWidget.h \
@@ -91,9 +90,12 @@ HEADERS += \
UserInterface.h \
uimod/UiModLabel.h
+PRECOMPILED_HEADER += config.h
+
FORMS += \
AboutDialog.ui \
ExportDialog.ui \
+ ImportDialog.ui \
OptionsDialog.ui \
PictureDialog.ui \
ProfileInterface.ui \
@@ -115,7 +117,7 @@ DISTFILES += res/app.rc \
res/gta5sync.desktop \
res/gta5sync_de.ts \
res/gta5sync_fr.ts \
- res/gta5view.exe.manifest \
+ res/gta5sync.exe.manifest \
lang/qtbase_ru.qm \
lang/gta5sync_ru.ts \
lang/qt_ru.qm \
diff --git a/main.cpp b/main.cpp
index ae44fb5..844d1ab 100755
--- a/main.cpp
+++ b/main.cpp
@@ -1,6 +1,6 @@
/*****************************************************************************
* gta5sync GRAND THEFT AUTO V SYNC
-* Copyright (C) 2016 Syping
+* Copyright (C) 2016-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
diff --git a/res/app.qrc b/res/app.qrc
index 152a07a..c002c6d 100755
--- a/res/app.qrc
+++ b/res/app.qrc
@@ -23,6 +23,7 @@
960x536.png
empty1x16.png
avatararea.png
+ avatarareaimport.png
global.de.ini
@@ -32,4 +33,7 @@
global.zh.ini
global.es.ini
+
+ template.g5e
+
diff --git a/res/app.rc b/res/app.rc
index 3f54c4c..fa2716b 100755
--- a/res/app.rc
+++ b/res/app.rc
@@ -7,8 +7,8 @@ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "gta5view.exe.manifest"
#include
VS_VERSION_INFO VERSIONINFO
-FILEVERSION 1, 2, 0, 0
-PRODUCTVERSION 1, 2, 0, 0
+FILEVERSION 1, 3, 0, 0
+PRODUCTVERSION 1, 3, 0, 0
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS VOS_NT_WINDOWS32
@@ -25,12 +25,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Syping"
VALUE "FileDescription", "gta5view\0"
- VALUE "FileVersion", "1.2.0\0"
+ VALUE "FileVersion", "1.3.0\0"
VALUE "InternalName", "gta5view\0"
VALUE "LegalCopyright", "Copyright © 2016-2017 Syping\0"
VALUE "OriginalFilename", "gta5view.exe\0"
VALUE "ProductName", "gta5view\0"
- VALUE "ProductVersion", "1.2.0\0"
+ VALUE "ProductVersion", "1.3.0\0"
END
END
END
diff --git a/res/avatarareaimport.png b/res/avatarareaimport.png
new file mode 100644
index 0000000..045c961
Binary files /dev/null and b/res/avatarareaimport.png differ
diff --git a/res/gta5sync_de.qm b/res/gta5sync_de.qm
index 485658e..b174c2b 100755
Binary files a/res/gta5sync_de.qm and b/res/gta5sync_de.qm differ
diff --git a/res/gta5sync_de.ts b/res/gta5sync_de.ts
index 12eb105..8dd0709 100755
--- a/res/gta5sync_de.ts
+++ b/res/gta5sync_de.ts
@@ -129,12 +129,12 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
Format
-
+
&JPEG/PNG Format
-
+
GTA &Snapmatic Format
@@ -143,51 +143,89 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
Auflösung
-
+
Export Format
-
+
Export Größe
-
+
&Standard Größe
-
+
&Desktop Größe
-
+
&Eigene Größe
-
+
Eigene Größe:
-
+
x
-
+
&Exportieren
-
+
S&chließen
+
+ ImportDialog
+
+
+
+ Importieren...
+
+
+
+
+ Einstellungen
+
+
+
+
+ Seitenverhältnis &behalten
+
+
+
+
+ Seitenverhältnis &ignorieren
+
+
+
+
+ &Avatar
+
+
+
+
+ &OK
+
+
+
+
+ Abbre&chen
+
+
OptionsDialog
@@ -372,7 +410,7 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
&OK
-
+
OK, Cancel, Apply
Abbre&chen
@@ -383,26 +421,26 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
%1 (%2 wenn verfügbar) [sys]
-
+
System like PC System
System
-
+
System like PC System = %1, System Language like Deutsch = %2
%1 (%2 wenn verfügbar)
-
-
+
+
%1
%1
-
+
Der eigene Ordner wird initialisiert sobald du %1 neugestartet hast.
@@ -411,20 +449,20 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
Der eigene Ordner initialisiert sobald du %1 neugestartet hast.
-
+
Die Änderung der Sprache nimmt Effekt sobald du %1 neugestartet hast.
-
+
No Profile, as default
Kein Profil
-
-
-
+
+
+
Profil: %1
@@ -473,7 +511,7 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
-
+
&Exportieren
@@ -507,7 +545,7 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
<span style=" font-weight:600;">Crew ID: </span>%5
-
+
Exportieren
@@ -521,17 +559,17 @@ Grand Theft Auto V Snapmatic Bilder und Spielständen
Schließen
-
+
Exportiere als &JPG Bild...
-
+
Exportiere als >A Snapmatic...
-
+
@@ -540,19 +578,19 @@ Taste 2 - Overlay umschalten
Pfeiltasten - Navigieren
-
-
+
+
Snapmatic Bildansicht
-
-
+
+
Fehlgeschlagen bei %1
-
+
Avatar Vorschaumodus
@@ -589,19 +627,19 @@ Drücke A für Standardansicht
Avatar Vorschaumodus<br>Drücke A für Standardansicht
-
-
+
+
Keine Spieler
-
-
+
+
Keine Crew
-
+
Unbekannter Standort
@@ -610,59 +648,59 @@ Drücke A für Standardansicht
Exportiere Bild...
-
+
Exportiere als JPG Bild...
-
+
JPEG Bild (*.jpg)
-
+
Portable Network Graphics (*.png)
-
-
-
-
+
+
+
+
Exportiere als JPG Bild
-
-
+
+
Ãœberschreibe %1 mit aktuellen Snapmatic Bild?
-
-
-
-
-
-
+
+
+
+
+
+
Exportiere als GTA Snapmatic
-
-
+
+
Fehlgeschlagen beim Ãœberschreiben von %1 mit aktuellen Snapmatic Bild
-
-
-
+
+
+
Fehlgeschlagen beim Exportieren vom aktuellen Snapmatic Bild
-
+
Snapmatic wurde wegen Benutzung der .auto Erweiterung zu "%1" exportiert.
@@ -679,22 +717,22 @@ Drücke A für Standardansicht
Exporti
-
+
Exportiere als GTA Snapmatic...
-
+
GTA V Export (*.g5e)
-
+
GTA V Roher Export (*.auto)
-
+
Snapmatic Bilder (PGTA*)
@@ -728,8 +766,8 @@ Drücke A für Standardansicht
Beim Speichern des Bildes ist ein Fehler aufgetreten
-
-
+
+
Keine gültige Datei wurde ausgewählt
@@ -789,28 +827,29 @@ Drücke A für Standardansicht
Profil schließen
-
+
Lade...
-
+
+
Importieren...
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
Importieren
@@ -819,25 +858,41 @@ Drücke A für Standardansicht
Alle Profildateien (SGTA* PGTA*)
-
-
+
+
+ Importfähige Dateien (*.g5e *.jpg *.png SGTA* PGTA*)
+
+
+
+
Spielstanddateien (SGTA*)
-
-
+
+
Snapmatic Bilder (PGTA*)
-
-
+
+
+ Alle Bilddateien (*.jpg *.png)
+
+
+
+
Alle Dateien (**)
-
+
+
+
+ Importiere Datei %1 von %2 Dateien
+
+
+
@@ -846,46 +901,46 @@ Drücke A für Standardansicht
%1
-
-
+
+
Fehler beim Lesen vom Snapmatic Bild
-
-
+
+
Fehler beim Lesen von Spielstanddatei
-
+
Kann %1 nicht importieren weil das Dateiformat nicht gültig ist
-
+
Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA oder endet mit .g5e
-
+
Fehlgeschlagen beim Importieren vom Snapmatic Bild, dieses Bild ist bereits im Spiel
-
+
%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:
-
-
-
+
+
+
Keine gültige Datei wurde ausgewählt
-
+
Aktivierte Bilder: %1 von %2
@@ -894,35 +949,35 @@ Drücke A für Standardansicht
Fehlgeschlagen beim Importieren vom Snapmatic Bild, Datei beginnt nicht mit PGTA
-
+
Fehlgeschlagen beim Importieren vom Snapmatic Bild, kann Snapmatic Bild nicht ins Profil kopieren
-
+
Fehlgeschlagen beim Importieren vom Spielstand, kann Spielstanddatei nicht ins Profil kopieren
-
+
Fehlgeschlagen beim Importieren vom Spielstand, kein Spielstandslot mehr frei
-
-
+
+
JPG Bilder und GTA Snapmatic
-
-
+
+
Nur JPG Bilder
-
-
+
+
Nur GTA Snapmatic
@@ -941,25 +996,25 @@ Das GTA Snapmatic Format macht es möglich sie wieder ins Game zu importieren
Exportieren als:
-
-
+
+
Keine Snapmatic Bilder oder Spielstände ausgewählt
-
-
-
+
+
+
Auswahl löschen
-
+
Möchtest du wirklich die ausgewählten Snapmatic Bilder und Spielstanddateien löschen?
-
+
Fehlgeschlagen beim kompletten entfernen der ausgewählten Snapmatic Bilder und/oder der Spielstanddateien
@@ -980,10 +1035,10 @@ Exportieren als:
Fehlgeschlagenen beim Import vom Spielstand weil kein Spielstandslot mehr übrig ist
-
-
-
-
+
+
+
+
Auswahl exportieren
@@ -1004,12 +1059,12 @@ Exportieren als:
Wie sollen wir mit den Snapmatic Bilder umgehen?
-
+
Auswahl exportieren...
-
+
Initialisiere Export...
@@ -1018,7 +1073,7 @@ Exportieren als:
Initialisierung...
-
+
@@ -1041,21 +1096,20 @@ Exportieren als:
Aktueller Exportiervorgang: %1
-
-
-
+
+
+
Exportiere Datei %1 von %2 Dateien
-
-
+
Alle Profildateien (*.g5e SGTA* PGTA*)
-
-
+
+
GTA V Export (*.g5e)
@@ -1077,17 +1131,17 @@ Exportieren als:
SavegameDialog
-
+
Spielstandanzeiger
-
+
<span style=" font-weight:600;">Spielstand</span><br><br>%1
-
+
&Exportieren
@@ -1096,7 +1150,7 @@ Exportieren als:
&Kopieren
-
+
S&chließen
@@ -1109,7 +1163,7 @@ Exportieren als:
Schließen
-
+
Fehlgeschlagen bei %1
@@ -1142,6 +1196,7 @@ Exportieren als:
+
Exportieren
@@ -1277,7 +1332,6 @@ Exportieren als:
Spielstand kopieren
-
&Exportieren
@@ -1353,36 +1407,36 @@ Exportieren als:
SnapmaticEditor
-
-
+
+
Snapmatic Eigenschaften
-
+
Snapmatic Typ
-
-
+
+
Editor
-
-
+
+
Selbstporträt
-
+
Typisch
-
-
+
+
Fahndungsfoto
@@ -1391,32 +1445,32 @@ Exportieren als:
Eigenes
-
+
Director
-
+
Meme
-
+
Extras
-
+
Beim Ãœbernehmen als Avatar qualifizieren
-
+
Das Qualifizieren als Avatar erlaubt dir dieses Snapmatic als Social Club Profilbild zu nutzen
-
+
&Ãœbernehmen
@@ -1434,11 +1488,19 @@ Exportieren als:
Cancel
-
+
Patchen von Snapmatic Eigenschaften fehlgeschlagen wegen I/O Fehler
+
+ SnapmaticPicture
+
+
+
+ FOTO - %1
+
+
SnapmaticWidget
@@ -1473,18 +1535,18 @@ Exportieren als:
-
-
+
+
Bild löschen
-
+
Bist du sicher %1 von deinen Snapmatic Bilder zu löschen?
-
+
Bearbei&ten
@@ -1497,7 +1559,7 @@ Exportieren als:
&Im Spiel deaktivieren
-
+
&Exportieren
@@ -1510,12 +1572,12 @@ Exportieren als:
Exportiere als >A Snapmatic
-
+
&Im Spiel anzeigen
-
+
&Im Spiel ausblenden
@@ -1524,49 +1586,53 @@ Exportieren als:
&Eigenschaften bearbeiten
-
+
+ FOTO - %1
+
+
+
&Eigenschaften bearbeiten...
-
+
Exportiere als &JPG Bild...
-
+
Exportiere als >A Snapmatic...
-
+
A&nsehen
-
+
Entfe&rnen
-
-
+
+
Au&swählen
-
+
A&bwählen
-
-
+
+
Alles &auswählen
-
+
Alles a&bwählen
@@ -1614,7 +1680,7 @@ Exportieren als:
Bist du sicher %1 von deinen Snapmatic Bilder zu löschen?
-
+
Fehlgeschlagen beim Löschen %1 von deinen Snapmatic Bildern
@@ -1654,7 +1720,7 @@ Exportieren als:
Ãœber gta5sync
-
+
Strg+A
@@ -1667,7 +1733,7 @@ Exportieren als:
Optionen
-
+
Strg+O
@@ -1676,7 +1742,7 @@ Exportieren als:
Alles auswählen
-
+
Strg+S
@@ -1693,7 +1759,7 @@ Exportieren als:
Auswahl exportieren
-
+
Strg+E
@@ -1702,17 +1768,17 @@ Exportieren als:
Auswahl löschen
-
+
Strg+D
-
+
Beenden
-
+
Auswahl &Sichtbarkeit
@@ -1721,12 +1787,12 @@ Exportieren als:
&Ãœber Produkt
-
+
B&eenden
-
+
Strg+Q
@@ -1741,22 +1807,22 @@ Exportieren als:
%1 %2
-
+
&Datei
-
+
&Hilfe
-
+
Bearb&eiten
-
+
&Profil
@@ -1769,43 +1835,43 @@ Exportieren als:
&Ãœber gta5sync
-
+
&Profil schließen
-
+
Strg+Ende
-
+
Strg+Entf
-
+
Datei &öffnen...
-
-
+
+
Wähle >A V Ordner...
-
+
Strg+G
-
+
Im Spiel anzeig&en
-
+
Im Spiel ausblen&den
@@ -1818,7 +1884,7 @@ Exportieren als:
Im Spiel aktivier&en
-
+
Umschalt+E
@@ -1827,7 +1893,7 @@ Exportieren als:
Im Spiel &deaktivieren
-
+
Umschalt+D
@@ -1841,7 +1907,7 @@ Exportieren als:
&Profil auswählen
-
+
Strg+P
@@ -1850,27 +1916,27 @@ Exportieren als:
&Optionen
-
+
Ein&stellungen
-
+
&Alles auswählen
-
+
Alles a&bwählen
-
+
Auswahl &exportieren...
-
+
Auswahl entfe&rnen
@@ -1879,12 +1945,12 @@ Exportieren als:
Strg+R
-
+
Dateien &importieren...
-
+
Strg+I
@@ -1894,15 +1960,15 @@ Exportieren als:
-
+
Profil auswählen
-
-
-
-
+
+
+
+
Wähle GTA V Ordner...
@@ -1911,7 +1977,7 @@ Exportieren als:
Wähle GTA V &Ordner...
-
+
Datei öffnen...
@@ -1926,21 +1992,21 @@ Exportieren als:
%2 - %1
-
+
&Ãœber %1
-
-
-
+
+
+
Datei öffnen
-
+
Kann nicht %1 öffnen weil Dateiformat nicht gültig ist
diff --git a/res/gta5sync_fr.qm b/res/gta5sync_fr.qm
index 095f174..3c7a03a 100644
Binary files a/res/gta5sync_fr.qm and b/res/gta5sync_fr.qm differ
diff --git a/res/gta5sync_fr.ts b/res/gta5sync_fr.ts
index d15e000..062d411 100644
--- a/res/gta5sync_fr.ts
+++ b/res/gta5sync_fr.ts
@@ -1,11 +1,11 @@
-
+
AboutDialog
- À propos de gta5sync
+ À propos de gta5sync
- <span style=" font-weight:600;">gta5sync</span><br/>
+ <span style=" font-weight:600;">gta5sync</span><br/>
<br/>
Un outil pour gérer et synchroniser les photos Snapmatic<br/>
et les fichiers de sauvegarde de Grand Theft Auto V<br/>
@@ -89,61 +89,99 @@ et les fichiers de sauvegarde de Grand Theft Auto V
Exporter
-
+
Format
-
+
&JPEG/PNG
-
+
GTA &Snapmatic
-
+
Dimensions
-
+
Par &défaut
-
+
Dimensions de l'&écran
-
+
&Personnalisé
-
+
Dimensions:
-
+
x
-
+
&Exporter
-
+
&Fermer
+
+ ImportDialog
+
+
+
+ Importer...
+
+
+
+
+ Paramètres
+
+
+
+
+ &Conserver le rapport d'aspect
+
+
+
+
+ &Ignorer le rapport d'aspect
+
+
+
+
+ &Avatar
+
+
+
+
+ &OK
+
+
+
+
+ A&nnuler
+
+
OptionsDialog
@@ -300,50 +338,50 @@ et les fichiers de sauvegarde de Grand Theft Auto V
&OK
-
+
OK, Cancel, Apply
&Annuler
-
+
System like PC System = %1, System Language like Deutsch = %2
%1 (%2 si disponible)
-
+
System like PC System
Système
-
-
+
+
%1
%1
-
+
Le répertoire personnalisé sera actif au prochain lancement de %1.
-
+
Le changement de langue sera actif au prochain lancement de %1.
-
+
No Profile, as default
Aucun profil
-
-
-
+
+
+
Profil : %1
@@ -373,7 +411,7 @@ et les fichiers de sauvegarde de Grand Theft Auto V
-
+
&Exporter
@@ -388,78 +426,78 @@ et les fichiers de sauvegarde de Grand Theft Auto V
&Fermer
-
+
Exporter comme Snapmatic...
-
+
GTA V Export (*.g5e)
-
+
GTA V Export Brut (*.g5e)
-
+
Fichiers GTA Snapmatic (PGTA*)
-
+
Exporté comme "%1" avec l'utilisation de l'extension .auto.
- Tous les fichiers (**)
+ Tous les fichiers (**)
-
-
-
-
-
-
+
+
+
+
+
+
Exporter comme GTA Snapmatic
-
-
+
+
%1 existe déjà . Vous-vous le remplacer ?
-
-
+
+
Echec du remplacement de %1
- Echec de la copie
+ Echec de la copie
-
-
+
+
Fichier invalide
-
+
Exporter comme image &JPG...
-
+
Exporter comme >A Snapmatic...
-
+
@@ -468,19 +506,19 @@ Touche 2 - Activer/désactiver l'overlay
Touches fléchées - Naviguer
-
-
+
+
Visionneuse de photo Snapmatic
-
-
+
+
Echec de %1
-
+
Mode Aperçu Avatar
@@ -488,57 +526,57 @@ Appuyer sur 1 pour le mode par défaut
- Aperçu avatar<br>Appuyer sur A pour la vue par défaut
+ Aperçu avatar<br>Appuyer sur A pour la vue par défaut
-
-
+
+
Aucun joueur
-
-
+
+
Aucun crew
-
+
Emplacement inconnu
-
+
Exporter comme image JPG...
-
+
Exporter
-
+
Image JPEG (*.jpg)
-
+
Portable Network Graphics (*.png)
-
-
-
-
+
+
+
+
Exporter comme image JPG
-
-
-
+
+
+
Échec de l'export de la photo Snapmatic
@@ -581,67 +619,74 @@ Appuyer sur 1 pour le mode par défaut
&Fermer
-
-
-
+
+
+
Copie du fichier %1 sur %2
-
+
Photos activées : %1 sur %2
-
+
Chargement...
-
+
+
Importer...
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
Importer
- Fichiers de profil GTA (SGTA* PGTA*)
+ Fichiers de profil GTA (SGTA* PGTA*)
-
-
+
+
Fichiers de sauvegarde GTA (SGTA*)
-
-
+
+
Photos Snapmatic (PGTA*)
-
-
+
+
Tous les fichiers (**)
-
+
+
+
+ Importation du fichier %1 sur %2
+
+
+
@@ -650,101 +695,111 @@ Appuyer sur 1 pour le mode par défaut
%1
-
-
-
+
+
+
Fichier invalide
-
-
+
+
Impossible d'ouvrir la photo Snapmatic
-
-
+
+
Impossible de lire le fichier de sauvegarde
-
+
Impossible d'importer %1, format invalide
- Impossible d'importer la photo Snapmatic,nom de fichier incorrect (PGTA*)
+ Impossible d'importer la photo Snapmatic,nom de fichier incorrect (PGTA*)
-
+
+
+ Fichiers importables (*.g5e *.jpg *.png SGTA* PGTA*)
+
+
+
+
+ Tous les fichiers image (*.jpg *.png)
+
+
+
Impossible d'importer la photo Snapmatic,nom de fichier incorrect (PGTA*, *.g5e)
-
+
Impossible d'importer la photo Snapmatic, un fichier du même nom existe déjÃ
-
+
Impossible d'importer la photo Snapmatic, impossible de copier le fichier dans le profil
-
+
Impossible d'importer la sauvegarde, impossible de copier le fichier dans le profil
-
+
Impossible d'importer la sauvegarde, aucun emplacement libre
-
-
-
-
+
+
+
+
Exporter la sélection
-
-
+
+
Images JPG et GTA Snapmatic
-
-
+
+
Images JPG seulement
-
-
+
+
GTA Snapmatic seulement
-
+
%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 :
-
+
Exporter la sélection...
-
+
Initialisation de l'export...
-
+
@@ -753,37 +808,36 @@ Appuyer sur 1 pour le mode par défaut
%1
-
-
+
+
Aucun fichier de sauvegarde ou photo Snapmatic sélectionné
-
-
-
+
+
+
Supprimer la sélection
-
+
Supprimer la sélection ?
-
+
Impossible de supprimer la sélection
-
-
+
Tous les fichiers de profil (*.g5e SGTA* PGTA*)
-
-
+
+
GTA V Export (*.g5e)
@@ -805,27 +859,27 @@ Appuyer sur 1 pour le mode par défaut
SavegameDialog
-
+
Gestionnaire de sauvegardes
-
+
<span style=" font-weight:600;">Sauvegarde</span><br><br>%1
-
+
&Exporter
-
+
&Fermer
-
+
Échec de %1
@@ -859,6 +913,7 @@ Appuyer sur 1 pour le mode par défaut
+
Exporter
@@ -875,7 +930,6 @@ Appuyer sur 1 pour le mode par défaut
Supprimer
-
&Exporter
@@ -995,70 +1049,70 @@ Appuyer sur 1 pour le mode par défaut
SnapmaticEditor
-
-
+
+
Propriétés Snapmatic
-
+
Type
-
-
+
+
Éditeur
-
-
+
+
Selfie
-
+
Normal
-
-
+
+
Mugshot
- Personnalisé
+ Personnalisé
-
+
Director
-
+
Meme
-
+
Extras
-
+
Qualifier comme Avatar
-
+
Qualifier comme Avatar permet d'utiliser cette image en tant que photo de profil sur le Social Club
-
+
A&ppliquer
@@ -1068,11 +1122,19 @@ Appuyer sur 1 pour le mode par défaut
A&nnuler
-
+
La modification des propriétés Snapmatic a échoué : erreur d'entrée/sortie
+
+ SnapmaticPicture
+
+
+
+ PHOTO - %1
+
+
SnapmaticWidget
@@ -1117,8 +1179,8 @@ Appuyer sur 1 pour le mode par défaut
-
-
+
+
Supprimer la photo
@@ -1128,79 +1190,79 @@ Appuyer sur 1 pour le mode par défaut
Supprimer
-
+
Supprimer %1 ?
-
+
Impossible de supprimer %1
-
+
Édi&ter
-
+
&Visible en jeu
-
+
&Invisible en jeu
-
+
Modifier les &propriétés...
-
+
&Exporter
-
+
Exporter comme image &JPG...
-
+
Exporter comme >A Snapmatic...
-
+
&Voir
-
+
S&upprimer
-
-
+
+
&Sélectionner
-
+
&Déselectionner
-
-
+
+
Sélectionner &tout
-
+
&Déselectionner tout
@@ -1209,7 +1271,7 @@ Appuyer sur 1 pour le mode par défaut
UserInterface
- gta5sync - %1
+ gta5sync - %1
@@ -1232,170 +1294,170 @@ Appuyer sur 1 pour le mode par défaut
Fer&mer
-
+
&Fichier
-
+
Ai&de
-
+
&Éditer
-
+
&Profil
- &À propos de gta5sync
+ &À propos de gta5sync
-
+
Ctrl+P
-
+
&Quitter
-
+
Quitter
-
+
Ctrl+Q
-
+
Fermer le &profil
-
+
Ctrl + Fin
-
+
Paramètre&s
-
+
Ctrl+S
-
+
Sélectionner &tout
-
+
Ctrl+A
-
+
&Désélectionner tout
-
+
Ctrl+D
-
+
&Exporter la sélection...
-
+
Ctrl+E
-
+
&Supprimer la sélection
-
+
Ctrl+Del
-
+
&Importer...
-
+
Ctrl+I
-
+
&Ouvrir...
-
+
Ctrl+O
-
-
+
+
Modifier l'emplacement de >A V...
-
-
-
-
+
+
+
+
Modifier l'emplacement de GTA V...
-
+
Ctrl+G
-
+
Rendre visible &en jeu
-
+
Shift+E
-
+
&Visibilité de la sélection
-
+
Ren&dre invisible en jeu
-
+
Shift+D
@@ -1406,32 +1468,32 @@ Appuyer sur 1 pour le mode par défaut
%2 - %1
-
+
&À propos de %1
-
+
Sélectionner un profil
-
+
Ouvrir...
-
-
-
+
+
+
Ouvrir
-
+
Impossible d'ouvrir %1, format invalide
diff --git a/res/template.g5e b/res/template.g5e
new file mode 100644
index 0000000..2700af1
Binary files /dev/null and b/res/template.g5e differ