pax_global_header00006660000000000000000000000064127121451670014520gustar00rootroot0000000000000052 comment=4498ecf892b021687274153022562e52e58f9cee phototonic-1.7.20/000077500000000000000000000000001271214516700137755ustar00rootroot00000000000000phototonic-1.7.20/Arch/000077500000000000000000000000001271214516700146525ustar00rootroot00000000000000phototonic-1.7.20/Arch/PKGBUILD000066400000000000000000000015121271214516700157750ustar00rootroot00000000000000pkgname=phototonic pkgver=1.7.13 pkgrel=1 phototonic_commit=c1998178dfc49275c716250914ee1aac910ab908 pkgdesc="Image Viewer and Organizer" arch=('i686' 'x86_64') url="http://oferkv.github.io/phototonic/" license=('GPL3') depends=('qt5-base' 'exiv2' 'libxkbcommon-x11') optdepends=('qt5-imageformats: TIFF and TGA support' 'qt5-svg: SVG support') provides=('phototonic') source=("https://github.com/oferkv/phototonic/archive/$phototonic_commit.tar.gz") md5sums=('6c65ca3cb26f575c3983bcde15246ada') build() { cd "$srcdir/$pkgname-$phototonic_commit" qmake-qt5 PREFIX="/usr" \ QMAKE_CFLAGS_RELEASE="$CPPFLAGS $CFLAGS" \ QMAKE_CXXFLAGS_RELEASE="$CPPFLAGS $CXXFLAGS" \ QMAKE_LFLAGS_RELEASE="$LDFLAGS" make } package() { cd "$srcdir/$pkgname-$phototonic_commit" make INSTALL_ROOT="$pkgdir/" install } phototonic-1.7.20/COPYING000066400000000000000000001045131271214516700150340ustar00rootroot00000000000000 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 How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . phototonic-1.7.20/ChangeLog000066400000000000000000001775161271214516700155700ustar00rootroot00000000000000commit 6fc85f96e081386c7d668f2db967f9c4c683852a (HEAD -> master, origin/master, origin/HEAD) Author: Ofer Kashayov Date: Sat Nov 14 12:21:48 2015 +0200 Added better CLI arguments processing and option to select language from CLI commit b59d703aa3958c4c11f878a3f6b74a262678bade Author: Ofer Kashayov Date: Sat Nov 14 10:17:50 2015 +0200 Czech translation update and Arch packagebuild. commit c3737334746d0bae2369b23d982ade5a981dcdd7 Author: Ofer Kashayov Date: Fri Nov 13 19:15:20 2015 +0200 Many changes, listed below: - Changes to layout switching method, cleaned up messy code that toggles between viewer and thumbnails - Fixed critical issue with tags, if exif data was missing, tags were not read correctly ebcause iptc data was ignored - Added Negate option to reverse the tags filter actione - Allowing now nested docks - Enhancments to tags user experience - Updated image tags icons commit c37070e4a068570d34ece8de1e48aa0882c80c5b (tag: v1.7) Author: Ofer Kashayov Date: Sun Nov 8 20:03:52 2015 +0200 Update Czech translation commit 9b51c8857782a428c2c24d0685d09e986d08c3d2 Author: Ofer Kashayov Date: Sun Nov 8 19:55:16 2015 +0200 Fix zoom issues commit 041b3605a69c514fbf7dd23d51b3f2d6134754c2 Author: Ofer Kashayov Date: Sun Nov 8 19:22:43 2015 +0200 Better image read error handling commit 3a05fa31b12013e05967e86738180bee83306d37 Author: Ofer Kashayov Date: Sun Aug 30 22:08:52 2015 +0300 Updated translations commit 1da9f25ca63040eca41765a7a06af146c4968553 Author: dglava Date: Sun Aug 30 19:49:20 2015 +0200 Remove useless lines commit 904c43796bc94df1883bdc568d032edc50ecfb7d Author: dglava Date: Sun Aug 30 19:08:58 2015 +0200 Updated bs, hr and sr translations commit 1eb6636349468050787bb9232c8b26e36c0cd932 Author: SARL ENR 68 Date: Fri Aug 28 18:22:01 2015 +0200 Update French translation - by Geiger David commit 3c36007cdb330b8ca77cbee3647fdc32dad9e93a Author: Ofer Kashayov Date: Thu Aug 20 20:57:40 2015 +0300 Updated translations and change log commit c38aeae79cff211b51d7bf2503483f7dbc9af413 Author: dglava Date: Mon Aug 17 17:41:29 2015 +0200 Added bs, hr and sr translations commit affa7c3369f450701839b8f5bb3f37a1a83639a1 Author: Ofer Kashayov Date: Fri Aug 7 20:57:43 2015 +0300 Version adjust commit e262112e5a4ee611f87bbb9bf5871655d069b49a Author: Ofer Kashayov Date: Fri Aug 7 20:56:32 2015 +0300 Fixed colors manipulations for images with alpha channel and non animated GIF images commit 4d4450dcebbcc6473a34c1163cd5ff73c2b0e1d1 Author: Ofer Kashayov Date: Fri Aug 7 14:41:16 2015 +0300 Minor fixes to image resize method commit aed89a8fa6023a9ddd2e7d4cd94429100a755e53 Author: Ofer Kashayov Date: Fri Aug 7 12:12:55 2015 +0300 Added Negativity settings to colors dialog commit a80cc079866c3435a65e79a95d4da717fa228712 Author: Ofer Kashayov Date: Wed Jul 15 22:16:13 2015 +0300 Fix issue with thumbs loading while changing preloading thumb pages amount settings. commit ddc7c67fc61da688e4155ff1be97765474fc5c5c Author: Ofer Kashayov Date: Mon Jul 13 22:55:15 2015 +0300 Set default button in some dialogs, fix tags disabling when interface disabled. commit 7f60847c448946e9a83667ed36d1d87361c962a9 Author: Ofer Kashayov Date: Sat Jul 11 20:06:18 2015 +0300 Fix issue with crop size feedback commit 2cc6e4ebc861930bd490d5bc303ff478ecfb3416 Author: Ofer Kashayov Date: Sat Jul 11 19:49:59 2015 +0300 Improvements to image feedback and multi tag loading commit cce5a97883d13f31442e8488048ffee231328fab Author: Ofer Kashayov Date: Sat Jul 11 18:00:10 2015 +0300 Image metadata cache implementation commit ae6c6f80aed31cfa0a774acf1081522da5826762 Author: Ofer Kashayov Date: Fri Jul 10 15:18:29 2015 +0300 Following bug fixes: Small fixes to image extensions Fixed issue with thumb label appearing after rename when labers are not displayed Remove debugging info Now checking that not adding an image tag that already exists commit 5d906772f61e8680d344f826028c6b6caeddb33c Author: Ofer Kashayov Date: Mon Jul 6 22:01:08 2015 +0300 Added temporary debug to exiv orientation reading commit c9427078ea5335a76e006c1924f50fbd2ef458a5 Author: Ofer Kashayov Date: Sat Jul 4 19:42:55 2015 +0300 Fix tag addition issue when no tags present Update changelog commit b95a6e735ed808e2fe4eae58cf0e81ae0c0916e4 Author: Ofer Kashayov Date: Sat Jul 4 13:46:29 2015 +0300 Improve tags usability and performance Update to Czech translation commit f1346c15e6e8129e39551e947d5ef4754842a246 Author: Ofer Kashayov Date: Sat Jun 27 19:50:39 2015 +0300 Update to Czech translation commit 7530a1b15ce4c070c84525c795506821bba56ed1 Author: Ofer Kashayov Date: Sat Jun 27 19:31:48 2015 +0300 Fix selection of thumb after delete or move operations Optimization to tags setting Changes to default key mapping commit 0f7884eaed130c4269b9522d3bd2628a89e24163 Author: Ofer Kashayov Date: Fri Jun 26 14:37:59 2015 +0300 Version adjust commit dfa6eab7f31a32fef62b26ee28fa62fd8b1c2ac4 Author: Ofer Kashayov Date: Fri Jun 26 14:37:22 2015 +0300 Version adjust commit 00c211c43c49e3d41daa4097d94569872b085a53 (tag: v1.6) Author: Ofer Kashayov Date: Fri Jun 26 14:34:17 2015 +0300 Improvements to tags commit 1d69510afda7dc4f3230638c1569ca072ad745a7 Author: Ofer Kashayov Date: Wed Jun 24 20:58:37 2015 +0300 Image tags feature commit af88d533cddea2a498f8f44958be9f3101b370bc Author: Krzysztof Pyrkosz Date: Sat May 2 12:04:43 2015 +0200 Update translation files, add phrase to polish translation commit 7b9aacfccca2856e182a1447861fee80e806d941 Author: Ofer Kashayov Date: Fri May 1 14:14:50 2015 +0300 Minor fixes and version adjust commit 2acf43f530b6d821b13f226e5295093156012e96 Author: everbot Date: Fri May 1 19:02:27 2015 +0930 Add setting for delete confirmation commit 0d34714b9ffe500244ada1833749518b0dab0c61 Author: everbot Date: Fri May 1 16:01:09 2015 +0930 Allow deleting photo without confirmation This works on both thumbnail view and Viewer commit ebb264ea5f187e6aee09abfeedc9e2171bab2575 Author: Ofer Kashayov Date: Sat Apr 18 15:21:12 2015 +0300 don't processEvents in a loop, thanks to luebking. commit ec6bf0c0dcbbd52a43f0f6f032291b4ceccde0df Author: Thomas Lübking Date: Sun Mar 8 12:42:02 2015 +0100 support drag and drop of url mime This allows to copy/move files into a filebrowser or onto the desktop, mail attachments and whatnot NOTICE: there's a severe DnD bug in Qt 5.4.0 - it doesn't work at all (regardless of this or any DnD implementation) commit 029e9ad97cbff503a52098710647dd6d05bc0a03 Author: Ofer Kashayov Date: Sat Apr 18 14:39:47 2015 +0300 Adjust version commit 03482cb75da00fb00dd5ea8607ebd8a3b77dd108 Author: Thomas Lübking Date: Sun Mar 8 14:06:35 2015 +0100 have a more sophisticated dircompleter * can resolve ~/ * autotrails a / on completion * use lazy childcount (interested in dirs only anyway) commit 784aad5a9417371ad5ecba19e1929ccb357b25eb Author: Ofer Kashayov Date: Sat Apr 18 12:39:45 2015 +0300 Update version commit 833611395415e57ca04eea71d7a698e674a753fa Author: Thomas Lübking Date: Sat Mar 7 17:10:28 2015 +0100 fix bookmark visibility handling copy & paste stuff and forgotton safe commit cb34cd8a82ef92b7ab165bfd302fa0ccfc8f88f8 Author: Ofer Kashayov Date: Sat Apr 18 10:54:13 2015 +0300 Fix invalid thumb refresh issue when deleting images in thumbviewer commit 0c911e0ff6e7c4cfbc3c3e23b91c2e7a8e953a3e Author: oferkv Date: Mon Mar 16 20:26:53 2015 +0200 Fix invalid cursor hiding in various dialogs while in full screen commit 368a9e807b5a3d1acdc160347123d3641553643d Author: daviddavid Date: Sun Mar 15 13:36:35 2015 +0100 Update French translation - fix some typos. - by Geiger David commit 84da2a61ffdcea0129d2839476b2934460bb7f99 Author: Peter Mattern Date: Wed Mar 11 22:14:06 2015 +0100 improvements regarding PKGBUILDs commit 06e2f123ac1f8f368dcb4db641c05d92f69f966b Author: oferkv Date: Sun Feb 8 20:02:36 2015 +0200 Sync version commit 792c3f69696da17eaa5c48600f9bfc9409d62572 Author: Krzysztof Pyrkosz Date: Sat Feb 7 13:08:33 2015 +0100 Fixes #179: fix drive handling in FSModel commit 70404e664fd3f04ed69181627cbadf12f9c37496 Author: Krzysztof Pyrkosz Date: Sat Feb 7 11:23:41 2015 +0100 Fixes #179: hide expansion mark on empty dirs commit dfcf5230d22483903be5781aad0fcdfa8a2e4575 Author: oferkv Date: Fri Feb 6 16:08:20 2015 +0200 Fix version commit 9649b8acd1c3ad333f02cef858c4cd293fef4c71 Author: oferkv Date: Fri Feb 6 16:07:11 2015 +0200 Update change log commit a6ed57b18062df7395a17dab3bc6993835d03c4a Author: oferkv Date: Fri Feb 6 15:52:47 2015 +0200 Fix version and sync repos commit 2beb1df9c73564920880c5971de03a2c1da55e4b Author: Krzysztof Pyrkosz Date: Wed Feb 4 22:50:44 2015 +0100 Delete action enhacments Enable or disable delete action based on active widget and item selection and make delete action work on bookmark tree. commit c96bbe2bbbca02ce2f3459675c0590592a05174c Author: Krzysztof Pyrkosz Date: Mon Feb 2 20:09:22 2015 +0100 Issue #173: Change Up to Go Up and fix space in German translation commit 3600f4fa5800352055d9145b2b535e1d0828a7e8 Author: Jonathan Hooverman Date: Mon Feb 2 19:48:18 2015 +0100 Updated German translation commit d77589838712d812e2aa1bff4d20a00031e78ad6 Author: Jonathan Hooverman Date: Mon Feb 2 18:52:46 2015 +0100 Updated German translation commit 0221fd21da8825b5641be49dbae1cbf48132774a Author: Krzysztof Pyrkosz Date: Mon Feb 2 04:22:22 2015 +0100 Issue #165: Import and delete old key bindings commit 1080c59cdc8941e21153b4bd7c98c174500924fe Author: Krzysztof Pyrkosz Date: Mon Feb 2 04:18:39 2015 +0100 Issue #165: Language neutral saving of key bindings commit d455052b58e83ec061a8ce767524295453f523e2 Author: Krzysztof Pyrkosz Date: Sun Feb 1 23:52:21 2015 +0100 Include compiled translations commit 3bf066f245d442d1930db328160c588a6dca4562 Author: Krzysztof Pyrkosz Date: Sun Feb 1 23:49:29 2015 +0100 Update translation files to reflect Ilya87 updates commit 35f66071c56b128d17285e4644922a238f58bd4d Author: oferkv Date: Mon Jan 12 21:13:53 2015 +0200 Fix invalid saving of bookmarks commit d1cfef5ad0b6d550d8ea6e13d37aa754ce1e7aeb Author: Ilya87 Date: Thu Dec 18 00:19:33 2014 +0300 Update Russian translation and fix %n image(s) for Rusians commit 07ea48a5419ccf757be3032686ca6a8935f6acce Author: oferkv Date: Sat Dec 13 20:11:17 2014 +0200 Update translation bins and version commit 7dcc0e9b619cc4275e215c6d611f9bac6f706a96 Author: SARL ENR-68 Date: Sat Dec 13 16:13:18 2014 +0100 Update French translation (for new change) - by Geiger David commit 309357a6e6d5d5f5ddb3b87fbdf0ad3f162b5556 Author: Jonathan Hooverman Date: Fri Dec 12 21:54:49 2014 +0100 Updated German translation commit 28fab187ae9de3aed8ce06eaf60f2a36cceefed7 Author: Krzysztof Pyrkosz Date: Thu Dec 11 23:01:41 2014 +0100 #152 fix update: polish translation and ts files update commit 10434505c9ffe1920ecba6f6072295338ccc8d94 Author: Krzysztof Pyrkosz Date: Thu Dec 11 22:47:01 2014 +0100 #152 fix update: add "find duplicate images" icon and titlebar text commit 018d29d6306c87a6edfb3d5aff3680f928b56fd6 Author: Krzysztof Pyrkosz Date: Thu Dec 11 21:48:09 2014 +0100 #152 fix proposal: make find duplicates permanent Fix issue #152 by making "Find duplicates" setting permanent. Probably we should add some type of notification above Thumbs view. Changing dir, including subfolders or refreshing unsets "Find duplicates" option. commit cd061335fd9898715ff53cfa3745d0d3502d725c Author: Krzysztof Pyrkosz Date: Tue Dec 9 01:33:20 2014 +0100 Fix issue #150: I18n clean-ups commit 17259d2aee87922cf9dd09fb5774a143673e4d52 Author: oferkv Date: Mon Dec 8 21:57:51 2014 +0200 Minor fix to thumbs bg image and version adjustment commit 4fb55d0d707c435e46b388fa523e90e7c705ca99 Author: Krzysztof Pyrkosz Date: Mon Dec 8 00:04:12 2014 +0100 Issue #106: clear popup, clean up, translations commit e715cd1e188a3315db8bee0d22a696f907055f93 Author: Krzysztof Pyrkosz Date: Sun Dec 7 01:43:12 2014 +0100 Fix issue #106: Keyboard shortcuts should be in a list and not a combo commit 5fa5aafeadfdb28bbeb5956f7eb0ba5e2cc55dee Author: krzyc Date: Fri Dec 5 11:45:31 2014 +0100 Allow translation of "General" in thumbview.cpp commit b41ed98a56b38cba27cb97c12984c31db31ae63e Author: oferkv Date: Sun Nov 23 20:09:23 2014 +0200 Add Change Log commit 8a9534c6d7604e235b88242d762e2014a61deb34 Author: oferkv Date: Sun Nov 23 19:41:47 2014 +0200 Update translation bins and adjust version commit 83ab836400e00e79d3b6973f553434916786ba3c Author: oferkv Date: Sun Nov 23 19:38:37 2014 +0200 Update Czech translation commit 0973e5b710fd3562e02240a77f3a98710fa2400e Author: Jonathan Hooverman Date: Sat Nov 22 12:43:42 2014 +0100 Updated German translation commit 98c3f6b68bfe791915662af0cb31388e015c6a46 (tag: v1.5) Author: oferkv Date: Sat Nov 22 12:27:01 2014 +0200 Adjust version commit b6deba27b54340e4d68419e56fcfa7544ad0e481 Author: Ilya87 Date: Sat Nov 22 12:06:29 2014 +0300 Update Russian translation for 1.5.0 release commit 21bdee854578a41bf7549c928dab62d86a1f0fff Author: SARL ENR-68 Date: Fri Nov 21 21:38:48 2014 +0100 Update French translation (for future 1.5.0 release) - by Geiger David - by Rémi VERSCHELDE commit 5d468e680c793a30a0c48fa51c02d048913f5520 Author: oferkv Date: Fri Nov 21 21:51:54 2014 +0200 Update Polish translation commit 100b713ae0f4d6af7c8af00bf68c497bb97b9ea5 Author: oferkv Date: Fri Nov 21 17:39:14 2014 +0200 Merge Gernam translation commit b3f24f54771c5626d192a67d9588cbc59941f655 Author: Jonathan Hooverman Date: Fri Nov 21 15:17:52 2014 +0100 Updated German translation commit 00ea1cbdd58bec20cb05f0ec5ed014cd176511db Author: oferkv Date: Fri Nov 21 14:11:55 2014 +0200 Update Polish translation, Add no selection warning, Add paste to bookmarks popup. commit 78c6c0594c8550f895ec545498cf871efe112786 Author: Ilya87 Date: Wed Nov 19 21:00:28 2014 +0300 Update Russian translation and image(s) fix commit ad9dd8ab07e56d3e9436d18d01bea02f1f2bd9e3 Author: SARL ENR-68 Date: Tue Nov 18 21:28:13 2014 +0100 Update French translation (for future 1.5.0 release) - by Geiger David commit e1272eec56d5ea95155969d409ef1093aeedef55 Author: oferkv Date: Tue Nov 18 20:28:14 2014 +0200 Update translation files commit 94e104233a55471f7579145adf04bb2670355572 Author: oferkv Date: Tue Nov 18 20:26:12 2014 +0200 Adjust subversion commit d5339c0e95ac9c5ea80878c263b71ffb1c4da2d7 Author: oferkv Date: Tue Nov 18 20:25:04 2014 +0200 Update infoview groups commit 193d0ec64ddf234d8a332bd95dcf9d33684ee341 Author: SARL ENR-68 Date: Mon Nov 17 23:52:37 2014 +0100 Update French translation - by Rémi VERSCHELDE - by Geiger David commit 461c315bd5490d89082105e0a2fdab30cdcb00c9 Author: oferkv Date: Sun Nov 16 20:19:54 2014 +0200 Fix cropping issues and add feedback to transformations commit f6c4f6f1cdff06979bddc4449d27e77174e405ac Author: oferkv Date: Sat Nov 15 22:07:15 2014 +0200 Cropping Dialog usage now oriented for permanent transform commit 9229a7db3ac15fc14c86e60d35b750ae144d11ab Author: oferkv Date: Sat Nov 15 18:54:23 2014 +0200 Added Color Balance and shortcut for Lock Transformations commit 67bfc5d04ad8b26680b0f06285d97288de12a9e8 Author: oferkv Date: Sat Nov 15 14:52:50 2014 +0200 Reset Zoom and Original Size with Middle Mouse Button and Modifiers commit 7c69cd494cceb7eb40e08c26a63b9ba919c109d2 Author: oferkv Date: Sat Nov 15 14:11:57 2014 +0200 Crop to selection implementation commit 0b629c4bb664ed6d4d4bb5279d00cc6483301c69 Author: oferkv Date: Sat Nov 8 17:14:46 2014 +0200 Colors dialog enhancements commit d85350a6e7fb7a0007ea698a046e0e3b7829fbca Author: oferkv Date: Sat Nov 8 13:37:37 2014 +0200 Set thumbnails background image and fixes to Colors dialog commit b6f2aa74801cde43708e39a83b51eaff41b31910 Author: oferkv Date: Fri Nov 7 20:29:36 2014 +0200 Enhancements to Copy and Move to dialogs commit 58531c0c26b8e5ea7b9afdf0d8776454c350e0c8 Author: oferkv Date: Fri Nov 7 16:51:17 2014 +0200 Fix transformations lock inconsistencies Reorganization of transformations Enhancements to Crop and Colots dialogs commit e1b75487ef779051495c98f06c48a8c01ccbcc2e Author: oferkv Date: Fri Nov 7 15:15:06 2014 +0200 Version adjust commit ebb97083fbaeff1061310b0479873e5bedea221e Author: oferkv Date: Fri Nov 7 15:13:09 2014 +0200 Fix transform dialog cleanups and potential crash in resize dialog commit 52af770bcd4fffc84419b62155353af305d9a0f4 Author: Jonathan Hooverman Date: Wed Nov 5 11:10:23 2014 +0100 Updated German translation commit 8cb040119f253edf3467c6c50545e8d64388eab5 Author: oferkv Date: Mon Nov 3 20:31:54 2014 +0200 Add Focus to path bar and search bar shortcuts commit 38e7fab5960ffce1e1c9d8cd4269a0d06064fd35 Author: oferkv Date: Mon Nov 3 19:42:41 2014 +0200 General maintenance commit 360850204566f6ff048cb33418bbd0b464719775 Author: Jonathan Hooverman Date: Sun Nov 2 21:54:24 2014 +0100 Updated German translation commit bd61d0063d9fab977da26ca5b6f4e0dbf46978dd Author: SARL ENR-68 Date: Sun Nov 2 21:30:29 2014 +0100 Update French translation (for last change) - by Rémi VERSCHELDE - by Geiger David commit 8a5475189aba8e17a760d82ce4e46d56104684c5 Author: Ilya87 Date: Sun Nov 2 04:47:15 2014 +0300 Update Russian translation and Find Duplicate translation fix commit c1568901ce50018457cf30d951c3eb2aa95b256a Author: oferkv Date: Sat Nov 1 17:45:18 2014 +0200 Added Find Duplicate Images feature Fixed issue where Exif reading would crash in rare cases commit 0d17361cc7ff2743ed26d8385838dfdec32c09e6 Author: oferkv Date: Fri Oct 31 23:29:58 2014 +0200 Fix docks resize issue when image toolbar visible in viewer commit 89b1ad35215965f2383f3a2116db44c51a6680af Author: oferkv Date: Fri Oct 31 22:31:05 2014 +0200 Fix image resize when viewer opened first time when image dock is invisible commit 461483b7a7c4807a43a330693dd33c715eb464b8 Author: oferkv Date: Fri Oct 31 22:11:36 2014 +0200 Add bookmark when directory is dragged to an empty area in the bookmarks dock commit 075c8e60ac68fd251b1beb7fe0e500f35c23d4f9 Author: oferkv Date: Fri Oct 31 17:31:19 2014 +0200 Fix sorting order when sorting by time and size commit 0017946bf60b2289d3261226231362a461e22978 Author: oferkv Date: Fri Oct 31 16:17:06 2014 +0200 Update translation bins commit c0be7b187814670457f4a36dce662831f774e640 Author: oferkv Date: Fri Oct 31 16:15:09 2014 +0200 Drag and drop thumbnails in to bookmark items commit 42dd8c4a1eed9bfbf671003bc64316cbcb5f20b7 Author: SARL ENR-68 Date: Sun Oct 26 15:07:13 2014 +0100 Update French translation (for last change) - by Geiger David update commit 147b76131f3bf1cac2f3b5789549584ab003ba3b Author: oferkv Date: Sat Oct 25 23:43:37 2014 +0300 Fix issue with deleting bookmarks for deleted folders commit d6d1c5ee886727eafa775932616ce4658efbc180 Author: oferkv Date: Sat Oct 25 23:21:26 2014 +0300 Unify docks and toolbars menu with application menu commit 2fa39764fc73d9204e98452062cb25d697d0be14 Author: oferkv Date: Sat Oct 25 21:43:17 2014 +0300 Add Bookmarks feature commit 8ee65e6c71216bc330e3b137853185e06bc8839f Author: oferkv Date: Fri Oct 24 11:54:28 2014 +0300 Fix viewer and viewer toolbar default visibility Updated translation binaries commit 19430d4a6c6d6a4cad63a1f423dc7383762a0c80 Author: Jonathan Hooverman Date: Sat Oct 18 13:42:56 2014 +0200 Updated German translation commit 2b734a6e0658377a0cf0e9ac8618f6fd4354cd28 Author: oferkv Date: Fri Oct 17 13:43:41 2014 +0300 Fix Compact thumbs flickering and blanking when closing image from CLI commit 8d10589133a00403eded9754d49628f6f7a81e0b Author: oferkv Date: Wed Oct 15 20:40:36 2014 +0300 Add image viewer toolbar Update Czech translation commit dccc29103eddab4d883d8f0774df5e7eca8cdb59 Author: oferkv Date: Tue Sep 23 20:58:28 2014 +0300 Update for Russian translation and translation binaries commit 9faebe2d3d38ff7f9fc3ce2aacf812c95f96a41f Author: Jonathan Hooverman Date: Sat Sep 20 15:09:14 2014 +0200 Updated German translation commit 388b80bfe8349a28bf0b5e6c3c99143fbbb5e842 (tag: v1.4) Author: oferkv Date: Tue Sep 16 19:19:31 2014 +0300 Change version scheme and update translation bins commit fe50b44327c96adff6b525902acb6f46cbd4c51f Author: SARL ENR-68 Date: Sun Sep 14 08:54:56 2014 +0200 Update French translation (for new change) - by Geiger David commit 1e2cc3c496ea477216a0f1435943abd6c2b06a72 Author: oferkv Date: Sat Sep 13 15:32:12 2014 +0300 Consolidate feedback in viewer and other bug fixes commit 2086522a7a25069635546ab7c6daae09e50d6cc0 Author: oferkv Date: Sat Sep 13 14:05:08 2014 +0300 Replace Manage action in favor of Open with action commit b527c23e622f00ca32ddcec2be459a9e9fe7ee80 Author: oferkv Date: Sat Sep 13 09:41:52 2014 +0300 Fix versioning and clear preview when browsing to other folders commit 2bdbeb1ed3b522ffefb15c5fca6cdf2f495753a4 Author: oferkv Date: Fri Sep 12 19:38:29 2014 +0300 Fix wrong image loading degradation from last commit commit 2f552f3ced6e41a0b38af372a928f6fd39c0c05d Author: oferkv Date: Fri Sep 12 19:35:26 2014 +0300 Fix invert selection slowness commit 00ff2827ab01517deefc03e358cac3bf75b3ccb8 Author: oferkv Date: Fri Sep 12 19:05:09 2014 +0300 Add busy indicator commit f06bc10cf651363154614b279ec4bc766809ac51 Author: oferkv Date: Fri Sep 12 15:29:24 2014 +0300 Fix degradation when opening image from file manager commit b267c03dd86087653f24125972b05c77d323e5f1 Author: oferkv Date: Fri Sep 12 15:25:33 2014 +0300 Corrections for exiting from full screen mode flow commit 190ce9630273f8ff62d4f8172e411567d6e8760e Author: oferkv Date: Fri Sep 12 12:56:30 2014 +0300 Correct interface behavior when using transformation dialogs commit c6b43de71be90306e405ce2981a17eb9395052a9 Author: oferkv Date: Tue Sep 9 22:53:57 2014 +0300 Fix mouse events on preview dock Disable wrong actions in thumbs area commit 3100eea7abe0f7aa3e08ba6d09b1deac62679707 Author: oferkv Date: Tue Sep 9 21:58:57 2014 +0300 Fix arrow keys not working in thumbnails area while preview is open Fix thumbs refresh issue when closing image opened from file manager commit a35dc7836f1b2c1b57b16c1abe15b9ca7d048aa5 Author: oferkv Date: Mon Sep 8 21:18:23 2014 +0300 Integration of imageViewer and Preview Dock commit 2896de2ae0a51a2014057fd49051dc7034347994 Author: oferkv Date: Sun Sep 7 22:37:31 2014 +0300 Fixed crash when closing image in some cases. Also fixed wrong image index when loading from CLI or file manager commit 135c446ed46dc0fe01274ee91b79810b157427d8 Author: oferkv Date: Sat Sep 6 18:22:41 2014 +0300 Bug fixes to docks positions, rename in viewer and close image lag commit 592a897c7ab0e44ac9c572874eb8ed4dac555db2 Author: oferkv Date: Fri Sep 5 20:27:26 2014 +0300 Add rename action to imageView commit 6f5cd1ddb2a407db30b312ad74a42f66c9128db5 Author: oferkv Date: Fri Sep 5 18:52:04 2014 +0300 Fix performance issues when flipping between viewer and thumbnails commit 39ea73fd9d3f7305a3476f72e1a2df2dc34b7bd0 Author: oferkv Date: Wed Sep 3 23:18:28 2014 +0300 Fix issues with Show Labels in Squarish mode commit 2c86726051c14df60fded17712d66e728b0b7a4e Author: oferkv Date: Wed Sep 3 21:47:39 2014 +0300 Fix delay when closing viewer commit 05de6e1e1c20477fa8a3395742674a0a671aea6d Author: oferkv Date: Wed Sep 3 19:44:52 2014 +0300 Fix folder focus issue when creating a new folder commit 4aab106e0781cc99b1780f77412fc4c387260ea0 Author: oferkv Date: Sat Aug 30 11:33:58 2014 +0300 Open operation now toggles between image open/close as it should commit 036bfeb54e63e33ddcbb06265d8abc5f1931a9af Author: oferkv Date: Fri Aug 29 13:03:32 2014 +0300 Preview Dock menu and mouse events commit db603b279cc44dded631fe68d188f38795de661f Author: oferkv Date: Thu Aug 28 22:49:31 2014 +0300 Fix random slowness when closing image commit 52e9d44b91274699f431938b351f3b3ff5b8701b Author: oferkv Date: Wed Aug 27 23:20:00 2014 +0300 Updated translation binaries commit 23c142544c47c7af9e13316b1cfb2589c58d5d9e Author: oferkv Date: Wed Aug 27 23:17:20 2014 +0300 Preview Dock implementation part 2 commit 1ed3cf5b6138fa757a1c7c9c9a04840f0c2099cd Author: SARL ENR-68 Date: Tue Aug 26 15:24:57 2014 +0200 Fix typo on French translation commit c5c63c795df54abd1e431098a439b3d991074670 Author: SARL ENR-68 Date: Tue Aug 26 15:17:04 2014 +0200 Update French translation (for new change) - by Geiger David commit 428a06d13679d8a6f41e2cfcf0269df48359878b Author: Jonathan Hooverman Date: Mon Aug 25 19:19:20 2014 +0200 Updated German translation commit 998444c23b7f6275b25ca71e865fd93877998419 Author: oferkv Date: Sun Aug 24 22:48:14 2014 +0300 Updates for Russian translation commit 3d34a9dfe370baba02f9c72bf8289bb648baed1d Author: oferkv Date: Sun Aug 24 22:37:24 2014 +0300 Preview Dock implementation part 1 commit 1ef7b6dc960c85a6d5c74ba73a6195268353f0a8 Author: SARL ENR-68 Date: Sun Aug 24 20:41:33 2014 +0200 Update French translation and fix missing space on Mainwindow - update French translation. - fix missing space between 'About' and 'Phototonic'. commit c5e947912cf4624b28a25eda54f09801c7c0d6ac Author: oferkv Date: Fri Aug 22 22:05:18 2014 +0300 Fix for large icon in menus and image close slowness commit d7e4d4f5601426f8ee85aa3d0ca24e31c30d5581 Author: Jonathan Hooverman Date: Thu Aug 21 10:15:54 2014 +0200 Updated German translation commit 3b00931eee42053d54b9efe15dd4a37a8166af1e Author: oferkv Date: Wed Aug 20 22:24:41 2014 +0300 Fix missing translations commit 86e5aea20ebb4e3943229fab5e44374c39f57b19 Author: oferkv Date: Tue Aug 19 22:07:05 2014 +0300 Fix shaded dialogs in KDE final commit a626c83df1d0d62b7725d164cabb9e55612a529c Author: oferkv Date: Mon Aug 18 22:40:15 2014 +0300 Fix colors dialog under KDE commit 59d25fa190150c2cd3445d2b684566362fa7f1d0 Author: oferkv Date: Mon Aug 18 20:51:07 2014 +0300 Updated translation binaries and small fix to viewer popup message commit 794d5f4b3ed74005a881867470ac5dbb3eea9410 Author: SARL ENR-68 Date: Sun Aug 17 23:10:54 2014 +0200 Proposal to French translation for phototonic and for desktop file - by David GEIGER - by Adrien DAUGABEL commit 5ac05176854fddf9e3eaa8f40078dd3ea54e917a Author: oferkv Date: Sun Aug 17 20:20:58 2014 +0300 Update for Czech translation commit 3a9b9c6c8d790689c669c5c4edc07f251991dbd9 Author: oferkv Date: Sat Aug 16 12:22:58 2014 +0300 Allow customization of toolbar icons size commit e77f8a60e42cfeb5dca2efa8f4fc81d4d346f0c0 Author: oferkv Date: Sat Aug 16 00:41:46 2014 +0300 Confirmation when moving folders commit 8b26a5193becee7d0e984594d2041a2d93b1169c Author: oferkv Date: Fri Aug 15 23:39:21 2014 +0300 Cleanup toolbar icon size commit 67fda96bb6d48b6c09961cde4ca3a7d4ebaecb6d Author: oferkv Date: Fri Aug 15 23:21:39 2014 +0300 Add tabs to settings dialog commit aa9e1ab67252b113bacd1fe40e1371b51cf4928e Author: oferkv Date: Fri Aug 15 13:20:47 2014 +0300 Rotate thumbnails by Exif orientation commit f8014d8af61f0de713e1575fe54a396cf71a6b93 Author: oferkv Date: Wed Aug 13 21:02:29 2014 +0300 Add license file commit 16b258d653db4bfb7457c75f908dfebddbcc41e1 Author: oferkv Date: Wed Aug 13 20:41:37 2014 +0300 Updates for Russian and Polish translations and minor fixes commit 95d53914e1bf566edb15a1007457d57d8428d878 Author: Jonathan Hooverman Date: Sun Aug 10 21:04:04 2014 +0200 Fixed typos in German translation commit 75bb83149ab8b0b5b40f92f5596c6494efdcc22b Author: Christopher Roy Bratusek Date: Sat Aug 9 19:19:59 2014 +0200 german i18n update commit 1f81ac1c9a9cc73f49667421e0f34daba4575a9f Author: oferkv Date: Sat Aug 9 13:54:19 2014 +0300 Add Czech translation commit dc48317a6dc966e00647413cb7540f47fa774b77 Author: oferkv Date: Sat Aug 9 12:27:42 2014 +0300 Minor changes to external app dialog commit 22a2eeba0e7676aa79dda843ffd7598f658805be Author: Christopher Roy Bratusek Date: Sat Aug 9 09:56:16 2014 +0200 lintian: override binary-without-manpage warning commit 3a589720060cadab91f894d114b171153d57846c Author: Christopher Roy Bratusek Date: Sat Aug 9 09:52:44 2014 +0200 qmake: respect CFLAGS/CXXFLAGS/LDFLAGS env-vars commit ebb827c26f5f5926fe19ea1609149d1cfc5ac609 Author: Christopher Roy Bratusek Date: Sat Aug 9 09:38:43 2014 +0200 lintian: W: depend on essential without version number commit 8c03454c0b582dccec22d50fc0a73d5c4bc2fb3f Author: Christopher Roy Bratusek Date: Sat Aug 9 09:38:03 2014 +0200 lintian: W: duplicated entry StartUpNotify commit 25c4d57b3bbeefbcaefa6b87e88fe9568a419048 Author: Christopher Roy Bratusek Date: Sat Aug 9 09:27:14 2014 +0200 missing build-dep on libexiv2-dev commit 89c9a146714919888925f3b68cd7034db5d21e8c Author: Christopher Roy Bratusek Date: Fri Aug 8 16:51:34 2014 +0200 another string commit 1a66f0e07466cc5611f0c4cd6fd382a172fc7654 Author: Christopher Roy Bratusek Date: Fri Aug 8 16:38:26 2014 +0200 one more string improvement in german translation commit 93d5fb612fd9f69dcb0ea935583bea86bf3764c3 Author: Christopher Roy Bratusek Date: Fri Aug 8 15:39:32 2014 +0200 translated last 3 untranslated strings commit f71ead64b86d4ec345bf0ec8381d91014e1b734b Author: Christopher Roy Bratusek Date: Fri Aug 8 15:33:52 2014 +0200 improve german translation: - add some missing spaces - use the word Zoom everywhere, instead of mixing Zoom and Ansicht - translate a few untranslated strings - better wording on some strings - the string for already bound keybinding in german was completely messed up. fixed. commit 750efa6531ebf168e85b112a49e63183744162d7 Author: Christopher Roy Bratusek Date: Fri Aug 8 20:30:26 2014 +0200 add (add new entry) button to external applications editor commit 7789e792fe5da3976d3c2d7d029dcc5f368b688c Author: Christopher Roy Bratusek Date: Fri Aug 8 19:43:43 2014 +0200 make external application chooser cells editable * allows changing menu-name of the external application * allows adding additional arguments to the application commit e8e391777140c0a47b32d00e03c453f85bc80e73 Author: Christopher Roy Bratusek Date: Fri Aug 8 19:16:58 2014 +0200 remove some unused hunk commit afccf8727fd9b4b980422f9dc25b94419c4a3c3e Author: Christopher Roy Bratusek Date: Fri Aug 8 19:01:34 2014 +0200 debian packaging scripts commit 7d10d188868af2b8feb0fe887d3823898fb0d02f (tag: v1.03) Author: oferkv Date: Fri Aug 8 11:38:02 2014 +0300 Allow arguments in external apps commit 6735c4d28635d5de1d24a2f874f4b5801010b372 Author: oferkv Date: Thu Aug 7 21:40:37 2014 +0300 Change icon commit fa7f7db7121cb02ce40586cd16f1a5beeb581057 Author: oferkv Date: Mon Aug 4 21:42:20 2014 +0300 Remove old handler for CLI image commit 46715d3cd3697cbeac13e9f0aeca9fd8c57586c0 Author: oferkv Date: Mon Aug 4 19:28:34 2014 +0300 Update for Russian translation commit 425f4c7d0fddb99fc6826bb28d9771fd1551519c Author: oferkv Date: Mon Aug 4 19:22:20 2014 +0300 Fix exiting from full screen when exit on close enabled commit 28712eb35e665d04c555ce7ee7f4d333516a4341 Author: oferkv Date: Sat Aug 2 21:29:34 2014 +0300 Remove redundent cursor overrides commit 04e1f3bd925cbd919b26473c6427a5ce452afb05 Author: oferkv Date: Sat Aug 2 20:23:46 2014 +0300 Fix crash when colorizing Format_Indexed8 commit 5904ff4998f84f3e14958cee1e3676628cade2b3 Author: oferkv Date: Sat Aug 2 19:17:56 2014 +0300 Resize image part 3 commit 3729b4f8c3184c06a2e9629c4fccfffc29c3dc13 Author: Jonathan Hooverman Date: Sat Aug 2 11:57:23 2014 +0200 Updated German translation commit 1c1b4012404e507cd99572f8a7bb00579bf25543 Author: oferkv Date: Sat Aug 2 00:49:52 2014 +0300 Add shortcut keys for external applications commit 90d94a72f2438d9285eb6f0e4b888c52386d92a7 Author: oferkv Date: Fri Aug 1 23:30:23 2014 +0300 Optimizations to compact and squarish thumbnails commit 7e720e5b9f64577f09bcfa278c3180d2c746e379 Author: oferkv Date: Fri Aug 1 22:18:49 2014 +0300 Resize image part 2 commit 5bf13b1c9828ab53fc1c5969a5a0a7432f6d4c58 Author: oferkv Date: Fri Aug 1 20:11:36 2014 +0300 Resize image part 1 commit e8dcba36ca0a4acfb3e17e01bb70fa0701bf7019 Author: oferkv Date: Fri Aug 1 16:42:33 2014 +0300 Better brightness and contrast processing commit 0f497247c9eb703762044f72222bd428740ff75b Author: oferkv Date: Fri Aug 1 15:26:52 2014 +0300 Disable accidental file extension renaming commit 5ea326b97f5b300b1ae679c7ae4013a0b72c10cd Author: oferkv Date: Fri Aug 1 14:45:26 2014 +0300 Add Docks and toolbars visibility sub menu commit 469723e444a98771300221968f866d91638cf143 Author: oferkv Date: Fri Aug 1 12:39:18 2014 +0300 Slide show fixes commit bc4c8e07f131baa4f0a49b5bd7b79dd2523679ef Author: oferkv Date: Fri Aug 1 12:19:25 2014 +0300 Enhance image name label in full screen commit 4b7502134a6502ba3c85b1297aa20cd7fb80781d Author: oferkv Date: Wed Jul 30 22:20:49 2014 +0300 Add shadow to image name display in full screen commit 3f149e754eb18a04fb9c1ed64516f02e3ef547c4 Author: Jonathan Hooverman Date: Wed Jul 30 18:55:56 2014 +0200 Updated German translation, minor cosmetics commit 34f20384b36959ce3926ff73fc537cfe44cdf237 Author: oferkv Date: Tue Jul 29 22:07:30 2014 +0300 Updated russian translation commit a942ce213c8a800b5806fdaf48bc30eea5f4dd9c Author: oferkv Date: Tue Jul 29 22:03:54 2014 +0300 Enhancements to thumbnails layout commit 7a03229e3948f47fe8676ded86a229b077876797 Author: oferkv Date: Mon Jul 28 23:56:01 2014 +0300 Add Show/Hide thumbs labels feature commit 1fff0107eb58586d78f872d16ff69f9784f6d127 Author: oferkv Date: Mon Jul 28 23:17:17 2014 +0300 Small fix to image info in full screen commit 04ef24c45bd3e7be826930a71e7268064727d094 Author: oferkv Date: Mon Jul 28 22:09:53 2014 +0300 Update translation files commit 7a269c174d4fca887ebd61fb2174e8df46b93d37 Author: oferkv Date: Mon Jul 28 22:00:39 2014 +0300 Add image name in full screen commit 48ec9988763b7cf9268b82a9f5235612064e54e2 Author: Jonathan Hooverman Date: Sun Jul 27 11:56:43 2014 +0200 Added German translation for desktop file commit 4fa642e48e07f57426185d891f74275cfa7e39ee Author: Jonathan Hooverman Date: Sun Jul 27 11:51:05 2014 +0200 Updated German translation commit 710405f144ff42bcec1163faa112738c0706161c Author: oferkv Date: Sat Jul 26 23:40:21 2014 +0300 Brightness and Contrast part 2 commit e3a2407711c84b140fffd4628e62e53547e2befb Author: oferkv Date: Fri Jul 25 20:38:27 2014 +0300 Brightness and Contrast part 1 commit d4603047bd7e3960f343ee0f5d1124499f5f94df Author: oferkv Date: Fri Jul 25 17:15:28 2014 +0300 Enhance image viewer menu with file options commit f4726d92b438140f0da6269661e2a4a24cb841ce Author: oferkv Date: Thu Jul 24 20:07:57 2014 +0300 Add startup directory feature and other bug fixes commit f3934237f480c7d81812537db89635ca73edaadf Author: oferkv Date: Wed Jul 23 20:15:59 2014 +0300 Fix wheel zoom direction commit 98b7dbd08a9242548d7dc6110207e8790cfbc792 Author: oferkv Date: Wed Jul 23 18:52:41 2014 +0300 Fix thumbnails sorting to be case insensitive commit aff5a5db15ba987f40336a2987338d8307998378 Author: oferkv Date: Wed Jul 23 00:14:36 2014 +0300 Startup folder part 1 commit 324c38646ff53631956f818437644978585d431e Author: oferkv Date: Mon Jul 21 20:47:32 2014 +0300 Added Russian translation commit b0b22057669faef9154779cf230714088e4519e5 Author: oferkv Date: Sun Jul 20 21:40:56 2014 +0300 Fix menu missing in Ubuntu commit 43f356f86b1049bae743d045da5cb1e34828fda0 Author: oferkv Date: Sun Jul 20 20:36:19 2014 +0300 Add German translation commit 5203123e654bac0f5d4131bfe4663bf2801ad982 Author: oferkv Date: Sat Jul 19 23:10:08 2014 +0300 Polish translation added commit d164e8b0a218697ab5bae8f3fb7b3d2cbc33af1c Author: oferkv Date: Sat Jul 19 11:53:52 2014 +0300 Colors dialog and internationalization updates commit 41cb320a7a69869ffab3b412b452e0447658ea73 Author: oferkv Date: Fri Jul 18 17:31:32 2014 +0300 Internationalization part 2 commit c6f21f0fc3cedc23aa305d77948777b7185e829f Author: oferkv Date: Wed Jul 16 21:45:49 2014 +0300 Internationalization part 1 commit 46d64daab5f7e8bf24cbf5cc129c63d0568e934f (tag: v1.01) Author: oferkv Date: Mon Jul 14 21:51:44 2014 +0300 Fix save failure with some extensions and toolbars, docks persistent visibility commit 355a1e39076dde130cbff553add63d5b2ac6bd6b (tag: v1.00) Author: oferkv Date: Sat Jul 12 22:09:26 2014 +0300 Fix dock visibility issue commit 0850b65da087105d32dc82884c277054956be78d Author: oferkv Date: Sat Jul 12 12:58:56 2014 +0300 Misc bug fixes in dialogs and docks commit 89e1e13ccb3f26b8c58f068ab65322f3db1c7700 Author: oferkv Date: Sat Jul 12 00:50:30 2014 +0300 Enhance thumbnails loading in reverse direction commit 856d7983787a848a75ded077c5102a1896c4ba08 Author: oferkv Date: Fri Jul 11 17:18:44 2014 +0300 Fix thumbnails range loading when position changes by window resizing commit aae318bbdb13d0afe50f96f9357c3381eec7e146 Author: oferkv Date: Sun Jul 6 01:45:41 2014 +0300 Add zooming with ctrl+wheel and minor tweak to thumbs loading commit 7a0f7bd110dcfa9d6fa0549004903ef26bfb3a30 Author: oferkv Date: Sat Jul 5 23:01:27 2014 +0300 Fix invalid image movement when using keyboard to move image commit 5f1ba5187b8a258f71c8fda35fb0383ac4cc3a34 Author: oferkv Date: Sat Jul 5 19:08:54 2014 +0300 Disable certain actions when in new image commit 1960355a8fd8496b3cd9219dc0ec17b3bc962857 Author: oferkv Date: Sat Jul 5 17:40:13 2014 +0300 Fix invalid thumbs flickering when closing image commit 997cb88167845a5a082f772e67fdd5072c02f404 Author: oferkv Date: Sat Jul 5 15:24:38 2014 +0300 Customize mouse behavior commit c357f7951d3719c6223258473084b11611dc3e15 Author: oferkv Date: Fri Jul 4 22:30:30 2014 +0300 Fix invalid window resizing after exit from fullscreen commit aef24aa7eac9d9360efc4faaa9ed9dce1d587c01 Author: oferkv Date: Fri Jul 4 16:34:18 2014 +0300 Copy or Move images to... dialog implementation commit 6818ab664733fc033c16fad8e7c1b4fc4d8df714 Author: oferkv Date: Sat Jun 28 13:12:23 2014 +0300 Open with multiple external applications commit 4e8b467eecea09b91f98814e1edba75e0c7a917d Author: oferkv Date: Thu Jun 26 21:09:00 2014 +0300 Crop dialog enhancements and fixes commit d0d6f532e784b3ee89a6a2398ffaa7504a86f024 Author: oferkv Date: Wed Jun 25 21:33:23 2014 +0300 Allow smaller thumbnails size commit 5f2e6c46749f9e1dcd4e477005da051d84a4cfa2 Author: oferkv Date: Mon Jun 23 19:37:50 2014 +0300 Enhance filter bar line edit and info viewer with additional actions commit 8db784adb069d382a112cb16330ae9a44317647c Author: oferkv Date: Sat Jun 21 20:25:40 2014 +0300 Fix scrolling to last image, add custom thumbs pages loading to prefs commit 2415623c355b895eecca9dd21c5916e8d2e3c68e Author: oferkv Date: Sat Jun 14 16:13:27 2014 +0300 Optimizations to thumbnails loading commit 4af67c49d3a69d881669e4346287e1f3efab5d76 Author: oferkv Date: Tue Jun 10 21:12:03 2014 +0300 optimizations to thumbnails loading commit 14be881b49b4f4483b79332706f3a1d0981b2412 Author: oferkv Date: Sat Jun 7 16:39:27 2014 +0300 Dynamic thumbnail loading commit 77bc3175ac97a2c3a9b0b09447c9cd2cc83ffed2 Author: oferkv Date: Tue Jun 3 13:51:41 2014 +0300 Fix toolbars and docks remain visible when returning from viewer bug part 2 commit c067b49bd42b273a13297444e2ee07c99476514c Author: oferkv Date: Tue Jun 3 12:24:26 2014 +0300 Fix toolbars and docks remain visible when returning from viewer bug commit b49acbec04ccdb05099066920ed62a0ae653bf0d Author: oferkv Date: Sat May 31 16:59:00 2014 +0300 Fix regression issues in copy/paste/delete/move part 2 commit 3bfeb2dbd5904ee28a286e72d865c0599ca5abb0 Author: oferkv Date: Sat May 31 15:26:17 2014 +0300 Fix regression issues in copy/paste/delete/move related to new recursion feature commit 7cbfafa830374d03c8e17b8101df53bc35e71709 Author: oferkv Date: Fri May 30 18:16:49 2014 +0300 Fix slideshow image offset and crash when deleting all images while in viewer commit a8734b031c7e02d8edba7ecfcdd3ff036be221e4 Author: oferkv Date: Tue May 27 22:52:12 2014 +0300 Show hidden files option commit 46a84ace3754a162fcdccdbdeef7f002344c6a75 Author: oferkv Date: Sun May 25 20:44:06 2014 +0300 Load thumbnails recursively part 3 commit 49c9e975777431e264d8dd65aee4d5fdedc47888 Author: oferkv Date: Sat May 24 17:44:49 2014 +0300 Load thumbnails recursively part 2 commit 0b5eb463194d0166552e4ce9c265e8d6f6f8ef0d Author: oferkv Date: Fri May 23 17:18:20 2014 +0300 Load thumbnails recursively part 1 commit eee0aa14c32af35d1185f216f86837c8ed72012b (tag: v0.99) Author: oferkv Date: Sat May 17 17:58:52 2014 +0300 Fix wrong thumb selection when new image closed commit 96a74b96807e9c8d691c8601ddafd120a4ff753e Author: oferkv Date: Sat May 17 17:22:46 2014 +0300 Add image for clear keyboard shortcut action commit 76c04b3d1979453d58a64e468ed507d59bc5d0bb Author: oferkv Date: Sat May 17 17:09:54 2014 +0300 Several small fixes commit 0dd2a44d918a00a20be74a843d899f865a2ac6c4 Author: oferkv Date: Sat May 17 15:06:52 2014 +0300 Fix free rotation quality commit db834679b30a659d4987dfc5b2b440bd020b7ff6 Author: oferkv Date: Fri May 16 18:08:08 2014 +0300 Add free rotation option commit 57c1f1ab35ac7bf4a94a37e27e8647dc0462200b Author: oferkv Date: Fri May 16 16:34:51 2014 +0300 Enhance Crop dialog commit 267cc347827dce20a237f8f9f3da43a5caae6890 Author: oferkv Date: Fri May 16 15:10:54 2014 +0300 Misc bug fixes commit e165fd7d4a44b35b894365dd1bff3febd78977e9 Author: oferkv Date: Thu May 15 21:05:53 2014 +0300 Exif support part 4 commit 2a7f4fd52b190b970f591efee389069cb3d97288 Author: oferkv Date: Mon May 12 21:21:41 2014 +0300 Image info enhancements commit cc7bd673c6bb4f197ed1b8c618e48db3dfeb2511 Author: oferkv Date: Sun May 11 20:39:14 2014 +0300 Image filter bar part 2 commit 0bbed2f3b7e41be15bf4866605bc2a139aa8f3e0 Author: oferkv Date: Sat May 10 19:52:11 2014 +0300 Image filter bar part 1 commit c35f3f4dfd0a90b5694394424b637e82c8e1c5ff Author: oferkv Date: Fri May 9 18:19:32 2014 +0300 Fix dockable widgets visibility when running from command line commit 405a37fabef955b63554ba1ceaa37945374923b5 Author: oferkv Date: Fri May 9 17:48:05 2014 +0300 Fixes to image saving with Exif data intact commit a5a8ad7039c7b821dedc1c02ddd902f1cabd1924 Author: oferkv Date: Fri May 9 15:50:42 2014 +0300 Open multiple images with external application commit 669a901c9def9c330770353b63bb319bfbd87989 Author: oferkv Date: Fri May 9 15:14:35 2014 +0300 Add docking functionality for filesystem tree and image info commit bb6d1d97bd05e4bdfab5b3cb6a9527eea36cee71 Author: oferkv Date: Mon May 5 19:03:28 2014 +0300 Exif support part 3 commit a2a83004a244194a20719a16b8ff96eba14f3525 Author: oferkv Date: Sat May 3 18:29:16 2014 +0300 Exif support part 2 commit d90404b543bd5246c679764858ee15630f4bd106 Author: oferkv Date: Fri May 2 19:58:01 2014 +0300 Exif support part 1 commit b1dfc055c1a65a9a513d24c79a4635fdb27829c2 Author: oferkv Date: Tue Apr 29 20:50:27 2014 +0300 Add Show-Hide Tree option and some other fixes. commit 26a6c793b40da099c9514aacf9be6f12b7321f2d Author: oferkv Date: Sun Apr 27 20:25:03 2014 +0300 New image enhancements commit bbebb2ddbb168894ab2ec5057b6d61a80fd81bec Author: oferkv Date: Sat Apr 26 17:24:46 2014 +0300 Add new Image, Paste Image, additional bug fixes. commit e4f15bd0f3890a99bd42eef0f4c01d2e11618f03 Author: oferkv Date: Fri Apr 25 15:24:22 2014 +0300 Remember dialog positions and minor optimizations to colorization process commit c8e00746165e972a742e11923eb847eba11eb0b2 (tag: v0.98) Author: oferkv Date: Mon Apr 21 17:57:54 2014 +0300 Fix popup message time commit f31e1a65c6005a5aacfdcbdbdc10087f640614fb Author: oferkv Date: Mon Apr 21 17:02:51 2014 +0300 Small fixes commit 6bb5be5552bfdb9ec56f0d679f3e6157d30ba870 Author: oferkv Date: Sun Apr 20 19:56:26 2014 +0300 Fix icon sharpness commit 45e386db7fc605c5e08e21e473241c3e3f84eeb5 Author: oferkv Date: Sun Apr 20 19:06:37 2014 +0300 Fix empty thumb text in square mode and other small fixes commit cd14316a3f6784ab279bffefee3752010e78c6a8 Author: oferkv Date: Sun Apr 20 16:41:32 2014 +0300 Fix no color display issue on color selection buttons commit 05de130ea03ddf404e7dbec88fa65d269361479b Author: oferkv Date: Sun Apr 20 16:14:05 2014 +0300 Enhance slideshow behavior commit 00da0f2085081f246bac1b020bc55a9123e0f5d0 Author: oferkv Date: Sat Apr 19 18:20:23 2014 +0300 Fix issues with saving image commit 09b761ae338d5213af0b68f6605853fd0158bf08 Author: oferkv Date: Sat Apr 19 17:55:09 2014 +0300 Add feedback option when in viewer commit 3e16386411eca2384daf154c1821a888e77e7e56 Author: oferkv Date: Fri Apr 18 18:37:41 2014 +0300 Fix issue with invalid animation checking commit a53946ca0ae689e2f542594b7ebef978c2bc9be6 Author: oferkv Date: Fri Apr 18 18:19:21 2014 +0300 Animated GIFs part 2 commit 7a89ab94b6378744e5b5584d02010c51c63a6636 Author: oferkv Date: Thu Apr 17 20:14:18 2014 +0300 Animated GIFs part 1 commit 7190e65e01f647b1d25e0c12d0870b8eb4bce63f Author: oferkv Date: Thu Apr 17 19:22:17 2014 +0300 Move image with keys and invert selection commit 85dcdc29c72e794f4267f68296d33dd1c4386f8f Author: oferkv Date: Thu Apr 17 16:00:38 2014 +0300 Add Hue and Saturation option commit afd766be5f63a4cb722f48321cb5e4bcc843749f Author: oferkv Date: Sun Apr 13 20:46:24 2014 +0300 Channel Mixer test commit e9abad56ad85a6c4d0e99eb9e16d7cf7ea4c8f03 Author: oferkv Date: Sat Apr 12 19:50:11 2014 +0300 Colors dialog part 1 commit be41b0940cc1d63b7198564dae1fc780cf6df9e9 (tag: v0.97) Author: oferkv Date: Thu Apr 10 20:24:12 2014 +0300 Update version, add Qt info commit 03f22f7c9e9e5550c5ad7a6f36483e96ed806ba1 Author: oferkv Date: Thu Apr 10 20:01:10 2014 +0300 Expand / Collapse folders when clicked commit 530721380f246fcde5feda2c88d42455a9877325 Author: oferkv Date: Tue Apr 8 22:00:11 2014 +0300 Move to QT5 and bug fixes commit da57cba5df1724d2bae211cc72fb1047396ef511 Author: oferkv Date: Mon Apr 7 21:25:57 2014 +0300 Fix missing icons when environment is not an Open Desktop DE commit 2dd7454c31e87304bd3aaa3fb342e0025c1a346d Author: oferkv Date: Wed Apr 2 22:39:39 2014 +0300 Fix usability issues add additional info to status and title bars commit 20bf13e037f8cc60bb6be55b1a2f5209f16b8d30 Author: oferkv Date: Sat Mar 29 21:10:23 2014 +0300 Add wrap image list option commit bb3472f0f5bbba207b03c369213e10b04959c7c5 Author: oferkv Date: Sat Mar 29 19:01:42 2014 +0300 Fixes to PKGBUILDs commit d0b984089c8a92798e190216bccdb5ba754d710d (tag: v0.96) Author: oferkv Date: Sat Mar 29 16:22:21 2014 +0300 Fix several browsing related issues commit d242963709cf458621b806cb071b03eb8df4aa94 (tag: v0.95) Author: oferkv Date: Fri Mar 28 13:34:54 2014 +0300 Add open with external application option commit d6cd9ef8a5a91b0d79d5b8b52fb63b5e3189c7c1 (tag: v0.94) Author: oferkv Date: Tue Mar 25 21:21:15 2014 +0200 Fix main window icon commit df680e171ea161e261c454e9a546f7fcfe5a851c Author: oferkv Date: Tue Mar 25 21:12:02 2014 +0200 Use icons from icon theme instead of static icons commit 08d046557a5acf089f0e655f7d4ee1baba0f0a47 Author: oferkv Date: Sun Mar 23 21:11:55 2014 +0200 Add copy image action and clear shortcut option commit 6aadca80371fc2b8faf1a6cb844d3e0f7feed4f2 (tag: v0.93) Author: oferkv Date: Sat Mar 22 12:50:49 2014 +0200 Fix issues with keyboard shortcuts commit 230fec9b006c582a0477b2a9bd3c3f1b56c052c3 Author: oferkv Date: Fri Mar 21 21:52:36 2014 +0200 Add keyboard shortcuts customization commit a1154c9f1ea94a9120b1a854f8c9999a76d987fc Author: oferkv Date: Thu Mar 20 20:44:26 2014 +0200 Fix issues related to image formats commit a57d8c3ed19f4d42f9fa8dc5b0ebf88cda5e53eb (tag: v0.91) Author: oferkv Date: Wed Mar 19 20:00:21 2014 +0200 Fix minor versioning issues commit fd3e9e5a96560e92e48c04d089c0cd8c2597bea8 Author: oferkv Date: Tue Mar 18 22:04:26 2014 +0200 Enhance Crop dialog commit f64838c09b512c8ecccd3f8e43b16a49e63f60c2 Author: oferkv Date: Sat Mar 15 20:37:57 2014 +0200 Random image and slide show options commit c736437f56e451c0ff07c3f4d10e7794374c182e Author: oferkv Date: Sat Mar 15 16:33:40 2014 +0200 Add image info, add no small thumb resize commit 16d1b38cdd5d10f0899b985f0ca91382c611ab97 Author: oferkv Date: Fri Mar 14 20:32:23 2014 +0200 Fix mouse cursor not hiding in full screen commit 26c0988c8537ff481bb60783be352eea2db4b9fb Author: oferkv Date: Fri Mar 14 20:00:22 2014 +0200 Add mirroring layouts commit 354f8f3d4af3614af8963254c90cef81a6b3f9b3 Author: oferkv Date: Fri Mar 14 16:47:20 2014 +0200 Fix wrong mouse cursor override after settings dialog closed commit 3efbc3073caf23c95dc728cda8b6f5b524240c21 Author: oferkv Date: Fri Mar 14 15:27:43 2014 +0200 Add .desktop file for applications menu item commit 7a137b86208736901ad12c7c7881863ba49ec22b Author: oferkv Date: Fri Mar 14 13:38:50 2014 +0200 Crop image option part 2 commit 4924d6c6ff1623a64ae07fdb5e388c95b6a58958 Author: oferkv Date: Sat Mar 8 22:25:47 2014 +0200 Update install directory commit 0f8b3557f95fe7f2deda159d28dd42e2592942bb Author: oferkv Date: Sat Mar 8 20:43:03 2014 +0200 Crop image option part 1 commit 6df138b0ecf335c7d41e6883d553baa980934b8b Author: oferkv Date: Sat Mar 8 16:18:34 2014 +0200 Fix overriding cursor issues when opening dialogs in viewer commit 47c85935bece72c371fdbe81f1e1dc7084a9fbce Author: oferkv Date: Sat Mar 8 13:34:20 2014 +0200 Add save image option commit 35874a5d41af665f6982b7c8ef864ebd847a9850 Author: oferkv Date: Fri Mar 7 18:03:54 2014 +0200 Update info commit 96590c3a692733c1438510e8bcb5e64779ea23a6 (tag: v0.90) Author: oferkv Date: Fri Mar 7 17:39:31 2014 +0200 Add flip option commit 6cf34da392068bcd4918aa12cc71aa25b38ed442 Author: oferkv Date: Fri Mar 7 16:59:17 2014 +0200 Add rotate option commit d8907755183395b806fc269d286ad07149079f22 Author: oferkv Date: Wed Mar 5 21:25:12 2014 +0200 Fix compact mode flickering when loading commit 43dc5d07bb675f6437271c6bed07055a84bba191 Author: oferkv Date: Sun Mar 2 21:44:07 2014 +0200 Fix bugs related to deletion or moving of thumbnails commit 63de7893104ae0d143a8bca2628677e07e6a7f96 Author: oferkv Date: Sun Mar 2 21:17:21 2014 +0200 Fix misc bugs related to thumbs update commit 748ae62c386f87328c7a4c28358b2ccfb2b511e0 Author: oferkv Date: Sat Mar 1 14:57:48 2014 +0200 Add delete image from viewer and misc fixes commit fe461f7554c3f3a74f06b404263530cc3581ffdb Author: oferkv Date: Fri Feb 28 18:54:06 2014 +0200 Add show original size option commit 3a84f39c58ebcf92ed73c48800fe958e3466abb4 Author: oferkv Date: Fri Feb 28 14:56:11 2014 +0200 Fix window sizes and refresh issues commit c8621e160b2223b9a1f27b7cddf23ba2be9ead7d Author: oferkv Date: Sat Feb 22 16:27:11 2014 +0200 Multiple layouts part 2 commit e96eba0409141d1aff0a1154c4b6472c7a54c1e4 Author: oferkv Date: Fri Feb 21 21:37:31 2014 +0200 Multiple layouts part 1 commit 28ea76a6328df83daca5df62928d7ba90eaa7702 Author: oferkv Date: Fri Feb 21 18:08:58 2014 +0200 Hide mouse cursor in full screen part 2 commit 1aef1c76e4f9871b3ef5f04143b9ddc19baec537 Author: oferkv Date: Tue Feb 18 22:09:47 2014 +0200 Hide mouse cursor in full screen part 1 commit bede42bb2f66f112927f298f8ce5bb47e239d809 Author: oferkv Date: Tue Feb 18 21:11:46 2014 +0200 Image movement limitation part 3 commit 7e12525128f7a5787c56030ea1ac4182f278eb55 Author: oferkv Date: Mon Feb 17 23:45:04 2014 +0200 Image movement limitation part 2 commit bf0f03dda360c0e138d6a08af0d3e1c8d140d025 Author: oferkv Date: Sun Feb 16 22:34:17 2014 +0200 Image movement limitation part 1 commit 49a7a81717ed518f0dfac47721ac46cc433fb972 Author: oferkv Date: Sat Feb 15 17:37:59 2014 +0200 Add mouse moves image option commit 89ab3ceca09a7aa64b0ed2beff0ea706f0eeb636 Author: oferkv Date: Sat Feb 15 14:10:01 2014 +0200 Add zoom controls to image viewer commit 789ccab70986b2d2711642f4fc6340c3130af20a Author: oferkv Date: Fri Feb 14 20:19:50 2014 +0200 Add additional navigation controls commit 18cc34dcf7a6d0d499390858f4c00cdc9c7a033b Author: oferkv Date: Fri Feb 14 14:05:16 2014 +0200 Add exit instead of close to thumbnails option commit c4784862714564cd978051bdae422831776d2fae Author: oferkv Date: Fri Feb 14 11:58:48 2014 +0200 Load default settings when no settings found commit 6cdd8e0a3ab587fec0627340a9ff7ba00b602c53 Author: oferkv Date: Thu Feb 13 22:25:20 2014 +0200 Fix misc thumbnail issues commit be429cb319ee6db2742efab86beac58504996098 Author: oferkv Date: Thu Feb 13 21:28:42 2014 +0200 Maintenance commit bba7bd493fa3125ba28224f0d228b130a7e2693b Author: oferkv Date: Wed Feb 12 22:40:21 2014 +0200 Implement next and previous image options commit ef6d12d1d1fdebcf6680fc726a6e28e4a194eb20 Author: oferkv Date: Mon Feb 10 22:58:27 2014 +0200 Bug fixes commit 73a103d90e8e645c46309f793cf45b685884f53c Author: oferkv Date: Sun Feb 9 23:48:54 2014 +0200 Bug fixes commit 3923c1b846fdac75bc1b70daa807720fcaf95c7b Author: oferkv Date: Fri Feb 7 17:44:46 2014 +0200 Add square layout part 2 commit 9096916579130a9b8a10b2d99465fdf6bba73a03 Author: oferkv Date: Tue Feb 4 21:54:44 2014 +0200 Add square layout part 1 commit c44ac0e8c728d5a779cfb23899f8ceb109a548a9 Author: oferkv Date: Mon Feb 3 22:34:44 2014 +0200 Fix thumbnail sizes in non compact mode commit de19342d1e8098c131ff179ddcb6479b24148790 Author: oferkv Date: Sun Feb 2 20:59:53 2014 +0200 Set page scroll and wheel sensitivity commit 89260ff8b07d39fccc2621a76513e9f7239174d1 Author: oferkv Date: Sun Feb 2 17:35:51 2014 +0200 Manage CLI arguments commit 4a9ef2e09952b4e664571d00575e429330f2d30e Author: oferkv Date: Sun Feb 2 13:49:49 2014 +0200 Add compact layout and CLI arguments commit c7b9adcbc26e11360d0ef8ed9df2a09bc3986df5 Author: oferkv Date: Sat Feb 1 18:04:10 2014 +0200 Thumbnail features part 6 commit ca4ac62b966aac3e503fec7287df3cc156c5d3cb Author: oferkv Date: Fri Jan 31 21:24:59 2014 +0200 Thumbnail features part 5 commit be5589689463a1b91d0b62dd0f3434bcf21479b5 Author: oferkv Date: Fri Jan 31 19:24:06 2014 +0200 Thumbnail features part 4 commit 530e525ec897be46389ef768f6e4e24dde2318a8 Author: oferkv Date: Tue Jan 28 23:09:06 2014 +0200 Thumbnail features part 3 commit 723035a0e5e219e7460cb98e84dda7d574ce7879 Author: oferkv Date: Mon Jan 27 22:20:55 2014 +0200 Thumbnail features part 2 commit bed4976563de33358331feb291a1639959de0cbd Author: oferkv Date: Sun Jan 26 23:24:26 2014 +0200 Thumbnail features part 1 commit 2387f91a3c6731113d1a826f3d67c54492c0edae Author: oferkv Date: Sat Jan 25 17:38:09 2014 +0200 Fix misc issues related to thumbnails display commit 9949817909b1dc98307628fa44389f5cb58b4121 Author: oferkv Date: Fri Jan 24 17:22:11 2014 +0200 Fix misc issues commit bf73c1fab1769c4bfc37572050972ecdbf26d1e2 Author: oferkv Date: Fri Jan 24 14:31:18 2014 +0200 Fix misc issues with settings dialog commit c02a8e026a6e287fee58c47360db3a1a679335cc Author: oferkv Date: Wed Jan 22 22:16:20 2014 +0200 Add viewer background color setting commit 1bf426e63db64fc3a8d08d1c7ae7d963ee4b04d2 Author: oferkv Date: Tue Jan 21 23:24:01 2014 +0200 Cleanup commit c97a000324532a0918be7bf617955afba0df251d (tag: v0.74) Author: oferkv Date: Tue Jan 21 21:54:01 2014 +0200 fix fullscreen toggle commit 6cf800f9c59c59238f6d79d5bc12d242b3990785 Author: oferkv Date: Tue Jan 21 21:18:01 2014 +0200 Initial commit phototonic-1.7.20/bookmarks.cpp000066400000000000000000000047101271214516700164730ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "bookmarks.h" BookMarks::BookMarks(QWidget *parent) : QTreeWidget(parent) { setAcceptDrops(true); setDragEnabled(false); setDragDropMode(QAbstractItemView::DropOnly); connect(this, SIGNAL(expanded(const QModelIndex &)), this, SLOT(resizeTreeColumn(const QModelIndex &))); connect(this, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(resizeTreeColumn(const QModelIndex &))); setColumnCount(1); setHeaderHidden(true); reloadBookmarks(); } void BookMarks::reloadBookmarks() { clear(); QSetIterator it(GData::bookmarkPaths); while (it.hasNext()) { QString itemPath = it.next(); QTreeWidgetItem *item = new QTreeWidgetItem(this); item->setText(0, QFileInfo(itemPath).fileName()); item->setIcon(0, QIcon(":/images/bookmarks.png")); item->setToolTip(0, itemPath); insertTopLevelItem(0, item); } } void BookMarks::resizeTreeColumn(const QModelIndex &) { resizeColumnToContents(0); } void BookMarks::removeBookmark() { if (selectedItems().size() == 1) { GData::bookmarkPaths.remove(selectedItems().at(0)->toolTip(0)); reloadBookmarks(); } } void BookMarks::dragEnterEvent(QDragEnterEvent *event) { QModelIndexList selectedDirs = selectionModel()->selectedRows(); if (selectedDirs.size() > 0) { dndOrigSelection = selectedDirs[0]; } event->acceptProposedAction(); } void BookMarks::dragMoveEvent(QDragMoveEvent *event) { setCurrentIndex(indexAt(event->pos())); } void BookMarks::dropEvent(QDropEvent *event) { if (event->source()) { QString fstreeStr("FSTree"); bool dirOp = (event->source()->metaObject()->className() == fstreeStr); emit dropOp(event->keyboardModifiers(), dirOp, event->mimeData()->urls().at(0).toLocalFile()); } } phototonic-1.7.20/bookmarks.h000066400000000000000000000025201271214516700161350ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef BOOKMARKS_H #define BOOKMARKS_H #include #include "global.h" class BookMarks : public QTreeWidget { Q_OBJECT public: BookMarks(QWidget *parent); void reloadBookmarks(); public slots: void removeBookmark(); private: QModelIndex dndOrigSelection; private slots: void resizeTreeColumn(const QModelIndex &); protected: void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); signals: void dropOp(Qt::KeyboardModifiers keyMods, bool dirOp, QString cpMvDirPath); }; #endif // BOOKMARKS_H phototonic-1.7.20/croprubberband.cpp000066400000000000000000000042021271214516700174710ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov - oferkv@live.com * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "croprubberband.h" CropRubberBand::CropRubberBand(QWidget *parent) : QWidget(parent) { setWindowFlags(Qt::SubWindow); QVBoxLayout* mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); QHBoxLayout* topLayout = new QHBoxLayout(); topLayout->setContentsMargins(0, 0, 0, 0); QHBoxLayout* bottomLayout = new QHBoxLayout(); bottomLayout->setContentsMargins(0, 0, 0, 0); QSizeGrip* grip1 = new QSizeGrip(this); QSizeGrip* grip2 = new QSizeGrip(this); QSizeGrip* grip3 = new QSizeGrip(this); QSizeGrip* grip4 = new QSizeGrip(this); grip1->setStyleSheet("background-color: rgba(0, 0, 0, 0%)"); grip2->setStyleSheet("background-color: rgba(0, 0, 0, 0%)"); grip3->setStyleSheet("background-color: rgba(0, 0, 0, 0%)"); grip4->setStyleSheet("background-color: rgba(0, 0, 0, 0%)"); topLayout->addWidget(grip1, 0, Qt::AlignTop | Qt::AlignLeft); topLayout->addWidget(grip2, 1, Qt::AlignTop | Qt::AlignRight); bottomLayout->addWidget(grip3, 0, Qt::AlignBottom | Qt::AlignLeft); bottomLayout->addWidget(grip4, 1, Qt::AlignBottom | Qt::AlignRight); mainLayout->addLayout(topLayout); mainLayout->addLayout(bottomLayout); rubberband = new QRubberBand(QRubberBand::Rectangle, this); rubberband->setStyleSheet("background-color: rgb(255, 255, 255)"); rubberband->show(); } void CropRubberBand::resizeEvent(QResizeEvent *) { rubberband->resize(size()); } phototonic-1.7.20/croprubberband.h000066400000000000000000000020141271214516700171350ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov - oferkv@live.com * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef CROPRUBBERBAND_H #define CROPRUBBERBAND_H #include class CropRubberBand : public QWidget { public: CropRubberBand(QWidget *parent = 0); private: QRubberBand *rubberband; void resizeEvent(QResizeEvent *); }; #endif // CROPRUBBERBAND_H phototonic-1.7.20/debian/000077500000000000000000000000001271214516700152175ustar00rootroot00000000000000phototonic-1.7.20/debian/changelog000066400000000000000000000002251271214516700170700ustar00rootroot00000000000000phototonic (1.03-1nano) unstable; urgency=low * Initial release -- Christopher Roy Bratusek Fri, 08 Aug 2014 18:51:59 +0200 phototonic-1.7.20/debian/compat000066400000000000000000000000021271214516700164150ustar00rootroot000000000000009 phototonic-1.7.20/debian/control000066400000000000000000000016061271214516700166250ustar00rootroot00000000000000Source: phototonic Section: graphics Priority: optional Maintainer: Christopher Roy Bratusek Build-Depends: debhelper (>= 9), g++ (>= 4.5), qt5-qmake, qtbase5-dev, qtquick1-5-dev, qtdeclarative5-dev, qtscript5-dev, libqt5opengl5-dev, libexiv2-dev Standards-Version: 3.9.5 Homepage: https://oferkv.github.io/phototonic/ Package: phototonic Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Qt5 image viewer and organizer Photonic features various functionality for viewing and organizing your images, like: - Slideshow - image transformation (resize, recolor, rotation) - copying, renaming, (re)moving single or multiple images - creating new images - view basic image information - single- and subfolder-view mode - opening files with user-set external applications - full-fledged keybindings support - quite configurable phototonic-1.7.20/debian/copyright000066400000000000000000000021171271214516700171530ustar00rootroot00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Phototonic Source: https://oferkv.github.io/phototonic/ Files: * Copyright: 2013-2014 Ofer Kashayov License: GPL-3.0+ Files: debian/* Copyright: 2014 Christopher Roy Bratusek License: GPL-3.0+ License: GPL-3.0+ 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 package 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 . . On Debian systems, the complete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". phototonic-1.7.20/debian/phototonic.lintian-overrides000066400000000000000000000000271271214516700227640ustar00rootroot00000000000000binary-without-manpage phototonic-1.7.20/debian/rules000077500000000000000000000005551271214516700163040ustar00rootroot00000000000000#!/usr/bin/make -f DH_VERBOSE = 1 DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/default.mk export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed DEB_PREF = $(shell gcc -print-multiarch) %: dh $@ override_dh_auto_configure: /usr/lib/$(DEB_PREF)/qt5/bin/qmake . phototonic-1.7.20/debian/source/000077500000000000000000000000001271214516700165175ustar00rootroot00000000000000phototonic-1.7.20/debian/source/format000066400000000000000000000000141271214516700177250ustar00rootroot000000000000003.0 (quilt) phototonic-1.7.20/dialogs.cpp000066400000000000000000001470101271214516700161260ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "dialogs.h" #include "global.h" CpMvDialog::CpMvDialog(QWidget *parent) : QDialog(parent) { abortOp = false; opLabel = new QLabel(""); cancelButton = new QPushButton(tr("Cancel")); cancelButton->setIcon(QIcon::fromTheme("dialog-cancel")); cancelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(cancelButton, SIGNAL(clicked()), this, SLOT(abort())); QHBoxLayout *topLayout = new QHBoxLayout; topLayout->addWidget(opLabel); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topLayout); mainLayout->addLayout(buttonsLayout, Qt::AlignRight); setLayout(mainLayout); } void CpMvDialog::abort() { abortOp = true; } static QString autoRename(QString &destDir, QString &currFile) { int extSep = currFile.lastIndexOf("."); QString nameOnly = currFile.left(extSep); QString extOnly = currFile.right(currFile.size() - extSep - 1); QString newFile; int idx = 1; do { newFile = QString(nameOnly + "_copy_%1." + extOnly).arg(idx); ++idx; } while (idx && (QFile::exists(destDir + QDir::separator() + newFile))); return newFile; } int cpMvFile(bool isCopy, QString &srcFile, QString &srcPath, QString &dstPath, QString &dstDir) { int res; if (isCopy) res = QFile::copy(srcPath, dstPath); else res = QFile::rename(srcPath, dstPath); if (!res && QFile::exists(dstPath)) { QString newName = autoRename(dstDir, srcFile); QString newDestPath = dstDir + QDir::separator() + newName; if (isCopy) res = QFile::copy(srcPath, newDestPath); else res = QFile::rename(srcPath, newDestPath); dstPath = newDestPath; } return res; } void CpMvDialog::exec(ThumbView *thumbView, QString &destDir, bool pasteInCurrDir) { int res = 0; QString sourceFile; QFileInfo fileInfo; QString currFile; QString destFile; int tn; show(); if (pasteInCurrDir) { for (tn = 0; tn < GData::copyCutFileList.size(); ++tn) { sourceFile = GData::copyCutFileList[tn]; fileInfo = QFileInfo(sourceFile); currFile = fileInfo.fileName(); destFile = destDir + QDir::separator() + currFile; opLabel->setText((GData::copyOp? tr("Copying \"%1\" to \"%2\".") : tr("Moving \"%1\" to \"%2\".")) .arg(sourceFile).arg(destFile)); QApplication::processEvents(); res = cpMvFile(GData::copyOp, currFile, sourceFile, destFile, destDir); if (!res || abortOp) { break; } else { GData::copyCutFileList[tn] = destFile; } } } else { QList rowList; for (tn = GData::copyCutIdxList.size() - 1; tn >= 0 ; --tn) { sourceFile = thumbView->thumbViewModel->item(GData::copyCutIdxList[tn].row())-> data(thumbView->FileNameRole).toString(); fileInfo = QFileInfo(sourceFile); currFile = fileInfo.fileName(); destFile = destDir + QDir::separator() + currFile; opLabel->setText((GData::copyOp? tr("Copying \"%1\" to \"%2\".") : tr("Moving \"%1\" to \"%2\".")).arg(sourceFile).arg(destFile)); QApplication::processEvents(); res = cpMvFile(GData::copyOp, currFile, sourceFile, destFile, destDir); if (!res || abortOp) { break; } rowList.append(GData::copyCutIdxList[tn].row()); } if (!GData::copyOp) { qSort(rowList); for (int t = rowList.size() - 1; t >= 0; --t) thumbView->thumbViewModel->removeRow(rowList.at(t)); } latestRow = rowList.at(0); } nfiles = GData::copyCutIdxList.size(); close(); } ShortcutsTableView::ShortcutsTableView() { keysModel = new QStandardItemModel(); keysModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Action"))); keysModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Shortcut"))); keysModel->setHorizontalHeaderItem(2, new QStandardItem("")); setModel(keysModel); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::SingleSelection); setEditTriggers(QAbstractItemView::NoEditTriggers); verticalHeader()->hide(); verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); horizontalHeader()->setHighlightSections(false); horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); setColumnHidden(2, true); shortcutsMenu = new QMenu(""); clearAction = new QAction(tr("Delete shortcut"), this); connect(clearAction, SIGNAL(triggered()), this, SLOT(clearShortcut())); shortcutsMenu->addAction(clearAction); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showShortcutsTableMenu(QPoint))); } void ShortcutsTableView::addRow(QString action, QString description, QString shortcut) { keysModel->appendRow(QList() << new QStandardItem(description) << new QStandardItem(shortcut) << new QStandardItem(action)); } void ShortcutsTableView::keyPressEvent(QKeyEvent *e) { if (!this->selectedIndexes().count()) { return; } QString keySeqText; QString keyText(""); QString modifierText(""); if (e->modifiers() & Qt::ShiftModifier) modifierText += "Shift+"; if (e->modifiers() & Qt::ControlModifier) modifierText += "Ctrl+"; if (e->modifiers() & Qt::AltModifier) modifierText += "Alt+"; if ( (e->key() >= Qt::Key_Shift && e->key() <= Qt::Key_ScrollLock) || (e->key() >= Qt::Key_Super_L && e->key() <= Qt::Key_Direction_R) || e->key() == Qt::Key_AltGr || e->key() < 0) { return; } keyText = QKeySequence(e->key()).toString(); keySeqText = modifierText + keyText; if (e->modifiers() & Qt::AltModifier && (e->key() > Qt::Key_0 && e->key() <= Qt::Key_Colon)) { QMessageBox msgBox; msgBox.warning(this, tr("Set shortcut"), tr("\"%1\" is reserved for shortcuts to external applications.").arg(keySeqText)); return; } QMapIterator it(GData::actionKeys); while (it.hasNext()) { it.next(); if (it.value()->shortcut().toString() == keySeqText) { QMessageBox msgBox; msgBox.warning(this, tr("Set shortcut"), tr("\"%1\" is already assigned to \"%2\" action.").arg(keySeqText).arg(it.key())); return; } } QStandardItemModel *mod = (QStandardItemModel*)model(); int row = selectedIndexes().first().row(); mod->item(row, 1)->setText(keySeqText); GData::actionKeys.value(mod->item(row, 2)->text())->setShortcut(QKeySequence(keySeqText)); } void ShortcutsTableView::clearShortcut() { if (selectedEntry.isValid()) { QStandardItemModel *mod = (QStandardItemModel*)model(); mod->item(selectedEntry.row(), 1)->setText(""); GData::actionKeys.value(mod->item(selectedEntry.row(), 2)->text())->setShortcut(QKeySequence("")); } } void ShortcutsTableView::showShortcutsTableMenu(QPoint pt) { selectedEntry = indexAt(pt); if (selectedEntry.isValid()) shortcutsMenu->popup(viewport()->mapToGlobal(pt)); } SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Preferences")); setWindowIcon(QIcon::fromTheme("preferences-other", QIcon(":/images/phototonic.png"))); // Image Viewer Options // Zoom large images QGroupBox *fitLargeGroupBox = new QGroupBox(tr("Fit Large Images")); fitLargeRadios[0] = new QRadioButton(tr("Disable")); fitLargeRadios[1] = new QRadioButton(tr("By width or height")); fitLargeRadios[2] = new QRadioButton(tr("By width")); fitLargeRadios[3] = new QRadioButton(tr("By height")); fitLargeRadios[4] = new QRadioButton(tr("Stretch disproportionately")); QVBoxLayout *fitLargeVbox = new QVBoxLayout; for (int i = 0; i < nZoomRadios; ++i) { fitLargeVbox->addWidget(fitLargeRadios[i]); fitLargeRadios[i]->setChecked(false); } fitLargeVbox->addStretch(1); fitLargeGroupBox->setLayout(fitLargeVbox); fitLargeRadios[GData::zoomOutFlags]->setChecked(true); // Zoom small images QGroupBox *fitSmallGroupBox = new QGroupBox(tr("Fit Small Images")); fitSmallRadios[0] = new QRadioButton(tr("Disable")); fitSmallRadios[1] = new QRadioButton(tr("By width or height")); fitSmallRadios[2] = new QRadioButton(tr("By width")); fitSmallRadios[3] = new QRadioButton(tr("By height")); fitSmallRadios[4] = new QRadioButton(tr("Stretch disproportionately")); QVBoxLayout *fitSmallVbox = new QVBoxLayout; for (int i = 0; i < nZoomRadios; ++i) { fitSmallVbox->addWidget(fitSmallRadios[i]); fitSmallRadios[i]->setChecked(false); } fitSmallVbox->addStretch(1); fitSmallGroupBox->setLayout(fitSmallVbox); fitSmallRadios[GData::zoomInFlags]->setChecked(true); // imageView background color QLabel *backgroundColorLab = new QLabel(tr("Background color:")); backgroundColorButton = new QToolButton(); backgroundColorButton->setFixedSize(48, 24); QHBoxLayout *bgColBox = new QHBoxLayout; bgColBox->addWidget(backgroundColorLab); bgColBox->addWidget(backgroundColorButton); bgColBox->addStretch(1); connect(backgroundColorButton, SIGNAL(clicked()), this, SLOT(pickColor())); setButtonBgColor(GData::backgroundColor, backgroundColorButton); backgroundColorButton->setAutoFillBackground(true); bgColor = GData::backgroundColor; // Exit when opening image exitCliCb = new QCheckBox(tr("Exit instead of closing, when image is loaded from command line"), this); exitCliCb->setChecked(GData::exitInsteadOfClose); // Wrap image list wrapListCb = new QCheckBox(tr("Wrap image list when reaching last or first image"), this); wrapListCb->setChecked(GData::wrapImageList); // Save quality QLabel *saveQualityLab = new QLabel(tr("Default quality when saving images:")); saveQualitySpin = new QSpinBox; saveQualitySpin->setRange(0, 100); saveQualitySpin->setValue(GData::defaultSaveQuality); QHBoxLayout *saveQualityHbox = new QHBoxLayout; saveQualityHbox->addWidget(saveQualityLab); saveQualityHbox->addWidget(saveQualitySpin); saveQualityHbox->addStretch(1); // Enable animations enableAnimCb = new QCheckBox(tr("Enable GIF animation"), this); enableAnimCb->setChecked(GData::enableAnimations); // Enable image Exif rotation enableExifCb = new QCheckBox(tr("Rotate image according to Exif orientation"), this); enableExifCb->setChecked(GData::exifRotationEnabled); // Image Info imageInfoCb = new QCheckBox(tr("Show image file name in viewer"), this); imageInfoCb->setChecked(GData::enableImageInfoFS); // Viewer options QVBoxLayout *viewerOptsBox = new QVBoxLayout; QHBoxLayout *zoomOptsBox = new QHBoxLayout; zoomOptsBox->setAlignment(Qt::AlignTop); zoomOptsBox->addWidget(fitLargeGroupBox); zoomOptsBox->addWidget(fitSmallGroupBox); zoomOptsBox->addStretch(1); viewerOptsBox->addLayout(zoomOptsBox); viewerOptsBox->addLayout(bgColBox); viewerOptsBox->addWidget(enableExifCb); viewerOptsBox->addWidget(imageInfoCb); viewerOptsBox->addWidget(wrapListCb); viewerOptsBox->addWidget(enableAnimCb); viewerOptsBox->addLayout(saveQualityHbox); viewerOptsBox->addWidget(exitCliCb); viewerOptsBox->addStretch(1); // thumbView background color QLabel *bgThumbTxtLab = new QLabel(tr("Background color:")); colThumbButton = new QToolButton(); colThumbButton->setFixedSize(48, 24); QHBoxLayout *bgThumbColBox = new QHBoxLayout; bgThumbColBox->addWidget(bgThumbTxtLab); bgThumbColBox->addWidget(colThumbButton); connect(colThumbButton, SIGNAL(clicked()), this, SLOT(pickThumbsColor())); setButtonBgColor(GData::thumbsBackgroundColor, colThumbButton); colThumbButton->setAutoFillBackground(true); thumbBgColor = GData::thumbsBackgroundColor; // thumbView text color QLabel *txtThumbTxtLab = new QLabel("\t" + tr("Label color:")); colThumbTextButton = new QToolButton(); colThumbTextButton->setFixedSize(48, 24); bgThumbColBox->addWidget(txtThumbTxtLab); bgThumbColBox->addWidget(colThumbTextButton); bgThumbColBox->addStretch(1); connect(colThumbTextButton, SIGNAL(clicked()), this, SLOT(pickThumbsTextColor())); setButtonBgColor(GData::thumbsTextColor, colThumbTextButton); colThumbTextButton->setAutoFillBackground(true); thumbTextColor = GData::thumbsTextColor; // thumbview background image QLabel *thumbsBackImageLab = new QLabel(tr("Background image:")); thumbsBackImageEdit = new QLineEdit; thumbsBackImageEdit->setClearButtonEnabled(true); thumbsBackImageEdit->setMinimumWidth(200); QToolButton *chooseThumbsBackImageButton = new QToolButton(); chooseThumbsBackImageButton->setIcon(QIcon::fromTheme("document-open", QIcon(":/images/open.png"))); chooseThumbsBackImageButton->setFixedSize(26, 26); chooseThumbsBackImageButton->setIconSize(QSize(16, 16)); connect(chooseThumbsBackImageButton, SIGNAL(clicked()), this, SLOT(pickBgImage())); QHBoxLayout *thumbsBackImageEditBox = new QHBoxLayout; thumbsBackImageEditBox->addWidget(thumbsBackImageLab); thumbsBackImageEditBox->addWidget(thumbsBackImageEdit); thumbsBackImageEditBox->addWidget(chooseThumbsBackImageButton); thumbsBackImageEditBox->addStretch(1); thumbsBackImageEdit->setText(GData::thumbsBackImage); // Thumbnail spacing QLabel *thumbSpacingLab = new QLabel(tr("Add space between thumbnails:")); thumbSpacingSpin = new QSpinBox; thumbSpacingSpin->setRange(0, 15); thumbSpacingSpin->setValue(GData::thumbSpacing); QHBoxLayout *thumbSpacingHbox = new QHBoxLayout; thumbSpacingHbox->addWidget(thumbSpacingLab); thumbSpacingHbox->addWidget(thumbSpacingSpin); thumbSpacingHbox->addStretch(1); // Do not enlarge small thumbs noSmallThumbCb = new QCheckBox(tr("Show original size of images smaller than the thumbnail size"), this); noSmallThumbCb->setChecked(GData::noEnlargeSmallThumb); // Thumbnail pages to read ahead QLabel *thumbPagesLab = new QLabel(tr("Number of thumbnail pages to read ahead:")); thumbPagesSpin = new QSpinBox; thumbPagesSpin->setRange(1, 10); thumbPagesSpin->setValue(GData::thumbPagesReadahead); QHBoxLayout *thumbPagesHbox = new QHBoxLayout; thumbPagesHbox->addWidget(thumbPagesLab); thumbPagesHbox->addWidget(thumbPagesSpin); thumbPagesHbox->addStretch(1); enableThumbExifCb = new QCheckBox(tr("Rotate thumbnails according to Exif orientation"), this); enableThumbExifCb->setChecked(GData::exifThumbRotationEnabled); // Thumbnail options QVBoxLayout *thumbsOptsBox = new QVBoxLayout; thumbsOptsBox->addLayout(bgThumbColBox); thumbsOptsBox->addLayout(thumbsBackImageEditBox); thumbsOptsBox->addLayout(thumbSpacingHbox); thumbsOptsBox->addWidget(enableThumbExifCb); thumbsOptsBox->addLayout(thumbPagesHbox); thumbsOptsBox->addWidget(noSmallThumbCb); thumbsOptsBox->addStretch(1); // Slide show delay QLabel *slideDelayLab = new QLabel(tr("Delay between slides in seconds:")); slideDelaySpin = new QSpinBox; slideDelaySpin->setRange(1, 3600); slideDelaySpin->setValue(GData::slideShowDelay); QHBoxLayout *slideDelayHbox = new QHBoxLayout; slideDelayHbox->addWidget(slideDelayLab); slideDelayHbox->addWidget(slideDelaySpin); slideDelayHbox->addStretch(1); // Slide show random slideRandomCb = new QCheckBox(tr("Show random images"), this); slideRandomCb->setChecked(GData::slideShowRandom); // Slide show options QVBoxLayout *slideShowVbox = new QVBoxLayout; slideShowVbox->addLayout(slideDelayHbox); slideShowVbox->addWidget(slideRandomCb); slideShowVbox->addStretch(1); // Startup directory QGroupBox *startupDirGroupBox = new QGroupBox(tr("Startup folder")); startupDirRadios[GData::defaultDir] = new QRadioButton(tr("Default, or specified by command line argument")); startupDirRadios[GData::rememberLastDir] = new QRadioButton(tr("Remember last")); startupDirRadios[GData::specifiedDir] = new QRadioButton(tr("Specify:")); startupDirEdit = new QLineEdit; startupDirEdit->setClearButtonEnabled(true); startupDirEdit->setMinimumWidth(300); startupDirEdit->setMaximumWidth(400); QToolButton *chooseStartupDirButton = new QToolButton(); chooseStartupDirButton->setIcon(QIcon::fromTheme("document-open", QIcon(":/images/open.png"))); chooseStartupDirButton->setFixedSize(26, 26); chooseStartupDirButton->setIconSize(QSize(16, 16)); connect(chooseStartupDirButton, SIGNAL(clicked()), this, SLOT(pickStartupDir())); QHBoxLayout *startupDirEditBox = new QHBoxLayout; startupDirEditBox->addWidget(startupDirRadios[2]); startupDirEditBox->addWidget(startupDirEdit); startupDirEditBox->addWidget(chooseStartupDirButton); startupDirEditBox->addStretch(1); QVBoxLayout *startupDirVbox = new QVBoxLayout; for (int i = 0; i < 2; ++i) { startupDirVbox->addWidget(startupDirRadios[i]); startupDirRadios[i]->setChecked(false); } startupDirVbox->addLayout(startupDirEditBox); startupDirVbox->addStretch(1); startupDirGroupBox->setLayout(startupDirVbox); if (GData::startupDir == GData::specifiedDir) startupDirRadios[GData::specifiedDir]->setChecked(true); else if (GData::startupDir == GData::rememberLastDir) startupDirRadios[GData::rememberLastDir]->setChecked(true); else startupDirRadios[GData::defaultDir]->setChecked(true); startupDirEdit->setText(GData::specifiedStartDir); // Keyboard shortcuts widgets ShortcutsTableView *keysTable = new ShortcutsTableView(); QMapIterator it(GData::actionKeys); while (it.hasNext()) { it.next(); keysTable->addRow(it.key(), GData::actionKeys.value(it.key())->text(), GData::actionKeys.value(it.key())->shortcut().toString()); } // Mouse settings reverseMouseCb = new QCheckBox(tr("Swap mouse left-click and middle-click actions"), this); reverseMouseCb->setChecked(GData::reverseMouseBehavior); // Delete confirmation setting deleteConfirmCb = new QCheckBox(tr("Delete confirmation"), this); deleteConfirmCb->setChecked(GData::deleteConfirm); // Keyboard and mouse QGroupBox *keyboardGrp = new QGroupBox(tr("Keyboard Shortcuts")); QVBoxLayout *keyboardVbox = new QVBoxLayout; keyboardVbox->addWidget(keysTable); keyboardGrp->setLayout(keyboardVbox); QVBoxLayout *generalVbox = new QVBoxLayout; generalVbox->addWidget(keyboardGrp); generalVbox->addWidget(reverseMouseCb); generalVbox->addWidget(deleteConfirmCb); generalVbox->addWidget(startupDirGroupBox); generalVbox->addStretch(1); /* Confirmation buttons */ QHBoxLayout *buttonsHbox = new QHBoxLayout; QPushButton *okButton = new QPushButton(tr("OK")); okButton->setIcon(QIcon::fromTheme("dialog-ok")); okButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(okButton, SIGNAL(clicked()), this, SLOT(saveSettings())); okButton->setDefault(true); QPushButton *closeButton = new QPushButton(tr("Cancel")); closeButton->setIcon(QIcon::fromTheme("dialog-cancel")); closeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(closeButton, SIGNAL(clicked()), this, SLOT(abort())); buttonsHbox->addWidget(closeButton, 1, Qt::AlignRight); buttonsHbox->addWidget(okButton, 0, Qt::AlignRight); /* Tabs */ QTabWidget *tabs = new QTabWidget; QWidget *viewerSettings = new QWidget; viewerSettings->setLayout(viewerOptsBox); tabs->addTab(viewerSettings, tr("Viewer")); QWidget *thumbSettings = new QWidget; thumbSettings->setLayout(thumbsOptsBox); tabs->addTab(thumbSettings, tr("Thumbnails")); QWidget *slideSettings = new QWidget; slideSettings->setLayout(slideShowVbox); tabs->addTab(slideSettings, tr("Slide Show")); QWidget *generalSettings = new QWidget; generalSettings->setLayout(generalVbox); tabs->addTab(generalSettings, tr("General")); QVBoxLayout *mainVbox = new QVBoxLayout; mainVbox->addWidget(tabs); mainVbox->addLayout(buttonsHbox); setLayout(mainVbox); } void SettingsDialog::saveSettings() { int i; for (i = 0; i < nZoomRadios; ++i) { if (fitLargeRadios[i]->isChecked()) { GData::zoomOutFlags = i; GData::appSettings->setValue("zoomOutFlags", (int)GData::zoomOutFlags); break; } } for (i = 0; i < nZoomRadios; ++i) { if (fitSmallRadios[i]->isChecked()) { GData::zoomInFlags = i; GData::appSettings->setValue("zoomInFlags", (int)GData::zoomInFlags); break; } } GData::backgroundColor = bgColor; GData::thumbsBackgroundColor = thumbBgColor; GData::thumbsTextColor = thumbTextColor; GData::thumbsBackImage = thumbsBackImageEdit->text(); GData::thumbSpacing = thumbSpacingSpin->value(); GData::thumbPagesReadahead = thumbPagesSpin->value(); GData::exitInsteadOfClose = exitCliCb->isChecked(); GData::wrapImageList = wrapListCb->isChecked(); GData::defaultSaveQuality = saveQualitySpin->value(); GData::noEnlargeSmallThumb = noSmallThumbCb->isChecked(); GData::slideShowDelay = slideDelaySpin->value(); GData::slideShowRandom = slideRandomCb->isChecked(); GData::enableAnimations = enableAnimCb->isChecked(); GData::exifRotationEnabled = enableExifCb->isChecked(); GData::exifThumbRotationEnabled = enableThumbExifCb->isChecked(); GData::enableImageInfoFS = imageInfoCb->isChecked(); GData::reverseMouseBehavior = reverseMouseCb->isChecked(); GData::deleteConfirm = deleteConfirmCb->isChecked(); if (startupDirRadios[0]->isChecked()) GData::startupDir = GData::defaultDir; else if (startupDirRadios[1]->isChecked()) GData::startupDir = GData::rememberLastDir; else { GData::startupDir = GData::specifiedDir; GData::specifiedStartDir = startupDirEdit->text(); } accept(); } void SettingsDialog::abort() { reject(); } void SettingsDialog::pickColor() { QColor userColor = QColorDialog::getColor(GData::backgroundColor, this); if (userColor.isValid()) { setButtonBgColor(userColor, backgroundColorButton); bgColor = userColor; } } void SettingsDialog::setButtonBgColor(QColor &color, QToolButton *button) { QString style = "background: rgb(%1, %2, %3);"; style = style.arg(color.red()).arg(color.green()).arg(color.blue()); button->setStyleSheet(style); } void SettingsDialog::pickThumbsColor() { QColor userColor = QColorDialog::getColor(GData::thumbsBackgroundColor, this); if (userColor.isValid()) { setButtonBgColor(userColor, colThumbButton); thumbBgColor = userColor; } } void SettingsDialog::pickThumbsTextColor() { QColor userColor = QColorDialog::getColor(GData::thumbsTextColor, this); if (userColor.isValid()) { setButtonBgColor(userColor, colThumbTextButton); thumbTextColor = userColor; } } void SettingsDialog::pickStartupDir() { QString dirName = QFileDialog::getExistingDirectory(this, tr("Choose Startup Folder"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); startupDirEdit->setText(dirName); } void SettingsDialog::pickBgImage() { QString dirName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("Images") + " (*.jpg *.jpeg *.jpe *.png *.bmp *.tiff *.tif *.ppm *.xbm *.xpm)"); thumbsBackImageEdit->setText(dirName); } CropDialog::CropDialog(QWidget *parent, ImageView *imageView_) : QDialog(parent) { setWindowTitle(tr("Cropping")); setWindowIcon(QIcon(":/images/crop.png")); resize(350, 100); if (GData::dialogLastX) move(GData::dialogLastX, GData::dialogLastY); imageView = imageView_; QHBoxLayout *buttonsHbox = new QHBoxLayout; QPushButton *resetButton = new QPushButton(tr("Reset")); resetButton->setIcon(QIcon::fromTheme("document-revert")); connect(resetButton, SIGNAL(clicked()), this, SLOT(reset())); QPushButton *okButton = new QPushButton(tr("OK")); okButton->setIcon(QIcon::fromTheme("dialog-ok")); connect(okButton, SIGNAL(clicked()), this, SLOT(ok())); okButton->setDefault(true); buttonsHbox->addWidget(resetButton, 0, Qt::AlignLeft); buttonsHbox->addWidget(okButton, 0, Qt::AlignRight); QSlider *topSlide = new QSlider(Qt::Horizontal); topSlide->setTickPosition(QSlider::TicksAbove); topSlide->setTickInterval(10); topSlide->setTracking(false); QSlider *bottomSlide = new QSlider(Qt::Horizontal); bottomSlide->setTickPosition(QSlider::TicksAbove); bottomSlide->setTickInterval(10); bottomSlide->setTracking(false); QSlider *leftSlide = new QSlider(Qt::Horizontal); leftSlide->setTickPosition(QSlider::TicksAbove); leftSlide->setTickInterval(10); leftSlide->setTracking(false); QSlider *rightSlide = new QSlider(Qt::Horizontal); rightSlide->setTickPosition(QSlider::TicksAbove); rightSlide->setTickInterval(10); rightSlide->setTracking(false); topSpin = new QSpinBox; topSpin->setPrefix("% "); bottomSpin = new QSpinBox; bottomSpin->setPrefix("% "); leftSpin = new QSpinBox; leftSpin->setPrefix("% "); rightSpin = new QSpinBox; rightSpin->setPrefix("% "); QLabel *leftLab = new QLabel(tr("Left")); QLabel *rightLab = new QLabel(tr("Right")); QLabel *topLab = new QLabel(tr("Top")); QLabel *bottomLab = new QLabel(tr("Bottom")); QGridLayout *mainGbox = new QGridLayout; mainGbox->addWidget(leftLab, 0, 0, 1, 1); mainGbox->addWidget(leftSlide, 0, 1, 1, 1); mainGbox->addWidget(leftSpin, 0, 2, 1, 1); mainGbox->addWidget(rightLab, 1, 0, 1, 1); mainGbox->addWidget(rightSlide, 1, 1, 1, 1); mainGbox->addWidget(rightSpin, 1, 2, 1, 1); mainGbox->addWidget(topLab, 2, 0, 1, 1); mainGbox->addWidget(topSlide, 2, 1, 1, 1); mainGbox->addWidget(topSpin, 2, 2, 1, 1); mainGbox->addWidget(bottomLab, 3, 0, 1, 1); mainGbox->addWidget(bottomSlide, 3, 1, 1, 1); mainGbox->addWidget(bottomSpin, 3, 2, 1, 1); QVBoxLayout *mainVbox = new QVBoxLayout; mainVbox->addLayout(mainGbox); mainVbox->addLayout(buttonsHbox); setLayout(mainVbox); topSpin->setRange(0, 100); bottomSpin->setRange(0, 100); leftSpin->setRange(0, 100); rightSpin->setRange(0, 100); topSlide->setRange(0, 100); bottomSlide->setRange(0, 100); leftSlide->setRange(0, 100); rightSlide->setRange(0, 100); connect(topSlide, SIGNAL(valueChanged(int)), topSpin, SLOT(setValue(int))); connect(bottomSlide, SIGNAL(valueChanged(int)), bottomSpin, SLOT(setValue(int))); connect(leftSlide, SIGNAL(valueChanged(int)), leftSpin, SLOT(setValue(int))); connect(rightSlide, SIGNAL(valueChanged(int)), rightSpin, SLOT(setValue(int))); connect(topSpin, SIGNAL(valueChanged(int)), topSlide, SLOT(setValue(int))); connect(bottomSpin, SIGNAL(valueChanged(int)), bottomSlide, SLOT(setValue(int))); connect(leftSpin, SIGNAL(valueChanged(int)), leftSlide, SLOT(setValue(int))); connect(rightSpin, SIGNAL(valueChanged(int)), rightSlide, SLOT(setValue(int))); connect(topSpin, SIGNAL(valueChanged(int)), this, SLOT(applyCrop(int))); connect(bottomSpin, SIGNAL(valueChanged(int)), this, SLOT(applyCrop(int))); connect(leftSpin, SIGNAL(valueChanged(int)), this, SLOT(applyCrop(int))); connect(rightSpin, SIGNAL(valueChanged(int)), this, SLOT(applyCrop(int))); } void CropDialog::applyCrop(int) { GData::cropLeftPercent = leftSpin->value(); GData::cropTopPercent = topSpin->value(); GData::cropWidthPercent = rightSpin->value(); GData::cropHeightPercent = bottomSpin->value(); imageView->refresh(); } void CropDialog::ok() { GData::dialogLastX = pos().x(); GData::dialogLastY = pos().y(); accept(); } void CropDialog::reset() { leftSpin->setValue(0); rightSpin->setValue(0); topSpin->setValue(0); bottomSpin->setValue(0); } ResizeDialog::ResizeDialog(QWidget *parent, ImageView *imageView_) : QDialog(parent) { setWindowTitle(tr("Scale Image")); setWindowIcon(QIcon::fromTheme("transform-scale", QIcon(":/images/phototonic.png"))); newWidth = newHeight = 0; if (GData::dialogLastX) move(GData::dialogLastX, GData::dialogLastY); imageView = imageView_; width = lastWidth = imageView->getImageWidthPreCropped(); height = lastHeight = imageView->getImageHeightPreCropped(); QHBoxLayout *buttonsHbox = new QHBoxLayout; QPushButton *okButton = new QPushButton(tr("Scale")); okButton->setIcon(QIcon::fromTheme("dialog-ok")); connect(okButton, SIGNAL(clicked()), this, SLOT(ok())); okButton->setDefault(true); QPushButton *cancelButton = new QPushButton(tr("Cancel")); cancelButton->setIcon(QIcon::fromTheme("dialog-cancel")); connect(cancelButton, SIGNAL(clicked()), this, SLOT(abort())); buttonsHbox->addWidget(cancelButton, 1, Qt::AlignRight); buttonsHbox->addWidget(okButton, 0, Qt::AlignRight); widthSpin = new QSpinBox; widthSpin->setRange(0, width * 10); widthSpin->setValue(width); connect(widthSpin, SIGNAL(valueChanged(int)), this, SLOT(adjustSizes())); heightSpin = new QSpinBox; heightSpin->setRange(0, height * 10); heightSpin->setValue(height); connect(heightSpin, SIGNAL(valueChanged(int)), this, SLOT(adjustSizes())); QGridLayout *mainGbox = new QGridLayout; QLabel *origSizeLab = new QLabel(tr("Original size:")); QString imageSizeStr = QString::number(width) + " x " + QString::number(height); QLabel *origSizePixelsLab = new QLabel(imageSizeStr); QLabel *widthLab = new QLabel(tr("Width:")); QLabel *heightLab = new QLabel(tr("Height:")); QLabel *unitsLab = new QLabel(tr("Units:")); QLabel *newSizeLab = new QLabel(tr("New size:")); newSizePixelsLab = new QLabel(imageSizeStr); pixelsRadio = new QRadioButton(tr("Pixels")); connect(pixelsRadio, SIGNAL(clicked()), this, SLOT(setUnits())); percentRadio = new QRadioButton(tr("Percent")); connect(percentRadio, SIGNAL(clicked()), this, SLOT(setUnits())); pixelsRadio->setChecked(true); pixelUnits = true; QCheckBox *lockAspectCb = new QCheckBox(tr("Lock aspect ratio"), this); lockAspectCb->setChecked(true); connect(lockAspectCb, SIGNAL(clicked()), this, SLOT(setAspectLock())); aspectLocked = true; QHBoxLayout *radiosHbox = new QHBoxLayout; radiosHbox->addStretch(1); radiosHbox->addWidget(pixelsRadio); radiosHbox->addWidget(percentRadio); mainGbox->addWidget(origSizeLab, 2, 2, 1, 1); mainGbox->addWidget(origSizePixelsLab, 2, 4, 1, 1); mainGbox->addWidget(widthLab, 6, 2, 1, 1); mainGbox->addWidget(heightLab, 7, 2, 1, 1); mainGbox->addWidget(unitsLab, 3, 2, 1, 1); mainGbox->addWidget(widthSpin, 6, 4, 1, 2); mainGbox->addWidget(heightSpin, 7, 4, 1, 2); mainGbox->addLayout(radiosHbox, 3, 4, 1, 3); mainGbox->addWidget(lockAspectCb, 5, 2, 1, 3); mainGbox->addWidget(newSizeLab, 8, 2, 1, 1); mainGbox->addWidget(newSizePixelsLab, 8, 4, 1, 1); mainGbox->setRowStretch(9, 1); mainGbox->setColumnStretch(3, 1); QVBoxLayout *mainVbox = new QVBoxLayout; mainVbox->addLayout(mainGbox); mainVbox->addLayout(buttonsHbox); setLayout(mainVbox); widthSpin->setFocus(Qt::OtherFocusReason); } void ResizeDialog::setAspectLock() { aspectLocked = ((QCheckBox*)QObject::sender())->isChecked(); adjustSizes(); } void ResizeDialog::setUnits() { int newWidth; int newHeight; if (pixelsRadio->isChecked() && !pixelUnits) { newWidth = (width * widthSpin->value()) / 100; newHeight = (height * heightSpin->value()) / 100; widthSpin->setRange(0, width * 10); heightSpin->setRange(0, height * 10); pixelUnits = true; } else { newWidth = (100 * widthSpin->value()) / width; newHeight = (100 * heightSpin->value()) / height; widthSpin->setRange(0, 100 * 10); heightSpin->setRange(0, 100 * 10); pixelUnits = false; } widthSpin->setValue(newWidth); if (!aspectLocked) heightSpin->setValue(newHeight); } void ResizeDialog::adjustSizes() { static bool busy = false; if (busy) return; busy = true; if (aspectLocked) { if (pixelUnits) { QSize imageSize(width, height); if (widthSpin->value() > lastWidth || heightSpin->value() > lastHeight) { imageSize.scale(widthSpin->value(), heightSpin->value(), Qt::KeepAspectRatioByExpanding); } else { imageSize.scale(widthSpin->value(), heightSpin->value(), Qt::KeepAspectRatio); } widthSpin->setValue(imageSize.width()); heightSpin->setValue(imageSize.height()); lastWidth = widthSpin->value(); lastHeight = heightSpin->value(); newWidth = imageSize.width(); newHeight = imageSize.height(); } else { if (widthSpin->value() != lastWidth) { heightSpin->setValue(widthSpin->value()); } else { widthSpin->setValue(heightSpin->value()); } lastWidth = widthSpin->value(); lastHeight = heightSpin->value(); newWidth = (width * widthSpin->value()) / 100; newHeight = (height * heightSpin->value()) / 100; } } else { if (pixelUnits) { newWidth = widthSpin->value(); newHeight = heightSpin->value(); } else { newWidth = (width * widthSpin->value()) / 100; newHeight = (height * heightSpin->value()) / 100; } } newSizePixelsLab->setText(QString::number(newWidth) + " x " + QString::number(newHeight)); busy = false; } void ResizeDialog::ok() { if (newWidth || newHeight) { GData::scaledWidth = newWidth; GData::scaledHeight = newHeight; imageView->refresh(); } accept(); } void ResizeDialog::abort() { reject(); } ColorsDialog::ColorsDialog(QWidget *parent, ImageView *imageView_) : QDialog(parent) { setWindowTitle(tr("Colors")); setWindowIcon(QIcon(":/images/colors.png")); resize(350, 300); imageView = imageView_; QHBoxLayout *buttonsHbox = new QHBoxLayout; QPushButton *resetButton = new QPushButton(tr("Reset")); resetButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); resetButton->setIcon(QIcon::fromTheme("document-revert")); connect(resetButton, SIGNAL(clicked()), this, SLOT(reset())); buttonsHbox->addWidget(resetButton, 0, Qt::AlignLeft); QPushButton *okButton = new QPushButton(tr("OK")); okButton->setIcon(QIcon::fromTheme("dialog-ok")); okButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(okButton, SIGNAL(clicked()), this, SLOT(ok())); buttonsHbox->addWidget(okButton, 0, Qt::AlignRight); okButton->setDefault(true); /* hue saturation */ QLabel *hueLab = new QLabel(tr("Hue")); QLabel *satLab = new QLabel(tr("Saturation")); QLabel *lightLab = new QLabel(tr("Lightness")); hueSlide = new QSlider(Qt::Horizontal); hueSlide->setTickPosition(QSlider::TicksAbove); hueSlide->setTickInterval(25); hueSlide->setRange(-100, 100); hueSlide->setTracking(false); connect(hueSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); colorizeCb = new QCheckBox(tr("Colorize"), this); colorizeCb->setCheckState(GData::colorizeEnabled? Qt::Checked : Qt::Unchecked); connect(colorizeCb, SIGNAL(stateChanged(int)), this, SLOT(enableColorize(int))); rNegateCb = new QCheckBox(tr("Negative"), this); rNegateCb->setCheckState(GData::rNegateEnabled? Qt::Checked : Qt::Unchecked); connect(rNegateCb, SIGNAL(stateChanged(int)), this, SLOT(redNegative(int))); gNegateCb = new QCheckBox(tr("Negative"), this); gNegateCb->setCheckState(GData::gNegateEnabled? Qt::Checked : Qt::Unchecked); connect(gNegateCb, SIGNAL(stateChanged(int)), this, SLOT(greenNegative(int))); bNegateCb = new QCheckBox(tr("Negative"), this); bNegateCb->setCheckState(GData::bNegateEnabled? Qt::Checked : Qt::Unchecked); connect(bNegateCb, SIGNAL(stateChanged(int)), this, SLOT(blueNegative(int))); saturationSlide = new QSlider(Qt::Horizontal); saturationSlide->setTickPosition(QSlider::TicksAbove); saturationSlide->setTickInterval(25); saturationSlide->setRange(-100, 100); saturationSlide->setTracking(false); connect(saturationSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); lightnessSlide = new QSlider(Qt::Horizontal); lightnessSlide->setTickPosition(QSlider::TicksAbove); lightnessSlide->setTickInterval(25); lightnessSlide->setRange(-100, 100); lightnessSlide->setTracking(false); connect(lightnessSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); QHBoxLayout *channelsHbox = new QHBoxLayout; redB = new QCheckBox(tr("Red")); redB->setCheckable(true); redB->setChecked(GData::hueRedChannel); connect(redB, SIGNAL(clicked()), this, SLOT(setRedChannel())); channelsHbox->addWidget(redB, 0, Qt::AlignLeft); greenB = new QCheckBox(tr("Green")); greenB->setCheckable(true); greenB->setChecked(GData::hueGreenChannel); connect(greenB, SIGNAL(clicked()), this, SLOT(setGreenChannel())); channelsHbox->addWidget(greenB, 0, Qt::AlignLeft); blueB = new QCheckBox(tr("Blue")); blueB->setCheckable(true); blueB->setChecked(GData::hueBlueChannel); connect(blueB, SIGNAL(clicked()), this, SLOT(setBlueChannel())); channelsHbox->addWidget(blueB, 0, Qt::AlignLeft); channelsHbox->addStretch(1); QGridLayout *hueSatLay = new QGridLayout; hueSatLay->addWidget(hueLab, 1, 0, 1, 1); hueSatLay->addWidget(hueSlide, 1, 1, 1, 1); hueSatLay->addWidget(colorizeCb, 2, 1, 1, 1); hueSatLay->addWidget(satLab, 3, 0, 1, 1); hueSatLay->addWidget(saturationSlide, 3, 1, 1, 1); hueSatLay->addWidget(lightLab, 4, 0, 1, 1); hueSatLay->addWidget(lightnessSlide, 4, 1, 1, 1); hueSatLay->setColumnMinimumWidth(0, 70); QGroupBox *hueSatGroup = new QGroupBox(tr("Hue and Saturation")); hueSatGroup->setLayout(hueSatLay); QGridLayout *channelsLay = new QGridLayout; channelsLay->addLayout(channelsHbox, 5, 1, 1, 1); channelsLay->setColumnMinimumWidth(0, 70); QGroupBox *channelsGroup = new QGroupBox(tr("Affected Channels")); channelsGroup->setLayout(channelsLay); /* brightness contrast */ QLabel *brightLab = new QLabel(tr("Brightness")); QLabel *contrastLab = new QLabel(tr("Contrast")); brightSlide = new QSlider(Qt::Horizontal); brightSlide->setTickPosition(QSlider::TicksAbove); brightSlide->setTickInterval(25); brightSlide->setRange(-100, 100); brightSlide->setTracking(false); connect(brightSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); contrastSlide = new QSlider(Qt::Horizontal); contrastSlide->setTickPosition(QSlider::TicksAbove); contrastSlide->setTickInterval(25); contrastSlide->setRange(-100, 100); contrastSlide->setTracking(false); contrastSlide->setInvertedAppearance(true); connect(contrastSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); QGridLayout *brightContrastbox = new QGridLayout; brightContrastbox->addWidget(brightLab, 1, 0, 1, 1); brightContrastbox->addWidget(brightSlide, 1, 1, 1, 1); brightContrastbox->addWidget(contrastLab, 2, 0, 1, 1); brightContrastbox->addWidget(contrastSlide, 2, 1, 1, 1); brightContrastbox->setColumnMinimumWidth(0, 70); QGroupBox *brightContrastGroup = new QGroupBox(tr("Brightness and Contrast")); brightContrastGroup->setLayout(brightContrastbox); /* Channel mixer */ QLabel *redLab = new QLabel(tr("Red")); redSlide = new QSlider(Qt::Horizontal); redSlide->setTickPosition(QSlider::TicksAbove); redSlide->setTickInterval(25); redSlide->setRange(-100, 100); redSlide->setTracking(false); connect(redSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); QLabel *greenLab = new QLabel(tr("Green")); greenSlide = new QSlider(Qt::Horizontal); greenSlide->setTickPosition(QSlider::TicksAbove); greenSlide->setTickInterval(25); greenSlide->setRange(-100, 100); greenSlide->setTracking(false); connect(greenSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); QLabel *blueLab = new QLabel(tr("Blue")); blueSlide = new QSlider(Qt::Horizontal); blueSlide->setTickPosition(QSlider::TicksAbove); blueSlide->setTickInterval(25); blueSlide->setRange(-100, 100); blueSlide->setTracking(false); connect(blueSlide, SIGNAL(valueChanged(int)), this, SLOT(applyColors(int))); QGridLayout *channelMixbox = new QGridLayout; channelMixbox->addWidget(redLab, 1, 0, 1, 1); channelMixbox->addWidget(redSlide, 1, 1, 1, 1); channelMixbox->addWidget(rNegateCb, 1, 2, 1, 1); channelMixbox->addWidget(greenLab, 2, 0, 1, 1); channelMixbox->addWidget(greenSlide, 2, 1, 1, 1); channelMixbox->addWidget(gNegateCb, 2, 2, 1, 1); channelMixbox->addWidget(blueLab, 3, 0, 1, 1); channelMixbox->addWidget(blueSlide, 3, 1, 1, 1); channelMixbox->addWidget(bNegateCb, 3, 2, 1, 1); channelMixbox->setColumnMinimumWidth(0, 70); QGroupBox *channelMixGroup = new QGroupBox(tr("Color Balance")); channelMixGroup->setLayout(channelMixbox); QVBoxLayout *mainVbox = new QVBoxLayout; mainVbox->addWidget(brightContrastGroup); mainVbox->addWidget(channelMixGroup); mainVbox->addWidget(hueSatGroup); mainVbox->addWidget(channelsGroup); mainVbox->addStretch(1); mainVbox->addLayout(buttonsHbox); setLayout(mainVbox); applyColors(0); } void ColorsDialog::applyColors(int) { if (brightSlide->value() >= 0) GData::brightVal = (brightSlide->value() * 500 / 100) + 100; else GData::brightVal = brightSlide->value() + 100; if (contrastSlide->value() >= 0) GData::contrastVal = (contrastSlide->value() * 79 / 100) + 78; else GData::contrastVal = contrastSlide->value() + 79; GData::hueVal = hueSlide->value() * 127 / 100; if (saturationSlide->value() >= 0) GData::saturationVal = (saturationSlide->value() * 500 / 100) + 100; else GData::saturationVal = saturationSlide->value() + 100; if (lightnessSlide->value() >= 0) GData::lightnessVal = (lightnessSlide->value() * 200 / 100) + 100; else GData::lightnessVal = lightnessSlide->value() + 100; GData::redVal = redSlide->value(); GData::greenVal = greenSlide->value(); GData::blueVal = blueSlide->value(); imageView->refresh(); } void ColorsDialog::ok() { GData::dialogLastX = pos().x(); GData::dialogLastY = pos().y(); accept(); } void ColorsDialog::reset() { hueSlide->setValue(0); colorizeCb->setChecked(false); rNegateCb->setChecked(false); gNegateCb->setChecked(false); bNegateCb->setChecked(false); saturationSlide->setValue(0); lightnessSlide->setValue(0); redB->setChecked(true); greenB->setChecked(true); blueB->setChecked(true); GData::hueRedChannel = true; GData::hueGreenChannel = true; GData::hueBlueChannel = true; contrastSlide->setValue(0); brightSlide->setValue(0); redSlide->setValue(0); greenSlide->setValue(0); blueSlide->setValue(0); imageView->refresh(); } void ColorsDialog::enableColorize(int state) { GData::colorizeEnabled = state; imageView->refresh(); } void ColorsDialog::redNegative(int state) { GData::rNegateEnabled = state; imageView->refresh(); } void ColorsDialog::greenNegative(int state) { GData::gNegateEnabled = state; imageView->refresh(); } void ColorsDialog::blueNegative(int state) { GData::bNegateEnabled = state; imageView->refresh(); } void ColorsDialog::setRedChannel() { GData::hueRedChannel = redB->isChecked(); imageView->refresh(); } void ColorsDialog::setGreenChannel() { GData::hueGreenChannel = greenB->isChecked(); imageView->refresh(); } void ColorsDialog::setBlueChannel() { GData::hueBlueChannel = blueB->isChecked(); imageView->refresh(); } void AppMgmtDialog::addTableModelItem(QStandardItemModel *model, QString &key, QString &val) { int atRow = model->rowCount(); QStandardItem *itemKey = new QStandardItem(key); QStandardItem *itemKey2 = new QStandardItem(val); model->insertRow(atRow, itemKey); model->setItem(atRow, 1, itemKey2); } AppMgmtDialog::AppMgmtDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Manage External Applications")); setWindowIcon(QIcon::fromTheme("document-properties", QIcon(":/images/phototonic.png"))); resize(350, 250); appsTable = new QTableView(this); appsTable->setSelectionBehavior(QAbstractItemView::SelectItems); appsTable->setSelectionMode(QAbstractItemView::ExtendedSelection); appsTable->setSelectionBehavior(QAbstractItemView::SelectRows); appsTableModel = new QStandardItemModel(this); appsTable->setModel(appsTableModel); appsTable->verticalHeader()->setVisible(false); appsTable->verticalHeader()->setDefaultSectionSize(appsTable->verticalHeader()->minimumSectionSize()); appsTableModel->setHorizontalHeaderItem(0, new QStandardItem(QString(tr("Name")))); appsTableModel->setHorizontalHeaderItem(1, new QStandardItem(QString(tr("Application path and arguments")))); appsTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Interactive); appsTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); appsTable-> setShowGrid(false); QHBoxLayout *addRemoveHbox = new QHBoxLayout; QPushButton *addButton = new QPushButton(tr("Choose")); addButton->setIcon(QIcon::fromTheme("list-add")); connect(addButton, SIGNAL(clicked()), this, SLOT(add())); addRemoveHbox->addWidget(addButton, 0, Qt::AlignRight); QPushButton *entryButton = new QPushButton(tr("Add manually")); entryButton->setIcon(QIcon::fromTheme("list-add")); connect(entryButton, SIGNAL(clicked()), this, SLOT(entry())); addRemoveHbox->addWidget(entryButton, 0, Qt::AlignRight); QPushButton *removeButton = new QPushButton(tr("Remove")); removeButton->setIcon(QIcon::fromTheme("list-remove")); connect(removeButton, SIGNAL(clicked()), this, SLOT(remove())); addRemoveHbox->addWidget(removeButton, 0, Qt::AlignRight); addRemoveHbox->addStretch(1); QHBoxLayout *buttonsHbox = new QHBoxLayout; QPushButton *okButton = new QPushButton(tr("OK")); okButton->setIcon(QIcon::fromTheme("dialog-ok")); okButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(okButton, SIGNAL(clicked()), this, SLOT(ok())); buttonsHbox->addWidget(okButton, 0, Qt::AlignRight); QVBoxLayout *mainVbox = new QVBoxLayout; mainVbox->addWidget(appsTable); mainVbox->addLayout(addRemoveHbox); mainVbox->addLayout(buttonsHbox); setLayout(mainVbox); // Load external apps list QString key, val; QMapIterator it(GData::externalApps); while (it.hasNext()) { it.next(); key = it.key(); val = it.value(); addTableModelItem(appsTableModel, key, val); } } void AppMgmtDialog::ok() { int row = appsTableModel->rowCount(); GData::externalApps.clear(); for (int i = 0; i < row ; ++i) { if (!appsTableModel->itemFromIndex(appsTableModel->index(i, 1))->text().isEmpty()) { GData::externalApps[appsTableModel->itemFromIndex(appsTableModel->index(i, 0))->text()] = appsTableModel->itemFromIndex(appsTableModel->index(i, 1))->text(); } } accept(); } void AppMgmtDialog::add() { QString fileName = QFileDialog::getOpenFileName(this, tr("Choose Application"), "", ""); if (fileName.isEmpty()) return; QFileInfo fileInfo = QFileInfo(fileName); QString appName = fileInfo.fileName(); addTableModelItem(appsTableModel, appName, fileName); } void AppMgmtDialog::entry() { int atRow = appsTableModel->rowCount(); QStandardItem *itemKey = new QStandardItem(QString(tr("New Application"))); appsTableModel->insertRow(atRow, itemKey); } void AppMgmtDialog::remove() { QModelIndexList indexesList; while((indexesList = appsTable->selectionModel()->selectedIndexes()).size()) { appsTableModel->removeRow(indexesList.first().row()); } } CopyMoveToDialog::CopyMoveToDialog(QWidget *parent, QString thumbsPath, bool move) : QDialog(parent) { copyOp = !move; if (move) { setWindowTitle(tr("Move to...")); setWindowIcon(QIcon::fromTheme("go-next")); } else { setWindowTitle(tr("Copy to...")); setWindowIcon(QIcon::fromTheme("edit-copy")); } resize(350, 250); currentPath = thumbsPath; pathsTable = new QTableView(this); pathsTable->setSelectionBehavior(QAbstractItemView::SelectItems); pathsTable->setSelectionMode(QAbstractItemView::ExtendedSelection); pathsTable->setEditTriggers(QAbstractItemView::NoEditTriggers); pathsTable->setSelectionBehavior(QAbstractItemView::SelectRows); pathsTable->setSelectionMode(QAbstractItemView::SingleSelection); pathsTableModel = new QStandardItemModel(this); pathsTable->setModel(pathsTableModel); pathsTable->verticalHeader()->setVisible(false); pathsTable->horizontalHeader()->setVisible(false); pathsTable->verticalHeader()->setDefaultSectionSize(pathsTable->verticalHeader()-> minimumSectionSize()); pathsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); pathsTable-> setShowGrid(false); connect(pathsTable->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(selection(QItemSelection, QItemSelection))); connect(pathsTable, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(pathDoubleClick(const QModelIndex &))); QHBoxLayout *addRemoveHbox = new QHBoxLayout; QPushButton *addButton = new QPushButton(tr("Browse...")); connect(addButton, SIGNAL(clicked()), this, SLOT(add())); QPushButton *removeButton = new QPushButton(tr("Remove")); connect(removeButton, SIGNAL(clicked()), this, SLOT(remove())); addRemoveHbox->addWidget(removeButton, 0, Qt::AlignLeft); addRemoveHbox->addStretch(1); addRemoveHbox->addWidget(addButton, 0, Qt::AlignRight); QHBoxLayout *buttonsHbox = new QHBoxLayout; QPushButton *cancelButton = new QPushButton(tr("Cancel")); cancelButton->setIcon(QIcon::fromTheme("dialog-cancel")); cancelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(cancelButton, SIGNAL(clicked()), this, SLOT(justClose())); QPushButton *okButton = new QPushButton(tr("OK")); okButton->setIcon(QIcon::fromTheme("dialog-ok")); okButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); okButton->setDefault(true); connect(okButton, SIGNAL(clicked()), this, SLOT(copyOrMove())); buttonsHbox->addStretch(1); buttonsHbox->addWidget(cancelButton, 0, Qt::AlignRight); buttonsHbox->addWidget(okButton, 0, Qt::AlignRight); destinationLab = new QLabel(tr("Destination:")); QFrame *line = new QFrame(this); line->setObjectName(QString::fromUtf8("line")); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); QVBoxLayout *mainVbox = new QVBoxLayout; mainVbox->addWidget(pathsTable); mainVbox->addLayout(addRemoveHbox); mainVbox->addWidget(line); mainVbox->addWidget(destinationLab); mainVbox->addLayout(buttonsHbox); setLayout(mainVbox); // Load paths list QSetIterator it(GData::bookmarkPaths); while (it.hasNext()) { QStandardItem *item = new QStandardItem(QIcon(":/images/bookmarks.png"), it.next()); pathsTableModel->insertRow(pathsTableModel->rowCount(), item); } pathsTableModel->sort(0); } void CopyMoveToDialog::selection(const QItemSelection&, const QItemSelection&) { if (pathsTable->selectionModel()->selectedRows().size() > 0) { destinationLab->setText(tr("Destination:") + " " + pathsTableModel->item(pathsTable->selectionModel()->selectedRows().at(0).row())->text()); } } void CopyMoveToDialog::pathDoubleClick(const QModelIndex &) { copyOrMove(); } void CopyMoveToDialog::savePaths() { GData::bookmarkPaths.clear(); for (int i = 0; i < pathsTableModel->rowCount(); ++i) { GData::bookmarkPaths.insert (pathsTableModel->itemFromIndex(pathsTableModel->index(i, 0))->text()); } } void CopyMoveToDialog::copyOrMove() { savePaths(); QModelIndexList indexesList; if((indexesList = pathsTable->selectionModel()->selectedIndexes()).size()) { selectedPath = pathsTableModel->itemFromIndex(indexesList.first())->text(); accept(); } else { reject(); } } void CopyMoveToDialog::justClose() { savePaths(); reject(); } void CopyMoveToDialog::add() { QString dirName = QFileDialog::getExistingDirectory(this, tr("Choose Folder"), currentPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dirName.isEmpty()) return; QStandardItem *item = new QStandardItem(QIcon(":/images/bookmarks.png"), dirName); pathsTableModel->insertRow(pathsTableModel->rowCount(), item); pathsTable->selectionModel()->clearSelection(); pathsTable->selectionModel()->select(pathsTableModel->index(pathsTableModel->rowCount() - 1, 0), QItemSelectionModel::Select); } void CopyMoveToDialog::remove() { QModelIndexList indexesList; if((indexesList = pathsTable->selectionModel()->selectedIndexes()).size()) { pathsTableModel->removeRow(indexesList.first().row()); } } ProgressDialog::ProgressDialog(QWidget *parent) : QDialog(parent) { opLabel = new QLabel(""); abortOp = false; cancelButton = new QPushButton(tr("Cancel")); cancelButton->setIcon(QIcon::fromTheme("dialog-cancel")); cancelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(cancelButton, SIGNAL(clicked()), this, SLOT(abort())); QHBoxLayout *topLayout = new QHBoxLayout; topLayout->addWidget(opLabel); QHBoxLayout *buttonsLayout = new QHBoxLayout; buttonsLayout->addWidget(cancelButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topLayout); mainLayout->addLayout(buttonsLayout, Qt::AlignRight); setLayout(mainLayout); } void ProgressDialog::abort() { abortOp = true; } phototonic-1.7.20/dialogs.h000066400000000000000000000125751271214516700156020ustar00rootroot00000000000000/* * Copyright (C) 2013 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef DIALOGS_H #define DIALOGS_H #include #include "thumbview.h" #include "imageview.h" int cpMvFile(bool isCopy, QString &srcFile, QString &srcPath, QString &dstPath, QString &dstDir); class CpMvDialog : public QDialog { Q_OBJECT public slots: void abort(); public: CpMvDialog(QWidget *parent); void exec(ThumbView *thumbView, QString &destDir, bool pasteInCurrDir); int nfiles; int latestRow; private: QLabel *opLabel; QPushButton *cancelButton; QFileInfo *dirInfo; bool abortOp; }; class ShortcutsTableView : public QTableView { Q_OBJECT public: ShortcutsTableView(); void addRow(QString action, QString description, QString shortcut); public slots: void showShortcutsTableMenu(QPoint pt); void clearShortcut(); protected: void keyPressEvent(QKeyEvent *e); private: QStandardItemModel *keysModel; QModelIndex selectedEntry; QMenu *shortcutsMenu; QAction *clearAction; }; class SettingsDialog : public QDialog { Q_OBJECT public: static int const nZoomRadios = 5; SettingsDialog(QWidget *parent); private slots: void pickColor(); void pickThumbsColor(); void pickThumbsTextColor(); void pickStartupDir(); void pickBgImage(); public slots: void abort(); void saveSettings(); private: QRadioButton *fitLargeRadios[nZoomRadios]; QRadioButton *fitSmallRadios[nZoomRadios]; QCheckBox *compactLayoutCb; QToolButton *backgroundColorButton; QToolButton *colThumbButton; QToolButton *colThumbTextButton; QSpinBox *thumbSpacingSpin; QSpinBox *thumbPagesSpin; QSpinBox *saveQualitySpin; QColor bgColor; QColor thumbBgColor; QColor thumbTextColor; QCheckBox *exitCliCb; QCheckBox *wrapListCb; QCheckBox *enableAnimCb; QCheckBox *enableExifCb; QCheckBox *enableThumbExifCb; QCheckBox *imageInfoCb; QCheckBox *noSmallThumbCb; QCheckBox *reverseMouseCb; QCheckBox *deleteConfirmCb; QSpinBox *slideDelaySpin; QCheckBox *slideRandomCb; QRadioButton *startupDirRadios[3]; QLineEdit *startupDirEdit; QLineEdit *thumbsBackImageEdit; void setButtonBgColor(QColor &color, QToolButton *button); }; class CropDialog : public QDialog { Q_OBJECT public: CropDialog(QWidget *parent, ImageView *imageView); public slots: void ok(); void reset(); void applyCrop(int); private: QSpinBox *topSpin; QSpinBox *bottomSpin; QSpinBox *leftSpin; QSpinBox *rightSpin; ImageView *imageView; }; class ResizeDialog : public QDialog { Q_OBJECT public: ResizeDialog(QWidget *parent, ImageView *imageView); public slots: void ok(); void abort(); void setAspectLock(); void setUnits(); void adjustSizes(); private: int width; int height; int lastWidth; int lastHeight; bool aspectLocked; bool pixelUnits; int newWidth; int newHeight; QSpinBox *widthSpin; QSpinBox *heightSpin; QRadioButton *pixelsRadio; QRadioButton *percentRadio; QLabel *newSizePixelsLab; ImageView *imageView; }; class ColorsDialog : public QDialog { Q_OBJECT public: ColorsDialog(QWidget *parent, ImageView *imageView); public slots: void ok(); void reset(); void enableColorize(int state); void redNegative(int state); void greenNegative(int state); void blueNegative(int state); void setRedChannel(); void setGreenChannel(); void setBlueChannel(); void applyColors(int value); private: ImageView *imageView; QSlider *hueSlide; QCheckBox *colorizeCb; QSlider *saturationSlide; QSlider *lightnessSlide; QCheckBox *redB; QCheckBox *greenB; QCheckBox *blueB; QSlider *brightSlide; QSlider *contrastSlide; QSlider *redSlide; QSlider *greenSlide; QSlider *blueSlide; QCheckBox *rNegateCb; QCheckBox *gNegateCb; QCheckBox *bNegateCb; }; class AppMgmtDialog : public QDialog { Q_OBJECT public: AppMgmtDialog(QWidget *parent); public slots: void ok(); private slots: void add(); void remove(); void entry(); private: QTableView *appsTable; QStandardItemModel *appsTableModel; void addTableModelItem(QStandardItemModel *model, QString &key, QString &val); }; class CopyMoveToDialog : public QDialog { Q_OBJECT public: CopyMoveToDialog(QWidget *parent, QString thumbsPath, bool move); QString selectedPath; bool copyOp; private slots: void copyOrMove(); void justClose(); void add(); void remove(); void selection(const QItemSelection&, const QItemSelection&); void pathDoubleClick(const QModelIndex &idx); private: QTableView *pathsTable; QStandardItemModel *pathsTableModel; QString currentPath; QLabel *destinationLab; void savePaths(); }; class ProgressDialog : public QDialog { Q_OBJECT public slots: void abort(); public: QLabel *opLabel; bool abortOp; ProgressDialog(QWidget *parent); private: QPushButton *cancelButton; }; #endif // DIALOGS_H phototonic-1.7.20/dircompleter.cpp000066400000000000000000000025371271214516700172010ustar00rootroot00000000000000/* * Copyright (C) 2015 Thomas Lübking * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include #include "dircompleter.h" DirCompleter::DirCompleter(QObject *parent) : QCompleter(parent) { QDirModel *model = new QDirModel; model->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot); model->setLazyChildCount(true); setModel(model); } QString DirCompleter::pathFromIndex(const QModelIndex &index) const { return QCompleter::pathFromIndex(index) + "/"; } QStringList DirCompleter::splitPath(const QString &path) const { if (path.startsWith("~")) { return QCompleter::splitPath(QString(path).replace(0, 1, QDir::homePath())); } return QCompleter::splitPath(path); } phototonic-1.7.20/dircompleter.h000066400000000000000000000021061271214516700166360ustar00rootroot00000000000000/* * Copyright (C) 2015 Thomas Lübking * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef DIRCOMPLETER_H #define DIRCOMPLETER_H #include class DirCompleter : public QCompleter { Q_OBJECT public: DirCompleter(QObject *parent = 0); QString pathFromIndex(const QModelIndex &index) const; public slots: QStringList splitPath(const QString &path) const; }; #endif // DIRCOMPLETER_H phototonic-1.7.20/fstree.cpp000066400000000000000000000052761271214516700160030ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "fstree.h" bool FSModel::hasChildren(const QModelIndex &parent) const { if (parent.column() > 0) return false; if (!parent.isValid()) // drives return true; // return false if item cant have children if (parent.flags() & Qt::ItemNeverHasChildren) { return false; } // return if at least one child exists return QDirIterator(filePath(parent), filter() | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags).hasNext(); } FSTree::FSTree(QWidget *parent) : QTreeView(parent) { setAcceptDrops(true); setDragEnabled(true); setDragDropMode(QAbstractItemView::InternalMove); fsModel = new FSModel(); fsModel->setRootPath(""); setModelFlags(); setModel(fsModel); for (int i = 1; i <= 3; ++i) { hideColumn(i); } setHeaderHidden(true); connect(this, SIGNAL(expanded(const QModelIndex &)), this, SLOT(resizeTreeColumn(const QModelIndex &))); connect(this, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(resizeTreeColumn(const QModelIndex &))); } QModelIndex FSTree::getCurrentIndex() { return selectedIndexes().first(); } void FSTree::resizeTreeColumn(const QModelIndex &) { resizeColumnToContents(0); } void FSTree::dragEnterEvent(QDragEnterEvent *event) { QModelIndexList selectedDirs = selectionModel()->selectedRows(); if (selectedDirs.size() > 0) { dndOrigSelection = selectedDirs[0]; event->acceptProposedAction(); } } void FSTree::dragMoveEvent(QDragMoveEvent *event) { setCurrentIndex(indexAt(event->pos())); } void FSTree::dropEvent(QDropEvent *event) { if (event->source()) { QString fstreeStr="FSTree"; bool dirOp = (event->source()->metaObject()->className() == fstreeStr); emit dropOp(event->keyboardModifiers(), dirOp, event->mimeData()->urls().at(0).toLocalFile()); setCurrentIndex(dndOrigSelection); } } void FSTree::setModelFlags() { fsModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot); if (GData::showHiddenFiles) fsModel->setFilter(fsModel->filter() | QDir::Hidden); } phototonic-1.7.20/fstree.h000066400000000000000000000026631271214516700154450ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include #include "global.h" #ifndef FSTREE_H #define FSTREE_H class FSModel : public QFileSystemModel { public: bool hasChildren(const QModelIndex &parent) const; }; class FSTree : public QTreeView { Q_OBJECT public: FSTree(QWidget *parent); FSModel *fsModel; QModelIndex getCurrentIndex(); void setModelFlags(); protected: void dragEnterEvent(QDragEnterEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); signals: void dropOp(Qt::KeyboardModifiers keyMods, bool dirOp, QString cpMvDirPath); private: QModelIndex dndOrigSelection; private slots: void resizeTreeColumn(const QModelIndex &); }; #endif // FSTREE_H phototonic-1.7.20/global.cpp000066400000000000000000000051141271214516700157420ustar00rootroot00000000000000/* * Copyright (C) 2013 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "global.h" namespace GData { QSettings *appSettings; unsigned int layoutMode; unsigned int zoomInFlags; unsigned int zoomOutFlags; QColor backgroundColor; QColor thumbsBackgroundColor; QColor thumbsTextColor; unsigned int thumbsLayout; unsigned int thumbSpacing; unsigned int thumbPagesReadahead; bool exitInsteadOfClose; bool wrapImageList; bool enableAnimations; float imageZoomFactor; bool keepZoomFactor; int rotation; bool keepTransform; bool flipH; bool flipV; int scaledWidth; int scaledHeight; int defaultSaveQuality; int cropLeft; int cropTop; int cropWidth; int cropHeight; int cropLeftPercent; int cropTopPercent; int cropWidthPercent; int cropHeightPercent; bool noEnlargeSmallThumb; int slideShowDelay; bool slideShowRandom; bool slideShowActive; QMap actionKeys; int hueVal; int saturationVal; int lightnessVal; int contrastVal; int brightVal; int redVal; int greenVal; int blueVal; bool colorsActive; bool colorizeEnabled; bool rNegateEnabled; bool gNegateEnabled; bool bNegateEnabled; bool hueRedChannel; bool hueGreenChannel; bool hueBlueChannel; bool exifRotationEnabled; bool exifThumbRotationEnabled; bool includeSubFolders; bool showHiddenFiles; bool imageToolbarFullScreen; QMap externalApps; QSet bookmarkPaths; QSet knownTags; bool reverseMouseBehavior; bool deleteConfirm; QModelIndexList copyCutIdxList; bool copyOp; QStringList copyCutFileList; bool isFullScreen; int dialogLastX; int dialogLastY; StartupDir startupDir; QString specifiedStartDir; bool enableImageInfoFS; bool showLabels; bool smallIcons; bool LockDocks; bool tagsDockVisible; bool fsDockVisible; bool bmDockVisible; bool iiDockVisible; QString currentViewDir; bool pvDockVisible; bool ivDockVisible; QString thumbsBackImage; } phototonic-1.7.20/global.h000066400000000000000000000066601271214516700154160ustar00rootroot00000000000000/* * Copyright (C) 2013 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef GLOBAL_H #define GLOBAL_H #include #include #include #include #include #include namespace GData { enum StartupDir { defaultDir = 0, rememberLastDir, specifiedDir }; extern QSettings *appSettings; extern unsigned int layoutMode; extern unsigned int zoomInFlags; extern unsigned int zoomOutFlags; extern QColor backgroundColor; extern QColor thumbsBackgroundColor; extern QColor thumbsTextColor; extern unsigned int thumbsLayout; extern unsigned int thumbSpacing; extern unsigned int thumbPagesReadahead; extern bool exitInsteadOfClose; extern bool wrapImageList; extern bool enableAnimations; extern float imageZoomFactor; extern bool keepZoomFactor; extern int rotation; extern bool keepTransform; extern bool flipH; extern bool flipV; extern int scaledWidth; extern int scaledHeight; extern int defaultSaveQuality; extern int cropLeft; extern int cropTop; extern int cropWidth; extern int cropHeight; extern int cropLeftPercent; extern int cropTopPercent; extern int cropWidthPercent; extern int cropHeightPercent; extern bool noEnlargeSmallThumb; extern int slideShowDelay; extern bool slideShowRandom; extern bool slideShowActive; extern QMap actionKeys; extern bool hueSatEnabled; extern bool brightContrastEnabled; extern int hueVal; extern int saturationVal; extern int lightnessVal; extern int contrastVal; extern int brightVal; extern int redVal; extern int greenVal; extern int blueVal; extern bool colorsActive; extern bool colorizeEnabled; extern bool rNegateEnabled; extern bool gNegateEnabled; extern bool bNegateEnabled; extern bool hueRedChannel; extern bool hueGreenChannel; extern bool hueBlueChannel; extern bool exifRotationEnabled; extern bool exifThumbRotationEnabled; extern bool includeSubFolders; extern bool showHiddenFiles; extern bool imageToolbarFullScreen; extern QMap externalApps; extern QSet bookmarkPaths; extern QSet knownTags; extern bool reverseMouseBehavior; extern bool deleteConfirm; extern QModelIndexList copyCutIdxList; extern bool copyOp; extern QStringList copyCutFileList; extern bool isFullScreen; extern int dialogLastX; extern int dialogLastY; extern StartupDir startupDir; extern QString specifiedStartDir; extern bool enableImageInfoFS; extern bool showLabels; extern bool smallIcons; extern bool LockDocks; extern bool fsDockVisible; extern bool bmDockVisible; extern bool tagsDockVisible; extern bool iiDockVisible; extern bool pvDockVisible; extern bool ivDockVisible; extern QString thumbsBackImage; extern QString currentViewDir; } #endif // GLOBAL_H phototonic-1.7.20/images/000077500000000000000000000000001271214516700152425ustar00rootroot00000000000000phototonic-1.7.20/images/about.png000066400000000000000000000014041271214516700170610ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8SAHa}꒭zXYf=,R +ujE!QPA[$=x1!Ţp ]MVw\qvjwf>xR_L;Dd+蜚F`0Ò$5pMMӾ?e}*S omoou4MbH*QT"]O B6 "0>Yg$cLmFFF^TUgll,:|BXk 幹s4Mp9mNSSܼc6qQVq|| y8L>f?zݵ!@aӗ$i@#L&azz:iRԣz˲,^G_#HomC___oRyՋ~-8XXXzw:D~ppcii=C{kkUQ6YB!8X]]}zr1"r@<LQ\.9,90[`5H$w,PaJ%3ϫr3 bOOYL4&&&֊~`ΤID:_Y^^N/BIjB 'VHkvo@sc?IENDB`phototonic-1.7.20/images/back.png000066400000000000000000000007631271214516700166560ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<pIDAT8SKq:0<㼬!Iqrn \o67fiA7%/:5rU#f*+MX@D1:7f~^EHphk"RdYk7\u " l6k-GfA˲\$)E2sDDAպSUx< ⪪bJBQ;3mBj2~|uwk"2Aph4Z5MT* 0CHDlhLFc0 f^xt!UTq^\t:} +~D\(roYS*:@@h5 y=rIENDB`phototonic-1.7.20/images/bookmarks.png000066400000000000000000000011171271214516700177400ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kSQ5%KJJ@`Pfӊ ((š젠=8)RT(bb4ږmrι!O7{s&U.,HQ=7vAཧuNgS>m IlHY_=V~zړ+J+}_yS?_@2,Ǵ?|8h P 0 cVDVn'mM W B @D9Jj2plNf#5L%՝g'S{LQ#Ru8M)h}̰x,8$Յh-gܟ qPp*V GP@äQ#Tu`g(OB~La2Hb\vZ~/yo0 xX@)U|>GiCY@)mۗil۾hD׭8WAܕA9s6(H&Jk˲.4eβ 5(`_<ϻN<Nt]?w]uG]dg|4g?lH5v?H䮰ʓHxGu.FIENDB`phototonic-1.7.20/images/busy.gif000066400000000000000000000253421271214516700167210ustar00rootroot00000000000000GIF89a2Ԭ! NETSCAPE2.0!,2`R8cIfj&JL׷]{?L F#2T&&d6{v[7an/pZv"x ހ~    Ƶ³ ۼҲæ ! 6m@AHC- d ŋ ȱ#ƍ-!,2켺Ĭ̤켾CL i試HM]뻞NK R\6SN҄0C"^כ$aq(\l>{}C o o   í ν ߭VrQBڤ Cꂄ3ITnjl (S\rD˗*]|!,2̴쬪ԼԼ쬮 DPgj˾n,NO~:<`/ c19,.tNתTf[@.C1zM> `0N'~~}56v77av' uutt%s#  ȿ    6-ւ8qN ੣RC:qT ."X“o\lR .ILePbѢCPJԨ !!,2䬮촶Ĭ촲Ĥ 8H > QT7_7B$H`r L@W^Vjoy$iufO6=)GD;뤀i:i  Qf:( g g '45|{8{  ||&h砞AF8B !>ķA &d@c}dHaB!lH`„[jMZ y)vPC(G D(;!իUfUB׮W-!,2䬮촶Ĭ촲Ĥ5L\0(+>HHB"d"bҨDULe_n U'e 8"|_D2  Xo@Y~@:U@  ; ϰ  < < 0`@X1Pn!Ç#F ,\POB.p ^1``We5h/7f~P`hQ]:ZAB('Eej/_" [ N b[#ʍ.r^!,2䬮촶Ĭ촲Ĥ3M<ÅҾn rMOY! $T1D6IIT Df^_p6tZ!n8oׯݫW0DqqnsD=<<q  ZZnnZ  qA BBװ ? B 4@@B"JH1bq] p X(d<!g <9R9ݚEA2sk;#XJI>+ӥOJ](`Bm YcH[ Rxp@Ņ,F՛߿{^!,2䬮촶Ĭ촲Ĥ3)0L\Ic rM?DTM G#O-uOR)T2D&M2p:g1ZZ~ ۮuݮ1oq  @\X_>>Z RCD[ZD\\  \AA  @  BB4(0 HŊ<b = 0duiM$ eKh!D Я4DdVLvb ^|J+S($Xg͎=[V 8 7 {!!,2䬮촶Ĭ촲Ĥ3)c9 3\P+MSUeAB"rX ذc`0a.8` pm^^!,2䬮촶Ĭ촲Ĥ3)cIt=5dlrM?DTg@D"fzR)PL!l ,z%S⪴`e0׾U;gW0`ZZq B q`@uF REFt  ¿ C Bۉ  DD݉ Ńpy&b4@`ֻ3j| DC"`_? i&DTDHcM,$L! V+*_υi!fo$AWw|۽_W0oZsCtA[AA]t ]^^tts sEtFFD CC0` hX@8ŊQDTJ% Q5y?Vlj-dbpnfJޒo((Hx/|1zc^xFxDDD``x xxww HIIG Fڊй:)D@`B3j `cB 2g>fB&\2%HM] 4`[fkE("  xj(*δg 0t*`[n%oʝ{Ł Z+c.\o/!,2䬮촶Ĭ촲Ĥ3)cIf9 <״tJ?DT?_#CH$b9;R)PkZ_ɷr檴`en{3uDT?0 9=Y`RU[2 p[rTifm+(H\ގc0s^_DwFxDDab abxxwH wxIIG F݋F ܹ'p[p! 4@B*l0 A&D > g(C`aF # `M6l̜U˥Ȁ6KR,QZ~ICHJXS2dӥ2QL2ox骶 VĝK.0DT?_o:R)Pk{f L"(dnUZw~I>[1f_{f_x HcFFaLLbb R cc   cII  IJJH  ,\`y1`$F#J` 0РKdžJ5r8I k%8DPQcH3@e89sd ^40@ϝd)U+DI a7VB8 rXA(ɘ1ݻxc<؛7!,2䬮촶Ĭ촲Ĥ3)cIf<MS=Wd$DbC,8׊V D)XYԬ5m 6 L[1|euzHz|FbFc  bzzyJK yzKKIǶ HڌH  b[*LHP ((A.hf! RBP[Z2 ip e QY!UB ŊT2hiSďq2S'e:Å hKݹbxp t/!,2䬮촶Ĭ촲Ĥ3)cIf0]sMj>DT?_o7eDp ;R)Pk{vBB,2_`enݦe1gaGgx I xG|M RLx  JJ  JIKK  I .Pp8ha#@ h%ZG A29ra#Gk2@¿,`X  d0P@M\+SYj9Q"b0URSԩ4hidBog՞0Ƅxb`,xw!,2䬮촶Ĭ촲Ĥ3)cIf4 3\N4վ># +DH@!S+VZL! + huFV:ǂ$1wbcI{K{IeIfd f||{M{N NNL  KێKٍ Fb[*\Р P`! ePƒ;"dH b@ P#el*kkgn(-YHaZJ3(P*C*3+blm4TFpu+ƅ,+C!,2䬮촶Ĭ촲Ĥ3)cIf0L\>DT?_o7 3HD"@fLRNVJjB"' lPenݎRc0ha}h| JKgHcNNd QMee    KKK  ȿLLJ  X@p8hᣇ#J@4@`W5ɰdɅj5* DT?_o7 wLF"HH$JVlfZoI1uMk-wAA dJ}L|Jfxxge f}}|N| |OOM  ǼǐL  8RS xSЛÇ#JdXC IRB$g%L X@$IϒLZ6` !j\µ 0D`MU2li$+ZÂ& %҅ .ʝKw wN02d !,2䬮촶Ĭ촲Ĥ3)cIfj9 <4DT?_o7 R LRNVJjJ KPenݎq"̔cJ  LMJ{J~    MM  NNLN   ,hX@I')\ȰI(0 VMBG#IdH^,0X@dbFSFҲg5 ` ^jXGo PJ@TZI:XhuNca+6&]˶Zme;  !,2䬮촶Ĭ촲Ĥ3)cIfj: A4M\' +D80J!RUT^B&D0aixf6&3$q3bI~ KIdwwc{M{ KMK 0K׏3  h@Q໧0!> 1Pb>,pAi r/'KD@ LUpΔE pAɰ% 6H(7HH! ʵ+W]n;vF!,2䬮촶촲Ĥ`)cIfj CTL绞߿7]e2)0glVViy)$.K97gs^wc>{}y_ G_G  $ 1    3`vP`Z~݊"/@`VZuTI3H؄a+f9M'/ഒ! T!ѣH5)QK^s !,2Լ쬮Լ촲 B1cIfjP<<6~49D.\6d)uF1*_o `bZ]ίO&kk   ¾úϽ ڻ ټ֩-TP& ?0pd5ig#,` N\reJ/U<9%!;phototonic-1.7.20/images/clear.png000066400000000000000000000012561271214516700170420ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<+IDAT8?haƟ-4J-] "4R 48tpTPK N-YWE I9Aw- W95|]j$C,yY^7yDܚ!.@LӴ7pui'`0o4ۢ(.9'<F|p\銢0m1WeG4ݶmض}^rwmma;o6lrYH$RT*F$)PdY.O=Vd^Z?<<4ٲȄ^`uU`9hHt׮cƂ"V'pa6yt%m4Ɋ b*5*'UG IB+'AS4 (ST=T0 Ht،76"g9@pЂ '^4Ͼ9&u(X=zVD]*8)G/lvB, z i~zEy@jb6-|56] ,yb`c^j&BTA3-b"h$∽./^OaO2{O0rl Z>t6ȣȡ * eU| 'f!7 8W\R. h|,T>ܲCc k MZ4SH+E-~O5{&W TtiO-#jm*2[@AwֶTc/ZLUIENDB`phototonic-1.7.20/images/copy.png000066400000000000000000000010351271214516700167210ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8?k@Ɵ&7H1AR\|?B@98(RiСH8H MHK};hL{}/#"b../+" AD' @qysNypgBD`f!В(AX!\9׈Fv]WťRINBldcPb_ I?DQdDqz@OtKIv=$\EـoxoYV1v<,z6@F}koϝN\"DfzIպ_,d a~?~imwoٗeX}0jPU5Ur|MD_Y3'f~>|<زb#+JDlMF|IENDB`phototonic-1.7.20/images/crop.png000066400000000000000000000010311271214516700167060ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME " 5)IDAT8ˍ1Q?'3Sh&V$Ha3Řb@  jtӦ D\HcQAf޻Lf5^xͻ{=޻uxEag/Fz!"88xG?J+7(b\ζ(^"ZbAV;HcN n4XZt:=(A)jnSTZ#s?{s @/K}rֺ@&R00 R(".`g_sTs@Dl6qm=ggb<==O̪NCZ-81L nx9ftؕvl>Li/0ܻ eeшLB v^Wzl>!K!FPF`6e=0EӼL\IENDB`phototonic-1.7.20/images/cut.png000066400000000000000000000014101271214516700165370ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8mS1Ha}cl$h"UBp+ -4T8ZݻX(j,Y TJܦҡ&)$K )7 wRrM÷1 p 'c< DdTl&IH&IJ0z;TUUt]oF"y#zSUUT;~Q4*J"fWT*Q.nu1fxAx`P*zx,ˢ,ڝ%d2YeTU8niUU/dYi1 obx,T(.~nSQ1FN5MlnnDdE:W|A(\:olA7'_^gMlmm͝4<<2&cm#Gr|YVfgg?&PZr|FM0 BVH:;;;Q<`V4V*woo/' 0鴶a̼tJ @;}}}+LӔMӔcXJQeYx<@ۛ;3\NlƿN/1X=)iMIENDB`phototonic-1.7.20/images/delete.png000066400000000000000000000012041271214516700172070ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8œKTq?ͤ36b k BfЪ71j00ȤE ZĈ 1Piemij/=s+N#6`V"f0 <錗Hs!U]-5nƬ`l򱚂-1`-z(t#٤z۔oHVKDR ".wf"23^>r{n}~4ީ_+[?{59`1vnFb>ڗ[?Nji2c m0؀m ̉6m˖H e+QRIENDB`phototonic-1.7.20/images/duplicates.png000066400000000000000000000005131271214516700201040ustar00rootroot00000000000000PNG  IHDRaIDAT8˵1j@?Uo`N`a'k\:9"9Aڊ*}&agf], Mӌv]Wq'O0u]._8 q8ATU74ME68eY,7Ijgi p=bҶ,39ɆI1Q8ǹar`yW`y '  Ëmyb4dY52@Q躾!/U)BsY2 }ɏ+ʓ oIENDB`phototonic-1.7.20/images/error_image.png000066400000000000000000000077071271214516700202560ustar00rootroot00000000000000PNG  IHDR@@iq pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx[q0}xfR $@*RIĩ N `GYVl6sD377C@j=cxzLAfm7h mx1AFgK{ udXy? 6?$]WOM4009KUР= Oq5Zl[UcrSBA&q9|zHC̞<]F%B6B3uyhZSjfgI2F ߓEaPV8a#uT}ZdcD6d#OR2B}Dano_tl*'MJJOu  ̿qOEu-?5 {t2ëYPWBFĝo_5`#/'3 LLjCZ[!:7C;vAϦ5̹u2I?ҎX_CIBCL${(iD,/L?"rjOHx: gL ~Y, w^'HϜ2a 6

V&%lcIҵLBS"6Ƕ-`8\N@KMC&g& D@lo-8رqx$x| EL&0qE3>cuI0eH1/E +a:2Z05evnT(2GQ*zt?S F3Iw l69̰6d|@( 4*OkON/|mW1x~?ofO 7)~ll|hRVY !St:!@q]"Q%mC"Cُ.|x*^#rEaڨks1.L f[` qÌ$$`4$|U=B[!IJZdEi9ѭ1 X'.IM1kRQ4a&[[e%Q{eP 71)ЎvyKNEDat+'3L|4] u'"渴|YKBׁ{>wytL9IENDB`phototonic-1.7.20/images/first.png000066400000000000000000000010671271214516700171030ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8œ1RaG}) Cz.pih^hQE)A)F!H !nA5&i.ݫWEu{:pr\( \۞IʖTՏGaa *;|ATz'cf[~(JT*ki6TXLjBṈsTh4z{^""cj:-N5xbSl0vb3 ZV.<1 #8]F^z$Y᠋yyv ,ˢl'v\.K4͗zQRV$;0˽q 5U4D}\fo@ p9 v;rm>ȫNp8~T*6N!z-slUٿp3 P`IENDB`phototonic-1.7.20/images/flipH.png000066400000000000000000000007201271214516700170110ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<MIDAT8ݓKP@M:D"7KC]C\ {gmPбs tB1>Z|}qqb76MEdoY(";7 kn$4MZ"(M$I.fE(;E\.8(˲\߿ s_ׯ Rt>L61 c0$TkiCq^Ɨp4ht:e6hC=;k4juJޗ zYvv4o R:-(5P]/a]hRv۷m[r#,X&+EcVEi7$4zIENDB`phototonic-1.7.20/images/home.png000066400000000000000000000010141271214516700166740ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8QCtG_!d),E/JH&kc!0SW ׳*kDp=9?犪?e=p 8`BUG@m<_F62l6|A|S~&x0'aa1F}lum3?}m\n.Zto2UEDISTV8j@ynZGj6M=LVتu[|kǭ3IY=IENDB`phototonic-1.7.20/images/new.png000066400000000000000000000006731271214516700165470ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<8IDAT81j@ERJS¾@|@:Pt4t $ƅ ؅MᬑF? 3 E |:n\o!8_=RuR>0mj!mpRJnVoH) f(b+Z 5 !RKl֏0 Ssb>D``4`:.U2sB$0)뺎,Kf0u<(>0,bje+%_F YNIENDB`phototonic-1.7.20/images/new_bookmark.png000066400000000000000000000007111271214516700204250ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<FIDAT8œjQEϠ6m%~Zʇ$aXXmHe`>΀j lE؅I]yF3ýw*BD jL$2MS3I%QU'忣f9(j5S:G@G,y?K`+ 4 ou\VVջ؁X, .uЌx0(8`:>tۣf_L Q{w*"iNPL&l8͂4wEy盢虈Ey[.3y, 7 +;^ ë8wUuE\.T* 3N6'"[k˼Z>jbnl p\FCWAdahz=0 ¡60cv27O7^gVPד~NFUo3yBU/l U~s™IENDB`phototonic-1.7.20/images/new_tag.png000066400000000000000000000012121271214516700173700ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME%IDAT8˅OHa?nkV0Z vPnz;Aу"JN <,Gňl8:Zlěnt/Ru@ B"D|KN^~mMMm2sX$74q~o|i"ש8R^ 4*lÚT9U`X`XXBa$In䘝nm0;3ݪ9t#G,⨵黶D5[AFCB䦤Zl\'@69 sXi+Ģ"` 8H{Q*DdSD*QvGqtjaoY43Ax<>UJa2Lfꩈ8I$!"9nD$uХHRG^7g_ 6+˲R6du]?h4gpZT-*I58m{R(jlGb a=(2-6g%~_bi2KIENDB`phototonic-1.7.20/images/no_image.png000066400000000000000000000001111271214516700175170ustar00rootroot00000000000000PNG  IHDRĉIDATIENDB`phototonic-1.7.20/images/open.png000066400000000000000000000010531271214516700167100ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8AkQ;0]Z@pvUj.\g5O/  RuхP\Hf1T(pET`{΃DUg1p?DU]f=N|60xv߀KU"ʇ(IENDB`phototonic-1.7.20/images/paste.png000066400000000000000000000010741271214516700170660ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT81Q iL,6FטPә`Gk@B$l VLbf`{ C]CINq߽s{rN 4Q,V~5= w `'E7U"Z{_Xl6c9wpp0+ M`X,>>%`=ݶbq#c"&cY.C=xxNZy' ƘeպP՛ZDYۭ4͋x\:aZ-{/v`">57WU \IENDB`phototonic-1.7.20/images/phototonic.png000066400000000000000000000156111271214516700201420ustar00rootroot00000000000000PNG  IHDR00`n pHYs+;IDATX 0  b! @;   823857:CؽPTs%.DϤBE6=ICGO ")CL\✓0R Ͼ54:)1;{,2;  `%: -.7ds/17FIQaht (+/Tiq8=HTXa)(-#&,nz8:@ ;=EBJR                  u        !%       /B]         ,        # )AZ =,     eS/   /  &;Y         $F B1  2*   -   ,"  ";_      /(  !  2$ " ^ξ)+2M   ' ,E  0@Q(!&5&. 6AMô'ؽ )0'1ζİ/4?έk! ͭ=(J] $  ĭ~ ²Ƶ CUd$               61!  +H  % )8"!4-68:7;0¾ #*+%H:BA'@ *">FS#. #B2AE0<'Sq96# M$B2  a 0.W>+   c: B6& % 3vͦiZj>XUk'[p^gMXw1?yKvXRBQe߿l6CL&FDWTU5 CDjoXJ93vdzJTU=wG^{O0 !\>o7͞0 ÌF\.W1x< B9t:Kf.ϪsjoXAӴ2^MԓMTzpMe|>N_3?~\Tē3}kx p@0IENDB`phototonic-1.7.20/images/refresh.png000066400000000000000000000013071271214516700174070ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<DIDAT8=hq` m08T(H:dqn`ӴPCvB`)ҠvKRK&iӚOks.mHЃgx9%"% MDַ,"} 8'&&ܛkrPJSSS`PS333JR\.KP]׫B/J_ls\.J(t:Alaaa0bXw~BaH<nX.z\sssK*c"E))nCCC7j:N!"|¡PS8RJ ,`0xgggMӴ;vFOG؇f3W1M*0xBzJZm} {N{jv%NEDڦi~fi)@ f#"rxF'''Z- ЁZH"RTJYZZp8'U1gzz0d~...~v Xև6 ;LJ$\͓y"VJ4M*"^[[[o/]mLJq>`q3?bIENDB`phototonic-1.7.20/images/rotate_left.png000066400000000000000000000014411271214516700202600ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}KSaƟwMO9mSU`P+"/.SaxӼR5h YL Ӷ3c8VÝCn8n>ˈbtCDutWl69SԼ(cuK""TZئ_˲;==%_.m@o84ID,v(ZZj.ٹ~||^\\@UU榦&^k (s+++]FFFgd$I&\&f0333۟xvuu$<J|r'ё"F@[iii#I%Is&i<VU?wE%;;;6?TUET*2Ԫ<wƆH$ONN>RUt(?'z} X8^ ;<qM~`qqcT*f7>\r`DX on+-xc Bl.˧(UodtN244t8C&ID"x(%"Y/p /6\{eXcx,hIENDB`phototonic-1.7.20/images/rotate_right.png000066400000000000000000000014001271214516700204360ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<}IDAT8}KSq??,nj1,' %S` bBF=ٳ"ERI`b=(= Dt=RvyzHtz}?=_+T""OSp,ۦ 9@ dRR =_FR$K:ΆB3N1eY2 \۶,+x:@s:7h$\{rY^^ٸ~ kpNLLZ]]P(r\/vmhh苮|K޲,gū@4'`慅p8,555@ 0 1 C_N mD"A"`iii saNӴ;^4Mk.׀@;rާ3332??@]GGGW$199A4rhvwppVVVZ+++Ʀt]:;;o׷yֶmFHDv3)xnTTTPRReYaѾwL湈d)s8Z[[|>R.N& `>sR@#P,+0'83P2IENDB`phototonic-1.7.20/images/save.png000066400000000000000000000011251271214516700167050ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8jQ3f5 "Bt[ Mٸ1DBB@( Q"҅AƂR$ :ΔE=p\>9W D0OYYuX,\qğµ,8tuݰ+uw,{%"\B2,"rm{H$n{^@H)rLDn4um\L?<|sכ0F:; 0;6X.?fMF?S]6\𼻽yB47 ,(t"A2D1) gdx<pl6;R0Wj: `Aqπ?<bP^߃ J=V~]P:Fhl6Ru뺿^99ՓT*uQ~R PTW"b>3ZYIENDB`phototonic-1.7.20/images/save_as.png000066400000000000000000000011671271214516700173760ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ukZQP R$PdDJ)!4E(Tp떡%Ж%td) $С%]tqD88<__}4.||ppxVX?5p%"% 0NMt,1M1 G[8AY讔BӴߑH䩈2L"~zpmm-pqq?NRۑ\=uxx{o~y*^&">p zy~hPP(<BjW3LR4+J3ɤAOi0L,LT4\.H&7`7tXDRim~h4zWU7;b"!<7PRK|uooρHju/|oc_TE$,ˊ܋ղ$D"qckkZm۟|jjV`ƓD"qCD@333NLLJ-n\4S⯀h "=>>5ƀOD\q zVUVǭƸ:"||O܍p'[0:ѲSU}S]~ăTU}Hr]u{.+3݂}}}oǿj]X,(7|#=.xO|{yf~p]pIn :GeYIENDB`phototonic-1.7.20/images/settings.png000066400000000000000000000010071271214516700176060ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8@?Y&[#A!<@^@D E\8R BTV4e;e`w@D-P@K?oy@D7OkmkVep-"; Kzcгֆkh_Vs.)6&tpڼ}]Ьjk:RGwNz;@{}n|AH/z 1'{ddu>Q c3 _2ȗ4k[,d9ͥ6thT4֥FS0[d GR1 KV 죷KӰ33i6'1W`"?ί\ϳZG"Wٱ!0zJ=p`MGOͲ}ɝ H?h/?!IJ-i}IENDB`phototonic-1.7.20/images/tag_filter_off.png000066400000000000000000000007641271214516700207310ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  IDAT8˥1QֵX,R3?:Z$dj1& K)Y )h]jDdaDW3ק1~M 񘖯o!AF#! L&Rٶm+ V< fe$ va0M۶ 1jql6f3rBz.oT J4 L>Qv/=T̥R^b ,K)뺧B(bT*: <q~oZ>ZuB*5jvԓ3y@k?l6&,n?{-0 }=k!IENDB`phototonic-1.7.20/images/tag_filter_on.png000066400000000000000000000007541271214516700205720ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME 4*ːyIDAT8ՒM(q?yOIK"))9 ,\7Wܖ p.RDQk!mke橧_Oyo`=3h2CNbrRj;^7@bj5}-329d0y!f4@L|灢|zhP$% 9g*y4Y[Y"~yCEy1Օek5]0r!~OmЧ |[kSOϑ1wT= ^<[3`O=؋{nx(EQ221b2!CA}cS*Ҋ׺V=g%/L%Oo隒 lԃ!7Þ}N8ws:IENDB`phototonic-1.7.20/images/tag_grey.png000066400000000000000000000011041271214516700175450ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME eIDAT8ˍ?A#z@!e B/puZxxp6)")RewEE?yag!@x)f2\A 9N@wwUT1iL{ݾ}MӮ'BӁy4;iwI|>ur 8t]X,~r]ql6랈%hGut]'0p8z~D"߀R@`l63N}fsrI(LT:jWd7pqqv}F_U#>Z*~ŨT*T <!m۶ aE( u %@%=Ϊ؏aFw[ZZFl!eP&ߤHd>֑ɀ#L.J#*I&?*s$(q`QV(2(eb, ?nΉ~gMMꑺ/RW|+Wk٭Ĵ;{x|>f@&fCMӝg9Jh%[NI }yy;r@}$Ξ[eIENDB`phototonic-1.7.20/images/tag_yellow.png000066400000000000000000000010661271214516700201210ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME-`,GIDAT8ˍ?hSQ2b B88wcPwG!89AXx]:)BA)M05R$#64^ӈ}|{DUk%vTIPUEUX jp  jG =*頦6T͉"cGV#O_ILIӷdm+@Bm,RHOIt)ʘXEO` O^Lumr{{` OoFNlYn=TuOsC>5[\/D'J83KɈl,[+\ͯ:"0_1c81fn9УGOE+1s7]2(}wׯF1ΐYy1?C&pV&IENDB`phototonic-1.7.20/images/top.png000066400000000000000000000010601271214516700165470ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8@Y΍ W !HU]]T$6Ur A  *Slles2Ϸ.13.X2w8qgEQ|< j:p^O`2-Y;fWVcI9V/΍TmhIENDB`phototonic-1.7.20/images/tree.png000066400000000000000000000011421271214516700167050ustar00rootroot00000000000000PNG  IHDRw=)IDATx^VAkA$Y ^B HAlŃGxYP)ɋ*X"xKcV 6ٙyv?` dӃy7;QU$ NrGiҠ#BJ4RZr%JϮ❥[SG>>g"9H5od$;g1iַpydUe:4*~LT+E Ь4{ AA8kw#߁W,R+J;r~ZŠJP 7*{1h/^i\3AYϜUp,L^*~DIENDB`phototonic-1.7.20/images/up.png000066400000000000000000000010241271214516700163710ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8@ǿߘe!LTW\gY[`,DOIieaeceY0Wt{̘gHbx{Gp*@2p@ ૈc\<ϟy$%"%Iꦪ$I6QvB .,K)RH,ΕRgu]k(β,;'|w $gJGGQm\>9W"⦆xji5k6\8&^#E֛~?sZMH~}[kݶ]9 @Eq?/ ܮVOm~f0Ƽ&G "$_X,;z"{ৈ#T IMʟ!"=s=_c9v$x|'HL]/?QwIENDB`phototonic-1.7.20/images/zoom.png000066400000000000000000000013231271214516700167330ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<PIDAT8MHq?Ϧ3a`Ĝ|ËD60]"ACH xT`zK2cl"`Đ:ߧ/ȟ~w=|<QU.""- PUuar0{pCU>QUDd`}}Cggg`ee%3Mw 徾0VSk W,{oB[Ѹalv3}+fgg=+8U5NgW׍M4] 6@*7`ZpoonLlooJxa4} Hݙ~bF8j/===cccd29dw\CbT 4ȁV.|>ݮRTKKKYDPD~WB!K؀Gpq^!Ñ //!"tjuuUSϖay-9pD"D"kkk`MWDc$!tuu;nD&g ePIENDB`phototonic-1.7.20/images/zoom1.png000066400000000000000000000013701271214516700170160ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<uIDAT8OHqrv풤9tNJu3)aU 0MGNݾ]R×J(F( E$a 7 =IR?2L.IRkP)"?%"( /۵D"DbOOَsa|z/o L,{cYmYV[4ALyweeLNwt]]\nOk\NHs,[ڂ\.KcRPh;YT.s\43NٶnOr766R",8-4uwhm#"ض eY*؜444tB3\mmmnF@DJ~ߧiڣSSSѝt%IGMM82E$Wvp =00pv7 i+RjIӴa̋־@)n lyR4y0sssǿK@͑{ڪ`0D$.~GUCD~ooozK$6Pc뿧#TIENDB`phototonic-1.7.20/images/zoom_in.png000066400000000000000000000013641271214516700174260ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDAT8Kq_MgtÓ:eR0(IbBVQ/W 1QC)MG< :l!'1|x߼PRT 0窜l;u};ft]Oξ7DS"Rʽ񾩩ɳ5??, g===6MӖZ[[}O9+- GGG?H&`7'@[< ?!3HH"lzzzigg'+X*6 a\\.aa0dPpv{i2@iill<4߰ G:` `%n~/7/݃t)P(p8b1X,fޮz 8bKK{xxط qpp`)Jc1###.˙NT*uVQR*x^i." R<Ni| $^f%=2=/dteeENZsHf{HD6e^I+>~|>_(QJwrc9=$IENDB`phototonic-1.7.20/images/zoom_out.png000066400000000000000000000013271271214516700176260ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<TIDAT8Kq_mm˖SHAG 2@S! C ,uQ!0A&J`b9=|w!vtHE_xyJD8F)UǑx&'' mi HOOO]D(%"(<+++Fbbff&U,ݝwt]_x<|ĭH$!g2 pvv p4'LE"x|j^LLL,pMDj\>\N`0{t(KP444ln)'eYCDlf nlldvwwwJw ?55z422Ҧiږi?5M[4-;00ZWW04?@D2Jf` =I$ZZZ\L&cTJeEdXp𼫫shhvvvv tzk~~>iZ+47zLD '@R3 v=^HճLY8p8_ZZx<z!n Bh4*k3= MMM .Rx 8iIENDB`phototonic-1.7.20/imageview.cpp000066400000000000000000000663041271214516700164670ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov - oferkv@live.com * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include #include #include #include "global.h" #include "imageview.h" #define CLIPBOARD_IMAGE_NAME "clipboard.png" #define ROUND(x) ((int) ((x) + 0.5)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) ImageView::ImageView(QWidget *parent, MetadataCache *mdCache) : QWidget(parent) { this->mainWindow = parent; this->mdCache = mdCache; cursorIsHidden = false; moveImageLocked = false; mirrorLayout = LayNone; imageLabel = new QLabel; imageLabel->setScaledContents(true); isAnimation = false; anim = 0; QHBoxLayout *mainLayout = new QHBoxLayout(); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); mainLayout->addWidget(imageLabel); scrlArea = new QScrollArea; scrlArea->setContentsMargins(0, 0, 0, 0); scrlArea->setAlignment(Qt::AlignCenter); scrlArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrlArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrlArea->verticalScrollBar()->blockSignals(true); scrlArea->horizontalScrollBar()->blockSignals(true); scrlArea->setFrameStyle(0); scrlArea->setLayout(mainLayout); scrlArea->setWidgetResizable(true); setBgColor(); QVBoxLayout *scrollLayout = new QVBoxLayout; scrollLayout->setContentsMargins(0, 0, 0, 0); scrollLayout->setSpacing(0); scrollLayout->addWidget(scrlArea); this->setLayout(scrollLayout); infoLabel = new QLabel(this); infoLabel->setVisible(GData::enableImageInfoFS); infoLabel->setMargin(3); infoLabel->move(10, 10); infoLabel->setStyleSheet("QLabel { background-color : black; color : white; border-radius: 3px} "); feedbackLabel = new QLabel(this); feedbackLabel->setVisible(false); feedbackLabel->setMargin(3); feedbackLabel->setStyleSheet("QLabel { background-color : black; color : white; border-radius: 3px} "); QGraphicsOpacityEffect *infoEffect = new QGraphicsOpacityEffect; infoEffect-> setOpacity(0.5); infoLabel->setGraphicsEffect(infoEffect); QGraphicsOpacityEffect *feedbackEffect = new QGraphicsOpacityEffect; feedbackEffect->setOpacity(0.5); feedbackLabel->setGraphicsEffect(feedbackEffect); mouseMovementTimer = new QTimer(this); connect(mouseMovementTimer, SIGNAL(timeout()), this, SLOT(monitorCursorState())); GData::cropLeft = GData::cropTop = GData::cropWidth = GData::cropHeight = 0; GData::cropLeftPercent= GData::cropTopPercent = GData::cropWidthPercent = GData::cropHeightPercent = 0; GData::hueVal = 0; GData::saturationVal = 100; GData::lightnessVal = 100; GData::hueRedChannel = true; GData::hueGreenChannel = true; GData::hueBlueChannel = true; GData::contrastVal = 78; GData::brightVal = 100; GData::dialogLastX = GData::dialogLastY = 0; newImage = false; cropBand = 0; } static unsigned int getHeightByWidth(int imgWidth, int imgHeight, int newWidth) { float aspect; aspect = (float) imgWidth / (float) newWidth; return(imgHeight / aspect); } static unsigned int getWidthByHeight(int imgHeight, int imgWidth, int newHeight) { float aspect; aspect = (float) imgHeight / (float) newHeight; return(imgWidth / aspect); } static inline int calcZoom(int size) { return size * GData::imageZoomFactor; } void ImageView::resizeImage() { static bool busy = false; if (busy || (!imageLabel->pixmap() && !anim)) { return; } busy = true; int imageViewWidth = this->size().width(); int imageViewHeight = this->size().height(); QSize imgSize = isAnimation? anim->currentPixmap().size() : imageLabel->pixmap()->size(); if (tempDisableResize) { imgSize.scale(imgSize.width(), imgSize.height(), Qt::KeepAspectRatio); } else { switch(GData::zoomInFlags) { case Disable: if (imgSize.width() <= imageViewWidth && imgSize.height() <= imageViewHeight) { imgSize.scale( calcZoom(imgSize.width()), calcZoom(imgSize.height()), Qt::KeepAspectRatio); } break; case WidthNHeight: if (imgSize.width() <= imageViewWidth && imgSize.height() <= imageViewHeight) { imgSize.scale( calcZoom(imageViewWidth), calcZoom(imageViewHeight), Qt::KeepAspectRatio); } break; case Width: if (imgSize.width() <= imageViewWidth) { imgSize.scale( calcZoom(imageViewWidth), calcZoom(getHeightByWidth( imgSize.width(), imgSize.height(), imageViewWidth)), Qt::KeepAspectRatio); } break; case Height: if (imgSize.height() <= imageViewHeight) { imgSize.scale( calcZoom(getWidthByHeight( imgSize.height(), imgSize.width(), imageViewHeight)), calcZoom(imageViewHeight), Qt::KeepAspectRatio); } break; case Disprop: int newWidth = imgSize.width(), newHeight = imgSize.height(); if (newWidth <= imageViewWidth) { newWidth = imageViewWidth; } if (newHeight <= imageViewHeight) { newHeight = imageViewHeight; } imgSize.scale(calcZoom(newWidth), calcZoom(newHeight), Qt::IgnoreAspectRatio); break; } switch(GData::zoomOutFlags) { case Disable: if (imgSize.width() >= imageViewWidth || imgSize.height() >= imageViewHeight) { imgSize.scale( calcZoom(imgSize.width()), calcZoom(imgSize.height()), Qt::KeepAspectRatio); } break; case WidthNHeight: if (imgSize.width() >= imageViewWidth || imgSize.height() >= imageViewHeight) { imgSize.scale( calcZoom(imageViewWidth), calcZoom(imageViewHeight), Qt::KeepAspectRatio); } break; case Width: if (imgSize.width() >= imageViewWidth) { imgSize.scale( calcZoom(imageViewWidth), calcZoom(getHeightByWidth( imgSize.width(), imgSize.height(), imageViewWidth)), Qt::KeepAspectRatio); } break; case Height: if (imgSize.height() >= imageViewHeight) { imgSize.scale( calcZoom(getWidthByHeight( imgSize.height(), imgSize.width(), imageViewHeight)), calcZoom(imageViewHeight), Qt::KeepAspectRatio); } break; case Disprop: int newWidth = imgSize.width(), newHeight = imgSize.height(); if (newWidth >= imageViewWidth) { newWidth = imageViewWidth; } if (newHeight >= imageViewHeight) { newHeight = imageViewHeight; } imgSize.scale(calcZoom(newWidth), calcZoom(newHeight), Qt::IgnoreAspectRatio); break; } } imageLabel->setVisible(false); imageLabel->setFixedSize(imgSize); imageLabel->setVisible(true); centerImage(imgSize); busy = false; } void ImageView::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); resizeImage(); } void ImageView::showEvent(QShowEvent *event) { QWidget::showEvent(event); resizeImage(); } void ImageView::centerImage(QSize &imgSize) { int newX = (this->size().width() - imgSize.width()) / 2; int newY = (this->size().height() - imgSize.height()) / 2; if (newX != imageLabel->pos().x() || newY != imageLabel->pos().y()) { imageLabel->move(newX, newY); } } void ImageView::rotateByExifRotation(QImage &image, QString &imageFullPath) { QTransform trans; int orientation = mdCache->getImageOrientation(imageFullPath); switch(orientation) { case 2: image = image.mirrored(true, false); break; case 3: trans.rotate(180); image = image.transformed(trans, Qt::SmoothTransformation); break; case 4: image = image.mirrored(false, true); break; case 5: trans.rotate(90); image = image.transformed(trans, Qt::SmoothTransformation); image = image.mirrored(true, false); break; case 6: trans.rotate(90); image = image.transformed(trans, Qt::SmoothTransformation); break; case 7: trans.rotate(90); image = image.transformed(trans, Qt::SmoothTransformation); image = image.mirrored(false, true); break; case 8: trans.rotate(270); image = image.transformed(trans, Qt::SmoothTransformation); break; } } void ImageView::transform() { if (GData::exifRotationEnabled) { rotateByExifRotation(displayImage, currentImageFullPath); } if (GData::rotation) { QTransform trans; trans.rotate(GData::rotation); displayImage = displayImage.transformed(trans, Qt::SmoothTransformation); } if (GData::flipH || GData::flipV) { displayImage = displayImage.mirrored(GData::flipH, GData::flipV); } int cropLeftPercentPixels = 0, cropTopPercentPixels = 0, cropWidthPercentPixels = 0, cropHeightPercentPixels = 0; bool croppingOn = false; if (GData::cropLeftPercent || GData::cropTopPercent || GData::cropWidthPercent || GData::cropHeightPercent) { croppingOn = true; cropLeftPercentPixels = (displayImage.width() * GData::cropLeftPercent) / 100; cropTopPercentPixels = (displayImage.height() * GData::cropTopPercent) / 100; cropWidthPercentPixels = (displayImage.width() * GData::cropWidthPercent) / 100; cropHeightPercentPixels = (displayImage.height() * GData::cropHeightPercent) / 100; } if (GData::cropLeft || GData::cropTop || GData::cropWidth || GData::cropHeight) { displayImage = displayImage.copy( GData::cropLeft + cropLeftPercentPixels, GData::cropTop + cropTopPercentPixels, displayImage.width() - GData::cropLeft - GData::cropWidth - cropLeftPercentPixels - cropWidthPercentPixels, displayImage.height() - GData::cropTop - GData::cropHeight - cropTopPercentPixels - cropHeightPercentPixels); } else { if (croppingOn) { displayImage = displayImage.copy( cropLeftPercentPixels, cropTopPercentPixels, displayImage.width() - cropLeftPercentPixels - cropWidthPercentPixels, displayImage.height() - cropTopPercentPixels - cropHeightPercentPixels); } } } void ImageView::mirror() { switch(mirrorLayout) { case LayDual: { mirrorImage = QImage(displayImage.width() * 2, displayImage.height(), QImage::QImage::Format_ARGB32); QPainter painter(&mirrorImage); painter.drawImage(0, 0, displayImage); painter.drawImage(displayImage.width(), 0, displayImage.mirrored(true, false)); break; } case LayTriple: { mirrorImage = QImage(displayImage.width() * 3, displayImage.height(), QImage::QImage::Format_ARGB32); QPainter painter(&mirrorImage); painter.drawImage(0, 0, displayImage); painter.drawImage(displayImage.width(), 0, displayImage.mirrored(true, false)); painter.drawImage(displayImage.width() * 2, 0, displayImage.mirrored(false, false)); break; } case LayQuad: { mirrorImage = QImage(displayImage.width() * 2, displayImage.height() * 2, QImage::QImage::Format_ARGB32); QPainter painter(&mirrorImage); painter.drawImage(0, 0, displayImage); painter.drawImage(displayImage.width(), 0, displayImage.mirrored(true, false)); painter.drawImage(0, displayImage.height(), displayImage.mirrored(false, true)); painter.drawImage(displayImage.width(), displayImage.height(), displayImage.mirrored(true, true)); break; } case LayVDual: { mirrorImage = QImage(displayImage.width(), displayImage.height() * 2, QImage::QImage::Format_ARGB32); QPainter painter(&mirrorImage); painter.drawImage(0, 0, displayImage); painter.drawImage(0, displayImage.height(), displayImage.mirrored(false, true)); break; } } displayImage = mirrorImage; } static inline int bound0To255(int val) { return ((val > 255)? 255 : (val < 0)? 0 : val); } static inline int hslValue(double n1, double n2, double hue) { double value; if (hue > 255) { hue -= 255; } else if (hue < 0) { hue += 255; } if (hue < 42.5) { value = n1 + (n2 - n1) * (hue / 42.5); } else if (hue < 127.5) { value = n2; } else if (hue < 170) { value = n1 + (n2 - n1) * ((170 - hue) / 42.5); } else { value = n1; } return ROUND(value * 255.0); } void rgbToHsl(int r, int g, int b, unsigned char *hue, unsigned char *sat, unsigned char *light) { double h, s, l; int min, max; int delta; if (r > g) { max = MAX(r, b); min = MIN(g, b); } else { max = MAX(g, b); min = MIN(r, b); } l = (max + min) / 2.0; if (max == min) { s = 0.0; h = 0.0; } else { delta = (max - min); if (l < 128) { s = 255 * (double) delta / (double) (max + min); } else { s = 255 * (double) delta / (double) (511 - max - min); } if (r == max) { h = (g - b) / (double) delta; } else if (g == max) { h = 2 + (b - r) / (double) delta; } else { h = 4 + (r - g) / (double) delta; } h = h * 42.5; if (h < 0) { h += 255; } else if (h > 255) { h -= 255; } } *hue = ROUND(h); *sat = ROUND(s); *light = ROUND(l); } void hslToRgb(double h, double s, double l, unsigned char *red, unsigned char *green, unsigned char *blue) { if (s == 0) { /* achromatic case */ *red = l; *green = l; *blue = l; } else { double m1, m2; if (l < 128) m2 = (l * (255 + s)) / 65025.0; else m2 = (l + s - (l * s) / 255.0) / 255.0; m1 = (l / 127.5) - m2; /* chromatic case */ *red = hslValue(m1, m2, h + 85); *green = hslValue(m1, m2, h); *blue = hslValue(m1, m2, h - 85); } } void ImageView::colorize() { int y, x; unsigned char hr, hg, hb; int r, g, b; QRgb *line; unsigned char h, s, l; static unsigned char contrastTransform[256]; static unsigned char brightTransform[256]; bool hasAlpha = displayImage.hasAlphaChannel(); if (displayImage.colorCount()) { displayImage = displayImage.convertToFormat(QImage::Format_RGB32); } int i; float contrast = ((float)GData::contrastVal / 100.0); float brightness = ((float)GData::brightVal / 100.0); for(i = 0; i < 256; ++i) { if (i < (int)(128.0f + 128.0f * tan(contrast)) && i > (int)(128.0f - 128.0f * tan(contrast))) { contrastTransform[i] = (i - 128) / tan(contrast) + 128; } else if (i >= (int)(128.0f + 128.0f * tan(contrast))) { contrastTransform[i] = 255; } else { contrastTransform[i] = 0; } } for (i = 0; i < 256; ++i) { brightTransform[i] = MIN(255,(int)((255.0 * pow(i / 255.0, 1.0 / brightness)) + 0.5)); } for(y = 0; y < displayImage.height(); ++y) { line = (QRgb *)displayImage.scanLine(y); for(x = 0; x < displayImage.width(); ++x) { r = GData::rNegateEnabled? bound0To255(255 - qRed(line[x])) : qRed(line[x]); g = GData::gNegateEnabled? bound0To255(255 - qGreen(line[x])) : qGreen(line[x]); b = GData::bNegateEnabled? bound0To255(255 - qBlue(line[x])) : qBlue(line[x]); r = bound0To255((r * (GData::redVal + 100)) / 100); g = bound0To255((g * (GData::greenVal + 100)) / 100); b = bound0To255((b * (GData::blueVal + 100)) / 100); r = bound0To255(brightTransform[r]); g = bound0To255(brightTransform[g]); b = bound0To255(brightTransform[b]); r = bound0To255(contrastTransform[r]); g = bound0To255(contrastTransform[g]); b = bound0To255(contrastTransform[b]); rgbToHsl(r, g, b, &h, &s, &l); h = GData::colorizeEnabled? GData::hueVal : h + GData::hueVal; s = bound0To255(((s * GData::saturationVal) / 100)); l = bound0To255(((l * GData::lightnessVal) / 100)); hslToRgb(h, s, l, &hr, &hg, &hb); r = GData::hueRedChannel? hr : qRed(line[x]); g = GData::hueGreenChannel? hg : qGreen(line[x]); b = GData::hueBlueChannel? hb: qBlue(line[x]); if (hasAlpha) { line[x] = qRgba(r, g, b, qAlpha(line[x])); } else { line[x] = qRgb(r, g, b); } } } } void ImageView::refresh() { if (isAnimation) { return; } if (GData::scaledWidth) { displayImage = origImage.scaled(GData::scaledWidth, GData::scaledHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else { displayImage = origImage; } transform(); if (GData::colorsActive || GData::keepTransform) { colorize(); } if (mirrorLayout) { mirror(); } displayPixmap = QPixmap::fromImage(displayImage); imageLabel->setPixmap(displayPixmap); resizeImage(); } void ImageView::reload() { isAnimation = false; if (GData::enableImageInfoFS) { if (currentImageFullPath.left(1) == ":") { setInfo("No Image"); } else if (currentImageFullPath.isEmpty()) { setInfo("Clipboard"); } else { setInfo(QFileInfo(currentImageFullPath).fileName()); } } if (!GData::keepTransform) { GData::cropLeftPercent = GData::cropTopPercent = GData::cropWidthPercent = GData::cropHeightPercent = 0; GData::rotation = 0; GData::flipH = GData::flipV = false; } GData::scaledWidth = GData::scaledHeight = 0; GData::cropLeft = GData::cropTop = GData::cropWidth = GData::cropHeight = 0; if (newImage || currentImageFullPath.isEmpty()) { newImage = true; currentImageFullPath = CLIPBOARD_IMAGE_NAME; origImage.load(":/images/no_image.png"); displayImage = origImage; displayPixmap = QPixmap::fromImage(displayImage); imageLabel->setPixmap(displayPixmap); pasteImage(); mainWindow->setWindowTitle(tr("Clipboard") + " - Phototonic"); return; } imageReader.setFileName(currentImageFullPath); if (GData::enableAnimations && imageReader.supportsAnimation()) { if (anim) { delete anim; } anim = new QMovie(currentImageFullPath); if (anim->frameCount() > 1) { isAnimation = true; imageLabel->setMovie(anim); anim->start(); } } if (!isAnimation) { if (imageReader.size().isValid() && imageReader.read(&origImage)) { displayImage = origImage; transform(); if (GData::colorsActive || GData::keepTransform) { colorize(); } if (mirrorLayout) { mirror(); } displayPixmap = QPixmap::fromImage(displayImage); } else { displayPixmap = QIcon::fromTheme("image-missing", QIcon(":/images/error_image.png")).pixmap(128, 128); setInfo(imageReader.errorString()); } imageLabel->setPixmap(displayPixmap); } resizeImage(); } void ImageView::setInfo(QString infoString) { infoLabel->setText(infoString); infoLabel->adjustSize(); } void ImageView::unsetFeedback() { feedbackLabel->setText(""); feedbackLabel->setVisible(false); } void ImageView::setFeedback(QString feedbackString) { feedbackLabel->setText(feedbackString); feedbackLabel->setVisible(true); int margin = infoLabel->isVisible()? (infoLabel->height() + 15) : 10; feedbackLabel->move(10, margin); feedbackLabel->adjustSize(); QTimer::singleShot(3000, this, SLOT(unsetFeedback())); } void ImageView::loadImage(QString imageFileName) { newImage = false; tempDisableResize = false; currentImageFullPath = imageFileName; if (!GData::keepZoomFactor) { GData::imageZoomFactor = 1.0; } QApplication::processEvents(); reload(); } void ImageView::monitorCursorState() { static QPoint lastPos; if (QCursor::pos() != lastPos) { lastPos = QCursor::pos(); if (cursorIsHidden) { QApplication::restoreOverrideCursor(); cursorIsHidden = false; } } else { if (!cursorIsHidden) { QApplication::setOverrideCursor(Qt::BlankCursor); cursorIsHidden = true; } } } void ImageView::setCursorHiding(bool hide) { if (hide) { mouseMovementTimer->start(500); } else { mouseMovementTimer->stop(); if (cursorIsHidden) { QApplication::restoreOverrideCursor(); cursorIsHidden = false; } } } void ImageView::mouseDoubleClickEvent(QMouseEvent *event) { QWidget::mouseDoubleClickEvent(event); while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); } void ImageView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { if (event->modifiers() == Qt::ControlModifier) { cropOrigin = event->pos(); if (!cropBand) cropBand = new CropRubberBand(this); cropBand->show(); cropBand->setGeometry(QRect(cropOrigin , event->pos()).normalized()); } else { if (cropBand) { cropBand->hide(); } } setMouseMoveData(true, event->x(), event->y()); QApplication::setOverrideCursor(Qt::ClosedHandCursor); event->accept(); } QWidget::mousePressEvent(event); } void ImageView::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { setMouseMoveData(false, 0, 0); while (QApplication::overrideCursor()) { QApplication::restoreOverrideCursor(); } if (cropBand && cropBand->isVisible()) { setFeedback(tr("Selection size: ") + QString::number(cropBand->width()) + "x" + QString::number(cropBand->height())); } } QWidget::mouseReleaseEvent(event); } void ImageView::cropToSelection() { if (cropBand && cropBand->isVisible()) { QPoint bandTL = mapToGlobal(cropBand->geometry().topLeft()); QPoint bandBR = mapToGlobal(cropBand->geometry().bottomRight()); bandTL = imageLabel->mapFromGlobal(bandTL); bandBR = imageLabel->mapFromGlobal(bandBR); double scaledX = imageLabel->rect().width(); double scaledY = imageLabel->rect().height(); scaledX = displayPixmap.width() / scaledX; scaledY = displayPixmap.height() / scaledY; bandTL.setX(int(bandTL.x() * scaledX)); bandTL.setY(int(bandTL.y() * scaledY)); bandBR.setX(int(bandBR.x() * scaledX)); bandBR.setY(int(bandBR.y() * scaledY)); int cropLeft = bandTL.x(); int cropTop = bandTL.y(); int cropWidth = displayPixmap.width() - bandBR.x(); int cropHeight = displayPixmap.height() - bandBR.y(); if (cropLeft > 0) GData::cropLeft += cropLeft; if (cropTop > 0) GData::cropTop += cropTop; if (cropWidth > 0) GData::cropWidth += cropWidth; if (cropHeight > 0) GData::cropHeight += cropHeight; cropBand->hide(); refresh(); } else { QMessageBox msgBox; msgBox.warning(this, tr("No selection"), tr("Hold down the Ctrl key and select a region using the mouse.")); } } void ImageView::setMouseMoveData(bool lockMove, int lMouseX, int lMouseY) { moveImageLocked = lockMove; mouseX = lMouseX; mouseY = lMouseY; layoutX = imageLabel->pos().x(); layoutY = imageLabel->pos().y(); } void ImageView::mouseMoveEvent(QMouseEvent *event) { if (event->modifiers() == Qt::ControlModifier) { if (cropBand && cropBand->isVisible()) { cropBand->setGeometry(QRect(cropOrigin , event->pos()).normalized()); } } else { if (moveImageLocked) { int newX = layoutX + (event->pos().x() - mouseX); int newY = layoutY + (event->pos().y() - mouseY); bool needToMove = false; if (imageLabel->size().width() > size().width()) { if (newX > 0) { newX = 0; } else if (newX < (size().width() - imageLabel->size().width())) { newX = (size().width() - imageLabel->size().width()); } needToMove = true; } else { newX = layoutX; } if (imageLabel->size().height() > size().height()) { if (newY > 0) { newY = 0; } else if (newY < (size().height() - imageLabel->size().height())) { newY = (size().height() - imageLabel->size().height()); } needToMove = true; } else { newY = layoutY; } if (needToMove) { imageLabel->move(newX, newY); } } } } void ImageView::keyMoveEvent(int direction) { int newX = layoutX = imageLabel->pos().x(); int newY = layoutY = imageLabel->pos().y(); bool needToMove = false; switch (direction) { case MoveLeft: newX += 50; break; case MoveRight: newX -= 50; break; case MoveUp: newY += 50; break; case MoveDown: newY -= 50; break; } if (imageLabel->size().width() > size().width()) { if (newX > 0) { newX = 0; } else if (newX < (size().width() - imageLabel->size().width())) { newX = (size().width() - imageLabel->size().width()); } needToMove = true; } else { newX = layoutX; } if (imageLabel->size().height() > size().height()) { if (newY > 0) { newY = 0; } else if (newY < (size().height() - imageLabel->size().height())) { newY = (size().height() - imageLabel->size().height()); } needToMove = true; } else { newY = layoutY; } if (needToMove) { int i; switch (direction) { case MoveLeft: for (i = imageLabel->pos().x(); i <= newX; ++i) imageLabel->move(newX, newY); break; case MoveRight: for (i = imageLabel->pos().x(); i >= newX; --i) imageLabel->move(newX, newY); break; case MoveUp: for (i = imageLabel->pos().y(); i <= newY; ++i) imageLabel->move(newX, newY); break; case MoveDown: for (i = imageLabel->pos().y(); i >= newY; --i) imageLabel->move(newX, newY); break; } } } void ImageView::saveImage() { Exiv2::Image::AutoPtr image; bool exifError = false; if (newImage) { saveImageAs(); return; } setFeedback(tr("Saving...")); try { image = Exiv2::ImageFactory::open(currentImageFullPath.toStdString()); image->readMetadata(); } catch (Exiv2::Error &error) { exifError = true; } QImageReader imgReader(currentImageFullPath); if (!displayPixmap.save(currentImageFullPath, imgReader.format().toUpper(), GData::defaultSaveQuality)) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to save image.")); return; } if (!exifError) { try { image->writeMetadata(); } catch (Exiv2::Error &error) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to save Exif metadata.")); } } reload(); setFeedback(tr("Image saved.")); } void ImageView::saveImageAs() { Exiv2::Image::AutoPtr exifImage; Exiv2::Image::AutoPtr newExifImage; bool exifError = false; setCursorHiding(false); QString fileName = QFileDialog::getSaveFileName(this, tr("Save image as"), currentImageFullPath, tr("Images") + " (*.jpg *.jpeg *.jpe *.png *.bmp *.ppm *.pgm *.pbm *.xbm *.xpm)"); if (!fileName.isEmpty()) { try { exifImage = Exiv2::ImageFactory::open(currentImageFullPath.toStdString()); exifImage->readMetadata(); } catch (Exiv2::Error &error) { exifError = true; } if (!displayPixmap.save(fileName, 0, GData::defaultSaveQuality)) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to save image.")); } else { if (!exifError) { try { newExifImage = Exiv2::ImageFactory::open(fileName.toStdString()); newExifImage->setMetadata(*exifImage); newExifImage->writeMetadata(); } catch (Exiv2::Error &error) { exifError = true; } } setFeedback(tr("Image saved.")); } } if (mainWindow->isFullScreen()) { setCursorHiding(true); } } void ImageView::contextMenuEvent(QContextMenuEvent *) { while (QApplication::overrideCursor()) QApplication::restoreOverrideCursor(); ImagePopUpMenu->exec(QCursor::pos()); } int ImageView::getImageWidthPreCropped() { return origImage.width(); } int ImageView::getImageHeightPreCropped() { return origImage.height(); } bool ImageView::isNewImage() { return newImage; } void ImageView::copyImage() { QApplication::clipboard()->setImage(displayImage); } void ImageView::pasteImage() { if (isAnimation) return; if (!QApplication::clipboard()->image().isNull()) { origImage = QApplication::clipboard()->image(); refresh(); } } void ImageView::setBgColor() { QString bgColor = "background: rgb(%1, %2, %3); "; bgColor = bgColor.arg(GData::backgroundColor.red()) .arg(GData::backgroundColor.green()) .arg(GData::backgroundColor.blue()); QString ss = "QWidget { " + bgColor + " }"; scrlArea->setStyleSheet(ss); } phototonic-1.7.20/imageview.h000066400000000000000000000055741271214516700161360ustar00rootroot00000000000000/* * Copyright (C) 2013 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef IMAGEVIEW_H #define IMAGEVIEW_H #include #include "croprubberband.h" #include "mdcache.h" class ImageView : public QWidget { Q_OBJECT public: bool tempDisableResize; int mirrorLayout; QString currentImageFullPath; QMenu *ImagePopUpMenu; QScrollArea *scrlArea; QLabel *infoLabel; CropRubberBand *cropBand; enum ZoomMethods { Disable = 0, WidthNHeight, Width, Height, Disprop }; enum MirrorLayouts { LayNone = 0, LayDual, LayTriple, LayQuad, LayVDual }; enum Movement { MoveUp = 0, MoveDown, MoveLeft, MoveRight }; ImageView(QWidget *parent, MetadataCache *mdCache); void loadImage(QString imageFileName); void resizeImage(); void setCursorHiding(bool hide); void refresh(); void refreshColors(); void reload(); int getImageWidthPreCropped(); int getImageHeightPreCropped(); bool isNewImage(); void keyMoveEvent(int direction); void rotateByExifRotation(QImage &image, QString &imageFullPath); void setInfo(QString infoString); void setFeedback(QString feedbackString); void setBgColor(); public slots: void monitorCursorState(); void saveImage(); void saveImageAs(); void copyImage(); void pasteImage(); void cropToSelection(); private slots: void unsetFeedback(); protected: void resizeEvent(QResizeEvent *event); void showEvent(QShowEvent *event); void mouseMoveEvent(QMouseEvent *event); void contextMenuEvent(QContextMenuEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); private: QWidget *mainWindow; QImageReader imageReader; QLabel *imageLabel; QPixmap displayPixmap; QImage origImage; QImage displayImage; QImage mirrorImage; QTimer *mouseMovementTimer; QMovie *anim; bool newImage; bool cursorIsHidden; bool moveImageLocked; int mouseX; int mouseY; int layoutX; int layoutY; bool isAnimation; QLabel *feedbackLabel; QPoint cropOrigin; MetadataCache *mdCache; void setMouseMoveData(bool lockMove, int lMouseX, int lMouseY); void centerImage(QSize &imgSize); void transform(); void mirror(); void colorize(); }; #endif // IMAGEVIEW_H phototonic-1.7.20/infoview.cpp000066400000000000000000000052311271214516700163300ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "infoview.h" InfoView::InfoView(QWidget *parent) : QTableView(parent) { setSelectionBehavior(QAbstractItemView::SelectItems); setSelectionMode(QAbstractItemView::ExtendedSelection); verticalHeader()->setVisible(false); verticalHeader()->setDefaultSectionSize(verticalHeader()->minimumSectionSize()); horizontalHeader()->setVisible(false); horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); setShowGrid(false); setEditTriggers(QAbstractItemView::NoEditTriggers); setSelectionBehavior(QAbstractItemView::SelectRows); setTabKeyNavigation(false); infoModel = new QStandardItemModel(this); setModel(infoModel); // InfoView menu infoMenu = new QMenu(""); copyAction = new QAction(tr("Copy"), this); connect(copyAction, SIGNAL(triggered()), this, SLOT(copyEntry())); infoMenu->addAction(copyAction); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showInfoViewMenu(QPoint))); } void InfoView::showInfoViewMenu(QPoint pt) { selectedEntry = indexAt(pt); if (selectedEntry.isValid()) infoMenu->popup(viewport()->mapToGlobal(pt)); } void InfoView::clear() { infoModel->clear(); } void InfoView::addEntry(QString &key, QString &value) { int atRow = infoModel->rowCount(); QStandardItem *itemKey = new QStandardItem(key); infoModel->insertRow(atRow, itemKey); if (!value.isEmpty()) { QStandardItem *itemVal = new QStandardItem(value); itemVal->setToolTip(value); infoModel->setItem(atRow, 1, itemVal); } } void InfoView::addTitleEntry(QString title) { int atRow = infoModel->rowCount(); QStandardItem *itemKey = new QStandardItem(title); infoModel->insertRow(atRow, itemKey); QFont boldFont; boldFont.setBold(true); itemKey->setData(boldFont, Qt::FontRole); } void InfoView::copyEntry() { if (selectedEntry.isValid()) QApplication::clipboard()->setText(infoModel->itemFromIndex(selectedEntry)->toolTip()); } phototonic-1.7.20/infoview.h000066400000000000000000000023021271214516700157710ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef INFOVIEW_H #define INFOVIEW_H #include class InfoView : public QTableView { Q_OBJECT public: InfoView(QWidget *parent); void clear(); void addEntry(QString &key, QString &value); void addTitleEntry(QString title); public slots: void showInfoViewMenu(QPoint pt); void copyEntry(); private: QStandardItemModel *infoModel; QModelIndex selectedEntry; QMenu *infoMenu; QAction *copyAction; }; #endif // INFOVIEW_H phototonic-1.7.20/main.cpp000066400000000000000000000043041271214516700154260ustar00rootroot00000000000000/* * Copyright (C) 2013-2015 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "mainwindow.h" #include #include static void showHelp() { std::cout << VERSION << ", image viewer and organizer." << std::endl; std::cout << "Usage: phototonic [OPTION...] [FILE | DIRECTORY]" << std::endl << std::endl; std::cout << " -h, --help\t\t\tshow this help" << std::endl; std::cout << " -l, --lang=LANGUAGE\t\tuse a specific language" << std::endl; std::cout << std::endl << "Report bugs to oferkv@gmail.com" << std::endl; } int main(int argc, char *argv[]) { QApplication QApp(argc, argv); QStringList args = QCoreApplication::arguments(); QString fileOrDirectory, language; if (args.size() == 2) { if (args.at(1)[0] == '-') { showHelp(); return -1; } fileOrDirectory = args.at(1); } else if (args.size() == 3 || args.size() == 4) { if ((args.at(1) != "-l" && args.at(1) != "--lang")) { showHelp(); return -1; } language = args.at(2); if (args.size() == 4) { fileOrDirectory = args.at(3); } } if (!language.size()) { language = QLocale::system().name(); } QTranslator qtTranslator; qtTranslator.load("qt_" + language, QLibraryInfo::location(QLibraryInfo::TranslationsPath)); QApp.installTranslator(&qtTranslator); QTranslator phototonicTranslator; phototonicTranslator.load(":/translations/phototonic_" + language); QApp.installTranslator(&phototonicTranslator); Phototonic phototonic(fileOrDirectory); phototonic.show(); return QApp.exec(); } phototonic-1.7.20/mainwindow.cpp000066400000000000000000003331021271214516700166570ustar00rootroot00000000000000/* * Copyright (C) 2013-2015 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "dircompleter.h" #include "mainwindow.h" #include "global.h" #define THUMB_SIZE_MIN 50 #define THUMB_SIZE_MAX 300 Phototonic::Phototonic(QString fileOrDirectory, QWidget *parent) : QMainWindow(parent) { GData::appSettings = new QSettings("phototonic", "phototonic_103"); setDockOptions(QMainWindow::AllowNestedDocks); readSettings(); createThumbView(); createActions(); createMenus(); createToolBars(); createStatusBar(); createFSTree(); createBookmarks(); createImageTags(); createImageView(); updateExternalApps(); loadShortcuts(); setupDocks(); connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(updateActions())); restoreGeometry(GData::appSettings->value("Geometry").toByteArray()); restoreState(GData::appSettings->value("WindowState").toByteArray()); setWindowIcon(QIcon(":/images/phototonic.png")); setCentralWidget(thumbView); handleStartupArgs(fileOrDirectory); copyMoveToDialog = 0; colorsDialog = 0; cropDialog = 0; initComplete = true; thumbView->busy = false; currentHistoryIdx = -1; needHistoryRecord = true; interfaceDisabled = false; refreshThumbs(true); if (GData::layoutMode == thumbViewIdx) { thumbView->setFocus(Qt::OtherFocusReason); } if (cliImageLoaded) { QTimer::singleShot(100, this, SLOT(updateIndexByViewerImage())); } } void Phototonic::handleStartupArgs(QString fileOrDirectory) { cliImageLoaded = false; if (fileOrDirectory.size()) { QFileInfo cliFileOrDir(fileOrDirectory); if (cliFileOrDir.isDir()) { GData::currentViewDir = fileOrDirectory; cliImageLoaded = false; } else { GData::currentViewDir = cliFileOrDir.absolutePath(); cliFileName = GData::currentViewDir + QDir::separator() + cliFileOrDir.fileName(); cliImageLoaded = true; loadImagefromCli(); } } else { if (GData::startupDir == GData::specifiedDir) { GData::currentViewDir = GData::specifiedStartDir; } else if (GData::startupDir == GData::rememberLastDir) { GData::currentViewDir = GData::appSettings->value("lastDir").toString(); } } selectCurrentViewDir(); } bool Phototonic::event(QEvent *event) { if (event->type() == QEvent::ActivationChange || (GData::layoutMode == thumbViewIdx && event->type() == QEvent::MouseButtonRelease)) { thumbView->loadVisibleThumbs(); } return QMainWindow::event(event); } void Phototonic::createThumbView() { mdCache = new MetadataCache; thumbView = new ThumbView(this, mdCache); thumbView->thumbsSortFlags = (QDir::SortFlags)GData::appSettings->value("thumbsSortFlags").toInt(); thumbView->thumbsSortFlags |= QDir::IgnoreCase; connect(thumbView, SIGNAL(setStatus(QString)), this, SLOT(setStatus(QString))); connect(thumbView, SIGNAL(showBusy(bool)), this, SLOT(showBusyStatus(bool))); connect(thumbView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(updateActions())); iiDock = new QDockWidget(tr("Image Info"), this); iiDock->setObjectName("Image Info"); iiDock->setWidget(thumbView->infoView); connect(iiDock->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setIiDockVisibility())); connect(iiDock, SIGNAL(visibilityChanged(bool)), this, SLOT(setIiDockVisibility())); } void Phototonic::addMenuSeparator(QWidget *widget) { QAction *separator = new QAction(this); separator->setSeparator(true); widget->addAction(separator); } void Phototonic::createImageView() { imageView = new ImageView(this, mdCache); connect(saveAction, SIGNAL(triggered()), imageView, SLOT(saveImage())); connect(saveAsAction, SIGNAL(triggered()), imageView, SLOT(saveImageAs())); connect(copyImageAction, SIGNAL(triggered()), imageView, SLOT(copyImage())); connect(pasteImageAction, SIGNAL(triggered()), imageView, SLOT(pasteImage())); connect(cropToSelectionAct, SIGNAL(triggered()), imageView, SLOT(cropToSelection())); imageView->ImagePopUpMenu = new QMenu(); // Widget actions imageView->addAction(slideShowAction); imageView->addAction(nextImageAction); imageView->addAction(prevImageAction); imageView->addAction(firstImageAction); imageView->addAction(lastImageAction); imageView->addAction(randomImageAction); imageView->addAction(zoomInAct); imageView->addAction(zoomOutAct); imageView->addAction(origZoomAct); imageView->addAction(resetZoomAct); imageView->addAction(rotateRightAct); imageView->addAction(rotateLeftAct); imageView->addAction(freeRotateRightAct); imageView->addAction(freeRotateLeftAct); imageView->addAction(flipHAct); imageView->addAction(flipVAct); imageView->addAction(cropAct); imageView->addAction(cropToSelectionAct); imageView->addAction(resizeAct); imageView->addAction(saveAction); imageView->addAction(saveAsAction); imageView->addAction(copyImageAction); imageView->addAction(pasteImageAction); imageView->addAction(deleteAction); imageView->addAction(renameAction); imageView->addAction(closeImageAct); imageView->addAction(fullScreenAct); imageView->addAction(settingsAction); imageView->addAction(mirrorDisabledAct); imageView->addAction(mirrorDualAct); imageView->addAction(mirrorTripleAct); imageView->addAction(mirrorVDualAct); imageView->addAction(mirrorQuadAct); imageView->addAction(keepTransformAct); imageView->addAction(keepZoomAct); imageView->addAction(refreshAction); imageView->addAction(colorsAct); imageView->addAction(moveRightAct); imageView->addAction(moveLeftAct); imageView->addAction(moveUpAct); imageView->addAction(moveDownAct); imageView->addAction(showClipboardAction); imageView->addAction(copyToAction); imageView->addAction(moveToAction); imageView->addAction(resizeAct); imageView->addAction(openAction); imageView->addAction(exitAction); // Actions addMenuSeparator(imageView->ImagePopUpMenu); imageView->ImagePopUpMenu->addAction(nextImageAction); imageView->ImagePopUpMenu->addAction(prevImageAction); imageView->ImagePopUpMenu->addAction(firstImageAction); imageView->ImagePopUpMenu->addAction(lastImageAction); imageView->ImagePopUpMenu->addAction(randomImageAction); imageView->ImagePopUpMenu->addAction(slideShowAction); addMenuSeparator(imageView->ImagePopUpMenu); zoomSubMenu = new QMenu(tr("Zoom")); zoomSubMenuAct = new QAction(tr("Zoom"), this); zoomSubMenuAct->setIcon(QIcon::fromTheme("edit-find", QIcon(":/images/zoom.png"))); zoomSubMenuAct->setMenu(zoomSubMenu); imageView->ImagePopUpMenu->addAction(zoomSubMenuAct); zoomSubMenu->addAction(zoomInAct); zoomSubMenu->addAction(zoomOutAct); zoomSubMenu->addAction(origZoomAct); zoomSubMenu->addAction(resetZoomAct); addMenuSeparator(zoomSubMenu); zoomSubMenu->addAction(keepZoomAct); MirroringSubMenu = new QMenu(tr("Mirroring")); mirrorSubMenuAct = new QAction(tr("Mirroring"), this); mirrorSubMenuAct->setMenu(MirroringSubMenu); mirroringGroup = new QActionGroup(this); mirroringGroup->addAction(mirrorDisabledAct); mirroringGroup->addAction(mirrorDualAct); mirroringGroup->addAction(mirrorTripleAct); mirroringGroup->addAction(mirrorVDualAct); mirroringGroup->addAction(mirrorQuadAct); MirroringSubMenu->addActions(mirroringGroup->actions()); transformSubMenu = new QMenu(tr("Transform")); transformSubMenuAct = new QAction(tr("Transform"), this); transformSubMenuAct->setMenu(transformSubMenu); imageView->ImagePopUpMenu->addAction(resizeAct); imageView->ImagePopUpMenu->addAction(cropToSelectionAct); imageView->ImagePopUpMenu->addAction(transformSubMenuAct); transformSubMenu->addAction(colorsAct); transformSubMenu->addAction(rotateRightAct); transformSubMenu->addAction(rotateLeftAct); transformSubMenu->addAction(freeRotateRightAct); transformSubMenu->addAction(freeRotateLeftAct); transformSubMenu->addAction(flipHAct); transformSubMenu->addAction(flipVAct); transformSubMenu->addAction(cropAct); addMenuSeparator(transformSubMenu); transformSubMenu->addAction(keepTransformAct); imageView->ImagePopUpMenu->addAction(mirrorSubMenuAct); addMenuSeparator(imageView->ImagePopUpMenu); imageView->ImagePopUpMenu->addAction(copyToAction); imageView->ImagePopUpMenu->addAction(moveToAction); imageView->ImagePopUpMenu->addAction(saveAction); imageView->ImagePopUpMenu->addAction(saveAsAction); imageView->ImagePopUpMenu->addAction(renameAction); imageView->ImagePopUpMenu->addAction(deleteAction); imageView->ImagePopUpMenu->addAction(openWithMenuAct); addMenuSeparator(imageView->ImagePopUpMenu); viewSubMenu = new QMenu(tr("View")); viewSubMenuAct = new QAction(tr("View"), this); viewSubMenuAct->setMenu(viewSubMenu); imageView->ImagePopUpMenu->addAction(viewSubMenuAct); viewSubMenu->addAction(fullScreenAct); viewSubMenu->addAction(showClipboardAction); viewSubMenu->addAction(actShowViewerToolbars); viewSubMenu->addAction(refreshAction); imageView->ImagePopUpMenu->addAction(copyImageAction); imageView->ImagePopUpMenu->addAction(pasteImageAction); imageView->ImagePopUpMenu->addAction(closeImageAct); imageView->ImagePopUpMenu->addAction(exitAction); addMenuSeparator(imageView->ImagePopUpMenu); imageView->ImagePopUpMenu->addAction(settingsAction); imageView->setContextMenuPolicy(Qt::DefaultContextMenu); GData::isFullScreen = GData::appSettings->value("isFullScreen").toBool(); fullScreenAct->setChecked(GData::isFullScreen); thumbView->setImageView(imageView); } void Phototonic::createActions() { thumbsGoTopAct = new QAction(tr("Top"), this); thumbsGoTopAct->setObjectName("thumbsGoTop"); thumbsGoTopAct->setIcon(QIcon::fromTheme("go-top", QIcon(":/images/top.png"))); connect(thumbsGoTopAct, SIGNAL(triggered()), this, SLOT(goTop())); thumbsGoBottomAct = new QAction(tr("Bottom"), this); thumbsGoBottomAct->setObjectName("thumbsGoBottom"); thumbsGoBottomAct->setIcon(QIcon::fromTheme("go-bottom", QIcon(":/images/bottom.png"))); connect(thumbsGoBottomAct, SIGNAL(triggered()), this, SLOT(goBottom())); closeImageAct = new QAction(tr("Close Image"), this); closeImageAct->setObjectName("closeImage"); connect(closeImageAct, SIGNAL(triggered()), this, SLOT(hideViewer())); fullScreenAct = new QAction(tr("Full Screen"), this); fullScreenAct->setObjectName("fullScreen"); fullScreenAct->setCheckable(true); connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); settingsAction = new QAction(tr("Preferences"), this); settingsAction->setObjectName("settings"); settingsAction->setIcon(QIcon::fromTheme("preferences-other", QIcon(":/images/settings.png"))); connect(settingsAction, SIGNAL(triggered()), this, SLOT(showSettings())); exitAction = new QAction(tr("Exit"), this); exitAction->setObjectName("exit"); connect(exitAction, SIGNAL(triggered()), this, SLOT(close())); thumbsZoomInAct = new QAction(tr("Enlarge Thumbnails"), this); thumbsZoomInAct->setObjectName("thumbsZoomIn"); connect(thumbsZoomInAct, SIGNAL(triggered()), this, SLOT(thumbsZoomIn())); thumbsZoomInAct->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/images/zoom_in.png"))); if (thumbView->thumbSize == THUMB_SIZE_MAX) thumbsZoomInAct->setEnabled(false); thumbsZoomOutAct = new QAction(tr("Shrink Thumbnails"), this); thumbsZoomOutAct->setObjectName("thumbsZoomOut"); connect(thumbsZoomOutAct, SIGNAL(triggered()), this, SLOT(thumbsZoomOut())); thumbsZoomOutAct->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/images/zoom_out.png"))); if (thumbView->thumbSize == THUMB_SIZE_MIN) thumbsZoomOutAct->setEnabled(false); cutAction = new QAction(tr("Cut"), this); cutAction->setObjectName("cut"); cutAction->setIcon(QIcon::fromTheme("edit-cut", QIcon(":/images/cut.png"))); connect(cutAction, SIGNAL(triggered()), this, SLOT(cutThumbs())); cutAction->setEnabled(false); copyAction = new QAction(tr("Copy"), this); copyAction->setObjectName("copy"); copyAction->setIcon(QIcon::fromTheme("edit-copy", QIcon(":/images/copy.png"))); connect(copyAction, SIGNAL(triggered()), this, SLOT(copyThumbs())); copyAction->setEnabled(false); copyToAction = new QAction(tr("Copy to..."), this); copyToAction->setObjectName("copyTo"); connect(copyToAction, SIGNAL(triggered()), this, SLOT(copyImagesTo())); moveToAction = new QAction(tr("Move to..."), this); moveToAction->setObjectName("moveTo"); connect(moveToAction, SIGNAL(triggered()), this, SLOT(moveImagesTo())); deleteAction = new QAction(tr("Delete"), this); deleteAction->setObjectName("delete"); deleteAction->setIcon(QIcon::fromTheme("edit-delete", QIcon(":/images/delete.png"))); connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteOp())); saveAction = new QAction(tr("Save"), this); saveAction->setObjectName("save"); saveAction->setIcon(QIcon::fromTheme("document-save", QIcon(":/images/save.png"))); saveAsAction = new QAction(tr("Save As"), this); saveAsAction->setObjectName("saveAs"); saveAsAction->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/images/save_as.png"))); copyImageAction = new QAction(tr("Copy Image Data"), this); copyImageAction->setObjectName("copyImage"); pasteImageAction = new QAction(tr("Paste Image Data"), this); pasteImageAction->setObjectName("pasteImage"); renameAction = new QAction(tr("Rename"), this); renameAction->setObjectName("rename"); connect(renameAction, SIGNAL(triggered()), this, SLOT(rename())); selectAllAction = new QAction(tr("Select All"), this); selectAllAction->setObjectName("selectAll"); connect(selectAllAction, SIGNAL(triggered()), this, SLOT(selectAllThumbs())); aboutAction = new QAction(tr("About"), this); aboutAction->setObjectName("about"); aboutAction->setIcon(QIcon::fromTheme("help-about", QIcon(":/images/about.png"))); connect(aboutAction, SIGNAL(triggered()), this, SLOT(about())); // Sort actions actName = new QAction(tr("Name"), this); actName->setObjectName("name"); actTime = new QAction(tr("Time"), this); actTime->setObjectName("time"); actSize = new QAction(tr("Size"), this); actSize->setObjectName("size"); actType = new QAction(tr("Type"), this); actType->setObjectName("type"); actReverse = new QAction(tr("Reverse"), this); actReverse->setObjectName("reverse"); actName->setCheckable(true); actTime->setCheckable(true); actSize->setCheckable(true); actType->setCheckable(true); actReverse->setCheckable(true); connect(actName, SIGNAL(triggered()), this, SLOT(sortThumbnains())); connect(actTime, SIGNAL(triggered()), this, SLOT(sortThumbnains())); connect(actSize, SIGNAL(triggered()), this, SLOT(sortThumbnains())); connect(actType, SIGNAL(triggered()), this, SLOT(sortThumbnains())); connect(actReverse, SIGNAL(triggered()), this, SLOT(sortThumbnains())); if (thumbView->thumbsSortFlags & QDir::Time) actTime->setChecked(true); else if (thumbView->thumbsSortFlags & QDir::Size) actSize->setChecked(true); else if (thumbView->thumbsSortFlags & QDir::Type) actType->setChecked(true); else actName->setChecked(true); actReverse->setChecked(thumbView->thumbsSortFlags & QDir::Reversed); actShowHidden = new QAction(tr("Show Hidden Files"), this); actShowHidden->setObjectName("showHidden"); actShowHidden->setCheckable(true); actShowHidden->setChecked(GData::showHiddenFiles); connect(actShowHidden, SIGNAL(triggered()), this, SLOT(showHiddenFiles())); actShowLabels = new QAction(tr("Show Labels"), this); actShowLabels->setObjectName("showLabels"); actShowLabels->setCheckable(true); actShowLabels->setChecked(GData::showLabels); connect(actShowLabels, SIGNAL(triggered()), this, SLOT(showLabels())); actShowLabels->setEnabled(GData::thumbsLayout != ThumbView::Squares) ; actSmallIcons = new QAction(tr("Small Icons"), this); actSmallIcons->setObjectName("smallIcons"); actSmallIcons->setCheckable(true); actSmallIcons->setChecked(GData::smallIcons); connect(actSmallIcons, SIGNAL(triggered()), this, SLOT(setToolbarIconSize())); actLockDocks = new QAction(tr("Hide Dock Title Bars"), this); actLockDocks->setObjectName("lockDocks"); actLockDocks->setCheckable(true); actLockDocks->setChecked(GData::LockDocks); connect(actLockDocks, SIGNAL(triggered()), this, SLOT(lockDocks())); actShowViewerToolbars = new QAction(tr("Show Toolbar"), this); actShowViewerToolbars->setObjectName("showViewerToolbars"); actShowViewerToolbars->setCheckable(true); actShowViewerToolbars->setChecked(GData::imageToolbarFullScreen); connect(actShowViewerToolbars, SIGNAL(triggered()), this, SLOT(toggleImageToolbar())); actClassic = new QAction(tr("Classic Thumbs"), this); actClassic->setObjectName("classic"); actCompact = new QAction(tr("Compact"), this); actCompact->setObjectName("compact"); actSquarish = new QAction(tr("Squarish"), this); actSquarish->setObjectName("squarish"); connect(actClassic, SIGNAL(triggered()), this, SLOT(setClassicThumbs())); connect(actCompact, SIGNAL(triggered()), this, SLOT(setCompactThumbs())); connect(actSquarish, SIGNAL(triggered()), this, SLOT(setSquarishThumbs())); actClassic->setCheckable(true); actCompact->setCheckable(true); actSquarish->setCheckable(true); actClassic->setChecked(GData::thumbsLayout == ThumbView::Classic); actCompact->setChecked(GData::thumbsLayout == ThumbView::Compact); actSquarish->setChecked(GData::thumbsLayout == ThumbView::Squares); refreshAction = new QAction(tr("Reload"), this); refreshAction->setObjectName("refresh"); refreshAction->setIcon(QIcon::fromTheme("view-refresh", QIcon(":/images/refresh.png"))); connect(refreshAction, SIGNAL(triggered()), this, SLOT(reload())); subFoldersAction = new QAction(tr("Include Sub-folders"), this); subFoldersAction->setObjectName("subFolders"); subFoldersAction->setIcon(QIcon(":/images/tree.png")); subFoldersAction->setCheckable(true); connect(subFoldersAction, SIGNAL(triggered()), this, SLOT(setIncludeSubFolders())); pasteAction = new QAction(tr("Paste Here"), this); pasteAction->setObjectName("paste"); pasteAction->setIcon(QIcon::fromTheme("edit-paste", QIcon(":/images/paste.png"))); connect(pasteAction, SIGNAL(triggered()), this, SLOT(pasteThumbs())); pasteAction->setEnabled(false); createDirAction = new QAction(tr("New Folder"), this); createDirAction->setObjectName("createDir"); connect(createDirAction, SIGNAL(triggered()), this, SLOT(createSubDirectory())); createDirAction->setIcon(QIcon::fromTheme("folder-new", QIcon(":/images/new_folder.png"))); goBackAction = new QAction(tr("Back"), this); goBackAction->setObjectName("goBack"); goBackAction->setIcon(QIcon::fromTheme("go-previous", QIcon(":/images/back.png"))); connect(goBackAction, SIGNAL(triggered()), this, SLOT(goBack())); goBackAction->setEnabled(false); goFrwdAction = new QAction(tr("Forward"), this); goFrwdAction->setObjectName("goFrwd"); goFrwdAction->setIcon(QIcon::fromTheme("go-next", QIcon(":/images/next.png"))); connect(goFrwdAction, SIGNAL(triggered()), this, SLOT(goForward())); goFrwdAction->setEnabled(false); goUpAction = new QAction(tr("Go Up"), this); goUpAction->setObjectName("up"); goUpAction->setIcon(QIcon::fromTheme("go-up", QIcon(":/images/up.png"))); connect(goUpAction, SIGNAL(triggered()), this, SLOT(goUp())); goHomeAction = new QAction(tr("Home"), this); goHomeAction->setObjectName("home"); connect(goHomeAction, SIGNAL(triggered()), this, SLOT(goHome())); goHomeAction->setIcon(QIcon::fromTheme("go-home", QIcon(":/images/home.png"))); slideShowAction = new QAction(tr("Slide Show"), this); slideShowAction->setObjectName("slideShow"); connect(slideShowAction, SIGNAL(triggered()), this, SLOT(slideShow())); slideShowAction->setIcon(QIcon::fromTheme("media-playback-start", QIcon(":/images/play.png"))); nextImageAction = new QAction(tr("Next"), this); nextImageAction->setObjectName("nextImage"); nextImageAction->setIcon(QIcon::fromTheme("go-next", QIcon(":/images/next.png"))); connect(nextImageAction, SIGNAL(triggered()), this, SLOT(loadNextImage())); prevImageAction = new QAction(tr("Previous"), this); prevImageAction->setObjectName("prevImage"); prevImageAction->setIcon(QIcon::fromTheme("go-previous", QIcon(":/images/back.png"))); connect(prevImageAction, SIGNAL(triggered()), this, SLOT(loadPrevImage())); firstImageAction = new QAction(tr("First"), this); firstImageAction->setObjectName("firstImage"); firstImageAction->setIcon(QIcon::fromTheme("go-first", QIcon(":/images/first.png"))); connect(firstImageAction, SIGNAL(triggered()), this, SLOT(loadFirstImage())); lastImageAction = new QAction(tr("Last"), this); lastImageAction->setObjectName("lastImage"); lastImageAction->setIcon(QIcon::fromTheme("go-last", QIcon(":/images/last.png"))); connect(lastImageAction, SIGNAL(triggered()), this, SLOT(loadLastImage())); randomImageAction = new QAction(tr("Random"), this); randomImageAction->setObjectName("randomImage"); connect(randomImageAction, SIGNAL(triggered()), this, SLOT(loadRandomImage())); openAction = new QAction(tr("Open"), this); openAction->setObjectName("open"); openAction->setIcon(QIcon::fromTheme("document-open", QIcon(":/images/open.png"))); connect(openAction, SIGNAL(triggered()), this, SLOT(openOp())); showClipboardAction = new QAction(tr("Load Clipboard"), this); showClipboardAction->setObjectName("showClipboard"); showClipboardAction->setIcon(QIcon::fromTheme("insert-image", QIcon(":/images/new.png"))); connect(showClipboardAction, SIGNAL(triggered()), this, SLOT(newImage())); openWithSubMenu = new QMenu(tr("Open With...")); openWithMenuAct = new QAction(tr("Open With..."), this); openWithMenuAct->setObjectName("openWithMenu"); openWithMenuAct->setMenu(openWithSubMenu); chooseAppAct = new QAction(tr("Manage External Applications"), this); chooseAppAct->setObjectName("chooseApp"); connect(chooseAppAct, SIGNAL(triggered()), this, SLOT(chooseExternalApp())); addBookmarkAction = new QAction(tr("Add Bookmark"), this); addBookmarkAction->setObjectName("addBookmark"); addBookmarkAction->setIcon(QIcon(":/images/new_bookmark.png")); connect(addBookmarkAction, SIGNAL(triggered()), this, SLOT(addNewBookmark())); removeBookmarkAction = new QAction(tr("Remove Bookmark"), this); removeBookmarkAction->setObjectName("removeBookmark"); removeBookmarkAction->setIcon(QIcon::fromTheme("edit-delete", QIcon(":/images/delete.png"))); zoomOutAct = new QAction(tr("Zoom Out"), this); zoomOutAct->setObjectName("zoomOut"); connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut())); zoomOutAct->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/images/zoom_out.png"))); zoomInAct = new QAction(tr("Zoom In"), this); zoomInAct->setObjectName("zoomIn"); connect(zoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn())); zoomInAct->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/images/zoom_out.png"))); resetZoomAct = new QAction(tr("Reset Zoom"), this); resetZoomAct->setObjectName("resetZoom"); resetZoomAct->setIcon(QIcon::fromTheme("zoom-fit-best", QIcon(":/images/zoom.png"))); connect(resetZoomAct, SIGNAL(triggered()), this, SLOT(resetZoom())); origZoomAct = new QAction(tr("Original Size"), this); origZoomAct->setObjectName("origZoom"); origZoomAct->setIcon(QIcon::fromTheme("zoom-original", QIcon(":/images/zoom1.png"))); connect(origZoomAct, SIGNAL(triggered()), this, SLOT(origZoom())); keepZoomAct = new QAction(tr("Keep Zoom"), this); keepZoomAct->setObjectName("keepZoom"); keepZoomAct->setCheckable(true); connect(keepZoomAct, SIGNAL(triggered()), this, SLOT(keepZoom())); rotateLeftAct = new QAction(tr("Rotate 90 degree CCW"), this); rotateLeftAct->setObjectName("rotateLeft"); rotateLeftAct->setIcon(QIcon::fromTheme("object-rotate-left", QIcon(":/images/rotate_left.png"))); connect(rotateLeftAct, SIGNAL(triggered()), this, SLOT(rotateLeft())); rotateRightAct = new QAction(tr("Rotate 90 degree CW"), this); rotateRightAct->setObjectName("rotateRight"); rotateRightAct->setIcon(QIcon::fromTheme("object-rotate-right", QIcon(":/images/rotate_right.png"))); connect(rotateRightAct, SIGNAL(triggered()), this, SLOT(rotateRight())); flipHAct = new QAction(tr("Flip Horizontally"), this); flipHAct->setObjectName("flipH"); flipHAct->setIcon(QIcon::fromTheme("object-flip-horizontal", QIcon(":/images/flipH.png"))); connect(flipHAct, SIGNAL(triggered()), this, SLOT(flipHoriz())); flipVAct = new QAction(tr("Flip Vertically"), this); flipVAct->setObjectName("flipV"); flipVAct->setIcon(QIcon::fromTheme("object-flip-vertical", QIcon(":/images/flipV.png"))); connect(flipVAct, SIGNAL(triggered()), this, SLOT(flipVert())); cropAct = new QAction(tr("Cropping"), this); cropAct->setObjectName("crop"); cropAct->setIcon(QIcon(":/images/crop.png")); connect(cropAct, SIGNAL(triggered()), this, SLOT(cropImage())); cropToSelectionAct = new QAction(tr("Crop to Selection"), this); cropToSelectionAct->setObjectName("cropToSelection"); cropToSelectionAct->setIcon(QIcon(":/images/crop.png")); resizeAct = new QAction(tr("Scale Image"), this); resizeAct->setObjectName("resize"); resizeAct->setIcon(QIcon::fromTheme("transform-scale", QIcon(":/images/scale.png"))); connect(resizeAct, SIGNAL(triggered()), this, SLOT(scaleImage())); freeRotateLeftAct = new QAction(tr("Rotate 1 degree CCW"), this); freeRotateLeftAct->setObjectName("freeRotateLeft"); connect(freeRotateLeftAct, SIGNAL(triggered()), this, SLOT(freeRotateLeft())); freeRotateRightAct = new QAction(tr("Rotate 1 degree CW"), this); freeRotateRightAct->setObjectName("freeRotateRight"); connect(freeRotateRightAct, SIGNAL(triggered()), this, SLOT(freeRotateRight())); colorsAct = new QAction(tr("Colors"), this); colorsAct->setObjectName("colors"); connect(colorsAct, SIGNAL(triggered()), this, SLOT(showColorsDialog())); colorsAct->setIcon(QIcon(":/images/colors.png")); findDupesAction = new QAction(tr("Find Duplicate Images"), this); findDupesAction->setObjectName("findDupes"); findDupesAction->setIcon(QIcon(":/images/duplicates.png")); findDupesAction->setCheckable(true); connect(findDupesAction, SIGNAL(triggered()), this, SLOT(findDuplicateImages())); mirrorDisabledAct = new QAction(tr("Disable"), this); mirrorDisabledAct->setObjectName("mirrorDisabled"); mirrorDualAct = new QAction(tr("Dual"), this); mirrorDualAct->setObjectName("mirrorDual"); mirrorTripleAct = new QAction(tr("Triple"), this); mirrorTripleAct->setObjectName("mirrorTriple"); mirrorVDualAct = new QAction(tr("Dual Vertical"), this); mirrorVDualAct->setObjectName("mirrorVDual"); mirrorQuadAct = new QAction(tr("Quad"), this); mirrorQuadAct->setObjectName("mirrorQuad"); mirrorDisabledAct->setCheckable(true); mirrorDualAct->setCheckable(true); mirrorTripleAct->setCheckable(true); mirrorVDualAct->setCheckable(true); mirrorQuadAct->setCheckable(true); connect(mirrorDisabledAct, SIGNAL(triggered()), this, SLOT(setMirrorDisabled())); connect(mirrorDualAct, SIGNAL(triggered()), this, SLOT(setMirrorDual())); connect(mirrorTripleAct, SIGNAL(triggered()), this, SLOT(setMirrorTriple())); connect(mirrorVDualAct, SIGNAL(triggered()), this, SLOT(setMirrorVDual())); connect(mirrorQuadAct, SIGNAL(triggered()), this, SLOT(setMirrorQuad())); mirrorDisabledAct->setChecked(true); keepTransformAct = new QAction(tr("Lock Transformations"), this); keepTransformAct->setObjectName("keepTransform"); keepTransformAct->setCheckable(true); connect(keepTransformAct, SIGNAL(triggered()), this, SLOT(keepTransformClicked())); moveLeftAct = new QAction(tr("Move Left"), this); moveLeftAct->setObjectName("moveLeft"); connect(moveLeftAct, SIGNAL(triggered()), this, SLOT(moveLeft())); moveRightAct = new QAction(tr("Move Right"), this); moveRightAct->setObjectName("moveRight"); connect(moveRightAct, SIGNAL(triggered()), this, SLOT(moveRight())); moveUpAct = new QAction(tr("Move Up"), this); moveUpAct->setObjectName("moveUp"); connect(moveUpAct, SIGNAL(triggered()), this, SLOT(moveUp())); moveDownAct = new QAction(tr("Move Down"), this); moveDownAct->setObjectName("moveDown"); connect(moveDownAct, SIGNAL(triggered()), this, SLOT(moveDown())); invertSelectionAct = new QAction(tr("Invert Selection"), this); invertSelectionAct->setObjectName("invertSelection"); connect(invertSelectionAct, SIGNAL(triggered()), thumbView, SLOT(invertSelection())); filterImagesFocusAct = new QAction(tr("Filter by Name"), this); filterImagesFocusAct->setObjectName("filterImagesFocus"); connect(filterImagesFocusAct, SIGNAL(triggered()), this, SLOT(filterImagesFocus())); setPathFocusAct = new QAction(tr("Set Path"), this); setPathFocusAct->setObjectName("setPathFocus"); connect(setPathFocusAct, SIGNAL(triggered()), this, SLOT(setPathFocus())); } void Phototonic::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(subFoldersAction); fileMenu->addAction(createDirAction); fileMenu->addAction(showClipboardAction); fileMenu->addAction(addBookmarkAction); fileMenu->addSeparator(); fileMenu->addAction(exitAction); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(cutAction); editMenu->addAction(copyAction); editMenu->addAction(copyToAction); editMenu->addAction(moveToAction); editMenu->addAction(pasteAction); editMenu->addAction(renameAction); editMenu->addAction(deleteAction); editMenu->addSeparator(); editMenu->addAction(selectAllAction); editMenu->addAction(invertSelectionAct); addAction(filterImagesFocusAct); addAction(setPathFocusAct); editMenu->addSeparator(); editMenu->addAction(settingsAction); goMenu = menuBar()->addMenu(tr("&Go")); goMenu->addAction(goBackAction); goMenu->addAction(goFrwdAction); goMenu->addAction(goUpAction); goMenu->addAction(goHomeAction); goMenu->addSeparator(); goMenu->addAction(thumbsGoTopAct); goMenu->addAction(thumbsGoBottomAct); viewMenu = menuBar()->addMenu(tr("&View")); viewMenu->addAction(slideShowAction); viewMenu->addSeparator(); viewMenu->addAction(thumbsZoomInAct); viewMenu->addAction(thumbsZoomOutAct); sortMenu = viewMenu->addMenu(tr("Sort By")); sortTypesGroup = new QActionGroup(this); sortTypesGroup->addAction(actName); sortTypesGroup->addAction(actTime); sortTypesGroup->addAction(actSize); sortTypesGroup->addAction(actType); sortMenu->addActions(sortTypesGroup->actions()); sortMenu->addSeparator(); sortMenu->addAction(actReverse); viewMenu->addSeparator(); thumbLayoutsGroup = new QActionGroup(this); thumbLayoutsGroup->addAction(actClassic); thumbLayoutsGroup->addAction(actCompact); thumbLayoutsGroup->addAction(actSquarish); viewMenu->addActions(thumbLayoutsGroup->actions()); viewMenu->addSeparator(); viewMenu->addAction(actShowLabels); viewMenu->addAction(actShowHidden); viewMenu->addSeparator(); viewMenu->addAction(refreshAction); toolsMenu = menuBar()->addMenu(tr("&Tools")); toolsMenu->addAction(findDupesAction); menuBar()->addSeparator(); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAction); // thumbview context menu thumbView->addAction(openAction); thumbView->addAction(openWithMenuAct); thumbView->addAction(cutAction); thumbView->addAction(copyAction); thumbView->addAction(pasteAction); addMenuSeparator(thumbView); thumbView->addAction(copyToAction); thumbView->addAction(moveToAction); thumbView->addAction(renameAction); thumbView->addAction(deleteAction); addMenuSeparator(thumbView); thumbView->addAction(selectAllAction); thumbView->addAction(invertSelectionAct); thumbView->setContextMenuPolicy(Qt::ActionsContextMenu); menuBar()->setVisible(true); } void Phototonic::createToolBars() { /* Edit */ editToolBar = addToolBar(tr("Edit")); editToolBar->setObjectName("Edit"); editToolBar->addAction(cutAction); editToolBar->addAction(copyAction); editToolBar->addAction(pasteAction); editToolBar->addAction(deleteAction); editToolBar->addAction(showClipboardAction); connect(editToolBar->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setEditToolBarVisibility())); /* Navigation */ goToolBar = addToolBar(tr("Navigation")); goToolBar->setObjectName("Navigation"); goToolBar->addAction(goBackAction); goToolBar->addAction(goFrwdAction); goToolBar->addAction(goUpAction); goToolBar->addAction(goHomeAction); goToolBar->addAction(refreshAction); /* path bar */ pathBar = new QLineEdit; pathBar->setCompleter(new DirCompleter(pathBar)); pathBar->setMinimumWidth(200); pathBar->setMaximumWidth(300); connect(pathBar, SIGNAL(returnPressed()), this, SLOT(goPathBarDir())); goToolBar->addWidget(pathBar); goToolBar->addAction(subFoldersAction); goToolBar->addAction(findDupesAction); connect(goToolBar->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setGoToolBarVisibility())); /* View */ viewToolBar = addToolBar(tr("View")); viewToolBar->setObjectName("View"); viewToolBar->addAction(slideShowAction); viewToolBar->addAction(thumbsZoomInAct); viewToolBar->addAction(thumbsZoomOutAct); /* filter bar */ QAction *filterAct = new QAction(tr("Filter"), this); filterAct->setIcon(QIcon::fromTheme("edit-find", QIcon(":/images/zoom.png"))); connect(filterAct, SIGNAL(triggered()), this, SLOT(setThumbsFilter())); filterBar = new QLineEdit; filterBar->setMinimumWidth(100); filterBar->setMaximumWidth(200); connect(filterBar, SIGNAL(returnPressed()), this, SLOT(setThumbsFilter())); connect(filterBar, SIGNAL(textChanged(const QString&)), this, SLOT(clearThumbsFilter())); filterBar->setClearButtonEnabled(true); filterBar->addAction(filterAct, QLineEdit::LeadingPosition); viewToolBar->addSeparator(); viewToolBar->addWidget(filterBar); viewToolBar->addAction(settingsAction); connect(viewToolBar->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setViewToolBarVisibility())); /* image */ imageToolBar = addToolBar(tr("Image")); imageToolBar->setObjectName("Image"); imageToolBar->addAction(prevImageAction); imageToolBar->addAction(nextImageAction); imageToolBar->addAction(firstImageAction); imageToolBar->addAction(lastImageAction); imageToolBar->addAction(slideShowAction); imageToolBar->addSeparator(); imageToolBar->addAction(saveAction); imageToolBar->addAction(saveAsAction); imageToolBar->addAction(deleteAction); imageToolBar->addSeparator(); imageToolBar->addAction(zoomInAct); imageToolBar->addAction(zoomOutAct); imageToolBar->addAction(resetZoomAct); imageToolBar->addAction(origZoomAct); imageToolBar->addSeparator(); imageToolBar->addAction(resizeAct); imageToolBar->addAction(rotateRightAct); imageToolBar->addAction(rotateLeftAct); imageToolBar->addAction(flipHAct); imageToolBar->addAction(flipVAct); imageToolBar->addAction(cropAct); imageToolBar->addAction(colorsAct); imageToolBar->setVisible(false); connect(imageToolBar->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setImageToolBarVisibility())); setToolbarIconSize(); } void Phototonic::setToolbarIconSize() { int iconSize; if (initComplete) GData::smallIcons = actSmallIcons->isChecked(); iconSize = GData::smallIcons? 16 : 24; QSize iconQSize(iconSize, iconSize); editToolBar->setIconSize(iconQSize); goToolBar->setIconSize(iconQSize); viewToolBar->setIconSize(iconQSize); imageToolBar->setIconSize(iconQSize); } void Phototonic::createStatusBar() { stateLabel = new QLabel(tr("Initializing...")); statusBar()->addWidget(stateLabel); busyMovie = new QMovie(":/images/busy.gif"); busyLabel = new QLabel(this); busyLabel->setMovie(busyMovie); statusBar()->addWidget(busyLabel); busyLabel->setVisible(false); statusBar()->setStyleSheet("QStatusBar::item { border: 0px solid black }; "); } void Phototonic::createFSTree() { fsDock = new QDockWidget(tr("File System"), this); fsDock->setObjectName("File System"); fsTree = new FSTree(fsDock); fsDock->setWidget(fsTree); connect(fsDock->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setFsDockVisibility())); connect(fsDock, SIGNAL(visibilityChanged(bool)), this, SLOT(setFsDockVisibility())); addDockWidget(Qt::LeftDockWidgetArea, fsDock); // Context menu fsTree->addAction(openAction); fsTree->addAction(createDirAction); fsTree->addAction(renameAction); fsTree->addAction(deleteAction); addMenuSeparator(fsTree); fsTree->addAction(pasteAction); addMenuSeparator(fsTree); fsTree->addAction(openWithMenuAct); fsTree->addAction(addBookmarkAction); fsTree->setContextMenuPolicy(Qt::ActionsContextMenu); connect(fsTree, SIGNAL(clicked(const QModelIndex&)), this, SLOT(goSelectedDir(const QModelIndex &))); connect(fsTree->fsModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(checkDirState(const QModelIndex &, int, int))); connect(fsTree, SIGNAL(dropOp(Qt::KeyboardModifiers, bool, QString)), this, SLOT(dropOp(Qt::KeyboardModifiers, bool, QString))); fsTree->setCurrentIndex(fsTree->fsModel->index(QDir::currentPath())); connect(fsTree->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(updateActions())); } void Phototonic::createBookmarks() { bmDock = new QDockWidget(tr("Bookmarks"), this); bmDock->setObjectName("Bookmarks"); bookmarks = new BookMarks(bmDock); bmDock->setWidget(bookmarks); connect(bmDock->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setBmDockVisibility())); connect(bmDock, SIGNAL(visibilityChanged(bool)), this, SLOT(setBmDockVisibility())); connect(bookmarks, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(bookmarkClicked(QTreeWidgetItem *, int))); connect(removeBookmarkAction, SIGNAL(triggered()), bookmarks, SLOT(removeBookmark())); connect(bookmarks, SIGNAL(dropOp(Qt::KeyboardModifiers, bool, QString)), this, SLOT(dropOp(Qt::KeyboardModifiers, bool, QString))); connect(bookmarks, SIGNAL(itemSelectionChanged()), this, SLOT(updateActions())); addDockWidget(Qt::LeftDockWidgetArea, bmDock); bookmarks->addAction(pasteAction); bookmarks->addAction(removeBookmarkAction); bookmarks->setContextMenuPolicy(Qt::ActionsContextMenu); } void Phototonic::createImageTags() { tagsDock = new QDockWidget(tr("Tags"), this); tagsDock->setObjectName("Tags"); thumbView->imageTags = new ImageTags(tagsDock, thumbView, mdCache); tagsDock->setWidget(thumbView->imageTags); connect(tagsDock->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setTagsDockVisibility())); connect(tagsDock, SIGNAL(visibilityChanged(bool)), this, SLOT(setTagsDockVisibility())); addDockWidget(Qt::LeftDockWidgetArea, tagsDock); connect(thumbView->imageTags, SIGNAL(setStatus(QString)), this, SLOT(setStatus(QString))); connect(thumbView->imageTags, SIGNAL(reloadThumbs()), this, SLOT(reloadThumbsSlot())); connect(thumbView->imageTags->removeTagAction, SIGNAL(triggered()), this, SLOT(deleteOp())); } void Phototonic::sortThumbnains() { thumbView->thumbsSortFlags = QDir::IgnoreCase; if (actName->isChecked()) thumbView->thumbsSortFlags |= QDir::Name; else if (actTime->isChecked()) thumbView->thumbsSortFlags |= QDir::Time; else if (actSize->isChecked()) thumbView->thumbsSortFlags |= QDir::Size; else if (actType->isChecked()) thumbView->thumbsSortFlags |= QDir::Type; if (actReverse->isChecked()) thumbView->thumbsSortFlags |= QDir::Reversed; refreshThumbs(false); } void Phototonic::reload() { findDupesAction->setChecked(false); if (GData::layoutMode == thumbViewIdx) { refreshThumbs(false); } else { imageView->reload(); } } void Phototonic::setIncludeSubFolders() { findDupesAction->setChecked(false); GData::includeSubFolders = subFoldersAction->isChecked(); refreshThumbs(false); } void Phototonic::refreshThumbs(bool scrollToTop) { thumbView->setNeedScroll(scrollToTop); QTimer::singleShot(0, this, SLOT(reloadThumbsSlot())); } void Phototonic::setClassicThumbs() { GData::thumbsLayout = ThumbView::Classic; actShowLabels->setEnabled(true); refreshThumbs(false); } void Phototonic::setCompactThumbs() { GData::thumbsLayout = ThumbView::Compact; actShowLabels->setEnabled(true); refreshThumbs(false); } void Phototonic::setSquarishThumbs() { GData::thumbsLayout = ThumbView::Squares; actShowLabels->setEnabled(false); refreshThumbs(false); } void Phototonic::showHiddenFiles() { GData::showHiddenFiles = actShowHidden->isChecked(); fsTree->setModelFlags(); refreshThumbs(false); } void Phototonic::toggleImageToolbar() { imageToolBar->setVisible(actShowViewerToolbars->isChecked()); GData::imageToolbarFullScreen = actShowViewerToolbars->isChecked(); } void Phototonic::showLabels() { GData::showLabels = actShowLabels->isChecked(); refreshThumbs(false); } void Phototonic::about() { QString aboutString = "

" + QString(VERSION) + "

" + tr("

Image viewer and organizer

") + "Qt v" + QT_VERSION_STR + "

" + tr("Home page") + "

" + "

" + tr("Bug reports") + "

" + "

" + "" + "" + "" + QString::fromUtf8("") + "" + "" + QString::fromUtf8("") + QString::fromUtf8("") + "" + "" + "" + QString::fromUtf8("") + "" + QString::fromUtf8("") + QString::fromUtf8("") + "" + QString::fromUtf8("
Code:Ofer Kashayov(oferkv@gmail.com)
Christopher Roy Bratusek(nano@jpberlin.de)
Krzysztof Pyrkosz(pyrkosz@o2.pl)
Thomas L\u00FCbking(thomas.luebking@gmail.com)
Tung Le(https://github.com/everbot)
Peter Mattern(https://github.com/pmattern)
Bosnian:Dino Duratovi\u0107(dinomol@mail.com)
Croatian:Dino Duratovi\u0107(dinomol@mail.com)
Czech:Pavel Fric(pavelfric@seznam.cz)
French:Adrien Daugabel(adrien.d@mageialinux-online.org)
David Geiger(david.david@mageialinux-online.org)
R\u00E9mi Verschelde(akien@mageia.org)
German:Jonathan Hooverman(jonathan.hooverman@gmail.com)
Polish:Robert Wojew\u00F3dzki(robwoj44@poczta.onet.pl)
Krzysztof Pyrkosz(pyrkosz@o2.pl)
Russian:Ilya Alexandrovich(yast4ik@gmail.com)
Serbian:Dino Duratovi\u0107(dinomol@mail.com)
") + "

Phototonic is licensed under the GNU General Public License version 3

" + "

Copyright © 2013-2015 Ofer Kashayov

"; QMessageBox::about(this, tr("About") + " Phototonic", aboutString); } void Phototonic::filterImagesFocus() { if (GData::layoutMode == thumbViewIdx) { if (!viewToolBar->isVisible()) viewToolBar->setVisible(true); setViewToolBarVisibility(); filterBar->setFocus(Qt::OtherFocusReason); filterBar->selectAll(); } } void Phototonic::setPathFocus() { if (GData::layoutMode == thumbViewIdx) { if (!goToolBar->isVisible()) goToolBar->setVisible(true); setGoToolBarVisibility(); pathBar->setFocus(Qt::OtherFocusReason); pathBar->selectAll(); } } void Phototonic::cleanupSender() { delete QObject::sender(); } void Phototonic::externalAppError() { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to start external application.")); } void Phototonic::runExternalApp() { QString execCommand; QString selectedFileNames(""); execCommand = GData::externalApps[((QAction*) sender())->text()]; if (GData::layoutMode == imageViewIdx) { if (imageView->isNewImage()) { showNewImageWarning(this); return; } execCommand += " \"" + imageView->currentImageFullPath + "\""; } else { if (QApplication::focusWidget() == fsTree) { selectedFileNames += " \"" + getSelectedPath() + "\""; } else { QModelIndexList selectedIdxList = thumbView->selectionModel()->selectedIndexes(); if (selectedIdxList.size() < 1) { setStatus(tr("Invalid selection.")); return; } selectedFileNames += " "; for (int tn = selectedIdxList.size() - 1; tn >= 0 ; --tn) { selectedFileNames += "\"" + thumbView->thumbViewModel->item(selectedIdxList[tn].row())->data(thumbView->FileNameRole).toString(); if (tn) selectedFileNames += "\" "; } } execCommand += selectedFileNames; } QProcess *externalProcess = new QProcess(); connect(externalProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(cleanupSender())); connect(externalProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(externalAppError())); externalProcess->start(execCommand); } void Phototonic::updateExternalApps() { int actionNum = 0; QMapIterator eaIter(GData::externalApps); QList actionList = openWithSubMenu->actions(); if (!actionList.empty()) { for (int i = 0; i < actionList.size(); ++i) { QAction *action = actionList.at(i); if (action->isSeparator()) break; openWithSubMenu->removeAction(action); imageView->removeAction(action); delete action; } openWithSubMenu->clear(); } while (eaIter.hasNext()) { ++actionNum; eaIter.next(); QAction *extAppAct = new QAction(eaIter.key(), this); if (actionNum < 10) extAppAct->setShortcut(QKeySequence("Alt+" + QString::number(actionNum))); extAppAct->setIcon(QIcon::fromTheme(eaIter.key())); connect(extAppAct, SIGNAL(triggered()), this, SLOT(runExternalApp())); openWithSubMenu->addAction(extAppAct); imageView->addAction(extAppAct); } openWithSubMenu->addSeparator(); openWithSubMenu->addAction(chooseAppAct); } void Phototonic::chooseExternalApp() { AppMgmtDialog *dialog = new AppMgmtDialog(this); if (GData::slideShowActive) slideShow(); imageView->setCursorHiding(false); dialog->exec(); updateExternalApps(); delete(dialog); if (isFullScreen()) { imageView->setCursorHiding(true); } } void Phototonic::showSettings() { if (GData::slideShowActive) { slideShow(); } imageView->setCursorHiding(false); SettingsDialog *dialog = new SettingsDialog(this); if (dialog->exec()) { imageView->setBgColor(); thumbView->setThumbColors(); GData::imageZoomFactor = 1.0; imageView->infoLabel->setVisible(GData::enableImageInfoFS); if (GData::layoutMode == imageViewIdx) { imageView->reload(); needThumbsRefresh = true; } else { refreshThumbs(false); } } if (isFullScreen()) imageView->setCursorHiding(true); delete dialog; } void Phototonic::toggleFullScreen() { if (fullScreenAct->isChecked()) { shouldMaximize = isMaximized(); showFullScreen(); GData::isFullScreen = true; imageView->setCursorHiding(true); } else { showNormal(); if (shouldMaximize) showMaximized(); imageView->setCursorHiding(false); GData::isFullScreen = false; } } void Phototonic::selectAllThumbs() { thumbView->selectAll(); } void Phototonic::copyOrCutThumbs(bool copy) { GData::copyCutIdxList = thumbView->selectionModel()->selectedIndexes(); copyCutCount = GData::copyCutIdxList.size(); GData::copyCutFileList.clear(); for (int tn = 0; tn < copyCutCount; ++tn) { GData::copyCutFileList.append(thumbView->thumbViewModel->item(GData::copyCutIdxList[tn]. row())->data(thumbView->FileNameRole).toString()); } GData::copyOp = copy; pasteAction->setEnabled(true); } void Phototonic::cutThumbs() { copyOrCutThumbs(false); } void Phototonic::copyThumbs() { copyOrCutThumbs(true); } void Phototonic::copyImagesTo() { copyMoveImages(false); } void Phototonic::moveImagesTo() { copyMoveImages(true); } void Phototonic::copyMoveImages(bool move) { if (GData::slideShowActive) { slideShow(); } imageView->setCursorHiding(false); copyMoveToDialog = new CopyMoveToDialog(this, getSelectedPath(), move); if (copyMoveToDialog->exec()) { if (GData::layoutMode == thumbViewIdx) { if (copyMoveToDialog->copyOp) { copyThumbs(); } else { cutThumbs(); } pasteThumbs(); } else { if (imageView->isNewImage()) { showNewImageWarning(this); if (isFullScreen()) { imageView->setCursorHiding(true); } return; } QFileInfo fileInfo = QFileInfo(imageView->currentImageFullPath); QString fileName = fileInfo.fileName(); QString destFile = copyMoveToDialog->selectedPath + QDir::separator() + fileInfo.fileName(); int res = cpMvFile(copyMoveToDialog->copyOp, fileName, imageView->currentImageFullPath, destFile, copyMoveToDialog->selectedPath); if (!res) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to copy or move image.")); } else { if (!copyMoveToDialog->copyOp) { int currentRow = thumbView->getCurrentRow(); thumbView->thumbViewModel->removeRow(currentRow); loadCurrentImage(currentRow); } } } } bookmarks->reloadBookmarks(); delete(copyMoveToDialog); copyMoveToDialog = 0; if (isFullScreen()) { imageView->setCursorHiding(true); } } void Phototonic::thumbsZoomIn() { if (thumbView->thumbSize < THUMB_SIZE_MAX) { thumbView->thumbSize += 50; thumbsZoomOutAct->setEnabled(true); if (thumbView->thumbSize == THUMB_SIZE_MAX) thumbsZoomInAct->setEnabled(false); refreshThumbs(false); } } void Phototonic::thumbsZoomOut() { if (thumbView->thumbSize > THUMB_SIZE_MIN) { thumbView->thumbSize -= 50; thumbsZoomInAct->setEnabled(true); if (thumbView->thumbSize == THUMB_SIZE_MIN) thumbsZoomOutAct->setEnabled(false); refreshThumbs(false); } } void Phototonic::zoomOut() { if (GData::imageZoomFactor <= 4.0 && GData::imageZoomFactor > 0.25) { GData::imageZoomFactor -= 0.25; } else if (GData::imageZoomFactor <= 8.0 && GData::imageZoomFactor >= 4.0) { GData::imageZoomFactor -= 0.50; } else if (GData::imageZoomFactor <= 16.0 && GData::imageZoomFactor >= 8.0) { GData::imageZoomFactor -= 1.0; } else { imageView->setFeedback(tr("Minimum zoom")); return; } imageView->tempDisableResize = false; imageView->resizeImage(); imageView->setFeedback(tr("Zoom %1%").arg(QString::number(GData::imageZoomFactor * 100))); } void Phototonic::zoomIn() { if (GData::imageZoomFactor < 4.0 && GData::imageZoomFactor >= 0.25) { GData::imageZoomFactor += 0.25; } else if (GData::imageZoomFactor < 8.0 && GData::imageZoomFactor >= 4.0) { GData::imageZoomFactor += 0.50; } else if (GData::imageZoomFactor < 16.0 && GData::imageZoomFactor >= 8.0) { GData::imageZoomFactor += 1.00; } else { imageView->setFeedback(tr("Maximum zoom")); return; } imageView->tempDisableResize = false; imageView->resizeImage(); imageView->setFeedback(tr("Zoom %1%").arg(QString::number(GData::imageZoomFactor * 100))); } void Phototonic::resetZoom() { GData::imageZoomFactor = 1.0; imageView->tempDisableResize = false; imageView->resizeImage(); imageView->setFeedback(tr("Zoom Reset")); } void Phototonic::origZoom() { GData::imageZoomFactor = 1.0; imageView->tempDisableResize = true; imageView->resizeImage(); imageView->setFeedback(tr("Original Size")); } void Phototonic::keepZoom() { GData::keepZoomFactor = keepZoomAct->isChecked(); if (GData::keepZoomFactor) { imageView->setFeedback(tr("Zoom Locked")); } else { imageView->setFeedback(tr("Zoom Unlocked")); } } void Phototonic::keepTransformClicked() { GData::keepTransform = keepTransformAct->isChecked(); if (GData::keepTransform) { imageView->setFeedback(tr("Transformations Locked")); if (cropDialog) cropDialog->applyCrop(0); } else { GData::cropLeftPercent = GData::cropTopPercent = GData::cropWidthPercent = GData::cropHeightPercent = 0; imageView->setFeedback(tr("Transformations Unlocked")); } imageView->refresh(); } void Phototonic::rotateLeft() { GData::rotation -= 90; if (GData::rotation < 0) GData::rotation = 270; imageView->refresh(); imageView->setFeedback(tr("Rotation %1°").arg(QString::number(GData::rotation))); } void Phototonic::rotateRight() { GData::rotation += 90; if (GData::rotation > 270) GData::rotation = 0; imageView->refresh(); imageView->setFeedback(tr("Rotation %1°").arg(QString::number(GData::rotation))); } void Phototonic::flipVert() { GData::flipV = !GData::flipV; imageView->refresh(); imageView->setFeedback(GData::flipV? tr("Flipped Vertically") : tr("Unflipped Vertically")); } void Phototonic::flipHoriz() { GData::flipH = !GData::flipH; imageView->refresh(); imageView->setFeedback(GData::flipH? tr("Flipped Horizontally") : tr("Unflipped Horizontally")); } void Phototonic::cropImage() { if (GData::slideShowActive) slideShow(); if (!cropDialog) { cropDialog = new CropDialog(this, imageView); connect(cropDialog, SIGNAL(accepted()), this, SLOT(cleanupCropDialog())); connect(cropDialog, SIGNAL(rejected()), this, SLOT(cleanupCropDialog())); } cropDialog->show(); setInterfaceEnabled(false); cropDialog->applyCrop(0); } void Phototonic::scaleImage() { if (GData::slideShowActive) slideShow(); if (GData::layoutMode == thumbViewIdx && thumbView->selectionModel()->selectedIndexes().size() < 1) { setStatus(tr("No selection")); return; } resizeDialog = new ResizeDialog(this, imageView); connect(resizeDialog, SIGNAL(accepted()), this, SLOT(cleanupScaleDialog())); connect(resizeDialog, SIGNAL(rejected()), this, SLOT(cleanupScaleDialog())); resizeDialog->show(); setInterfaceEnabled(false); } void Phototonic::freeRotateLeft() { --GData::rotation; if (GData::rotation < 0) GData::rotation = 359; imageView->refresh(); imageView->setFeedback(tr("Rotation %1°").arg(QString::number(GData::rotation))); } void Phototonic::freeRotateRight() { ++GData::rotation; if (GData::rotation > 360) GData::rotation = 1; imageView->refresh(); imageView->setFeedback(tr("Rotation %1°").arg(QString::number(GData::rotation))); } void Phototonic::showColorsDialog() { if (GData::slideShowActive) slideShow(); if (!colorsDialog) { colorsDialog = new ColorsDialog(this, imageView); connect(colorsDialog, SIGNAL(accepted()), this, SLOT(cleanupColorsDialog())); connect(colorsDialog, SIGNAL(rejected()), this, SLOT(cleanupColorsDialog())); } GData::colorsActive = true; colorsDialog->show(); colorsDialog->applyColors(0); setInterfaceEnabled(false); } void Phototonic::moveRight() { imageView->keyMoveEvent(ImageView::MoveRight); } void Phototonic::moveLeft() { imageView->keyMoveEvent(ImageView::MoveLeft); } void Phototonic::moveUp() { imageView->keyMoveEvent(ImageView::MoveUp); } void Phototonic::moveDown() { imageView->keyMoveEvent(ImageView::MoveDown); } void Phototonic::setMirrorDisabled() { imageView->mirrorLayout = ImageView::LayNone; imageView->refresh(); imageView->setFeedback(tr("Mirroring Disabled")); } void Phototonic::setMirrorDual() { imageView->mirrorLayout = ImageView::LayDual; imageView->refresh(); imageView->setFeedback(tr("Mirroring: Dual")); } void Phototonic::setMirrorTriple() { imageView->mirrorLayout = ImageView::LayTriple; imageView->refresh(); imageView->setFeedback(tr("Mirroring: Triple")); } void Phototonic::setMirrorVDual() { imageView->mirrorLayout = ImageView::LayVDual; imageView->refresh(); imageView->setFeedback(tr("Mirroring: Dual Vertical")); } void Phototonic::setMirrorQuad() { imageView->mirrorLayout = ImageView::LayQuad; imageView->refresh(); imageView->setFeedback(tr("Mirroring: Quad")); } bool Phototonic::isValidPath(QString &path) { QDir checkPath(path); if (!checkPath.exists() || !checkPath.isReadable()) { return false; } return true; } void Phototonic::pasteThumbs() { if (!copyCutCount) return; QString destDir; if (copyMoveToDialog) destDir = copyMoveToDialog->selectedPath; else { if (QApplication::focusWidget() == bookmarks) { if (bookmarks->currentItem()) { destDir = bookmarks->currentItem()->toolTip(0); } } else { destDir = getSelectedPath(); } } if (!isValidPath(destDir)) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Can not copy or move to ") + destDir); selectCurrentViewDir(); return; } bool pasteInCurrDir = (GData::currentViewDir == destDir); QFileInfo fileInfo; if (!GData::copyOp && pasteInCurrDir) { for (int tn = 0; tn < GData::copyCutFileList.size(); ++tn) { fileInfo = QFileInfo(GData::copyCutFileList[tn]); if (fileInfo.absolutePath() == destDir) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Can not copy or move to the same folder")); return; } } } CpMvDialog *dialog = new CpMvDialog(this); dialog->exec(thumbView, destDir, pasteInCurrDir); if (pasteInCurrDir) { for (int tn = 0; tn < GData::copyCutFileList.size(); ++tn) { thumbView->addThumb(GData::copyCutFileList[tn]); } } else { int row = dialog->latestRow; if (thumbView->thumbViewModel->rowCount()) { if (row >= thumbView->thumbViewModel->rowCount()) { row = thumbView->thumbViewModel->rowCount() -1 ; } thumbView->setCurrentRow(row); thumbView->selectThumbByRow(row); } } QString state = QString((GData::copyOp? tr("Copied") : tr("Moved")) + " " + tr("%n image(s)", "", dialog->nfiles)); setStatus(state); delete(dialog); selectCurrentViewDir(); copyCutCount = 0; GData::copyCutIdxList.clear(); GData::copyCutFileList.clear(); pasteAction->setEnabled(false); thumbView->loadVisibleThumbs(); } void Phototonic::loadCurrentImage(int currentRow) { bool wrapImageListTmp = GData::wrapImageList; GData::wrapImageList = false; if (currentRow == thumbView->thumbViewModel->rowCount()) { thumbView->setCurrentRow(currentRow - 1); } if (thumbView->getNextRow() < 0 && currentRow > 0) { imageView->loadImage(thumbView->thumbViewModel->item(currentRow - 1)-> data(thumbView->FileNameRole).toString()); } else { if (thumbView->thumbViewModel->rowCount() == 0) { hideViewer(); refreshThumbs(true); return; } if (currentRow > (thumbView->thumbViewModel->rowCount() - 1)) currentRow = thumbView->thumbViewModel->rowCount() - 1; imageView->loadImage(thumbView->thumbViewModel->item(currentRow)-> data(thumbView->FileNameRole).toString()); } GData::wrapImageList = wrapImageListTmp; thumbView->setImageviewWindowTitle(); } void Phototonic::deleteViewerImage() { if (imageView->isNewImage()) { showNewImageWarning(this); return; } if (GData::slideShowActive) { slideShow(); } imageView->setCursorHiding(false); bool ok; QFileInfo fileInfo = QFileInfo(imageView->currentImageFullPath); QString fileName = fileInfo.fileName(); bool deleteConfirmed = true; if (GData::deleteConfirm) { QMessageBox msgBox; msgBox.setText(tr("Permanently delete") + " " + fileName); msgBox.setWindowTitle(tr("Delete image")); msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setButtonText(QMessageBox::Yes, tr("Yes")); msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel")); if (msgBox.exec() != QMessageBox::Yes) { deleteConfirmed = false; } } if (deleteConfirmed) { int currentRow = thumbView->getCurrentRow(); ok = QFile::remove(imageView->currentImageFullPath); if (ok) { thumbView->thumbViewModel->removeRow(currentRow); imageView->setFeedback(tr("Deleted ") + fileName); } else { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to delete image")); if (isFullScreen()) { imageView->setCursorHiding(true); } return; } loadCurrentImage(currentRow); } if (isFullScreen()) { imageView->setCursorHiding(true); } } void Phototonic::deleteOp() { if (QApplication::focusWidget() == thumbView->imageTags->tagsTree) { thumbView->imageTags->removeTag(); return; } if (QApplication::focusWidget() == bookmarks) { bookmarks->removeBookmark(); return; } if (QApplication::focusWidget() == fsTree) { deleteDir(); return; } if (GData::layoutMode == imageViewIdx) { deleteViewerImage(); return; } if (thumbView->selectionModel()->selectedIndexes().size() < 1) { setStatus(tr("No selection")); return; } // deleting from thumbnail viewer bool deleteConfirmed = true; if (GData::deleteConfirm) { QMessageBox msgBox; msgBox.setText(tr("Permanently delete selected images?")); msgBox.setWindowTitle(tr("Delete images")); msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Yes); msgBox.setButtonText(QMessageBox::Yes, tr("Yes")); msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel")); if (msgBox.exec() != QMessageBox::Yes) { deleteConfirmed = false; } } if (deleteConfirmed) { QModelIndexList indexesList; int nfiles = 0; bool ok; QList rows; int row; ProgressDialog *dialog = new ProgressDialog(this); dialog->show(); while((indexesList = thumbView->selectionModel()->selectedIndexes()).size()) { QString fileName = thumbView->thumbViewModel->item( indexesList.first().row())->data(thumbView->FileNameRole).toString(); dialog->opLabel->setText("Deleting " + fileName); ok = QFile::remove(fileName); ++nfiles; if (ok) { row = indexesList.first().row(); rows << row; thumbView->thumbViewModel->removeRow(row); } else { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to delete image.")); break; } if (thumbView->thumbViewModel->rowCount() > 0) { thumbView->setRowHidden(0 , false); } if (dialog->abortOp) { break; } } if (thumbView->thumbViewModel->rowCount()) { qSort(rows.begin(), rows.end()); row = rows.at(0); if (row >= thumbView->thumbViewModel->rowCount()) { row = thumbView->thumbViewModel->rowCount() -1 ; } thumbView->setCurrentRow(row); thumbView->selectThumbByRow(row); } dialog->close(); delete(dialog); QString state = QString(tr("Deleted") + " " + tr("%n image(s)", "", nfiles)); setStatus(state); } } void Phototonic::goTo(QString path) { findDupesAction->setChecked(false); thumbView->setNeedScroll(true); fsTree->setCurrentIndex(fsTree->fsModel->index(path)); GData::currentViewDir = path; refreshThumbs(true); } void Phototonic::goSelectedDir(const QModelIndex &idx) { findDupesAction->setChecked(false); thumbView->setNeedScroll(true); GData::currentViewDir = getSelectedPath(); refreshThumbs(true); fsTree->expand(idx); } void Phototonic::goPathBarDir() { findDupesAction->setChecked(false); thumbView->setNeedScroll(true); QDir checkPath(pathBar->text()); if (!checkPath.exists() || !checkPath.isReadable()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Invalid Path:") + " " + pathBar->text()); pathBar->setText(GData::currentViewDir); return; } GData::currentViewDir = pathBar->text(); refreshThumbs(true); selectCurrentViewDir(); } void Phototonic::bookmarkClicked(QTreeWidgetItem *item, int col) { goTo(item->toolTip(col)); } void Phototonic::setThumbsFilter() { thumbView->filterStr = filterBar->text(); refreshThumbs(true); } void Phototonic::clearThumbsFilter() { if (filterBar->text() == "") { thumbView->filterStr = filterBar->text(); refreshThumbs(true); } } void Phototonic::goBack() { if (currentHistoryIdx > 0) { needHistoryRecord = false; goTo(pathHistory.at(--currentHistoryIdx)); goFrwdAction->setEnabled(true); if (currentHistoryIdx == 0) goBackAction->setEnabled(false); } } void Phototonic::goForward() { if (currentHistoryIdx < pathHistory.size() - 1) { needHistoryRecord = false; goTo(pathHistory.at(++currentHistoryIdx)); if (currentHistoryIdx == (pathHistory.size() - 1)) goFrwdAction->setEnabled(false); } } void Phototonic::goUp() { QFileInfo fileInfo = QFileInfo(GData::currentViewDir); goTo(fileInfo.dir().absolutePath()); } void Phototonic::goHome() { goTo(QDir::homePath()); } void Phototonic::setCopyCutActions(bool setEnabled) { cutAction->setEnabled(setEnabled); copyAction->setEnabled(setEnabled); } void Phototonic::setDeleteAction(bool setEnabled) { deleteAction->setEnabled(setEnabled); } void Phototonic::updateActions() { if (QApplication::focusWidget() == thumbView) { setCopyCutActions(thumbView->selectionModel()->selectedIndexes().size()); setDeleteAction(thumbView->selectionModel()->selectedIndexes().size()); } else if (QApplication::focusWidget() == bookmarks) { setCopyCutActions(false); setDeleteAction(bookmarks->selectionModel()->selectedIndexes().size()); } else if (QApplication::focusWidget() == fsTree) { setCopyCutActions(false); setDeleteAction(fsTree->selectionModel()->selectedIndexes().size()); } else if (GData::layoutMode == imageViewIdx || QApplication::focusWidget() == imageView->scrlArea) { setCopyCutActions(false); setDeleteAction(true); } else { setCopyCutActions(false); setDeleteAction(false); } if (GData::layoutMode == imageViewIdx && !interfaceDisabled) { setViewerKeyEventsEnabled(true); fullScreenAct->setEnabled(true); closeImageAct->setEnabled(true); } else { if (QApplication::focusWidget() == imageView->scrlArea) { setViewerKeyEventsEnabled(true); fullScreenAct->setEnabled(false); closeImageAct->setEnabled(false); } else { setViewerKeyEventsEnabled(false); fullScreenAct->setEnabled(false); closeImageAct->setEnabled(false); } } } void Phototonic::writeSettings() { if (GData::layoutMode == thumbViewIdx) { GData::appSettings->setValue("Geometry", saveGeometry()); GData::appSettings->setValue("WindowState", saveState()); } GData::appSettings->setValue("thumbsSortFlags", (int)thumbView->thumbsSortFlags); GData::appSettings->setValue("thumbsZoomVal", (int)thumbView->thumbSize); GData::appSettings->setValue("isFullScreen", (bool)GData::isFullScreen); GData::appSettings->setValue("backgroundColor", GData::backgroundColor); GData::appSettings->setValue("backgroundThumbColor", GData::thumbsBackgroundColor); GData::appSettings->setValue("textThumbColor", GData::thumbsTextColor); GData::appSettings->setValue("thumbSpacing", (int)GData::thumbSpacing); GData::appSettings->setValue("thumbPagesReadahead", (int)GData::thumbPagesReadahead); GData::appSettings->setValue("thumbLayout", (int)GData::thumbsLayout); GData::appSettings->setValue("exitInsteadOfClose", (int)GData::exitInsteadOfClose); GData::appSettings->setValue("enableAnimations", (bool)GData::enableAnimations); GData::appSettings->setValue("exifRotationEnabled", (bool)GData::exifRotationEnabled); GData::appSettings->setValue("exifThumbRotationEnabled", (bool)GData::exifThumbRotationEnabled); GData::appSettings->setValue("reverseMouseBehavior", (bool)GData::reverseMouseBehavior); GData::appSettings->setValue("deleteConfirm", (bool)GData::deleteConfirm); GData::appSettings->setValue("showHiddenFiles", (bool)GData::showHiddenFiles); GData::appSettings->setValue("wrapImageList", (bool)GData::wrapImageList); GData::appSettings->setValue("imageZoomFactor", (float)GData::imageZoomFactor); GData::appSettings->setValue("shouldMaximize", (bool)isMaximized()); GData::appSettings->setValue("defaultSaveQuality", (int)GData::defaultSaveQuality); GData::appSettings->setValue("noEnlargeSmallThumb", (bool)GData::noEnlargeSmallThumb); GData::appSettings->setValue("slideShowDelay", (int)GData::slideShowDelay); GData::appSettings->setValue("slideShowRandom", (bool)GData::slideShowRandom); GData::appSettings->setValue("editToolBarVisible", (bool)editToolBarVisible); GData::appSettings->setValue("goToolBarVisible", (bool)goToolBarVisible); GData::appSettings->setValue("viewToolBarVisible", (bool)viewToolBarVisible); GData::appSettings->setValue("imageToolBarVisible", (bool)imageToolBarVisible); GData::appSettings->setValue("fsDockVisible", (bool)GData::fsDockVisible); GData::appSettings->setValue("iiDockVisible", (bool)GData::iiDockVisible); GData::appSettings->setValue("bmDockVisible", (bool)GData::bmDockVisible); GData::appSettings->setValue("pvDockVisible", (bool)GData::pvDockVisible); GData::appSettings->setValue("startupDir", (int)GData::startupDir); GData::appSettings->setValue("specifiedStartDir", GData::specifiedStartDir); GData::appSettings->setValue("thumbsBackImage", GData::thumbsBackImage); GData::appSettings->setValue("lastDir", GData::startupDir == GData::rememberLastDir? GData::currentViewDir: ""); GData::appSettings->setValue("enableImageInfoFS", (bool)GData::enableImageInfoFS); GData::appSettings->setValue("showLabels", (bool)GData::showLabels); GData::appSettings->setValue("smallIcons", (bool)GData::smallIcons); GData::appSettings->setValue("LockDocks", (bool)GData::LockDocks); GData::appSettings->setValue("imageToolbarFullScreen", (bool)GData::imageToolbarFullScreen); /* Action shortcuts */ GData::appSettings->beginGroup("Shortcuts"); QMapIterator scIter(GData::actionKeys); while (scIter.hasNext()) { scIter.next(); GData::appSettings->setValue(scIter.key(), scIter.value()->shortcut().toString()); } GData::appSettings->endGroup(); /* External apps */ GData::appSettings->beginGroup("ExternalApps"); GData::appSettings->remove(""); QMapIterator eaIter(GData::externalApps); while (eaIter.hasNext()) { eaIter.next(); GData::appSettings->setValue(eaIter.key(), eaIter.value()); } GData::appSettings->endGroup(); /* save bookmarks */ int idx = 0; GData::appSettings->beginGroup("CopyMoveToPaths"); GData::appSettings->remove(""); QSetIterator pathsIter(GData::bookmarkPaths); while (pathsIter.hasNext()) { GData::appSettings->setValue("path" + QString::number(++idx), pathsIter.next()); } GData::appSettings->endGroup(); /* save known Tags */ idx = 0; GData::appSettings->beginGroup("KnownTags"); GData::appSettings->remove(""); QSetIterator tagsIter(GData::knownTags); while (tagsIter.hasNext()) { GData::appSettings->setValue("tag" + QString::number(++idx), tagsIter.next()); } GData::appSettings->endGroup(); } void Phototonic::readSettings() { initComplete = false; needThumbsRefresh = false; if (!GData::appSettings->contains("thumbsZoomVal")) { resize(800, 600); GData::appSettings->setValue("thumbsSortFlags", (int)0); GData::appSettings->setValue("thumbsZoomVal", (int)150); GData::appSettings->setValue("isFullScreen", (bool)false); GData::appSettings->setValue("backgroundColor", QColor(25, 25, 25)); GData::appSettings->setValue("backgroundThumbColor", QColor(200, 200, 200)); GData::appSettings->setValue("textThumbColor", QColor(25, 25, 25)); GData::appSettings->setValue("thumbSpacing", (int)10); GData::appSettings->setValue("thumbPagesReadahead", (int)2); GData::appSettings->setValue("thumbLayout", (int)GData::thumbsLayout); GData::appSettings->setValue("zoomOutFlags", (int)1); GData::appSettings->setValue("zoomInFlags", (int)0); GData::appSettings->setValue("wrapImageList", (bool)false); GData::appSettings->setValue("exitInsteadOfClose", (int)0); GData::appSettings->setValue("imageZoomFactor", (float)1.0); GData::appSettings->setValue("defaultSaveQuality", (int)90); GData::appSettings->setValue("noEnlargeSmallThumb", (bool)true); GData::appSettings->setValue("enableAnimations", (bool)true); GData::appSettings->setValue("exifRotationEnabled", (bool)true); GData::appSettings->setValue("exifThumbRotationEnabled", (bool)false); GData::appSettings->setValue("reverseMouseBehavior", (bool)false); GData::appSettings->setValue("deleteConfirm", (bool)true); GData::appSettings->setValue("showHiddenFiles", (bool)false); GData::appSettings->setValue("slideShowDelay", (int)5); GData::appSettings->setValue("slideShowRandom", (bool)false); GData::appSettings->setValue("editToolBarVisible", (bool)true); GData::appSettings->setValue("goToolBarVisible", (bool)true); GData::appSettings->setValue("viewToolBarVisible", (bool)true); GData::appSettings->setValue("imageToolBarVisible", (bool)false); GData::appSettings->setValue("fsDockVisible", (bool)true); GData::appSettings->setValue("bmDockVisible", (bool)true); GData::appSettings->setValue("iiDockVisible", (bool)true); GData::appSettings->setValue("pvDockVisible", (bool)true); GData::appSettings->setValue("enableImageInfoFS", (bool)true); GData::appSettings->setValue("showLabels", (bool)true); GData::appSettings->setValue("smallIcons", (bool)false); GData::appSettings->setValue("LockDocks", (bool)true); GData::appSettings->setValue("imageToolbarFullScreen", (bool)false); GData::bookmarkPaths.insert(QDir::homePath()); } GData::backgroundColor = GData::appSettings->value("backgroundColor").value(); GData::exitInsteadOfClose = GData::appSettings->value("exitInsteadOfClose").toBool(); GData::enableAnimations = GData::appSettings->value("enableAnimations").toBool(); GData::exifRotationEnabled = GData::appSettings->value("exifRotationEnabled").toBool(); GData::exifThumbRotationEnabled = GData::appSettings->value("exifThumbRotationEnabled").toBool(); GData::reverseMouseBehavior = GData::appSettings->value("reverseMouseBehavior").toBool(); GData::deleteConfirm = GData::appSettings->value("deleteConfirm").toBool(); GData::showHiddenFiles = GData::appSettings->value("showHiddenFiles").toBool(); GData::wrapImageList = GData::appSettings->value("wrapImageList").toBool(); GData::imageZoomFactor = GData::appSettings->value("imageZoomFactor").toFloat(); GData::zoomOutFlags = GData::appSettings->value("zoomOutFlags").toInt(); GData::zoomInFlags = GData::appSettings->value("zoomInFlags").toInt(); GData::rotation = 0; GData::keepTransform = false; shouldMaximize = GData::appSettings->value("shouldMaximize").toBool(); GData::flipH = false; GData::flipV = false; GData::defaultSaveQuality = GData::appSettings->value("defaultSaveQuality").toInt(); GData::noEnlargeSmallThumb = GData::appSettings->value("noEnlargeSmallThumb").toBool(); GData::slideShowDelay = GData::appSettings->value("slideShowDelay").toInt(); GData::slideShowRandom = GData::appSettings->value("slideShowRandom").toBool(); GData::slideShowActive = false; editToolBarVisible = GData::appSettings->value("editToolBarVisible").toBool(); goToolBarVisible = GData::appSettings->value("goToolBarVisible").toBool(); viewToolBarVisible = GData::appSettings->value("viewToolBarVisible").toBool(); imageToolBarVisible = GData::appSettings->value("imageToolBarVisible").toBool(); GData::fsDockVisible = GData::appSettings->value("fsDockVisible").toBool(); GData::bmDockVisible = GData::appSettings->value("bmDockVisible").toBool(); GData::iiDockVisible = GData::appSettings->value("iiDockVisible").toBool(); GData::pvDockVisible = GData::appSettings->value("pvDockVisible").toBool(); GData::startupDir = (GData::StartupDir)GData::appSettings->value("startupDir").toInt(); GData::specifiedStartDir = GData::appSettings->value("specifiedStartDir").toString(); GData::thumbsBackImage = GData::appSettings->value("thumbsBackImage").toString(); GData::enableImageInfoFS = GData::appSettings->value("enableImageInfoFS").toBool(); GData::showLabels = GData::appSettings->value("showLabels").toBool(); GData::smallIcons = GData::appSettings->value("smallIcons").toBool(); GData::LockDocks = GData::appSettings->value("LockDocks").toBool(); GData::imageToolbarFullScreen = GData::appSettings->value("imageToolbarFullScreen").toBool(); /* read external apps */ GData::appSettings->beginGroup("ExternalApps"); QStringList extApps = GData::appSettings->childKeys(); for (int i = 0; i < extApps.size(); ++i) { GData::externalApps[extApps.at(i)] = GData::appSettings->value(extApps.at(i)).toString(); } GData::appSettings->endGroup(); /* read bookmarks */ GData::appSettings->beginGroup("CopyMoveToPaths"); QStringList paths = GData::appSettings->childKeys(); for (int i = 0; i < paths.size(); ++i) { GData::bookmarkPaths.insert(GData::appSettings->value(paths.at(i)).toString()); } GData::appSettings->endGroup(); /* read known tags */ GData::appSettings->beginGroup("KnownTags"); QStringList tags = GData::appSettings->childKeys(); for (int i = 0; i < tags.size(); ++i) { GData::knownTags.insert(GData::appSettings->value(tags.at(i)).toString()); } GData::appSettings->endGroup(); } void Phototonic::setupDocks() { pvDock = new QDockWidget(tr("Viewer"), this); pvDock->setObjectName("Viewer"); imageViewLayout = new QVBoxLayout; imageViewLayout->setContentsMargins(0, 0, 0, 0); imageViewLayout->addWidget(imageView); QWidget *imageViewContainerWidget = new QWidget; imageViewContainerWidget->setLayout(imageViewLayout); pvDock->setWidget(imageViewContainerWidget); connect(pvDock->toggleViewAction(), SIGNAL(triggered()), this, SLOT(setPvDockVisibility())); connect(pvDock, SIGNAL(visibilityChanged(bool)), this, SLOT(setPvDockVisibility())); addDockWidget(Qt::RightDockWidgetArea, pvDock); addDockWidget(Qt::RightDockWidgetArea, iiDock); QAction *docksNToolbarsAct = viewMenu->insertMenu(refreshAction, createPopupMenu()); docksNToolbarsAct->setText(tr("Docks and Toolbars")); fsDockOrigWidget = fsDock->titleBarWidget(); bmDockOrigWidget = bmDock->titleBarWidget(); tagsDockOrigWidget = tagsDock->titleBarWidget(); iiDockOrigWidget = iiDock->titleBarWidget(); pvDockOrigWidget = pvDock->titleBarWidget(); fsDockEmptyWidget = new QWidget; bmDockEmptyWidget = new QWidget; tagsDockEmptyWidget = new QWidget; iiDockEmptyWidget = new QWidget; pvDockEmptyWidget = new QWidget; lockDocks(); } void Phototonic::lockDocks() { if (initComplete) GData::LockDocks = actLockDocks->isChecked(); if (GData::LockDocks) { fsDock->setTitleBarWidget(fsDockEmptyWidget); bmDock->setTitleBarWidget(bmDockEmptyWidget); tagsDock->setTitleBarWidget(tagsDockEmptyWidget); iiDock->setTitleBarWidget(iiDockEmptyWidget); pvDock->setTitleBarWidget(pvDockEmptyWidget); } else { fsDock->setTitleBarWidget(fsDockOrigWidget); bmDock->setTitleBarWidget(bmDockOrigWidget); tagsDock->setTitleBarWidget(tagsDockOrigWidget); iiDock->setTitleBarWidget(iiDockOrigWidget); pvDock->setTitleBarWidget(pvDockOrigWidget); } } QMenu *Phototonic::createPopupMenu() { QMenu *extraActsMenu = QMainWindow::createPopupMenu(); extraActsMenu->addSeparator(); extraActsMenu->addAction(actSmallIcons); extraActsMenu->addAction(actLockDocks); return extraActsMenu; } void Phototonic::loadShortcuts() { // Add customizable key shortcut actions GData::actionKeys[thumbsGoTopAct->objectName()] = thumbsGoTopAct; GData::actionKeys[thumbsGoBottomAct->objectName()] = thumbsGoBottomAct; GData::actionKeys[closeImageAct->objectName()] = closeImageAct; GData::actionKeys[fullScreenAct->objectName()] = fullScreenAct; GData::actionKeys[settingsAction->objectName()] = settingsAction; GData::actionKeys[exitAction->objectName()] = exitAction; GData::actionKeys[thumbsZoomInAct->objectName()] = thumbsZoomInAct; GData::actionKeys[thumbsZoomOutAct->objectName()] = thumbsZoomOutAct; GData::actionKeys[cutAction->objectName()] = cutAction; GData::actionKeys[copyAction->objectName()] = copyAction; GData::actionKeys[nextImageAction->objectName()] = nextImageAction; GData::actionKeys[prevImageAction->objectName()] = prevImageAction; GData::actionKeys[deleteAction->objectName()] = deleteAction; GData::actionKeys[saveAction->objectName()] = saveAction; GData::actionKeys[saveAsAction->objectName()] = saveAsAction; GData::actionKeys[keepTransformAct->objectName()] = keepTransformAct; GData::actionKeys[keepZoomAct->objectName()] = keepZoomAct; GData::actionKeys[showClipboardAction->objectName()] = showClipboardAction; GData::actionKeys[copyImageAction->objectName()] = copyImageAction; GData::actionKeys[pasteImageAction->objectName()] = pasteImageAction; GData::actionKeys[renameAction->objectName()] = renameAction; GData::actionKeys[refreshAction->objectName()] = refreshAction; GData::actionKeys[pasteAction->objectName()] = pasteAction; GData::actionKeys[goBackAction->objectName()] = goBackAction; GData::actionKeys[goFrwdAction->objectName()] = goFrwdAction; GData::actionKeys[slideShowAction->objectName()] = slideShowAction; GData::actionKeys[firstImageAction->objectName()] = firstImageAction; GData::actionKeys[lastImageAction->objectName()] = lastImageAction; GData::actionKeys[randomImageAction->objectName()] = randomImageAction; GData::actionKeys[openAction->objectName()] = openAction; GData::actionKeys[zoomOutAct->objectName()] = zoomOutAct; GData::actionKeys[zoomInAct->objectName()] = zoomInAct; GData::actionKeys[resetZoomAct->objectName()] = resetZoomAct; GData::actionKeys[origZoomAct->objectName()] = origZoomAct; GData::actionKeys[rotateLeftAct->objectName()] = rotateLeftAct; GData::actionKeys[rotateRightAct->objectName()] = rotateRightAct; GData::actionKeys[freeRotateLeftAct->objectName()] = freeRotateLeftAct; GData::actionKeys[freeRotateRightAct->objectName()] = freeRotateRightAct; GData::actionKeys[flipHAct->objectName()] = flipHAct; GData::actionKeys[flipVAct->objectName()] = flipVAct; GData::actionKeys[cropAct->objectName()] = cropAct; GData::actionKeys[cropToSelectionAct->objectName()] = cropToSelectionAct; GData::actionKeys[colorsAct->objectName()] = colorsAct; GData::actionKeys[mirrorDisabledAct->objectName()] = mirrorDisabledAct; GData::actionKeys[mirrorDualAct->objectName()] = mirrorDualAct; GData::actionKeys[mirrorTripleAct->objectName()] = mirrorTripleAct; GData::actionKeys[mirrorVDualAct->objectName()] = mirrorVDualAct; GData::actionKeys[mirrorQuadAct->objectName()] = mirrorQuadAct; GData::actionKeys[moveDownAct->objectName()] = moveDownAct; GData::actionKeys[moveUpAct->objectName()] = moveUpAct; GData::actionKeys[moveRightAct->objectName()] = moveRightAct; GData::actionKeys[moveLeftAct->objectName()] = moveLeftAct; GData::actionKeys[copyToAction->objectName()] = copyToAction; GData::actionKeys[moveToAction->objectName()] = moveToAction; GData::actionKeys[goUpAction->objectName()] = goUpAction; GData::actionKeys[resizeAct->objectName()] = resizeAct; GData::actionKeys[filterImagesFocusAct->objectName()] = filterImagesFocusAct; GData::actionKeys[setPathFocusAct->objectName()] = setPathFocusAct; GData::actionKeys[keepTransformAct->objectName()] = keepTransformAct; GData::appSettings->beginGroup("Shortcuts"); QStringList groupKeys = GData::appSettings->childKeys(); if (groupKeys.size()) { if (groupKeys.contains(thumbsGoTopAct->text())) { QMapIterator key(GData::actionKeys); while (key.hasNext()) { key.next(); if (groupKeys.contains(key.value()->text())) { key.value()->setShortcut(GData::appSettings->value(key.value()->text()).toString()); GData::appSettings->remove(key.value()->text()); GData::appSettings->setValue(key.key(), key.value()->shortcut().toString()); } } } else { for (int i = 0; i < groupKeys.size(); ++i) { if (GData::actionKeys.value(groupKeys.at(i))) GData::actionKeys.value(groupKeys.at(i))->setShortcut (GData::appSettings->value(groupKeys.at(i)).toString()); } } } else { thumbsGoTopAct->setShortcut(QKeySequence("Ctrl+Home")); thumbsGoBottomAct->setShortcut(QKeySequence("Ctrl+End")); closeImageAct->setShortcut(Qt::Key_Escape); fullScreenAct->setShortcut(QKeySequence("Alt+Return")); settingsAction->setShortcut(QKeySequence("Ctrl+P")); exitAction->setShortcut(QKeySequence("Ctrl+Q")); cutAction->setShortcut(QKeySequence("Ctrl+X")); copyAction->setShortcut(QKeySequence("Ctrl+C")); deleteAction->setShortcut(QKeySequence("Del")); saveAction->setShortcut(QKeySequence("Ctrl+S")); copyImageAction->setShortcut(QKeySequence("Ctrl+Shift+C")); pasteImageAction->setShortcut(QKeySequence("Ctrl+Shift+V")); renameAction->setShortcut(QKeySequence("F2")); refreshAction->setShortcut(QKeySequence("F5")); pasteAction->setShortcut(QKeySequence("Ctrl+V")); goBackAction->setShortcut(QKeySequence("Alt+Left")); goFrwdAction->setShortcut(QKeySequence("Alt+Right")); goUpAction->setShortcut(QKeySequence("Alt+Up")); slideShowAction->setShortcut(QKeySequence("Ctrl+W")); nextImageAction->setShortcut(QKeySequence("PgDown")); prevImageAction->setShortcut(QKeySequence("PgUp")); firstImageAction->setShortcut(QKeySequence("Home")); lastImageAction->setShortcut(QKeySequence("End")); randomImageAction->setShortcut(QKeySequence("Ctrl+D")); openAction->setShortcut(QKeySequence("Return")); zoomOutAct->setShortcut(QKeySequence("-")); zoomInAct->setShortcut(QKeySequence("+")); resetZoomAct->setShortcut(QKeySequence("*")); origZoomAct->setShortcut(QKeySequence("/")); rotateLeftAct->setShortcut(QKeySequence("Ctrl+Left")); rotateRightAct->setShortcut(QKeySequence("Ctrl+Right")); freeRotateLeftAct->setShortcut(QKeySequence("Ctrl+Shift+Left")); freeRotateRightAct->setShortcut(QKeySequence("Ctrl+Shift+Right")); flipHAct->setShortcut(QKeySequence("Ctrl+Down")); flipVAct->setShortcut(QKeySequence("Ctrl+Up")); cropAct->setShortcut(QKeySequence("Ctrl+G")); cropToSelectionAct->setShortcut(QKeySequence("Ctrl+R")); colorsAct->setShortcut(QKeySequence("Ctrl+O")); mirrorDisabledAct->setShortcut(QKeySequence("Ctrl+1")); mirrorDualAct->setShortcut(QKeySequence("Ctrl+2")); mirrorTripleAct->setShortcut(QKeySequence("Ctrl+3")); mirrorVDualAct->setShortcut(QKeySequence("Ctrl+4")); mirrorQuadAct->setShortcut(QKeySequence("Ctrl+5")); moveDownAct->setShortcut(QKeySequence("Down")); moveUpAct->setShortcut(QKeySequence("Up")); moveLeftAct->setShortcut(QKeySequence("Left")); moveRightAct->setShortcut(QKeySequence("Right")); copyToAction->setShortcut(QKeySequence("Ctrl+Y")); moveToAction->setShortcut(QKeySequence("Ctrl+M")); resizeAct->setShortcut(QKeySequence("Ctrl+I")); filterImagesFocusAct->setShortcut(QKeySequence("Ctrl+F")); setPathFocusAct->setShortcut(QKeySequence("Ctrl+L")); keepTransformAct->setShortcut(QKeySequence("Ctrl+K")); } GData::appSettings->endGroup(); } void Phototonic::closeEvent(QCloseEvent *event) { thumbView->abort(); writeSettings(); hide(); qDebug() << "Phototonic: releasing clipboard..."; if (!QApplication::clipboard()->image().isNull()) { QApplication::clipboard()->clear(); } event->accept(); } void Phototonic::setStatus(QString state) { stateLabel->setText(" " + state + " "); } void Phototonic::mouseDoubleClickEvent(QMouseEvent *event) { if (interfaceDisabled) return; if (event->button() == Qt::LeftButton) { if (GData::layoutMode == imageViewIdx) { if (GData::reverseMouseBehavior) { fullScreenAct->setChecked(!(fullScreenAct->isChecked())); toggleFullScreen(); event->accept(); } else if (closeImageAct->isEnabled()) { hideViewer(); event->accept(); } } else { if (QApplication::focusWidget() == imageView->scrlArea) { openOp(); } } } } void Phototonic::mousePressEvent(QMouseEvent *event) { if (interfaceDisabled) return; if (GData::layoutMode == imageViewIdx) { if (event->button() == Qt::MiddleButton) { if (event->modifiers() == Qt::ShiftModifier) { origZoom(); event->accept(); return; } if (event->modifiers() == Qt::ControlModifier) { resetZoom(); event->accept(); return; } if (GData::reverseMouseBehavior && closeImageAct->isEnabled()) { hideViewer(); event->accept(); } else { fullScreenAct->setChecked(!(fullScreenAct->isChecked())); toggleFullScreen(); event->accept(); } } } else { if (QApplication::focusWidget() == imageView->scrlArea) { if (event->button() == Qt::MiddleButton && GData::reverseMouseBehavior) { openOp(); } } } } void Phototonic::newImage() { if (GData::layoutMode == thumbViewIdx) showViewer(); imageView->loadImage(""); } void Phototonic::setDocksVisibility(bool visible) { fsDock->setVisible(visible? GData::fsDockVisible : false); bmDock->setVisible(visible? GData::bmDockVisible : false); tagsDock->setVisible(visible? GData::tagsDockVisible : false); iiDock->setVisible(visible? GData::iiDockVisible : false); pvDock->setVisible(visible? GData::pvDockVisible : false); menuBar()->setVisible(visible); menuBar()->setDisabled(!visible); statusBar()->setVisible(visible); editToolBar->setVisible(visible? editToolBarVisible : false); goToolBar->setVisible(visible? goToolBarVisible : false); viewToolBar->setVisible(visible? viewToolBarVisible : false); imageToolBar->setVisible(visible? imageToolBarVisible : GData::imageToolbarFullScreen); setContextMenuPolicy(Qt::PreventContextMenu); } void Phototonic::openOp() { if (GData::layoutMode == imageViewIdx) { hideViewer(); return; } if (QApplication::focusWidget() == fsTree) { goSelectedDir(fsTree->getCurrentIndex()); return; } else if (QApplication::focusWidget() == thumbView || QApplication::focusWidget() == imageView->scrlArea) { QModelIndex idx; QModelIndexList indexesList = thumbView->selectionModel()->selectedIndexes(); if (indexesList.size() > 0) { idx = indexesList.first(); } else { if (thumbView->thumbViewModel->rowCount() == 0) { setStatus(tr("No images")); return; } idx = thumbView->thumbViewModel->indexFromItem(thumbView->thumbViewModel->item(0)); thumbView->selectionModel()->select(idx, QItemSelectionModel::Toggle); thumbView->setCurrentRow(0); } loadImagefromThumb(idx); return; } else if (QApplication::focusWidget() == filterBar) { setThumbsFilter(); return; } else if (QApplication::focusWidget() == pathBar) { goPathBarDir(); return; } } void Phototonic::setEditToolBarVisibility() { editToolBarVisible = editToolBar->isVisible(); } void Phototonic::setGoToolBarVisibility() { goToolBarVisible = goToolBar->isVisible(); } void Phototonic::setViewToolBarVisibility() { viewToolBarVisible = viewToolBar->isVisible(); } void Phototonic::setImageToolBarVisibility() { imageToolBarVisible = imageToolBar->isVisible(); } void Phototonic::setFsDockVisibility() { if (GData::layoutMode != imageViewIdx) { GData::fsDockVisible = fsDock->isVisible(); } } void Phototonic::setBmDockVisibility() { if (GData::layoutMode != imageViewIdx) { GData::bmDockVisible = bmDock->isVisible(); } } void Phototonic::setTagsDockVisibility() { if (GData::layoutMode != imageViewIdx) { GData::tagsDockVisible = tagsDock->isVisible(); } } void Phototonic::setIiDockVisibility() { if (GData::layoutMode != imageViewIdx) { GData::iiDockVisible = iiDock->isVisible(); } } void Phototonic::setPvDockVisibility() { if (GData::layoutMode != imageViewIdx) { GData::pvDockVisible = pvDock->isVisible(); } } void Phototonic::showViewer() { if (GData::layoutMode == thumbViewIdx) { GData::layoutMode = imageViewIdx; GData::appSettings->setValue("Geometry", saveGeometry()); GData::appSettings->setValue("WindowState", saveState()); imageViewLayout->removeWidget(imageView); imageView->setVisible(true); takeCentralWidget(); setCentralWidget(imageView); setDocksVisibility(false); if (GData::isFullScreen == true) { shouldMaximize = isMaximized(); showFullScreen(); imageView->setCursorHiding(true); QApplication::processEvents(); } updateActions(); } } void Phototonic::showBusyStatus(bool busy) { static int busyStatus = 0; if (busy) { ++busyStatus; } else { --busyStatus; } if (busyStatus > 0) { busyMovie->start(); busyLabel->setVisible(true); } else { busyLabel->setVisible(false); busyMovie->stop(); busyStatus = 0; } } void Phototonic::loadImagefromThumb(const QModelIndex &idx) { thumbView->setCurrentRow(idx.row()); showViewer(); imageView->loadImage(thumbView->thumbViewModel->item(idx.row())->data(thumbView->FileNameRole).toString()); thumbView->setImageviewWindowTitle(); } void Phototonic::updateViewerImageBySelection(const QItemSelection&) { if (!pvDock->isVisible() || GData::layoutMode == imageViewIdx) { return; } QModelIndexList indexesList = thumbView->selectionModel()->selectedIndexes(); if (indexesList.size() == 1) { QString ImagePath = thumbView->thumbViewModel->item(indexesList.first().row())->data (thumbView->FileNameRole).toString(); imageView->loadImage(ImagePath); thumbView->setCurrentRow(indexesList.first().row()); } else { QString ImagePath(":/images/no_image.png"); imageView->loadImage(ImagePath); } } void Phototonic::loadImagefromCli() { QFile imageFile(cliFileName); if(!imageFile.exists()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to open file \"%1\", file not found.").arg(cliFileName)); cliFileName = ""; return; } showViewer(); imageView->loadImage(cliFileName); setWindowTitle(cliFileName + " - Phototonic"); } void Phototonic::slideShow() { if (GData::slideShowActive) { GData::slideShowActive = false; slideShowAction->setText(tr("Slide Show")); imageView->setFeedback(tr("Slide show stopped")); SlideShowTimer->stop(); delete SlideShowTimer; slideShowAction->setIcon(QIcon::fromTheme("media-playback-start", QIcon(":/images/play.png"))); } else { if (thumbView->thumbViewModel->rowCount() <= 0) { return; } if (GData::layoutMode == thumbViewIdx) { QModelIndexList indexesList = thumbView->selectionModel()->selectedIndexes(); if (indexesList.size() != 1) { thumbView->setCurrentRow(0); } else { thumbView->setCurrentRow(indexesList.first().row()); } showViewer(); } GData::slideShowActive = true; SlideShowTimer = new QTimer(this); connect(SlideShowTimer, SIGNAL(timeout()), this, SLOT(slideShowHandler())); SlideShowTimer->start(GData::slideShowDelay * 1000); slideShowAction->setText(tr("Stop Slide Show")); imageView->setFeedback(tr("Slide show started")); slideShowAction->setIcon(QIcon::fromTheme("media-playback-stop", QIcon(":/images/stop.png"))); slideShowHandler(); } } void Phototonic::slideShowHandler() { if (GData::slideShowActive) { if (GData::slideShowRandom) { loadRandomImage(); } else { int currentRow = thumbView->getCurrentRow(); imageView->loadImage(thumbView->thumbViewModel->item(currentRow)->data(thumbView->FileNameRole).toString()); thumbView->setImageviewWindowTitle(); if (thumbView->getNextRow() > 0) { thumbView->setCurrentRow(thumbView->getNextRow()); } else { if (GData::wrapImageList) { thumbView->setCurrentRow(0); } else { slideShow(); } } } } } void Phototonic::loadNextImage() { if (thumbView->thumbViewModel->rowCount() <= 0) { return; } int nextRow = thumbView->getNextRow(); if (nextRow < 0) { if (GData::wrapImageList) { nextRow = 0; } else { return; } } imageView->loadImage(thumbView->thumbViewModel->item(nextRow)->data(thumbView->FileNameRole).toString()); thumbView->setCurrentRow(nextRow); thumbView->setImageviewWindowTitle(); if (GData::layoutMode == thumbViewIdx) { thumbView->selectThumbByRow(nextRow); } } void Phototonic::loadPrevImage() { if (thumbView->thumbViewModel->rowCount() <= 0) { return; } int prevRow = thumbView->getPrevRow(); if (prevRow < 0) { if (GData::wrapImageList) prevRow = thumbView->getLastRow(); else return; } imageView->loadImage(thumbView->thumbViewModel->item(prevRow)->data(thumbView->FileNameRole).toString()); thumbView->setCurrentRow(prevRow); thumbView->setImageviewWindowTitle(); if (GData::layoutMode == thumbViewIdx) { thumbView->selectThumbByRow(prevRow); } } void Phototonic::loadFirstImage() { if (thumbView->thumbViewModel->rowCount() <= 0) { return; } imageView->loadImage(thumbView->thumbViewModel->item(0)->data(thumbView->FileNameRole).toString()); thumbView->setCurrentRow(0); thumbView->setImageviewWindowTitle(); if (GData::layoutMode == thumbViewIdx) { thumbView->selectThumbByRow(0); } } void Phototonic::loadLastImage() { if (thumbView->thumbViewModel->rowCount() <= 0) { return; } int lastRow = thumbView->getLastRow(); imageView->loadImage(thumbView->thumbViewModel->item(lastRow)->data(thumbView->FileNameRole).toString()); thumbView->setCurrentRow(lastRow); thumbView->setImageviewWindowTitle(); if (GData::layoutMode == thumbViewIdx) { thumbView->selectThumbByRow(lastRow); } } void Phototonic::loadRandomImage() { if (thumbView->thumbViewModel->rowCount() <= 0) { return; } int randomRow = thumbView->getRandomRow(); imageView->loadImage(thumbView->thumbViewModel->item(randomRow)->data(thumbView->FileNameRole).toString()); thumbView->setCurrentRow(randomRow); thumbView->setImageviewWindowTitle(); if (GData::layoutMode == thumbViewIdx) { thumbView->selectThumbByRow(randomRow); } } void Phototonic::setViewerKeyEventsEnabled(bool enabled) { moveLeftAct->setEnabled(enabled); moveRightAct->setEnabled(enabled); moveUpAct->setEnabled(enabled); moveDownAct->setEnabled(enabled); } void Phototonic::updateIndexByViewerImage() { if (thumbView->thumbViewModel->rowCount() > 0 && thumbView->setCurrentIndexByName(imageView->currentImageFullPath)) { thumbView->selectCurrentIndex(); } } void Phototonic::hideViewer() { if (cliImageLoaded && GData::exitInsteadOfClose) { close(); return; } showBusyStatus(true); if (isFullScreen()) { showNormal(); if (shouldMaximize) { showMaximized(); } imageView->setCursorHiding(false); } GData::layoutMode = thumbViewIdx; takeCentralWidget(); setCentralWidget(thumbView); imageViewLayout->addWidget(imageView); QApplication::processEvents(); setDocksVisibility(true); while (QApplication::overrideCursor()) { QApplication::restoreOverrideCursor(); } if (GData::slideShowActive) { slideShow(); } thumbView->setResizeMode(QListView::Fixed); for (int i = 0; i <= 100 && qApp->hasPendingEvents(); ++i) { QApplication::processEvents(); } setThumbviewWindowTitle(); if (!cliFileName.isEmpty()) { cliFileName = ""; } restoreGeometry(GData::appSettings->value("Geometry").toByteArray()); restoreState(GData::appSettings->value("WindowState").toByteArray()); if (thumbView->thumbViewModel->rowCount() > 0) { if (thumbView->setCurrentIndexByName(imageView->currentImageFullPath)) thumbView->selectCurrentIndex(); } thumbView->setResizeMode(QListView::Adjust); if (needThumbsRefresh) { needThumbsRefresh = false; refreshThumbs(true); } else { thumbView->loadVisibleThumbs(); } thumbView->setFocus(Qt::OtherFocusReason); showBusyStatus(false); setContextMenuPolicy(Qt::DefaultContextMenu); updateActions(); } void Phototonic::goBottom() { thumbView->scrollToBottom(); } void Phototonic::goTop() { thumbView->scrollToTop(); } void Phototonic::dropOp(Qt::KeyboardModifiers keyMods, bool dirOp, QString cpMvDirPath) { QApplication::restoreOverrideCursor(); GData::copyOp = (keyMods == Qt::ControlModifier); QMessageBox msgBox; QString destDir; if (QObject::sender() == fsTree) { destDir = getSelectedPath(); } else if (QObject::sender() == bookmarks) { if (bookmarks->currentItem()) { destDir = bookmarks->currentItem()->toolTip(0); } else { addBookmark(cpMvDirPath); return; } } else { // Unknown sender return; } if (!isValidPath(destDir)) { msgBox.critical(this, tr("Error"), tr("Can not move or copy images to this folder.")); selectCurrentViewDir(); return; } if (destDir == GData::currentViewDir) { msgBox.critical(this, tr("Error"), tr("Destination folder is same as source.")); return; } if (dirOp) { QString dirOnly = cpMvDirPath.right(cpMvDirPath.size() - cpMvDirPath.lastIndexOf(QDir::separator()) - 1); QString question = tr("Move \"%1\" to \"%2\"?").arg(dirOnly).arg(destDir); int ret = QMessageBox::question(this, tr("Move folder"), question, QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); if (ret == QMessageBox::Yes) { QFile dir(cpMvDirPath); bool ok = dir.rename(destDir + QDir::separator() + dirOnly); if (!ok) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to move folder.")); } setStatus(tr("Folder moved")); } } else { CpMvDialog *cpMvdialog = new CpMvDialog(this); GData::copyCutIdxList = thumbView->selectionModel()->selectedIndexes(); cpMvdialog->exec(thumbView, destDir, false); if (!GData::copyOp) { int row = cpMvdialog->latestRow; if (thumbView->thumbViewModel->rowCount()) { if (row >= thumbView->thumbViewModel->rowCount()) { row = thumbView->thumbViewModel->rowCount() -1 ; } thumbView->setCurrentRow(row); thumbView->selectThumbByRow(row); } } QString state = QString((GData::copyOp? tr("Copied") : tr("Moved")) + " " + tr("%n image(s)", "", cpMvdialog->nfiles)); setStatus(state); delete(cpMvdialog); } thumbView->loadVisibleThumbs(); } void Phototonic::selectCurrentViewDir() { QModelIndex idx = fsTree->fsModel->index(GData::currentViewDir); if (idx.isValid()) { fsTree->expand(idx); fsTree->setCurrentIndex(idx); } } void Phototonic::checkDirState(const QModelIndex &, int, int) { if (!initComplete) { return; } if (thumbView->busy) { thumbView->abort(); } if (!QDir().exists(GData::currentViewDir)) { GData::currentViewDir = ""; QTimer::singleShot(0, this, SLOT(reloadThumbsSlot())); } } void Phototonic::recordHistory(QString dir) { if (!needHistoryRecord) { needHistoryRecord = true; return; } if (pathHistory.size() && dir == pathHistory.at(currentHistoryIdx)) return; pathHistory.insert(++currentHistoryIdx, dir); // Need to clear irrelevant items from list if (currentHistoryIdx != pathHistory.size() - 1) { goFrwdAction->setEnabled(false); for (int i = pathHistory.size() - 1; i > currentHistoryIdx ; --i) { pathHistory.removeAt(i); } } } void Phototonic::reloadThumbsSlot() { if (thumbView->busy || !initComplete) { thumbView->abort(); QTimer::singleShot(0, this, SLOT(reloadThumbsSlot())); return; } if (GData::currentViewDir == "") { GData::currentViewDir = getSelectedPath(); if (GData::currentViewDir == "") return; } QDir checkPath(GData::currentViewDir); if (!checkPath.exists() || !checkPath.isReadable()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to open folder:") + " " + GData::currentViewDir); return; } thumbView->infoView->clear(); if (GData::layoutMode == thumbViewIdx && pvDock->isVisible()) { QString ImagePath(":/images/no_image.png"); imageView->loadImage(ImagePath); } pathBar->setText(GData::currentViewDir); recordHistory(GData::currentViewDir); if (currentHistoryIdx > 0) goBackAction->setEnabled(true); if (GData::layoutMode == thumbViewIdx) { setThumbviewWindowTitle(); } thumbView->busy = true; if (findDupesAction->isChecked()) { thumbView->loadDuplicates(); } else { thumbView->load(); } } void Phototonic::setThumbviewWindowTitle() { if (findDupesAction->isChecked()) setWindowTitle(tr("Duplicate images in %1").arg(GData::currentViewDir) + " - Phototonic"); else setWindowTitle(GData::currentViewDir + " - Phototonic"); } void Phototonic::renameDir() { QModelIndexList selectedDirs = fsTree->selectionModel()->selectedRows(); QFileInfo dirInfo = QFileInfo(fsTree->fsModel->filePath(selectedDirs[0])); bool ok; QString title = tr("Rename") + " " + dirInfo.completeBaseName(); QString newDirName = QInputDialog::getText(this, title, tr("New name:"), QLineEdit::Normal, dirInfo.completeBaseName(), &ok); if (!ok) { selectCurrentViewDir(); return; } if(newDirName.isEmpty()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Invalid name entered.")); selectCurrentViewDir(); return; } QFile dir(dirInfo.absoluteFilePath()); QString newFullPathName = dirInfo.absolutePath() + QDir::separator() + newDirName; ok = dir.rename(newFullPathName); if (!ok) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to rename folder.")); selectCurrentViewDir(); return; } if (GData::currentViewDir == dirInfo.absoluteFilePath()) fsTree->setCurrentIndex(fsTree->fsModel->index(newFullPathName)); else selectCurrentViewDir(); } void Phototonic::rename() { if (QApplication::focusWidget() == fsTree) { renameDir(); return; } if (GData::layoutMode == imageViewIdx) { if (imageView->isNewImage()) { showNewImageWarning(this); return; } if (thumbView->thumbViewModel->rowCount() > 0) { if (thumbView->setCurrentIndexByName(imageView->currentImageFullPath)) thumbView->selectCurrentIndex(); } } QString selectedImageFileName = thumbView->getSingleSelectionFilename(); if (selectedImageFileName.isEmpty()) { setStatus(tr("Invalid selection")); return; } if (GData::slideShowActive) slideShow(); imageView->setCursorHiding(false); QString currnetFilePath = selectedImageFileName; QFile currentFile(currnetFilePath); QString newImageFullPath = GData::currentViewDir; bool ok; QString title = tr("Rename Image"); QString newImageName = QInputDialog::getText(this, title, tr("Enter a new name for \"%1\":") .arg(QFileInfo(selectedImageFileName).fileName()) + "\t\t\t", QLineEdit::Normal, QFileInfo(selectedImageFileName).completeBaseName(), &ok); if (!ok) { goto cleanUp; } if(newImageName.isEmpty()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("No name entered.")); goto cleanUp; } newImageName += "." + QFileInfo(selectedImageFileName).suffix(); if (newImageFullPath.right(1) == QDir::separator()) { newImageFullPath += newImageName; } else { newImageFullPath += QDir::separator() + newImageName; } ok = currentFile.rename(newImageFullPath); if (ok) { QModelIndexList indexesList = thumbView->selectionModel()->selectedIndexes(); thumbView->thumbViewModel->item( indexesList.first().row())->setData(newImageFullPath, thumbView->FileNameRole); if (GData::showLabels) { thumbView->thumbViewModel->item( indexesList.first().row())->setData(newImageName, Qt::DisplayRole); } imageView->setInfo(newImageName); imageView->currentImageFullPath = newImageFullPath; if (GData::layoutMode == imageViewIdx) { thumbView->setImageviewWindowTitle(); } } else { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to rename image.")); } cleanUp: if (isFullScreen()) { imageView->setCursorHiding(true); } } void Phototonic::deleteDir() { bool ok = true; QModelIndexList selectedDirs = fsTree->selectionModel()->selectedRows(); QString deletePath = fsTree->fsModel->filePath(selectedDirs[0]); QModelIndex idxAbove = fsTree->indexAbove(selectedDirs[0]); QFileInfo dirInfo = QFileInfo(deletePath); QString question = tr("Permanently delete \"%1\" and all of its contents?").arg(dirInfo.completeBaseName()); QMessageBox msgBox; msgBox.setText(question); msgBox.setWindowTitle(tr("Delete folder")); msgBox.setIcon(QMessageBox::Warning); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); msgBox.setButtonText(QMessageBox::Yes, tr("Yes")); msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel")); int ret = msgBox.exec(); if (ret == QMessageBox::Yes) ok = removeDirOp(deletePath); else { selectCurrentViewDir(); return; } if (!ok) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to delete folder.")); selectCurrentViewDir(); } QString state = QString(tr("Removed \"%1\"").arg(deletePath)); setStatus(state); if (GData::currentViewDir == deletePath) { if (idxAbove.isValid()) fsTree->setCurrentIndex(idxAbove); } else selectCurrentViewDir(); } void Phototonic::createSubDirectory() { QModelIndexList selectedDirs = fsTree->selectionModel()->selectedRows(); QFileInfo dirInfo = QFileInfo(fsTree->fsModel->filePath(selectedDirs[0])); bool ok; QString newDirName = QInputDialog::getText(this, tr("New Sub folder"), tr("New folder name:"), QLineEdit::Normal, "", &ok); if (!ok) { selectCurrentViewDir(); return; } if(newDirName.isEmpty()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Invalid name entered.")); selectCurrentViewDir(); return; } QDir dir(dirInfo.absoluteFilePath()); ok = dir.mkdir(dirInfo.absoluteFilePath() + QDir::separator() + newDirName); if (!ok) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to create new folder.")); selectCurrentViewDir(); return; } setStatus(tr("Created \"%1\"").arg(newDirName)); fsTree->expand(selectedDirs[0]); } QString Phototonic::getSelectedPath() { QModelIndexList selectedDirs = fsTree->selectionModel()->selectedRows(); if (selectedDirs.size() && selectedDirs[0].isValid()) { QFileInfo dirInfo = QFileInfo(fsTree->fsModel->filePath(selectedDirs[0])); return dirInfo.absoluteFilePath(); } else return ""; } void Phototonic::wheelEvent(QWheelEvent *event) { if (GData::layoutMode == imageViewIdx || QApplication::focusWidget() == imageView->scrlArea) { if (event->modifiers() == Qt::ControlModifier) { if (event->delta() < 0) zoomOut(); else zoomIn(); } else if (nextImageAction->isEnabled()) { if (event->delta() < 0) loadNextImage(); else loadPrevImage(); } } } void Phototonic::showNewImageWarning(QWidget *parent) { QMessageBox msgBox; msgBox.warning(parent, tr("Warning"), tr("Cannot perform action with temporary image.")); } bool Phototonic::removeDirOp(QString dirToDelete) { bool ok = true; QDir dir(dirToDelete); Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { if (info.isDir()) { ok = removeDirOp(info.absoluteFilePath()); } else { ok = QFile::remove(info.absoluteFilePath()); } if (!ok) { return ok; } } ok = dir.rmdir(dirToDelete); return ok; } void Phototonic::cleanupCropDialog() { setInterfaceEnabled(true); } void Phototonic::cleanupScaleDialog() { delete resizeDialog; resizeDialog = 0; setInterfaceEnabled(true); } void Phototonic::cleanupColorsDialog() { GData::colorsActive = false; setInterfaceEnabled(true); } void Phototonic::setInterfaceEnabled(bool enable) { // actions colorsAct->setEnabled(enable); renameAction->setEnabled(enable); cropAct->setEnabled(enable); resizeAct->setEnabled(enable); closeImageAct->setEnabled(enable); nextImageAction->setEnabled(enable); prevImageAction->setEnabled(enable); firstImageAction->setEnabled(enable); lastImageAction->setEnabled(enable); randomImageAction->setEnabled(enable); slideShowAction->setEnabled(enable); copyToAction->setEnabled(enable); moveToAction->setEnabled(enable); deleteAction->setEnabled(enable); settingsAction->setEnabled(enable); openAction->setEnabled(enable); // other thumbView->setEnabled(enable); fsTree->setEnabled(enable); bookmarks->setEnabled(enable); thumbView->imageTags->setEnabled(enable); menuBar()->setEnabled(enable); editToolBar->setEnabled(enable); goToolBar->setEnabled(enable); viewToolBar->setEnabled(enable); interfaceDisabled = !enable; if (enable) { if (isFullScreen()) { imageView->setCursorHiding(true); } updateActions(); } else { imageView->setCursorHiding(false); } } void Phototonic::addNewBookmark() { addBookmark(getSelectedPath()); } void Phototonic::addBookmark(QString path) { GData::bookmarkPaths.insert(path); bookmarks->reloadBookmarks(); } void Phototonic::findDuplicateImages() { refreshThumbs(true); } phototonic-1.7.20/mainwindow.h000066400000000000000000000214541271214516700163300ustar00rootroot00000000000000/* * Copyright (C) 2013-2015 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "thumbview.h" #include "imageview.h" #include "dialogs.h" #define VERSION "Phototonic v1.7.20" class Phototonic : public QMainWindow { Q_OBJECT public: Phototonic(QString fileOrDirectory, QWidget *parent = 0); QMenu *createPopupMenu(); int copyCutCount; protected: void mouseDoubleClickEvent(QMouseEvent *event); void closeEvent(QCloseEvent *event); void mousePressEvent(QMouseEvent *event); public slots: bool event(QEvent *event); void setStatus(QString state); void dropOp(Qt::KeyboardModifiers keyMods, bool dirOp, QString cpMvDirPath); void showViewer(); void loadImagefromThumb(const QModelIndex &idx); void updateViewerImageBySelection(const QItemSelection& selection); void loadImagefromCli(); void hideViewer(); void showBusyStatus(bool busy); private slots: void about(); void sortThumbnains(); void reload(); void setIncludeSubFolders(); void showSettings(); void toggleFullScreen(); void updateActions(); void reloadThumbsSlot(); void renameDir(); void setThumbviewWindowTitle(); void rename(); void openOp(); void newImage(); void addNewBookmark(); void deleteDir(); void createSubDirectory(); void checkDirState(const QModelIndex &, int, int); void goSelectedDir(const QModelIndex &currDir); void bookmarkClicked(QTreeWidgetItem *item, int col); void goPathBarDir(); void setThumbsFilter(); void clearThumbsFilter(); void goBack(); void goTo(QString path); void goForward(); void goUp(); void goHome(); void slideShow(); void slideShowHandler(); void loadNextImage(); void loadPrevImage(); void loadFirstImage(); void loadLastImage(); void loadRandomImage(); void updateIndexByViewerImage(); void selectAllThumbs(); void deleteOp(); void cutThumbs(); void copyThumbs(); void pasteThumbs(); void thumbsZoomIn(); void thumbsZoomOut(); void zoomIn(); void zoomOut(); void resetZoom(); void origZoom(); void keepZoom(); void keepTransformClicked(); void rotateLeft(); void rotateRight(); void flipVert(); void cropImage(); void scaleImage(); void freeRotateLeft(); void freeRotateRight(); void showColorsDialog(); void findDuplicateImages(); void setMirrorDisabled(); void setMirrorDual(); void setMirrorTriple(); void setMirrorVDual(); void setMirrorQuad(); void flipHoriz(); void moveRight(); void moveLeft(); void moveUp(); void moveDown(); void setDocksVisibility(bool visible); void goTop(); void goBottom(); void setClassicThumbs(); void setCompactThumbs(); void setSquarishThumbs(); void showHiddenFiles(); void toggleImageToolbar(); void showLabels(); void setToolbarIconSize(); void chooseExternalApp(); void updateExternalApps(); void runExternalApp(); void cleanupSender(); void externalAppError(); void setEditToolBarVisibility(); void setGoToolBarVisibility(); void setViewToolBarVisibility(); void setImageToolBarVisibility(); void setFsDockVisibility(); void setBmDockVisibility(); void setTagsDockVisibility(); void setIiDockVisibility(); void setPvDockVisibility(); void lockDocks(); void cleanupCropDialog(); void cleanupScaleDialog(); void cleanupColorsDialog(); void filterImagesFocus(); void setPathFocus(); void copyImagesTo(); void moveImagesTo(); private: QString cliFileName; QMenuBar *thumbsMenuBar; QMenu *fileMenu; QMenu *editMenu; QMenu *goMenu; QMenu *sortMenu; QMenu *viewMenu; QMenu *toolsMenu; QMenu *helpMenu; QMenu *zoomSubMenu; QMenu *transformSubMenu; QMenu *viewSubMenu; QMenu *imageFileSubMenu; QMenu *MirroringSubMenu; QMenu *openWithSubMenu; QToolBar *viewToolBar; QToolBar *editToolBar; QToolBar *goToolBar; QToolBar *imageToolBar; QAction *exitAction; QAction *cutAction; QAction *copyAction; QAction *copyToAction; QAction *moveToAction; QAction *deleteAction; QAction *saveAction; QAction *saveAsAction; QAction *renameAction; QAction *selectAllAction; QAction *copyImageAction; QAction *pasteImageAction; QAction *showClipboardAction; QAction *addBookmarkAction; QAction *removeBookmarkAction; QActionGroup *sortTypesGroup; QActionGroup *thumbLayoutsGroup; QAction *actName; QAction *actTime; QAction *actSize; QAction *actType; QAction *actReverse; QAction *refreshAction; QAction *subFoldersAction; QAction *fullScreenAct; QAction *thumbsGoTopAct; QAction *thumbsGoBottomAct; QAction *closeImageAct; QAction *settingsAction; QAction *thumbsZoomInAct; QAction *thumbsZoomOutAct; QAction *zoomSubMenuAct; QAction *zoomInAct; QAction *zoomOutAct; QAction *resetZoomAct; QAction *origZoomAct; QAction *keepZoomAct; QAction *keepTransformAct; QAction *transformSubMenuAct; QAction *viewSubMenuAct; QAction *rotateLeftAct; QAction *rotateRightAct; QAction *flipHAct; QAction *flipVAct; QAction *cropAct; QAction *cropToSelectionAct; QAction *resizeAct; QAction *freeRotateLeftAct; QAction *freeRotateRightAct; QAction *colorsAct; QActionGroup *mirroringGroup; QAction *mirrorSubMenuAct; QAction *mirrorDisabledAct; QAction *mirrorDualAct; QAction *mirrorTripleAct; QAction *mirrorVDualAct; QAction *mirrorQuadAct; QAction *moveLeftAct; QAction *moveRightAct; QAction *moveUpAct; QAction *moveDownAct; QAction *actClassic; QAction *actCompact; QAction *actSquarish; QAction *aboutAction; QAction *actShowHidden; QAction *actShowLabels; QAction *actSmallIcons; QAction *actLockDocks; QAction *actShowViewerToolbars; QAction *pasteAction; QAction *createDirAction; QAction *goBackAction; QAction *goFrwdAction; QAction *goUpAction; QAction *goHomeAction; QAction *slideShowAction; QAction *nextImageAction; QAction *prevImageAction; QAction *firstImageAction; QAction *lastImageAction; QAction *randomImageAction; QAction *openAction; QAction *findDupesAction; QAction *filterImagesFocusAct; QAction *setPathFocusAct; QAction *openWithMenuAct; QAction *chooseAppAct; QAction *invertSelectionAct; QLineEdit *pathBar; QLineEdit *filterBar; QLabel *stateLabel; QDockWidget *fsDock; QDockWidget *bmDock; QDockWidget *tagsDock; QDockWidget *pvDock; FSTree *fsTree; BookMarks *bookmarks; QHBoxLayout *mainLayout; QDockWidget *iiDock; ThumbView *thumbView; ImageView *imageView; QList pathHistory; QTimer *SlideShowTimer; CopyMoveToDialog *copyMoveToDialog; QWidget *fsDockOrigWidget; QWidget *bmDockOrigWidget; QWidget *tagsDockOrigWidget; QWidget *iiDockOrigWidget; QWidget *pvDockOrigWidget; QWidget *fsDockEmptyWidget; QWidget *bmDockEmptyWidget; QWidget *tagsDockEmptyWidget; QWidget *iiDockEmptyWidget; QWidget *pvDockEmptyWidget; QVBoxLayout *imageViewLayout; bool interfaceDisabled; MetadataCache *mdCache; enum CentralWidgets { thumbViewIdx = 0, imageViewIdx }; int currentHistoryIdx; bool needHistoryRecord; bool initComplete; bool needThumbsRefresh; bool cliImageLoaded; bool thumbViewBusy; bool shouldMaximize; bool editToolBarVisible; bool goToolBarVisible; bool viewToolBarVisible; bool imageToolBarVisible; QMovie *busyMovie; QLabel *busyLabel; ResizeDialog *resizeDialog; ColorsDialog *colorsDialog; CropDialog *cropDialog; void refreshThumbs(bool noScroll); void loadShortcuts(); void setupDocks(); void deleteViewerImage(); void loadCurrentImage(int currentRow); void selectCurrentViewDir(); void handleStartupArgs(QString fileOrDirectory); void addMenuSeparator(QWidget *widget); void createImageView(); void createThumbView(); void createActions(); void createMenus(); void createToolBars(); void createStatusBar(); void setfsModelFlags(); void createFSTree(); void createBookmarks(); void createImageTags(); void writeSettings(); void readSettings(); void recordHistory(QString dir); bool isValidPath(QString &path); QString getSelectedPath(); void setCopyCutActions(bool setEnabled); void setDeleteAction(bool setEnabled); void wheelEvent(QWheelEvent *event); void copyOrCutThumbs(bool copy); void showNewImageWarning(QWidget *parent); bool removeDirOp(QString dirToDelete); void setInterfaceEnabled(bool enable); void addBookmark(QString path); void copyMoveImages(bool move); void setViewerKeyEventsEnabled(bool enabled); }; #endif // MAINWINDOW_H phototonic-1.7.20/mdcache.cpp000066400000000000000000000063131271214516700160700ustar00rootroot00000000000000/* * Copyright (C) 2013-2015 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include #include "global.h" #include "mdcache.h" void MetadataCache::updateImageTags(QString &imageFileName, QSet tags) { imageTagsCache[imageFileName].tags = tags; } bool MetadataCache::removeTagFromImage(QString &imageFileName, const QString &tagName) { return imageTagsCache[imageFileName].tags.remove(tagName); } void MetadataCache::removeImage(QString &imageFileName) { imageTagsCache.remove(imageFileName); } QSet& MetadataCache::getImageTags(QString &imageFileName) { return imageTagsCache[imageFileName].tags; } int MetadataCache::getImageOrientation(QString &imageFileName) { if (imageTagsCache.contains(imageFileName)|| loadImageMetadata(imageFileName)) { return imageTagsCache[imageFileName].orientation; } return 0; } void MetadataCache::setImageTags(const QString &imageFileName, QSet tags) { ImageMetadata imageMetadata; imageMetadata.tags = tags; imageTagsCache.insert(imageFileName, imageMetadata); } void MetadataCache::addTagToImage(QString &imageFileName, QString &tagName) { if (imageTagsCache[imageFileName].tags.contains(tagName)) { return; } imageTagsCache[imageFileName].tags.insert(tagName); } void MetadataCache::clear() { imageTagsCache.clear(); } bool MetadataCache::loadImageMetadata(const QString &imageFullPath) { Exiv2::Image::AutoPtr exifImage; QSet tags; long orientation = 0; try { exifImage = Exiv2::ImageFactory::open(imageFullPath.toStdString()); exifImage->readMetadata(); } catch (Exiv2::Error &error) { return false; } try { Exiv2::ExifData &exifData = exifImage->exifData(); if (!exifData.empty()) { orientation = exifData["Exif.Image.Orientation"].value().toLong(); } } catch (Exiv2::Error &error) { } try { Exiv2::IptcData &iptcData = exifImage->iptcData(); if (!iptcData.empty()) { QString key; Exiv2::IptcData::iterator end = iptcData.end(); for (Exiv2::IptcData::iterator iptcIt = iptcData.begin(); iptcIt != end; ++iptcIt) { if (iptcIt->tagName() == "Keywords") { QString tagName = QString::fromUtf8(iptcIt->toString().c_str()); tags.insert(tagName); GData::knownTags.insert(tagName); } } } } catch (Exiv2::Error &error) { } ImageMetadata imageMetadata; if (tags.size()) { imageMetadata.tags = tags; } if (orientation) { imageMetadata.orientation = orientation; } if (tags.size() || orientation) { imageTagsCache.insert(imageFullPath, imageMetadata); } return true; } phototonic-1.7.20/mdcache.h000066400000000000000000000027431271214516700155400ustar00rootroot00000000000000/* * Copyright (C) 2013-2015 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef MDCACHE_H #define MDCACHE_H #include class ImageMetadata { public: QSet tags; int orientation; }; class MetadataCache { private: QMap imageTagsCache; public: void updateImageTags(QString &imageFileName, QSet tags); void addTagToImage(QString &imageFileName, QString &tagName); bool removeTagFromImage(QString &imageFileName, const QString &tagName); void removeImage(QString &imageFileName); QSet &getImageTags(QString &imageFileName); void setImageTags(const QString &imageFileName, QSet tags); void clear(); bool loadImageMetadata(const QString &imageFullPath); int getImageOrientation(QString &imageFileName); }; #endif // MDCACHE_H phototonic-1.7.20/phototonic.desktop000066400000000000000000000007511271214516700175610ustar00rootroot00000000000000[Desktop Entry] Name=Phototonic Name[de]=Phototonic Name[fr]=Phototonic Comment=View photos on your computer Comment[de]=Photos betrachten und verwalten Comment[fr]=Visionner et gérer des photos sur votre ordinateur GenericName=Image Viewer GenericName[de]=Bildbetrachter GenericName[fr]=Visionneuse d'images Exec=phototonic %F Icon=phototonic Terminal=false Type=Application Categories=Graphics;Viewer; StartupNotify=true MimeType=image/png;image/gif;image/jpeg;image/bmp;image/svg+xml; phototonic-1.7.20/phototonic.pro000066400000000000000000000024731271214516700167130ustar00rootroot00000000000000TEMPLATE = app TARGET = phototonic INCLUDEPATH += . INCLUDEPATH += /usr/local/include LIBS += -L/usr/local/lib -lexiv2 QT += widgets QMAKE_CXXFLAGS += $$(CXXFLAGS) QMAKE_CFLAGS += $$(CFLAGS) QMAKE_LFLAGS += $$(LDFLAGS) # Input HEADERS += dialogs.h mainwindow.h thumbview.h imageview.h croprubberband.h global.h infoview.h \ fstree.h bookmarks.h dircompleter.h tags.h mdcache.h SOURCES += dialogs.cpp main.cpp mainwindow.cpp thumbview.cpp imageview.cpp croprubberband.cpp \ global.cpp infoview.cpp fstree.cpp bookmarks.cpp dircompleter.cpp tags.cpp \ mdcache.cpp RESOURCES += phototonic.qrc target.path = /usr/bin/ icon.files = images/phototonic.png icon.path = /usr/share/icons/hicolor/48x48/apps icon16.files = images/icon16/phototonic.png icon16.path = /usr/share/icons/hicolor/16x16/apps iconPixmaps.files = images/icon16/phototonic.png iconPixmaps.path = /usr/share/pixmaps desktop.files = phototonic.desktop desktop.path = /usr/share/applications INSTALLS += target icon icon16 iconPixmaps desktop TRANSLATIONS = translations/phototonic_en.ts \ translations/phototonic_pl.ts \ translations/phototonic_de.ts \ translations/phototonic_ru.ts \ translations/phototonic_cs.ts \ translations/phototonic_fr.ts \ translations/phototonic_bs.ts \ translations/phototonic_hr.ts \ translations/phototonic_sr.ts phototonic-1.7.20/phototonic.qrc000066400000000000000000000040541271214516700166750ustar00rootroot00000000000000 images/error_image.png images/no_image.png images/home.png images/next.png images/back.png images/up.png images/refresh.png images/cut.png images/copy.png images/paste.png images/delete.png images/about.png images/new_folder.png images/settings.png images/phototonic.png images/zoom_in.png images/zoom_out.png images/first.png images/last.png images/top.png images/bottom.png images/zoom.png images/zoom1.png images/rotate_left.png images/rotate_right.png images/flipH.png images/flipV.png images/save.png images/open.png images/colors.png images/new.png images/tree.png images/clear.png images/play.png images/stop.png images/crop.png images/scale.png images/save_as.png images/bookmarks.png images/new_bookmark.png images/tag_grey.png images/tag_multi.png images/tag_yellow.png images/new_tag.png images/tag_filter_on.png images/tag_filter_negate.png images/tag_filter_off.png images/busy.gif images/duplicates.png translations/phototonic_pl.qm translations/phototonic_de.qm translations/phototonic_ru.qm translations/phototonic_cs.qm translations/phototonic_fr.qm translations/phototonic_bs.qm translations/phototonic_hr.qm translations/phototonic_sr.qm phototonic-1.7.20/tags.cpp000066400000000000000000000361401271214516700154430ustar00rootroot00000000000000/* * Copyright (C) 2013-2015 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "tags.h" #include "global.h" #include "dialogs.h" ImageTags::ImageTags(QWidget *parent, ThumbView *thumbView, MetadataCache *mdCache) : QWidget(parent) { tagsTree = new QTreeWidget; tagsTree->setColumnCount(2); tagsTree->setDragEnabled(false); tagsTree->setSortingEnabled(true); tagsTree->header()->close(); tagsTree->setSelectionMode(QAbstractItemView::ExtendedSelection); this->thumbView = thumbView; this->mdCache = mdCache; negateFilterEnabled = false; tabs = new QTabBar(this); tabs->addTab(tr("Image Tags")); tabs->addTab(tr("Filter")); tabs->setTabIcon(0, QIcon(":/images/tag_yellow.png")); tabs->setTabIcon(1, QIcon(":/images/tag_filter_off.png")); connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tabsChanged(int))); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->setContentsMargins(0, 3, 0, 0); mainLayout->setSpacing(0); mainLayout->addWidget(tabs); mainLayout->addWidget(tagsTree); setLayout(mainLayout); currentDisplayMode = SelectionTagsDisplay; folderFilteringActive = false; connect(tagsTree, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(saveLastChangedTag(QTreeWidgetItem *, int))); connect(tagsTree, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(tagClicked(QTreeWidgetItem *, int))); tagsTree->setContextMenuPolicy(Qt::CustomContextMenu); connect(tagsTree, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showMenu(QPoint))); addToSelectionAction = new QAction(tr("Tag"), this); addToSelectionAction->setIcon(QIcon(":/images/tag_yellow.png")); connect(addToSelectionAction, SIGNAL(triggered()), this, SLOT(addTagsToSelection())); removeFromSelectionAction = new QAction(tr("Untag"), this); connect(removeFromSelectionAction, SIGNAL(triggered()), this, SLOT(removeTagsFromSelection())); addTagAction = new QAction(tr("New Tag"), this); addTagAction->setIcon(QIcon(":/images/new_tag.png")); connect(addTagAction, SIGNAL(triggered()), this, SLOT(addNewTag())); removeTagAction = new QAction(tr("Remove Tag"), this); removeTagAction->setIcon(QIcon::fromTheme("edit-delete", QIcon(":/images/delete.png"))); clearTagsFilterAction = new QAction(tr("Clear Filters"), this); clearTagsFilterAction->setIcon(QIcon(":/images/tag_filter_off.png")); connect(clearTagsFilterAction, SIGNAL(triggered()), this, SLOT(clearTagFilters())); negateAction = new QAction(tr("Negate"), this); negateAction->setCheckable(true); connect(negateAction, SIGNAL(triggered()), this, SLOT(negateFilter())); tagsMenu = new QMenu(""); tagsMenu->addAction(addToSelectionAction); tagsMenu->addAction(removeFromSelectionAction); tagsMenu->addSeparator(); tagsMenu->addAction(addTagAction); tagsMenu->addAction(removeTagAction); tagsMenu->addSeparator(); tagsMenu->addAction(clearTagsFilterAction); tagsMenu->addAction(negateAction); } void ImageTags::redrawTree() { tagsTree->resizeColumnToContents(0); tagsTree->sortItems(0, Qt::AscendingOrder); } void ImageTags::showMenu(QPoint pt) { QTreeWidgetItem *item = tagsTree->itemAt(pt); addToSelectionAction->setEnabled(item? true : false); removeFromSelectionAction->setEnabled(item? true : false); removeTagAction->setEnabled(item? true : false); tagsMenu->popup(tagsTree->viewport()->mapToGlobal(pt)); } void ImageTags::setTagIcon(QTreeWidgetItem *tagItem, TagIcons icon) { switch (icon) { case TagIconDisabled: tagItem->setIcon(0, QIcon(":/images/tag_grey.png")); break; case TagIconEnabled: tagItem->setIcon(0, QIcon(":/images/tag_yellow.png")); break; case TagIconMultiple: tagItem->setIcon(0, QIcon(":/images/tag_multi.png")); break; case TagIconFilterEnabled: tagItem->setIcon(0, QIcon(":/images/tag_filter_on.png")); break; case TagIconFilterDisabled: tagItem->setIcon(0, QIcon(":/images/tag_filter_off.png")); break; case TagIconFilterNegate: tagItem->setIcon(0, QIcon(":/images/tag_filter_negate.png")); break; } } void ImageTags::addTag(QString tagName, bool tagChecked) { QTreeWidgetItem *tagItem = new QTreeWidgetItem(); tagItem->setText(0, tagName); tagItem->setCheckState(0, tagChecked? Qt::Checked : Qt::Unchecked); setTagIcon(tagItem, tagChecked? TagIconEnabled : TagIconDisabled); tagsTree->addTopLevelItem(tagItem); } bool ImageTags::writeTagsToImage(QString &imageFileName, QSet &newTags) { QSet imageTags; Exiv2::Image::AutoPtr exifImage; try { exifImage = Exiv2::ImageFactory::open(imageFileName.toStdString()); exifImage->readMetadata(); Exiv2::IptcData newIptcData; /* copy existing data */ Exiv2::IptcData &iptcData = exifImage->iptcData(); if (!iptcData.empty()) { QString key; Exiv2::IptcData::iterator end = iptcData.end(); for (Exiv2::IptcData::iterator iptcIt = iptcData.begin(); iptcIt != end; ++iptcIt) { if (iptcIt->tagName() != "Keywords") { newIptcData.add(*iptcIt); } } } /* add new tags */ QSetIterator newTagsIt(newTags); while (newTagsIt.hasNext()) { QString tag = newTagsIt.next(); Exiv2::Value::AutoPtr value = Exiv2::Value::create(Exiv2::string); value->read(tag.toStdString()); Exiv2::IptcKey key("Iptc.Application2.Keywords"); newIptcData.add(key, value.get()); } exifImage->setIptcData(newIptcData); exifImage->writeMetadata(); } catch (Exiv2::Error &error) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Failed to save tags to ") + imageFileName); return false; } return true; } void ImageTags::showSelectedImagesTags() { static bool busy = false; if (busy) return; busy = true; QStringList selectedThumbs = thumbView->getSelectedThumbsList(); setActiveViewMode(SelectionTagsDisplay); int selectedThumbsNum = selectedThumbs.size(); QMap tagsCount; for (int i = 0; i < selectedThumbsNum; ++i) { QSetIterator imageTagsIter(mdCache->getImageTags(selectedThumbs[i])); while (imageTagsIter.hasNext()) { QString imageTag = imageTagsIter.next(); tagsCount[imageTag]++; if (!GData::knownTags.contains(imageTag)) { addTag(imageTag, true); GData::knownTags.insert(imageTag); } } } bool imagesTagged = false, imagesTaggedMixed = false; QTreeWidgetItemIterator it(tagsTree); while (*it) { QString tagName = (*it)->text(0); int tagCountTotal = tagsCount[tagName]; if (selectedThumbsNum == 0) { (*it)->setCheckState(0, Qt::Unchecked); (*it)->setFlags((*it)->flags() & ~Qt::ItemIsUserCheckable); setTagIcon(*it, TagIconDisabled); } else if (tagCountTotal == selectedThumbsNum) { (*it)->setCheckState(0, Qt::Checked); (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); setTagIcon(*it, TagIconEnabled); imagesTagged = true; } else if (tagCountTotal) { (*it)->setCheckState(0, Qt::PartiallyChecked); (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); setTagIcon(*it, TagIconMultiple); imagesTaggedMixed = true; } else { (*it)->setCheckState(0, Qt::Unchecked); (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); setTagIcon(*it, TagIconDisabled); } ++it; } if (imagesTagged) { tabs->setTabIcon(0, QIcon(":/images/tag_yellow.png")); } else if (imagesTaggedMixed) { tabs->setTabIcon(0, QIcon(":/images/tag_multi.png")); } else { tabs->setTabIcon(0, QIcon(":/images/tag_grey.png")); } addToSelectionAction->setEnabled(selectedThumbsNum? true : false); removeFromSelectionAction->setEnabled(selectedThumbsNum? true : false); redrawTree(); busy = false; } void ImageTags::showTagsFilter() { static bool busy = false; if (busy) return; busy = true; setActiveViewMode(FolderTagsDisplay); QTreeWidgetItemIterator it(tagsTree); while (*it) { QString tagName = (*it)->text(0); (*it)->setFlags((*it)->flags() | Qt::ItemIsUserCheckable); if (imageFilteringTags.contains(tagName)) { (*it)->setCheckState(0, Qt::Checked); setTagIcon(*it, negateFilterEnabled? TagIconFilterNegate : TagIconFilterEnabled); } else { (*it)->setCheckState(0, Qt::Unchecked); setTagIcon(*it, TagIconFilterDisabled); } ++it; } redrawTree(); busy = false; } void ImageTags::populateTagsTree() { tagsTree->clear(); QSetIterator knownTagsIt(GData::knownTags); while (knownTagsIt.hasNext()) { QString tag = knownTagsIt.next(); addTag(tag, false); } redrawTree(); } void ImageTags::setActiveViewMode(TagsDisplayMode mode) { currentDisplayMode = mode; addTagAction->setVisible(currentDisplayMode == SelectionTagsDisplay); removeTagAction->setVisible(currentDisplayMode == SelectionTagsDisplay); addToSelectionAction->setVisible(currentDisplayMode == SelectionTagsDisplay); removeFromSelectionAction->setVisible(currentDisplayMode == SelectionTagsDisplay); clearTagsFilterAction->setVisible(currentDisplayMode == FolderTagsDisplay); negateAction->setVisible(currentDisplayMode == FolderTagsDisplay); } bool ImageTags::isImageFilteredOut(QString imageFileName) { QSet imageTags = mdCache->getImageTags(imageFileName); QSetIterator filteredTagsIt(imageFilteringTags); while (filteredTagsIt.hasNext()) { if (imageTags.contains(filteredTagsIt.next())) { return negateFilterEnabled? true : false; } } return negateFilterEnabled? false : true; } void ImageTags::resetTagsState() { tagsTree->clear(); mdCache->clear(); } QSet ImageTags::getCheckedTags(Qt::CheckState tagState) { QSet checkedTags; QTreeWidgetItemIterator it(tagsTree); while (*it) { if ((*it)->checkState(0) == tagState) { checkedTags.insert((*it)->text(0)); } ++it; } return checkedTags; } void ImageTags::applyTagFiltering() { imageFilteringTags = getCheckedTags(Qt::Checked); if (imageFilteringTags.size()) { folderFilteringActive = true; if (negateFilterEnabled) { tabs->setTabIcon(1, QIcon(":/images/tag_filter_negate.png")); } else { tabs->setTabIcon(1, QIcon(":/images/tag_filter_on.png")); } } else { folderFilteringActive = false; tabs->setTabIcon(1, QIcon(":/images/tag_filter_off.png")); } emit reloadThumbs(); } void ImageTags::applyUserAction(QTreeWidgetItem *item) { QList tagsList; tagsList << item; applyUserAction(tagsList); } void ImageTags::applyUserAction(QList tagsList) { int processEventsCounter = 0; ProgressDialog *dialog = new ProgressDialog(this); dialog->show(); QStringList currentSelectedImages = thumbView->getSelectedThumbsList(); for (int i = 0; i < currentSelectedImages.size(); ++i) { QString imageName = currentSelectedImages[i]; for (int i = tagsList.size() - 1; i > -1; --i) { Qt::CheckState tagState = tagsList.at(i)->checkState(0); setTagIcon(tagsList.at(i), (tagState == Qt::Checked? TagIconEnabled : TagIconDisabled)); QString tagName = tagsList.at(i)->text(0); if (tagState == Qt::Checked) { dialog->opLabel->setText(tr("Tagging ") + imageName); mdCache->addTagToImage(imageName, tagName); } else { dialog->opLabel->setText(tr("Untagging ") + imageName); mdCache->removeTagFromImage(imageName, tagName); } } if (!writeTagsToImage(imageName, mdCache->getImageTags(imageName))) { mdCache->removeImage(imageName); } ++processEventsCounter; if (processEventsCounter > 9) { processEventsCounter = 0; QApplication::processEvents(); } if (dialog->abortOp) { break; } } dialog->close(); delete(dialog); } void ImageTags::saveLastChangedTag(QTreeWidgetItem *item, int) { lastChangedTagItem = item; } void ImageTags::tabsChanged(int index) { if (!index) { showSelectedImagesTags(); } else { showTagsFilter(); } } void ImageTags::tagClicked(QTreeWidgetItem *item, int) { if (item == lastChangedTagItem) { if (currentDisplayMode == FolderTagsDisplay) { applyTagFiltering(); } else { applyUserAction(item); } lastChangedTagItem = 0; } } void ImageTags::removeTagsFromSelection() { for (int i = tagsTree->selectedItems().size() - 1; i > -1; --i) { tagsTree->selectedItems().at(i)->setCheckState(0, Qt::Unchecked); } applyUserAction(tagsTree->selectedItems()); } void ImageTags::addTagsToSelection() { for (int i = tagsTree->selectedItems().size() - 1; i > -1; --i) { tagsTree->selectedItems().at(i)->setCheckState(0, Qt::Checked); } applyUserAction(tagsTree->selectedItems()); } void ImageTags::clearTagFilters() { QTreeWidgetItemIterator it(tagsTree); while (*it) { (*it)->setCheckState(0, Qt::Unchecked); ++it; } imageFilteringTags.clear(); applyTagFiltering(); } void ImageTags::negateFilter() { negateFilterEnabled = negateAction->isChecked(); applyTagFiltering(); } void ImageTags::addNewTag() { bool ok; QString title = tr("Add a new tag"); QString newTagName = QInputDialog::getText(this, title, tr("Enter new tag name"), QLineEdit::Normal, "", &ok); if (!ok) { return; } if(newTagName.isEmpty()) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("No name entered")); return; } QSetIterator knownTagsIt(GData::knownTags); while (knownTagsIt.hasNext()) { QString tag = knownTagsIt.next(); if (newTagName == tag) { QMessageBox msgBox; msgBox.critical(this, tr("Error"), tr("Tag ") + newTagName + tr(" already exists")); return; } } addTag(newTagName, false); GData::knownTags.insert(newTagName); redrawTree(); } void ImageTags::removeTag() { if (!tagsTree->selectedItems().size()) { return; } QMessageBox msgBox; msgBox.setText(tr("Remove selected tags(s)?")); msgBox.setWindowTitle(tr("Remove tag")); msgBox.setIcon(QMessageBox::Warning); msgBox.setWindowIcon(QIcon(":/images/tag.png")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); msgBox.setButtonText(QMessageBox::Yes, tr("Yes")); msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel")); if (msgBox.exec() != QMessageBox::Yes) { return; } bool removedTagWasChecked = false; for (int i = tagsTree->selectedItems().size() - 1; i > -1; --i) { QString tagName = tagsTree->selectedItems().at(i)->text(0); GData::knownTags.remove(tagName); if (imageFilteringTags.contains(tagName)) { imageFilteringTags.remove(tagName); removedTagWasChecked = true; } tagsTree->takeTopLevelItem(tagsTree->indexOfTopLevelItem(tagsTree->selectedItems().at(i))); } if (removedTagWasChecked) { applyTagFiltering(); } } phototonic-1.7.20/tags.h000066400000000000000000000054401271214516700151070ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef TAGS_H #define TAGS_H #include #include #include "thumbview.h" #include "mdcache.h" class ThumbView; enum TagsDisplayMode { FolderTagsDisplay, SelectionTagsDisplay }; enum TagIcons { TagIconDisabled, TagIconEnabled, TagIconMultiple, TagIconFilterDisabled, TagIconFilterEnabled, TagIconFilterNegate }; class ImageTags : public QWidget { Q_OBJECT public: ImageTags(QWidget *parent, ThumbView *thumbView, MetadataCache *mdCache); void addTag(QString tagName, bool tagChecked); void readImageTagsToCache(const QString &imageFullPath); void showTagsFilter(); void showSelectedImagesTags(); void resetTagsState(); bool isImageFilteredOut(QString imagePath); void removeTag(); void populateTagsTree(); QMenu *tagsMenu; QTreeWidget *tagsTree; bool folderFilteringActive; QAction *removeTagAction; TagsDisplayMode currentDisplayMode; private: void readImageFileTags(QSet &tags, const QString &imageFullPath); bool writeTagsToImage(QString &imageFileName, QSet &tags); QSet getCheckedTags(Qt::CheckState tagState); void setTagIcon(QTreeWidgetItem *tagItem, TagIcons icon); void setActiveViewMode(TagsDisplayMode mode); void applyUserAction(QTreeWidgetItem *item); void applyUserAction(QList tagsList); void redrawTree(); QSet imageFilteringTags; QAction *addTagAction; QAction *addToSelectionAction; QAction *removeFromSelectionAction; QAction *clearTagsFilterAction; QAction *negateAction; QTreeWidgetItem *lastChangedTagItem; ThumbView *thumbView; QTabBar *tabs; MetadataCache *mdCache; bool negateFilterEnabled; private slots: void tagClicked(QTreeWidgetItem *item, int column); void saveLastChangedTag(QTreeWidgetItem *item, int column); void applyTagFiltering(); void showMenu(QPoint pt); void addNewTag(); void addTagsToSelection(); void clearTagFilters(); void negateFilter(); void removeTagsFromSelection(); void tabsChanged(int index); signals: void setStatus(QString state); void reloadThumbs(); }; #endif // TAGS_H phototonic-1.7.20/thumbview.cpp000066400000000000000000000612551271214516700165240ustar00rootroot00000000000000/* * Copyright (C) 2013-2014 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #include "thumbview.h" ThumbView::ThumbView(QWidget *parent, MetadataCache *mdCache) : QListView(parent) { this->mdCache = mdCache; GData::thumbsBackgroundColor = GData::appSettings->value("backgroundThumbColor").value(); GData::thumbsTextColor = GData::appSettings->value("textThumbColor").value(); setThumbColors(); GData::thumbSpacing = GData::appSettings->value("thumbSpacing").toInt(); GData::thumbPagesReadahead = GData::appSettings->value("thumbPagesReadahead").toInt(); GData::thumbsLayout = GData::appSettings->value("thumbLayout").toInt(); thumbSize = GData::appSettings->value("thumbsZoomVal").toInt(); currentRow = 0; setViewMode(QListView::IconMode); setSelectionMode(QAbstractItemView::ExtendedSelection); setResizeMode(QListView::Adjust); setWordWrap(true); setDragEnabled(true); setEditTriggers(QAbstractItemView::NoEditTriggers); setItemDelegate(new QItemDelegate); setUniformItemSizes(false); thumbViewModel = new QStandardItemModel(this); thumbViewModel->setSortRole(SortRole); setModel(thumbViewModel); connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(loadVisibleThumbs(int))); connect(this->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(handleSelectionChanged(QItemSelection))); connect(this, SIGNAL(doubleClicked(const QModelIndex &)), parent, SLOT(loadImagefromThumb(const QModelIndex &))); connect(this->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), parent, SLOT(updateViewerImageBySelection(QItemSelection))); thumbsDir = new QDir(); fileFilters = new QStringList; emptyImg.load(":/images/no_image.png"); QTime time = QTime::currentTime(); qsrand((uint)time.msec()); mainWindow = parent; infoView = new InfoView(this); } void ThumbView::setThumbColors() { QString bgColor = "background: rgb(%1, %2, %3); "; bgColor = bgColor.arg(GData::thumbsBackgroundColor.red()) .arg(GData::thumbsBackgroundColor.green()) .arg(GData::thumbsBackgroundColor.blue()); QString ss = "QListView { " + bgColor + "background-image: url(" + GData::thumbsBackImage + "); background-attachment: fixed; }"; setStyleSheet(ss); QPalette scrollBarOrigPal = verticalScrollBar()->palette(); QPalette thumbViewOrigPal = palette(); thumbViewOrigPal.setColor(QPalette::Text, GData::thumbsTextColor); setPalette(thumbViewOrigPal); verticalScrollBar()->setPalette(scrollBarOrigPal); } void ThumbView::selectCurrentIndex() { if (currentIndex.isValid() && thumbViewModel->rowCount() > 0) { scrollTo(currentIndex); setCurrentIndex(currentIndex); } } QString ThumbView::getSingleSelectionFilename() { if (selectionModel()->selectedIndexes().size() == 1) return thumbViewModel->item(selectionModel()->selectedIndexes().first().row())->data(FileNameRole).toString(); return(""); } int ThumbView::getNextRow() { if (currentRow == thumbViewModel->rowCount() - 1) return -1; return currentRow + 1; } int ThumbView::getPrevRow() { if (currentRow == 0) return -1; return currentRow - 1; } int ThumbView::getLastRow() { return thumbViewModel->rowCount() - 1; } int ThumbView::getRandomRow() { return qrand() % (thumbViewModel->rowCount()); } int ThumbView::getCurrentRow() { return currentRow; } void ThumbView::setCurrentRow(int row) { if (row >= 0) currentRow = row; else currentRow = 0; } void ThumbView::setImageviewWindowTitle() { QString title = thumbViewModel->item(currentRow)->data(FileNameRole).toString() + " - [" + QString::number(currentRow + 1) + "/" + QString::number(thumbViewModel->rowCount()) + "] - Phototonic"; mainWindow->setWindowTitle(title); } bool ThumbView::setCurrentIndexByName(QString &FileName) { QModelIndexList indexList = thumbViewModel->match(thumbViewModel->index(0, 0), FileNameRole, FileName); if (indexList.size()) { currentIndex = indexList[0]; setCurrentRow(currentIndex.row()); setRowHidden(currentIndex.row(), false); return true; } return false; } bool ThumbView::setCurrentIndexByRow(int row) { QModelIndex idx = thumbViewModel->indexFromItem(thumbViewModel->item(row)); if (idx.isValid()) { currentIndex = idx; setCurrentRow(idx.row()); return true; } return false; } void ThumbView::updateExifInfo(QString imageFullPath) { Exiv2::Image::AutoPtr exifImage; QString key; QString val; try { exifImage = Exiv2::ImageFactory::open(imageFullPath.toStdString()); exifImage->readMetadata(); } catch (Exiv2::Error &error) { return; } Exiv2::ExifData &exifData = exifImage->exifData(); if (!exifData.empty()) { Exiv2::ExifData::const_iterator end = exifData.end(); infoView->addTitleEntry("Exif"); for (Exiv2::ExifData::const_iterator md = exifData.begin(); md != end; ++md) { key = QString::fromUtf8(md->tagName().c_str()); val = QString::fromUtf8(md->print().c_str()); infoView->addEntry(key, val); } } Exiv2::IptcData &iptcData = exifImage->iptcData(); if (!iptcData.empty()) { Exiv2::IptcData::iterator end = iptcData.end(); infoView->addTitleEntry("IPTC"); for (Exiv2::IptcData::iterator md = iptcData.begin(); md != end; ++md) { key = QString::fromUtf8(md->tagName().c_str()); val = QString::fromUtf8(md->print().c_str()); infoView->addEntry(key, val); } } Exiv2::XmpData &xmpData = exifImage->xmpData(); if (!xmpData.empty()) { Exiv2::XmpData::iterator end = xmpData.end(); infoView->addTitleEntry("XMP"); for (Exiv2::XmpData::iterator md = xmpData.begin(); md != end; ++md) { key = QString::fromUtf8(md->tagName().c_str()); val = QString::fromUtf8(md->print().c_str()); infoView->addEntry(key, val); } } } void ThumbView::handleSelectionChanged(const QItemSelection&) { QString info; QModelIndexList indexesList = selectionModel()->selectedIndexes(); int nSelected = indexesList.size(); QString imageFullPath; QString statusStr; infoView->clear(); if (nSelected == 1) { QString imageFullPath = thumbViewModel->item(indexesList.first().row())->data(FileNameRole).toString(); imageInfoReader.setFileName(imageFullPath); QString key; QString val; QFileInfo imageInfo = QFileInfo(imageFullPath); infoView->addTitleEntry(tr("General")); key = tr("File name"); val = imageInfo.fileName(); infoView->addEntry(key, val); key = tr("Location"); val = imageInfo.path(); infoView->addEntry(key, val); key = tr("Size"); val = QString::number(imageInfo.size() / 1024.0, 'f', 2) + "K"; infoView->addEntry(key, val); key = tr("Modified"); val = imageInfo.lastModified().toString(Qt::SystemLocaleShortDate); infoView->addEntry(key, val); if (imageInfoReader.size().isValid()) { key = tr("Format"); val = imageInfoReader.format().toUpper(); infoView->addEntry(key, val); key = tr("Resolution"); val = QString::number(imageInfoReader.size().width()) + "x" + QString::number(imageInfoReader.size().height()); infoView->addEntry(key, val); key = tr("Megapixel"); val = QString::number((imageInfoReader.size().width() * imageInfoReader.size().height()) / 1000000.0, 'f', 2); infoView->addEntry(key, val); updateExifInfo(imageFullPath); recentThumb = imageFullPath; } else { imageInfoReader.read(); key = tr("Error"); val = imageInfoReader.errorString(); infoView->addEntry(key, val); } } if (imageTags->currentDisplayMode == SelectionTagsDisplay) { imageTags->showSelectedImagesTags(); } /* update status bar */ if (!nSelected) { updateThumbsCount(); return; } else if (nSelected >= 1) { statusStr = tr("Selected %1 of%2") .arg(QString::number(nSelected)) .arg(tr(" %n image(s)", "", thumbViewModel->rowCount())); } emit setStatus(statusStr); } QStringList ThumbView::getSelectedThumbsList() { QModelIndexList indexesList = selectionModel()->selectedIndexes(); QStringList SelectedThumbsPaths; for (int tn = indexesList.size() - 1; tn >= 0 ; --tn) { SelectedThumbsPaths << thumbViewModel->item(indexesList[tn].row())->data(FileNameRole).toString(); } return SelectedThumbsPaths; } void ThumbView::startDrag(Qt::DropActions) { QModelIndexList indexesList = selectionModel()->selectedIndexes(); if (indexesList.isEmpty()) { return; } QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; QList urls; for (QModelIndexList::const_iterator it = indexesList.constBegin(), end = indexesList.constEnd(); it != end; ++it) { urls << QUrl(thumbViewModel->item(it->row())->data(FileNameRole).toString()); } mimeData->setUrls(urls); drag->setMimeData(mimeData); QPixmap pix; if (indexesList.count() > 1) { pix = QPixmap(128, 112); pix.fill(Qt::transparent); QPainter painter(&pix); painter.setBrush(Qt::NoBrush); painter.setPen(QPen(Qt::white, 2)); int x = 0, y = 0, xMax = 0, yMax = 0; for (int i = 0; i < qMin(5, indexesList.count()); ++i) { QPixmap pix = thumbViewModel->item(indexesList.at(i).row())->icon().pixmap(72); if (i == 4) { x = (xMax - pix.width()) / 2; y = (yMax - pix.height()) / 2; } painter.drawPixmap(x, y, pix); xMax = qMax(xMax, qMin(128, x + pix.width())); yMax = qMax(yMax, qMin(112, y + pix.height())); painter.drawRect(x + 1, y + 1, qMin(126, pix.width() - 2), qMin(110, pix.height() - 2)); x = !(x == y) * 56; y = !y * 40; } painter.end(); pix = pix.copy(0, 0, xMax, yMax); drag->setPixmap(pix); } else { pix = thumbViewModel->item(indexesList.at(0).row())->icon().pixmap(128); drag->setPixmap(pix); } drag->setHotSpot(QPoint(pix.width() / 2, pix.height() / 2)); drag->exec(Qt::CopyAction | Qt::MoveAction | Qt::LinkAction, Qt::IgnoreAction); } void ThumbView::abort() { abortOp = true; } void ThumbView::loadVisibleThumbs(int scrollBarValue) { static int lastScrollBarValue = 0; if (GData::thumbsLayout == Compact) { scrolledForward = true; } else { scrolledForward = (scrollBarValue >= lastScrollBarValue); } lastScrollBarValue = scrollBarValue; Start: int firstVisible = getFirstVisibleThumb(); int lastVisible = getLastVisibleThumb(); if (abortOp || firstVisible < 0 || lastVisible < 0) { return; } if (scrolledForward) { lastVisible += ((lastVisible - firstVisible) * (GData::thumbPagesReadahead + 1)); if (lastVisible >= thumbViewModel->rowCount()) { lastVisible = thumbViewModel->rowCount() - 1; } } else { firstVisible -= (lastVisible - firstVisible) * (GData::thumbPagesReadahead + 1); if (firstVisible < 0) { firstVisible = 0; } lastVisible += 10; if (lastVisible >= thumbViewModel->rowCount()) { lastVisible = thumbViewModel->rowCount() - 1; } } if (thumbsRangeFirst == firstVisible && thumbsRangeLast == lastVisible) { return; } thumbsRangeFirst = firstVisible; thumbsRangeLast = lastVisible; loadThumbsRange(); if (!abortOp) { goto Start; } } int ThumbView::getFirstVisibleThumb() { QModelIndex idx; for (int currThumb = 0; currThumb < thumbViewModel->rowCount(); ++currThumb) { idx = thumbViewModel->indexFromItem(thumbViewModel->item(currThumb)); if (viewport()->rect().contains(QPoint(0, visualRect(idx).y() + visualRect(idx).height() + 1))) { return idx.row(); } } return -1; } int ThumbView::getLastVisibleThumb() { QModelIndex idx; for (int currThumb = thumbViewModel->rowCount() -1; currThumb >= 0 ; --currThumb) { idx = thumbViewModel->indexFromItem(thumbViewModel->item(currThumb)); if (viewport()->rect().contains(QPoint(0, visualRect(idx).y() + visualRect(idx).height() + 1))) { return idx.row(); } } return -1; } bool ThumbView::isThumbVisible(QModelIndex idx) { if (viewport()->rect().contains(QPoint(0, visualRect(idx).y() + visualRect(idx).height() + 1))) { return true; } return false; } void ThumbView::updateThumbsCount() { QString state ; if (thumbViewModel->rowCount() > 0) { state = tr("%n image(s)", "", thumbViewModel->rowCount()); } else { state = tr("No images"); } thumbsDir->setPath(GData::currentViewDir); emit setStatus(state); } void ThumbView::loadPrepare() { float thumbAspect = 1.33; if (GData::thumbsLayout == Compact) { thumbAspect = 1.77; } else if (GData::thumbsLayout == Squares) { thumbAspect = 2; } thumbHeight = (GData::thumbsLayout == Squares)? thumbSize * thumbAspect : thumbSize; thumbWidth = (GData::thumbsLayout == Squares)? thumbSize * thumbAspect : thumbHeight * thumbAspect; setIconSize(QSize(thumbWidth, thumbHeight)); fileFilters->clear(); QString textFilter("*"); textFilter+= filterStr; *fileFilters << textFilter + "*.bmp" << textFilter + "*.cur" << textFilter + "*.dds" << textFilter + "*.gif" << textFilter + "*.icns" << textFilter + "*.ico" << textFilter + "*.jpeg" << textFilter + "*.jpg" << textFilter + "*.jp2" << textFilter + "*.jpe" << textFilter + "*.mng" << textFilter + "*.pbm" << textFilter + "*.pgm" << textFilter + "*.png" << textFilter + "*.ppm" << textFilter + "*.svg" << textFilter + "*.svgz" << textFilter + "*.tga" << textFilter + "*.tif" << textFilter + "*.tiff" << textFilter + "*.wbmp" << textFilter + "*.webp" << textFilter + "*.xbm" << textFilter + "*.xpm"; thumbsDir->setNameFilters(*fileFilters); thumbsDir->setFilter(QDir::Files); if (GData::showHiddenFiles) { thumbsDir->setFilter(thumbsDir->filter() | QDir::Hidden); } thumbsDir->setPath(GData::currentViewDir); QDir::SortFlags tempThumbsSortFlags = thumbsSortFlags; if (tempThumbsSortFlags & QDir::Size || tempThumbsSortFlags & QDir::Time) { tempThumbsSortFlags ^= QDir::Reversed; } thumbsDir->setSorting(tempThumbsSortFlags); thumbViewModel->clear(); setSpacing(GData::thumbSpacing); if (isNeedScroll) { scrollToTop(); } abortOp = false; newIndex = 0; thumbsRangeFirst = -1; thumbsRangeLast = -1; imageTags->resetTagsState(); } void ThumbView::load() { emit showBusy(true); loadPrepare(); initThumbs(); updateThumbsCount(); loadVisibleThumbs(); if (GData::includeSubFolders) { QDirIterator iterator(GData::currentViewDir, QDirIterator::Subdirectories); while (iterator.hasNext()) { iterator.next(); if (iterator.fileInfo().isDir() && iterator.fileName() != "." && iterator.fileName() != "..") { thumbsDir->setPath(iterator.filePath()); initThumbs(); updateThumbsCount(); loadVisibleThumbs(); if (abortOp) { goto finish; } } QApplication::processEvents(); } QItemSelection dummy; handleSelectionChanged(dummy); } finish: emit showBusy(false); busy = false; return; } void ThumbView::loadDuplicates() { loadPrepare(); emit showBusy(true); emit setStatus(tr("Searching duplicate images...")); dupImageHashes.clear(); findDupes(true); if (GData::includeSubFolders) { QDirIterator iterator(GData::currentViewDir, QDirIterator::Subdirectories); while (iterator.hasNext()) { iterator.next(); if (iterator.fileInfo().isDir() && iterator.fileName() != "." && iterator.fileName() != "..") { thumbsDir->setPath(iterator.filePath()); findDupes(false); if (abortOp) { goto finish; } } QApplication::processEvents(); } } finish: busy = false; emit showBusy(false); return; } void ThumbView::initThumbs() { thumbFileInfoList = thumbsDir->entryInfoList(); static QStandardItem *thumbIitem; static int fileIndex; static QPixmap emptyPixMap; static QSize hintSize; int processEventsCounter = 0; emptyPixMap = QPixmap::fromImage(emptyImg).scaled(thumbWidth, thumbHeight); if (GData::thumbsLayout == Squares) { hintSize = QSize(thumbWidth / 2, thumbWidth / 2); } else if (GData::thumbsLayout == Classic) { hintSize = QSize(thumbWidth, thumbHeight + (GData::showLabels? QFontMetrics(font()).height() + 5 : 0)); } for (fileIndex = 0; fileIndex < thumbFileInfoList.size(); ++fileIndex) { thumbFileInfo = thumbFileInfoList.at(fileIndex); mdCache->loadImageMetadata(thumbFileInfo.filePath()); if (imageTags->folderFilteringActive && imageTags->isImageFilteredOut(thumbFileInfo.filePath())) { continue; } thumbIitem = new QStandardItem(); thumbIitem->setData(false, LoadedRole); thumbIitem->setData(fileIndex, SortRole); thumbIitem->setData(thumbFileInfo.filePath(), FileNameRole); if (GData::thumbsLayout != Squares && GData::showLabels) { thumbIitem->setData(thumbFileInfo.fileName(), Qt::DisplayRole); } if (GData::thumbsLayout == Compact) { thumbIitem->setIcon(emptyPixMap); } thumbIitem->setTextAlignment(Qt::AlignTop | Qt::AlignHCenter); if (GData::thumbsLayout != Compact) { thumbIitem->setSizeHint(hintSize); } thumbViewModel->appendRow(thumbIitem); ++processEventsCounter; if (processEventsCounter > 100) { processEventsCounter = 0; QApplication::processEvents(); } } imageTags->populateTagsTree(); if (imageTags->currentDisplayMode == SelectionTagsDisplay) { imageTags->showSelectedImagesTags(); } else { imageTags->showTagsFilter(); } if (thumbFileInfoList.size() && selectionModel()->selectedIndexes().size() == 0) { selectThumbByRow(0); } } void ThumbView::selectThumbByRow(int row) { setCurrentIndexByRow(row); selectCurrentIndex(); } void ThumbView::updateFoundDupesState(int duplicates, int filesScanned, int originalImages) { QString state; state = tr("Scanned %1, displaying %2 (%3 and %4)") .arg(tr("%n image(s)", "", filesScanned)) .arg(tr("%n image(s)", "", originalImages + duplicates)) .arg(tr("%n original(s)", "", originalImages)) .arg(tr("%n duplicate(s)", "", duplicates)); emit setStatus(state); } void ThumbView::findDupes(bool resetCounters) { thumbFileInfoList = thumbsDir->entryInfoList(); int processEventsCounter = 0; static int originalImages; static int foundDups; static int totalFiles; if (resetCounters) { originalImages = totalFiles = foundDups = 0; } for (int currThumb = 0; currThumb < thumbFileInfoList.size(); ++currThumb) { thumbFileInfo = thumbFileInfoList.at(currThumb); QCryptographicHash md5gen(QCryptographicHash::Md5); QString currentFilePath = thumbFileInfo.filePath(); QFile file(currentFilePath); if (!file.open(QIODevice::ReadOnly)) { continue; } totalFiles++; md5gen.addData(file.readAll()); file.close(); QString md5 = md5gen.result().toHex(); if (dupImageHashes.contains(md5)) { if (dupImageHashes[md5].duplicates < 1) { addThumb(dupImageHashes[md5].filePath); originalImages++; } foundDups++; dupImageHashes[md5].duplicates++; addThumb(currentFilePath); } else { DuplicateImage dupImage; dupImage.filePath = currentFilePath; dupImage.duplicates = 0; dupImageHashes.insert(md5, dupImage); } ++processEventsCounter; if (processEventsCounter > 9) { processEventsCounter = 0; QApplication::processEvents(); } updateFoundDupesState(foundDups, totalFiles, originalImages); if (abortOp) { break; } } updateFoundDupesState(foundDups, totalFiles, originalImages); } void ThumbView::loadThumbsRange() { static bool inProgress = false; static QImageReader thumbReader; static QSize currThumbSize; static int currRowCount; static QString imageFileName; QImage thumb; int currThumb; bool imageReadOk; if (inProgress) { abortOp = true; QTimer::singleShot(0, this, SLOT(loadThumbsRange())); return; } inProgress = true; currRowCount = thumbViewModel->rowCount(); for ( scrolledForward? currThumb = thumbsRangeFirst : currThumb = thumbsRangeLast; (scrolledForward? currThumb <= thumbsRangeLast : currThumb >= thumbsRangeFirst); scrolledForward? ++currThumb : --currThumb) { if (abortOp || thumbViewModel->rowCount() != currRowCount || currThumb < 0) { break; } if (thumbViewModel->item(currThumb)->data(LoadedRole).toBool()) { continue; } imageFileName = thumbViewModel->item(currThumb)->data(FileNameRole).toString(); thumbReader.setFileName(imageFileName); currThumbSize = thumbReader.size(); imageReadOk = false; if (currThumbSize.isValid()) { if (!GData::noEnlargeSmallThumb || (currThumbSize.width() > thumbWidth || currThumbSize.height() > thumbHeight)) { currThumbSize.scale(QSize(thumbWidth, thumbHeight), Qt::KeepAspectRatio); } thumbReader.setScaledSize(currThumbSize); imageReadOk = thumbReader.read(&thumb); } if (imageReadOk) { if (GData::exifThumbRotationEnabled) { imageView->rotateByExifRotation(thumb, imageFileName); currThumbSize = thumb.size(); currThumbSize.scale(QSize(thumbWidth, thumbHeight), Qt::KeepAspectRatio); } thumbViewModel->item(currThumb)->setIcon(QPixmap::fromImage(thumb)); } else { thumbViewModel->item(currThumb)->setIcon(QIcon::fromTheme("image-missing", QIcon(":/images/error_image.png")).pixmap(BAD_IMG_SZ, BAD_IMG_SZ)); currThumbSize.setHeight(BAD_IMG_SZ); currThumbSize.setWidth(BAD_IMG_SZ); } if (GData::thumbsLayout == Compact) { if (GData::showLabels) currThumbSize.setHeight(currThumbSize.height() + QFontMetrics(font()).height() + 5); thumbViewModel->item(currThumb)->setSizeHint(currThumbSize); if (isThumbVisible(thumbViewModel->item(currThumb)->index())) setRowHidden(currThumb, false); } thumbViewModel->item(currThumb)->setData(true, LoadedRole); QApplication::processEvents(); } if (GData::thumbsLayout == Compact && thumbViewModel->rowCount() > 0) { setRowHidden(0 , false); } inProgress = false; abortOp = false; } void ThumbView::addThumb(QString &imageFullPath) { QStandardItem *thumbIitem = new QStandardItem(); QImageReader thumbReader; QSize hintSize; QSize currThumbSize; static QImage thumb; if (GData::thumbsLayout == Squares) hintSize = QSize(thumbWidth / 2, thumbWidth / 2); else if (GData::thumbsLayout == Classic) hintSize = QSize(thumbWidth, thumbHeight + (GData::showLabels? QFontMetrics(font()).height() + 5 : 0)); thumbFileInfo = QFileInfo(imageFullPath); thumbIitem->setData(true, LoadedRole); thumbIitem->setData(0, SortRole); thumbIitem->setData(thumbFileInfo.filePath(), FileNameRole); if (GData::thumbsLayout != Squares && GData::showLabels) thumbIitem->setData(thumbFileInfo.fileName(), Qt::DisplayRole); thumbReader.setFileName(imageFullPath); currThumbSize = thumbReader.size(); if (currThumbSize.isValid()) { if (!GData::noEnlargeSmallThumb || (currThumbSize.width() > thumbWidth || currThumbSize.height() > thumbHeight)) { currThumbSize.scale(QSize(thumbWidth, thumbHeight), Qt::KeepAspectRatio); } thumbReader.setScaledSize(currThumbSize); thumb = thumbReader.read(); if (GData::exifThumbRotationEnabled) { imageView->rotateByExifRotation(thumb, imageFullPath); currThumbSize = thumb.size(); currThumbSize.scale(QSize(thumbWidth, thumbHeight), Qt::KeepAspectRatio); } thumbIitem->setIcon(QPixmap::fromImage(thumb)); } else { thumbIitem->setIcon(QIcon::fromTheme("image-missing", QIcon(":/images/error_image.png")).pixmap(BAD_IMG_SZ, BAD_IMG_SZ)); currThumbSize.setHeight(BAD_IMG_SZ); currThumbSize.setWidth(BAD_IMG_SZ); } if (GData::thumbsLayout == Compact) { if (GData::showLabels) currThumbSize.setHeight(currThumbSize.height() + QFontMetrics(font()).height() + 5); thumbIitem->setSizeHint(currThumbSize); } else thumbIitem->setSizeHint(hintSize); thumbViewModel->appendRow(thumbIitem); } void ThumbView::wheelEvent(QWheelEvent *event) { if (event->delta() < 0) verticalScrollBar()->setValue(verticalScrollBar()->value() + thumbHeight); else verticalScrollBar()->setValue(verticalScrollBar()->value() - thumbHeight); } void ThumbView::mousePressEvent(QMouseEvent *event) { QListView::mousePressEvent(event); if (GData::reverseMouseBehavior && event->button() == Qt::MiddleButton) { if (selectionModel()->selectedIndexes().size() == 1) emit(doubleClicked(selectionModel()->selectedIndexes().first())); } } void ThumbView::invertSelection() { QItemSelection toggleSelection; QModelIndex firstIndex = thumbViewModel->index(0, 0); QModelIndex lastIndex = thumbViewModel->index(thumbViewModel->rowCount() - 1, 0); toggleSelection.select(firstIndex, lastIndex); selectionModel()->select(toggleSelection, QItemSelectionModel::Toggle); } void ThumbView::setNeedScroll(bool needScroll) { isNeedScroll = needScroll; } void ThumbView::setImageView(ImageView *imageView) { this->imageView = imageView; } phototonic-1.7.20/thumbview.h000066400000000000000000000065001271214516700161610ustar00rootroot00000000000000/* * Copyright (C) 2013 Ofer Kashayov * This file is part of Phototonic Image Viewer. * * Phototonic 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. * * Phototonic 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 Phototonic. If not, see . */ #ifndef THUMBVIEW_H #define THUMBVIEW_H #include #include #include "global.h" #include "fstree.h" #include "bookmarks.h" #include "infoview.h" #include "imageview.h" #include "tags.h" #include "mdcache.h" #define BAD_IMG_SZ 64 class ImageTags; struct DuplicateImage { QString filePath; int duplicates; }; class ThumbView : public QListView { Q_OBJECT public: enum UserRoles { FileNameRole = Qt::UserRole + 1, SortRole, LoadedRole }; enum ThumbnailLayouts { Classic, Compact, Squares }; ThumbView(QWidget *parent, MetadataCache *mdCache); void loadPrepare(); void load(); void loadDuplicates(); void setThumbColors(); bool setCurrentIndexByName(QString &FileName); bool setCurrentIndexByRow(int row); void setCurrentRow(int row); void setImageviewWindowTitle(); void setNeedScroll(bool needScroll); void selectCurrentIndex(); void addThumb(QString &imageFullPath); void abort(); void selectThumbByRow(int row); int getNextRow(); int getPrevRow(); int getLastRow(); int getRandomRow(); int getCurrentRow(); QStringList getSelectedThumbsList(); QString getSingleSelectionFilename(); void setImageView(ImageView *imageView); InfoView *infoView; ImageTags *imageTags; QDir *thumbsDir; QStringList *fileFilters; QList *thumbList; QStandardItemModel *thumbViewModel; QString recentThumb; QDir::SortFlags thumbsSortFlags; int thumbSize; int thumbWidth; int thumbHeight; QString filterStr; bool busy; protected: void startDrag(Qt::DropActions); void wheelEvent(QWheelEvent *event); void mousePressEvent(QMouseEvent *event); private: void initThumbs(); void findDupes(bool resetCounters); void updateFoundDupesState(int duplicates, int filesScanned, int originalImages); int getFirstVisibleThumb(); int getLastVisibleThumb(); bool isThumbVisible(QModelIndex idx); void updateThumbsCount(); void updateExifInfo(QString imageFullPath); QFileInfo thumbFileInfo; QFileInfoList thumbFileInfoList; QImage emptyImg; QModelIndex currentIndex; QImageReader imageInfoReader; QWidget *mainWindow; QMap dupImageHashes; MetadataCache *mdCache; ImageView *imageView; bool abortOp; int newIndex; bool isNeedScroll; int currentRow; bool scrolledForward; int thumbsRangeFirst; int thumbsRangeLast; signals: void setStatus(QString state); void showBusy(bool busy); public slots: void loadVisibleThumbs(int scrollBarValue = 0); void handleSelectionChanged(const QItemSelection& selection); void invertSelection(); private slots: void loadThumbsRange(); }; #endif // THUMBVIEW_H phototonic-1.7.20/translations/000077500000000000000000000000001271214516700165165ustar00rootroot00000000000000phototonic-1.7.20/translations/phototonic_bs.qm000066400000000000000000000660051271214516700217360ustar00rootroot00000000000000Z**%G*0+1by]GLb 9LbLb!Lb^^M 'VN)Nn-NP7*dTl2X3X XX Y%I\Zwikn+;xFDGFt(A?-1n" cXZ9 *5"QxY\[)ndCPeEj62rIAsnO<Ù.!zȲ,7q P! 9N< <\N9w 5^~&nTf3:h%4& 'fG; QxYQxY]Rg</nSW40IeFu0oG %ve"w(*w AYra?($CD$CHýRu } !& #<lu2/z^[tS] ]zIII rIIG!IGVIL1fZ6<6>o,Z' : :&zfR3֓^>}}Q{-AaB= hFW O(O DrP)nNUDF'l/^%.p3H~~>K]9,5t9cFuF}H5:1n_+_%C jIDYVI^)YߺInT &: +#CD%n 6 9$`>eOPtTF[k_.%E_PFk}n%HUjUOF2mjWa7 75ȜHЍD2( JDKY(4(_q6E=IY*?%8c-yCl7$]41jN#eLgg2>$A0K>"0מKמ5s6Lf=KY B]*J@ @X%h@8A:8 gl gl; lq^5 t7J4y y-U zdJH t=q & G. DK Mb N #TB Ds O a3 dgk idAL p=@ p=W q%6 *$B a  ># ' )/ 3 sQ ye yeN CV 2'`O }8K ~u ~a > ʺRN J! ص ES6 Bn  &e-) ,@~ , .; A` O PG'A Pr R> u1h u1 8g Zn+ 8 Sx T\ ڎ N`  < DC# Sd/ h`= i)# r* ] _a PE3 [  ©e <QA <^ Sc S(sA),5uY8:G9";IW6!]^ߔFiT\ao0 3WiaDodaj ru no Add manually AppMgmtDialog<Putanja i argumenti aplikacijeApplication path and arguments AppMgmtDialogIzaberiChoose AppMgmtDialog$Izaberi aplikacijuChoose Application AppMgmtDialog@Upravljaj eksternim aplikacijamaManage External Applications AppMgmtDialogImeName AppMgmtDialogNova aplikacijaNew Application AppMgmtDialog UreduOK AppMgmtDialog UkloniRemove AppMgmtDialogPogoeni kanaliAffected Channels ColorsDialog PlavaBlue ColorsDialogSvjetlost Brightness ColorsDialog(Svjetlost i kontrastBrightness and Contrast ColorsDialogBalans boja Color Balance ColorsDialog ObojiColorize ColorsDialogBojeColors ColorsDialogKontrastContrast ColorsDialog ZelenaGreen ColorsDialogNijansaHue ColorsDialog(Nijansa i zasienostHue and Saturation ColorsDialogSvjetlina Lightness ColorsDialogNegativNegative ColorsDialog UreduOK ColorsDialog CrvenaRed ColorsDialogPovratiReset ColorsDialogZasienost Saturation ColorsDialogPregledaj... Browse...CopyMoveToDialog Otka~iCancelCopyMoveToDialog Izaberi fasciklu Choose FolderCopyMoveToDialogKopiraj u... Copy to...CopyMoveToDialogDestinacija: Destination:CopyMoveToDialogPomjeri u... Move to...CopyMoveToDialog UreduOKCopyMoveToDialog UkloniRemoveCopyMoveToDialog Otka~iCancel CpMvDialog(Kopiram "%1" u "%2".Copying "%1" to "%2". CpMvDialog*Pomjeram "%1" u "%2".Moving "%1" to "%2". CpMvDialogDoleBottom CropDialog Izre~iCropping CropDialog LijevoLeft CropDialog UreduOK CropDialogPovratiReset CropDialog DesnoRight CropDialogGoreTop CropDialogVe postoji already exists ImageTags"Dodaj novu oznaku Add a new tag ImageTags Otka~iCancel ImageTagsUkloni filtere Clear Filters ImageTags Unesi ime oznakeEnter new tag name ImageTags GreakaError ImageTags4Neuspijelo snimanje oznakeFailed to save tags to  ImageTags FilterFilter ImageTagsNova oznakaNew Tag ImageTags Ime nije unesenoNo name entered ImageTagsUkloni oznaku Remove Tag ImageTags4Ukloni izabranu oznaku(e)?Remove selected tags(s)? ImageTagsUkloni oznaku Remove tag ImageTags Ozna iTag ImageTags OznakaTag  ImageTagsOzna ivanjeTagging  ImageTagsUkloni oznakuUntag ImageTags"Uklanjanje oznaka Untagging  ImageTagsDaYes ImageTagsKlipbord Clipboard ImageView GreakaError ImageViewDGreaka pri snimanju Exif podataka.Failed to save Exif metadata. ImageView4Greaka pri snimanju slike.Failed to save image. ImageViewtDr~i Ctrl dugme pritisnuto i izaberi regiju koristei mia.;Hold down the Ctrl key and select a region using the mouse. ImageView Slika snimljena. Image saved. ImageView SlikeImages ImageViewBez selekcije No selection ImageViewSnimi sliku kao Save image as ImageViewSnimam... Saving... ImageView&Veli ina selekcije:Selection size:  ImageViewKopirajCopyInfoView Phototonic%n slika%n slike%n slika %n image(s) Phototonic &Uredi&Edit Phototonic &Fajl&File Phototonic&Idi&Go Phototonic &Pomo&Help Phototonic &Alati&Tools Phototonic&Pogled&View Phototonic:Pregleda i organizator slika!

Image viewer and organizer

 PhototonicOAbout PhototonicDodaj kraticu Add Bookmark Phototonic NazadBack PhototonicKartice Bookmarks PhototonicDoleBottom PhototonicPrijavi greake Bug reports PhototonicDNemogue kopirati ili pomjeriti u Can not copy or move to  Phototonic^Nemogue kopirati ili pomjeriti u istu fasciklu'Can not copy or move to the same folder PhototonicjNemogue pomjeriti ili kopirati slike u ovu fasciklu.+Can not move or copy images to this folder. Phototonic Otka~iCancel Phototonic^Nemogue izvesti akciju sa primvremenom slikom.+Cannot perform action with temporary image. Phototonic4Klasi ne minijaturne slikeClassic Thumbs PhototonicZatvori sliku Close Image PhototonicBojeColors PhototonicKompaktnoCompact PhototonicKopiranoCopied PhototonicKopirajCopy Phototonic*Kopiraj podatke slikeCopy Image Data PhototonicKopiraj u... Copy to... PhototonicNapravljen "%1" Created "%1" Phototonic Izre~i selekcijuCrop to Selection Phototonic Izre~iCropping Phototonic Izre~iCut PhototonicIzbriaiDelete Phototonic Izbriai fasciklu Delete folder PhototonicIzbriai sliku Delete image PhototonicIzbriai slike Delete images PhototonicIzbrisanoDeleted PhototonicIzbrisanoDeleted  PhototonicROdrediana fascikla je ista kao i po etna.%Destination folder is same as source. PhototonicIsklju enoDisable Phototonic,Sidrene i alatne trakeDocks and Toolbars PhototonicDvostrukoDual Phototonic(Dvostruko vertikalno Dual Vertical Phototonic Duple slike u %1Duplicate images in %1 Phototonic UrediEdit Phototonic6Poveaj minijaturne prikazeEnlarge Thumbnails Phototonic.Unesi novo ime za "%1":Enter a new name for "%1": Phototonic GreakaError Phototonic IzaiExit PhototonicTNeuspijelo kopiranje ili pomjeranje slike.Failed to copy or move image. PhototonicHNeuspijelo pravljenje nove fascikle.Failed to create new folder. Phototonic:Neuspijelo brisanje fascikle.Failed to delete folder. Phototonic2Neuspijelo brisanje slikeFailed to delete image Phototonic4Neuspijelo brisanje slike.Failed to delete image. Phototonic>Neuspijelo pomjeranje fascikle.Failed to move folder. Phototonic<Neuspijelo otvaranje fascikle:Failed to open folder: PhototonicDNeuspijelo preimenovanje fascikle.Failed to rename folder. Phototonic>Neuspijelo preimenovanje slike.Failed to rename image. PhototonicTGreaka pri pokretanju eksterne aplikacije.%Failed to start external application. PhototonicFajl sistem File System Phototonic FilterFilter Phototonic$Filtriraj po imenuFilter by Name Phototonic&Pronai duple slikeFind Duplicate Images PhototonicPrvaFirst Phototonic$Obrni horizontalnoFlip Horizontally Phototonic Obrni vertikalnoFlip Vertically Phototonic(Obrnuto horizontalnoFlipped Horizontally Phototonic$Obrnuto vertikalnoFlipped Vertically Phototonic$Fascikla pomjerena Folder moved PhototonicNaprijedForward Phototonic4Prikaz preko cijelo ekrana Full Screen PhototonicIdi goreGo Up PhototonicPo etnaHome Phototonic Po etna stranica Home page Phototonic SlikaImage Phototonic&Informacije o slici Image Info Phototonic(Uklju i pod-fascikleInclude Sub-folders PhototonicPokreem...Initializing... Phototonic$Nevaljala putanja: Invalid Path: Phototonic*Neva~ee ime uneseno.Invalid name entered. Phototonic&Nevaljala selekcijaInvalid selection Phototonic(Nevaljala selekcija.Invalid selection. PhototonicObrni selekcijuInvert Selection PhototonicZadr~i zum Keep Zoom Phototonic ZadnjaLast PhototonicU itaj klipbordLoad Clipboard Phototonic0Zaklju aj transformacijeLock Transformations Phototonic@Upravljaj eksternim aplikacijamaManage External Applications Phototonic(Preslikaj (ogledalo) Mirroring Phototonic0Preslikavanje isklju enoMirroring Disabled Phototonic0Preslikavanje: dvostrukoMirroring: Dual PhototonicFPreslikavanje. dvostruko vertikalnoMirroring: Dual Vertical Phototonic8Preslikavanje:  etverostrukoMirroring: Quad Phototonic0Preslikavanje: trostrukoMirroring: Triple Phototonic(Pomjeri "%1" u "%2"?Move "%1" to "%2"? PhototonicPomjeri dole Move Down PhototonicPomjeri lijevo Move Left PhototonicPomjeri desno Move Right PhototonicPomjeri goreMove Up Phototonic Pomjeri fasciklu Move folder PhototonicPomjeri u... Move to... PhototonicPomjerenoMoved PhototonicImeName PhototonicNavigacija Navigation PhototonicNova fascikla New Folder Phototonic"Nova pod-fasciklaNew Sub folder Phototonic$Novo ime fascikle:New folder name: PhototonicNovo ime: New name: PhototonicSljedeaNext PhototonicNema slika No images Phototonic"Ime nije uneseno.No name entered. PhototonicBez selekcije No selection Phototonic OtvoriOpen Phototonic Otvori pomou... Open With... Phototonic&Originalna veli ina Original Size PhototonicNalijepi ovdje Paste Here Phototonic,Nalijepi podatke slikePaste Image Data PhototonicTrajno izbriaiPermanently delete PhototonicDTrajno izbriai "%1" i sav sadr~aj?0Permanently delete "%1" and all of its contents? Phototonic<Trajno izbriai odabrane slike?#Permanently delete selected images? PhototonicPostavke Preferences Phototonic ProalaPrevious Phototonic etverostrukoQuad PhototonicNasumi naRandom PhototonicU itaj ponovoReload PhototonicUkloni kraticuRemove Bookmark PhototonicUkljonjen %1" Removed "%1" PhototonicPreimenujRename PhototonicPreimenuj sliku Rename Image PhototonicPovrati zum Reset Zoom Phototonic ObrniReverse PhototonicDRotiraj 1 stepen suprotno kazaljciRotate 1 degree CCW PhototonicDRotiraj 1 stepen u smjeru kazaljkeRotate 1 degree CW PhototonicHRotiraj 90 stepeni suprotno kazaljciRotate 90 degree CCW PhototonicHRotiraj 90 stepeni u smjeru kazaljkeRotate 90 degree CW PhototonicRotacija %1 Rotation %1° Phototonic SnimiSave PhototonicSnimi kaoSave As Phototonic.Promjeni veli inu slike Scale Image PhototonicOzna i sve Select All PhototonicPostavi putanjuSet Path Phototonic2Prika~i skrivene datotekeShow Hidden Files PhototonicPrika~i natpise Show Labels Phototonic(Prika~i alatnu traku Show Toolbar Phototonic4Umanji minijaturne prikazeShrink Thumbnails PhototonicVeli inaSize PhototonicSlajd prikaz Slide Show Phototonic$Slajd prikaz po etSlide show started Phototonic0Slajd prikaz obustavljenSlide show stopped PhototonicMale ikone Small Icons PhototonicSortiraj poSort By PhototonicKockastoSquarish Phototonic*Obustani slajd prikazStop Slide Show Phototonic OznakeTags PhototonicVrijemeTime PhototonicGoreTop PhototonicTransformiai Transform Phototonic2Transformacije zaklju aneTransformations Locked Phototonic2Transformacije otklju aneTransformations Unlocked PhototonicTrostrukoTriple PhototonicTipType Phototonic,Neobrnuto horizontalnoUnflipped Horizontally Phototonic(Neobrnuto vertikalnoUnflipped Vertically Phototonic PogledView PhototonicPregleda Viewer Phototonic Pa~njaWarning PhototonicDaYes Phototonic Ubli~iZoom PhototonicUbli~i %1%Zoom %1% Phototonic Ubli~iZoom In PhototonicZum zaklju an Zoom Locked Phototonic UdaljiZoom Out PhototonicZum vraen Zoom Reset PhototonicZum otklju an Zoom Unlocked Phototonic Otka~iCancelProgressDialog Otka~iCancel ResizeDialogVisina:Height: ResizeDialogZaklju aj omjerLock aspect ratio ResizeDialogNova veli ina: New size: ResizeDialog(Originalna veli ina:Original size: ResizeDialogPostotakPercent ResizeDialogPikseliPixels ResizeDialogUveaj/SmanjiScale ResizeDialog.Promjeni veli inu slike Scale Image ResizeDialogJedinice:Units: ResizeDialog`irina:Width: ResizeDialogRDodaj razmak izmeu minijaturnih prikaza:Add space between thumbnails:SettingsDialogBoja pozadine:Background color:SettingsDialog"Pozadinska slika:Background image:SettingsDialogPo visini By heightSettingsDialogPo airiniBy widthSettingsDialog(Po airini ili visiniBy width or heightSettingsDialog Otka~iCancelSettingsDialog0Izaberi po etnu fascikluChoose Startup FolderSettingsDialogNStandardni kvalitet pri snimanju slika:#Default quality when saving images:SettingsDialogfStandardni, ili komandnom linijom odreeni argument.Default, or specified by command line argumentSettingsDialogFRazmak izmeu slajdova u sekundama: Delay between slides in seconds:SettingsDialog&Potvrda za brisanjeDelete confirmationSettingsDialogIsklju enoDisableSettingsDialog*Uklju i GIF animacijeEnable GIF animationSettingsDialogNapusti umjesto zatvaranja kada je u itana slika iz komandne linije?Exit instead of closing, when image is loaded from command lineSettingsDialog,Prilagodi velike slikeFit Large ImagesSettingsDialog*Prilagodi manje slikeFit Small ImagesSettingsDialogOpenitoGeneralSettingsDialog SlikeImagesSettingsDialog"Kratice tastatureKeyboard ShortcutsSettingsDialogBoja natpisa: Label color:SettingsDialognBroj stranica minijaturnih slika da se u ita unaprijed:(Number of thumbnail pages to read ahead:SettingsDialog UreduOKSettingsDialogOtvori fajl Open FileSettingsDialogPostavke PreferencesSettingsDialog$Zapamti posljednju Remember lastSettingsDialogJRotiraj slike prema Exif orijentaciji*Rotate image according to Exif orientationSettingsDialog\Rotiraj minijaturne slike po Exif orijentaciji/Rotate thumbnails according to Exif orientationSettingsDialog<Prika~i ime slike u pregleda uShow image file name in viewerSettingsDialogPrika~i originalnu veli inu slika koje su manje od minijaturne veli ine AppMgmtDialog Manage External Applications Upravljaj eksternim aplikacijama Name Ime Application path and arguments Putanja i argumenti aplikacije Choose Izaberi Add manually Dodaj ručno Remove Ukloni OK Uredu Choose Application Izaberi aplikaciju New Application Nova aplikacija ColorsDialog Colors Boje Reset Povrati OK Uredu Hue Nijansa Saturation Zasićenost Lightness Svjetlina Colorize Oboji Negative Negativ Red Crvena Green Zelena Blue Plava Hue and Saturation Nijansa i zasićenost Affected Channels Popravi Pogođeni kanali Brightness Svjetlost Contrast Kontrast Brightness and Contrast Svjetlost i kontrast Color Balance Balans boja CopyMoveToDialog Move to... Pomjeri u... Copy to... Kopiraj u... Browse... Pregledaj... Remove Ukloni Cancel Otkaži OK Uredu Destination: Destinacija: Choose Folder Izaberi fasciklu CpMvDialog Cancel Otkaži Copying "%1" to "%2". Kopiram "%1" u "%2". Moving "%1" to "%2". Pomjeram "%1" u "%2". CropDialog Cropping Izreži Reset Povrati OK Uredu Left Lijevo Right Desno Top Gore Bottom Dole ImageTags Image Tags Filter Filter Tag Označi Untag Ukloni oznaku New Tag Nova oznaka Remove Tag Ukloni oznaku Clear Filters Ukloni filtere Negate Error Greška Failed to save tags to Neuspijelo snimanje oznake Tagging Označivanje Untagging Uklanjanje oznaka Add a new tag Dodaj novu oznaku Enter new tag name Unesi ime oznake No name entered Ime nije uneseno Tag Oznaka already exists Već postoji Remove selected tags(s)? Ukloni izabranu oznaku(e)? Remove tag Ukloni oznaku Yes Da Cancel Otkaži ImageView Clipboard Klipbord Selection size: Veličina selekcije: No selection Bez selekcije Hold down the Ctrl key and select a region using the mouse. Drži Ctrl dugme pritisnuto i izaberi regiju koristeći miš. Saving... Snimam... Error Greška Failed to save image. Greška pri snimanju slike. Failed to save Exif metadata. Greška pri snimanju Exif podataka. Image saved. Slika snimljena. Save image as Snimi sliku kao Images Slike InfoView Copy Kopiraj Phototonic Image Info Informacije o slici Zoom Ubliži Mirroring Ovo treba popraviti Preslikaj (ogledalo) Transform Transformiši View Pogled Top Gore Bottom Dole Close Image Zatvori sliku Full Screen Prikaz preko cijelo ekrana Preferences Postavke Exit Izađi Enlarge Thumbnails Povećaj minijaturne prikaze Shrink Thumbnails Umanji minijaturne prikaze Cut Izreži Copy Kopiraj Copy to... Kopiraj u... Move to... Pomjeri u... Delete Izbriši Save Snimi Save As Snimi kao Copy Image Data Kopiraj podatke slike Paste Image Data Nalijepi podatke slike Rename Preimenuj Select All Označi sve About O Name Ime Time Vrijeme Size Veličina Type Tip Reverse Obrni Show Hidden Files Prikaži skrivene datoteke Show Labels Prikaži natpise Small Icons Male ikone Hide Docks Title Bar Sakrij naslovnu traku sidrene trake Hide Dock Title Bars Show Toolbar Prikaži alatnu traku Classic Thumbs Klasične minijaturne slike Compact Kompaktno Squarish Kockasto Reload Učitaj ponovo Include Sub-folders Uključi pod-fascikle Paste Here Nalijepi ovdje New Folder Nova fascikla Back Nazad Forward Naprijed Go Up Idi gore Home Početna Slide Show Slajd prikaz Next Sljedeća Previous Prošla First Prva Last Zadnja Random Nasumična Open Otvori Load Clipboard Učitaj klipbord Open With... Otvori pomoću... Manage External Applications Upravljaj eksternim aplikacijama Add Bookmark Dodaj kraticu Remove Bookmark Ukloni kraticu Zoom Out Udalji Zoom In Ubliži Reset Zoom Povrati zum Original Size Originalna veličina Keep Zoom Zadrži zum Rotate 90 degree CCW Rotiraj 90 stepeni suprotno kazaljci Rotate 90 degree CW Rotiraj 90 stepeni u smjeru kazaljke Flip Horizontally Obrni horizontalno Flip Vertically Obrni vertikalno Cropping Izreži Crop to Selection Izreži selekciju Scale Image Promjeni veličinu slike Rotate 1 degree CCW Rotiraj 1 stepen suprotno kazaljci Rotate 1 degree CW Rotiraj 1 stepen u smjeru kazaljke Colors Boje Find Duplicate Images Pronađi duple slike Disable Isključeno Dual Dvostruko Triple Trostruko Dual Vertical Dvostruko vertikalno Quad Četverostruko Lock Transformations Zaključaj transformacije Move Left Pomjeri lijevo Move Right Pomjeri desno Move Up Pomjeri gore Move Down Pomjeri dole Invert Selection Obrni selekciju Filter by Name Filtriraj po imenu Set Path Postavi putanju &File &Fajl &Edit &Uredi &Go &Idi &View &Pogled Sort By Sortiraj po &Tools &Alati &Help &Pomoć Edit Uredi Navigation Navigacija Filter Filter Image Slika Initializing... Pokrećem... File System Fajl sistem Bookmarks Kartice Tags Oznake <p>Image viewer and organizer</p> Pregledač i organizator slika Home page Početna stranica Bug reports Prijavi greške Error Greška Failed to start external application. Greška pri pokretanju eksterne aplikacije. Invalid selection. Nevaljala selekcija. Failed to copy or move image. Neuspijelo kopiranje ili pomjeranje slike. Minimum zoom Zoom %1% Ubliži %1% Maximum zoom Zoom Reset Zum vraćen Zoom Locked Zum zaključan Zoom Unlocked Zum otključan Transformations Locked Transformacije zaključane Transformations Unlocked Transformacije otključane Rotation %1° Rotacija %1° Failed to open file "%1", file not found. Flipped Vertically Obrnuto vertikalno Unflipped Vertically Ovo treba provjeriti Neobrnuto vertikalno Flipped Horizontally Obrnuto horizontalno Unflipped Horizontally Ovo treba provjeriti Neobrnuto horizontalno No selection Bez selekcije Mirroring Disabled Preslikavanje isključeno Mirroring: Dual Preslikavanje: dvostruko Mirroring: Triple Preslikavanje: trostruko Mirroring: Dual Vertical Preslikavanje. dvostruko vertikalno Mirroring: Quad Preslikavanje: četverostruko Can not copy or move to Nemoguće kopirati ili pomjeriti u Can not copy or move to the same folder Nemoguće kopirati ili pomjeriti u istu fasciklu Copied Kopirano Moved Pomjereno %n image(s) %n slika %n slike %n slika Permanently delete Trajno izbriši Delete image Izbriši sliku Yes Da Cancel Otkaži Deleted Izbrisano Failed to delete image Neuspijelo brisanje slike Permanently delete selected images? Trajno izbriši odabrane slike? Delete images Izbriši slike Failed to delete image. Neuspijelo brisanje slike. Deleted Izbrisano Invalid Path: Nevaljala putanja: Viewer Pregledač Docks and Toolbars Sidrene i alatne trake No images Nema slika Failed to open file "%1": file not found. Neuspijelo otvaranje fajla %1": fajl nije pronađen. Slide show stopped Slajd prikaz obustavljen Stop Slide Show Obustani slajd prikaz Slide show started Slajd prikaz počet Can not move or copy images to this folder. Nemoguće pomjeriti ili kopirati slike u ovu fasciklu. Destination folder is same as source. Odredišna fascikla je ista kao i početna. Move "%1" to "%2"? Pomjeri "%1" u "%2"? Move folder Pomjeri fasciklu Failed to move folder. Neuspijelo pomjeranje fascikle. Folder moved Fascikla pomjerena Failed to open folder: Neuspijelo otvaranje fascikle: Duplicate images in %1 Duple slike u %1 New name: Novo ime: Invalid name entered. Nevažeće ime uneseno. Failed to rename folder. Neuspijelo preimenovanje fascikle. Invalid selection Nevaljala selekcija Rename Image Preimenuj sliku Enter a new name for "%1": Unesi novo ime za "%1": No name entered. Ime nije uneseno. Failed to rename image. Neuspijelo preimenovanje slike. Permanently delete "%1" and all of its contents? Trajno izbriši "%1" i sav sadržaj? Delete folder Izbriši fasciklu Failed to delete folder. Neuspijelo brisanje fascikle. Removed "%1" Ukljonjen %1" New Sub folder Nova pod-fascikla New folder name: Novo ime fascikle: Failed to create new folder. Neuspijelo pravljenje nove fascikle. Created "%1" Napravljen "%1" Warning Pažnja Cannot perform action with temporary image. Nemoguće izvesti akciju sa primvremenom slikom. ProgressDialog Cancel Otkaži QObject Usage: phototonic [FILE or DIRECTORY]... Koristi ovako: phototonic [FAJL ili FASCIKLA]... ResizeDialog Scale Image Promjeni veličinu slike Scale Možda ima bolja jedinstvena rječ Uvećaj/Smanji Cancel Otkaži Original size: Originalna veličina: Width: Širina: Height: Visina: Units: Jedinice: New size: Nova veličina: Pixels Pikseli Percent Postotak Lock aspect ratio Zaključaj omjer SettingsDialog Preferences Postavke Fit Large Images Prilagodi velike slike Disable Isključeno By width or height Po širini ili visini By width Po širini By height Po visini Stretch disproportionately Razvuci disproporcionalno Fit Small Images Prilagodi manje slike Background color: Boja pozadine: Exit instead of closing, when image is loaded from command line Napusti umjesto zatvaranja kada je učitana slika iz komandne linije Wrap image list when reaching last or first image Ovo definitivno popraviti Umotaj listu slika pri kraju Default quality when saving images: Standardni kvalitet pri snimanju slika: Enable GIF animation Uključi GIF animacije Rotate image according to Exif orientation Rotiraj slike prema Exif orijentaciji Show image file name in viewer Prikaži ime slike u pregledaču Label color: Boja natpisa: Background image: Pozadinska slika: Add space between thumbnails: Dodaj razmak između minijaturnih prikaza: Show original size of images smaller than the thumbnail size Popraviti Prikaži originalnu veličinu slika koje su manje od minijaturne veličine Number of thumbnail pages to read ahead: Broj stranica minijaturnih slika da se učita unaprijed: Rotate thumbnails according to Exif orientation Rotiraj minijaturne slike po Exif orijentaciji Delay between slides in seconds: Razmak između slajdova u sekundama: Show random images Prikaži nasumične slike Startup folder Početna fascikla Default, or specified by command line argument Popraviti Standardni, ili komandnom linijom određeni argument Remember last Zapamti posljednju Specify: Odredi: Swap mouse left-click and middle-click actions Zamjeni akcije lijevog i srednjeg klika mišem Delete confirmation Potvrda za brisanje Keyboard Shortcuts Kratice tastature OK Uredu Cancel Otkaži Viewer Pregledač Thumbnails Minijaturni prikaz Slide Show Slajd prikaz General Općenito Choose Startup Folder Izaberi početnu fasciklu Open File Otvori fajl Images Slike ShortcutsTableView Action Akcija Shortcut Prečice Delete shortcut Izbriši prečicu Set shortcut Postavi prečicu "%1" is reserved for shortcuts to external applications. Definitivno popraviti "%1" je obrnuto za prečice kod eksternih aplikacija. "%1" is already assigned to "%2" action. Popraviti "%1" je već upotrebljeno za "%2" akciju. ThumbView General Uopšteno File name Ime fajla Location Lokacija Size Veličina Modified Modificiran Format Format Resolution Rezolucija Megapixel Megapiksel Error Greška Selected %1 of%2 Izabrano %1 od %2 %n image(s) %n slika %n slike %n slika %n image(s) %n slika %n slike %n slika No images Nema slika Searching duplicate images... Tražim duple slike... Scanned %1, displaying %2 (%3 and %4) Moguće da nevalja Skeniran %1, prikazujem %2 (%3 i %4) %n original(s) %n original %n originala %n originala %n duplicate(s) %n duplikat %n duplikata %n duplikata phototonic-1.7.20/translations/phototonic_cs.qm000066400000000000000000000671071271214516700217430ustar00rootroot00000000000000 @c\B5BeDsEn]F2B/9-8&o'A>[**%*0X+1by`G{Lb 9LbLb!Lb`}M (UN*Nn.N~P7+qTl41XX (X hY%I\Zwipkn,HxFFHFt)A?22n"cYo9!*6OQxY^o[)ndCQeFj7crIA snPÙ."YȲ-8 Q\! 9N=4<\N:w 5`~'nUf3;%5O (fGePxPtTG[E_.%Fe_PG(}n&I@jVBF3jXh77ȜIЍD( JtDL(6 (aq7E>xJ@*@E%8c- jCl8A]43jN$RMgg3>]%A0>#v0ממ66M5=KY C\]*K|@ A%aAV8B#<=9 gl gl@ lq^7 t7J5 y-V zdJH t>< ' G0@ DL NO O #TC Ds!> a5 dgL idA p=@ p=X) q%7 *%5 a  >$ ( )1! 3A sR ye yeO CW 2'bl }8L^ ~= ~f > ʺS1 K صk ET Bn  &e. ,@~ , .< Ae O PG'Bp Pr RNepodaYilo se ulo~it zna ky do Failed to save tags to  ImageTagsFiltrovatFilter ImageTagsZna ky obrzko Image Tags ImageTagsVylou itNegate ImageTagsNov zna kaNew Tag ImageTags.Nebyl zadn ~dn nzevNo name entered ImageTags Odstranit zna ku Remove Tag ImageTags:Odstranit vybranou zna ku(y)?Remove selected tags(s)? ImageTags Odstranit zna ku Remove tag ImageTagsOpatYit zna kouTag ImageTags Zna kaTag  ImageTagsZna kuje seTagging  ImageTagsZruait zna kuUntag ImageTagsRua se zna ky  Untagging  ImageTagsAnoYes ImageTagsSchrnka Clipboard ImageView ChybaError ImageViewNNepodaYilo se ulo~it popisn data EXIF.Failed to save Exif metadata. ImageView:NepodaYilo se ulo~it obrzek.Failed to save image. ImageViewdPodr~te klvesu Ctrl a pomoc myai vyberte oblast.;Hold down the Ctrl key and select a region using the mouse. ImageViewObrzek ulo~en. Image saved. ImageViewObrzkyImages ImageView}dn vbr No selection ImageView&Ulo~it obrzek jako Save image as ImageViewUkld se... Saving... ImageView$Velikost vbru: Selection size:  ImageViewKoprovatCopyInfoView%n obrzek%n obrzky%n obrzko %n image(s) Phototonicp&ravy&Edit Phototonic&Soubor&File Phototonic &Pohyb&Go PhototonicNpo&vda&Help Phototonic&Nstroje&Tools PhototonicPo&hled&View PhototonicD<p>Prohl~e a sprvce obrzko</p>!

Image viewer and organizer

 PhototonicO programuAbout PhototonicPYidat zlo~ku Add Bookmark PhototonicZptBack PhototonicZlo~ky Bookmarks PhototonicVe slo~ce doloBottom PhototonicHlaen chyb Bug reports PhototonicLNelze koprovat nebo pYesunout obrzkyCan not copy or move to  Phototonic^Nelze pYesunout nebo koprovat do stejn slo~ky'Can not copy or move to the same folder PhototoniclNelze pYesunout nebo koprovat obrzky do tto slo~ky.+Can not move or copy images to this folder. Phototonic ZruaitCancel PhototonicT innost nelze s do asnm souborem provst.+Cannot perform action with temporary image. Phototonic Klasick nhledyClassic Thumbs PhototonicZavYt obrzek Close Image Phototonic BarvyColors Phototonic*Zabrajc mlo mstaCompact PhototonicZkoprovnoCopied PhototonicKoprovatCopy Phototonic,Koprovat data obrzkuCopy Image Data PhototonicKoprovat do... Copy to... PhototonicVytvoYeno "%1" Created "%1" PhototonicOYznout vbrCrop to Selection PhototonicOYznutCropping PhototonicVyjmoutCut Phototonic SmazatDelete PhototonicSmazat slo~ku Delete folder PhototonicSmazat obrzek Delete image PhototonicSmazat obrzky Delete images PhototonicSmaznoDeleted PhototonicSmazno Deleted  PhototonicFClov slo~ka je stejn jako zdroj.%Destination folder is same as source. PhototonicZakzatDisable Phototonic2Panely a nstrojov pruhyDocks and Toolbars PhototonicDvojiceDual PhototonicDvojice svisle Dual Vertical Phototonic(Zdvojit obrzky v %1Duplicate images in %1 Phototonic pravyEdit PhototonicZvtait nhledyEnlarge Thumbnails Phototonic4Zadat nov nzev pro "%1":Enter a new name for "%1": Phototonic ChybaError PhototonicUkon itExit Phototonic^NepodaYilo se koprovat nebo pYesunout obrzek.Failed to copy or move image. PhototonicHNepodaYilo se vytvoYit novou slo~ku.Failed to create new folder. Phototonic8NepodaYilo se smazat slo~ku.Failed to delete folder. Phototonic8NepodaYilo se smazat obrzekFailed to delete image Phototonic:NepodaYilo se smazat obrzek.Failed to delete image. Phototonic>NepodaYilo se pYesunout slo~ku.Failed to move folder. Phototonic:NepodaYilo se otevYt slo~ku:Failed to open folder: PhototonicBNepodaYilo se pYejmenovat slo~ku.Failed to rename folder. PhototonicDNepodaYilo se pYejmenovat obrzek.Failed to rename image. PhototonicJNepodaYilo se spustit vnja program.%Failed to start external application. Phototonic Souborov systm File System Phototonic FiltrFilter Phototonic*Filtrovat podle nzvuFilter by Name Phototonic,Najt zdvojen obrzkyFind Duplicate Images Phototonic PrvnFirst Phototonic&PYevrtit vodorovnFlip Horizontally Phototonic PYevrtit svisleFlip Vertically Phototonic(PYevrceno vodorovnFlipped Horizontally Phototonic"PYevrceno svisleFlipped Vertically Phototonic Slo~ka pYesunuta Folder moved Phototonic VpYedForward Phototonic$Na celou obrazovku Full Screen Phototonic"NadYzen adresYGo Up Phototonic"Za te n strnkaHome Phototonic Domovsk strnka Home page PhototonicObrzekImage Phototonic&Informace o obrzku Image Info Phototonic$Zahrnout podslo~kyInclude Sub-folders PhototonicSpouat se...Initializing... PhototonicNeplatn cesta: Invalid Path: Phototonic*Zadn neplatn nzev.Invalid name entered. PhototonicNeplatn vbrInvalid selection PhototonicNeplatn vbr.Invalid selection. PhototonicObrtit vbrInvert Selection Phototonic"Zachovat zvtaen Keep Zoom PhototonicPoslednLast PhototonicNahrt schrnkuLoad Clipboard Phototonic"Uzamknout promnyLock Transformations Phototonic2Spravovat vnja programyManage External Applications Phototonic"Nejvta zvtaen Maximum zoom Phototonic"Nejmena zvtaen Minimum zoom PhototonicZrcadlen Mirroring Phototonic$Zrcadlen zakznoMirroring Disabled Phototonic$Zrcadlen: DvojiceMirroring: Dual Phototonic2Zrcadlen: Dvojice svisleMirroring: Dual Vertical Phototonic&Zrcadlen:  tveYiceMirroring: Quad Phototonic$Zrcadlen: TrojiceMirroring: Triple Phototonic,PYesunout "%1" do "%2?Move "%1" to "%2"? PhototonicPosunout dolo Move Down PhototonicPosunout vlevo Move Left PhototonicPosunout vpravo Move Right PhototonicPosunout nahoruMove Up Phototonic PYesunout slo~ku Move folder PhototonicPYesunout do... Move to... PhototonicPYesunoutMoved Phototonic NzevName Phototonic Pohyb Navigation PhototonicNov slo~ka New Folder PhototonicNov podslo~kaNew Sub folder Phototonic$Nov nzev slo~ky:New folder name: PhototonicNov nzev: New name: Phototonic DalaNext Phototonic}dn obrzky No images Phototonic0Nebyl zadn ~dn nzev.No name entered. Phototonic}dn vbr No selection PhototonicOtevYtOpen PhototonicOtevYt s... Open With... Phototonic Povodn velikost Original Size PhototonicVlo~it zde Paste Here Phototonic&Vlo~it data obrzkuPaste Image Data PhototonicSmazat trvalePermanently delete PhototonicPSmazat trvale "%1" a veaker jeho obsah?0Permanently delete "%1" and all of its contents? Phototonic<Trvale smazat vybran obrzky?#Permanently delete selected images? PhototonicNastaven Preferences PhototonicPYedchozPrevious Phototonic tveYiceQuad PhototonicNhodnRandom PhototonicNahrt znovuReload Phototonic"Odstranit zlo~kuRemove Bookmark PhototonicOdstranno "%1" Removed "%1" PhototonicPYejmenovatRename Phototonic&PYejmenovat obrzek Rename Image Phototonic.Nastavit zvtaen znovu Reset Zoom PhototonicObrcenReverse Phototonic.Oto it o 1 stupeH vlevoRotate 1 degree CCW Phototonic0Oto it o 1 stupeH vpravoRotate 1 degree CW PhototonicOto it vlevoRotate 90 degree CCW PhototonicOto it vpravoRotate 90 degree CW PhototonicOto en %1 Rotation %1° Phototonic Ulo~itSave PhototonicUlo~it jakoSave As Phototonic.Zmnit velikost obrzku Scale Image PhototonicVybrat vae Select All PhototonicNastavit cestuSet Path Phototonic*Ukzat skryt souboryShow Hidden Files PhototonicUkzat attky Show Labels Phototonic,Ukzat nstrojov pruh Show Toolbar PhototonicZmenait nhledyShrink Thumbnails PhototonicVelikostSize PhototonicPromtn Slide Show Phototonic$Promtn spuatnoSlide show started Phototonic&Promtn zastavenoSlide show stopped PhototonicMal ikony Small Icons PhototonicXadit dleSort By Phototonic&PYibli~n  tvercovSquarish Phototonic$Zastavit promtnStop Slide Show Phototonic Zna kyTags Phototonic asTime Phototonic Ve slo~ce nahoruTop PhototonicPromna Transform Phototonic Promny zamknutyTransformations Locked Phototonic"Promny odemknutyTransformations Unlocked PhototonicTrojiceTriple PhototonicTypType Phototonic8Vodorovn pYevrcen zruaenoUnflipped Horizontally Phototonic2Svisl pYevrcen zruaenoUnflipped Vertically Phototonic PohledView PhototonicProhl~e Viewer PhototonicVarovnWarning PhototonicAnoYes PhototonicZvtaenZoom PhototonicZvtaen %1%Zoom %1% PhototonicPYibl~itZoom In Phototonic"Zvtaen zamknuto Zoom Locked PhototonicOddlitZoom Out Phototonic.Nastavit zvtaen znovu Zoom Reset Phototonic$Zvtaen odemknuto Zoom Unlocked Phototonic ZruaitCancelProgressDialog ZruaitCancel ResizeDialog Vaka:Height: ResizeDialog(Zamknout pomr stranLock aspect ratio ResizeDialogNov velikost: New size: ResizeDialog"Povodn velikost:Original size: ResizeDialogProcentoPercent ResizeDialog PixeloPixels ResizeDialogZmnit velikostScale ResizeDialog.Zmnit velikost obrzku Scale Image ResizeDialogJednotky:Units: ResizeDialog `Yka:Width: ResizeDialog6Vlo~it mezi nhledy odstup:Add space between thumbnails:SettingsDialogBarva pozad:Background color:SettingsDialogObrzek pozad:Background image:SettingsDialogPodle vaky By heightSettingsDialogPodle aYkyBy widthSettingsDialog,Podle aYky nebo vakyBy width or heightSettingsDialog ZruaitCancelSettingsDialogFVybrat slo~ku pYi spuatn programuChoose Startup FolderSettingsDialogVVchoz jakost obrazu pYi ukldn obrzko:#Default quality when saving images:SettingsDialogfVchoz nebo stanoven parametrem pYkazovho Ydku.Default, or specified by command line argumentSettingsDialogBZpo~dn mezi snmky v sekundch: Delay between slides in seconds:SettingsDialog"Potvrzen smaznDelete confirmationSettingsDialogZakzatDisableSettingsDialog&Povolit animaci GIFEnable GIF animationSettingsDialogUkon it msto zavYen, kdy~ je obrzek nahrn z pYkazovho Ydku?Exit instead of closing, when image is loaded from command lineSettingsDialog2PYizposobit velk obrzkyFit Large ImagesSettingsDialog0PYizposobit mal obrzkyFit Small ImagesSettingsDialog ObecnGeneralSettingsDialogObrzkyImagesSettingsDialog"Klvesov zkratkyKeyboard ShortcutsSettingsDialogBarva attku: Label color:SettingsDialoghPo et strnek s nhledy, je~ se maj na st dopYedu:(Number of thumbnail pages to read ahead:SettingsDialogOKOKSettingsDialogOtevYt soubor Open FileSettingsDialogNastaven PreferencesSettingsDialog.Zapamatovat si posledn Remember lastSettingsDialogXOto it obrzek podle daje o nato en v EXIF*Rotate image according to Exif orientationSettingsDialogXOto it nhledy podle daje o nato en v EXIF/Rotate thumbnails according to Exif orientationSettingsDialogVZobrazit nzev souboru obrzku v prohl~e iShow image file name in viewerSettingsDialogUkzat povodn velikost obrzko menach, ne~ je velikost nhledu AppMgmtDialog Manage External Applications Spravovat vnější programy Command Příkaz Path Cesta Add Přidat Name Název Application path and arguments Cesta k programu a argumenty Choose Vybrat Add manually Přidat ručně Remove Odstranit OK OK Choose Application Vybrat program New Application Nový program ColorsDialog Colors Barvy Reset Nastavit znovu OK OK Hue Odstín Saturation Sytost Lightness Světlost Channels Kanály Enable Povolit Colorize Obarvit Negative Negativ Red Červená Green Zelená Blue Modrá Hue and Saturation Odstín a sytost Affected Channels Ovlivněné kanály Brightness Jas Contrast Kontrast Brightness and Contrast Jas a kontrast Color Balance Vyvážení barev CopyMoveToDialog Copy or Move Images to... Kopírovat nebo přesunout obrázky do... Add Přidat Move to... Přesunout do... Copy to... Kopírovat do... Browse... Procházet... Remove Odstranit Cancel Zrušit OK OK Destination: Cíl: Destination: Cíl: Close Zavřít Copy Kopírovat Move Přesunout Choose Folder Vybrat složku CpMvDialog Cancel Zrušit Copying "%1" to "%2". Kopíruje se "%1" do "%2. Moving "%1" to "%2". Přesunuje se "%1" do "%2. Copying Kopíruje se Moving Přesunuje se to do CropDialog Cropping Oříznutí Reset Nastavit znovu OK OK Top Nahoře Left Vlevo Right Vpravo Bottom Dole ImageTags Tag Opatřit značkou Untag Zrušit značku Clear Filters Vyprázdnit filtry New Tag Nová značka Image Tags Značky obrázků Filter Filtrovat Remove Tag Odstranit značku Negate Vyloučit Error Chyba Failed to save tags to Nepodařilo se uložit značky do Tagging Značkuje se Untagging Ruší se značky Add a new tag Přidat novou značku Enter new tag name Zadat název nové značky No name entered Nebyl zadán žádný název Tag Značka already exists již existuje Remove selected tags(s)? Odstranit vybranou značku(y)? Remove tag Odstranit značku Yes Ano Cancel Zrušit ImageView Clipboard Schránka Selection size: Velikost výběru: No selection Žádný výběr Hold down the Ctrl key and select a region using the mouse. Podržte klávesu Ctrl a pomocí myši vyberte oblast. Failed to save image. Nepodařilo se uložit obrázek. Failed to save Exif metadata. Nepodařilo se uložit popisná data EXIF. Image saved. Obrázek uložen. Hold down the Ctrl key and select a region using the mouse Podržte klávesu Ctrl a pomocí myši vyberte oblast Saving... Ukládá se... Error Chyba Failed to save image Nepodařilo se uložit obrázek Failed to save Exif metadata Nepodařilo se uložit popisná data EXIF Image saved Obrázek uložen Save image as Uložit obrázek jako Images Obrázky Image Files Obrázkové soubory InfoView Copy Kopírovat KeyGrabLineEdit Set shortcut Nastavit klávesovou zkratku is reserved for shortcuts to external applications je vyhrazeno pro klávesové zkratky vnějších programů is already assigned to " je již přiřazeno činnosti " " action " Phototonic Docks and Toolbars Panely a nástrojové pruhy Image Info Informace o obrázku Zoom Zvětšení Transform Proměna Mirroring Zrcadlení Top Ve složce nahoru Bottom Ve složce dolů Close Image Zavřít obrázek Full Screen Na celou obrazovku Preferences Nastavení Exit Ukončit Enlarge Thumbnails Zvětšit náhledy Shrink Thumbnails Zmenšit náhledy Cut Vyjmout Copy Kopírovat Copy or Move to... Kopírovat nebo přesunout do... Delete Smazat Save Uložit Save As Uložit jako Copy Image Kopírovat obrázek Paste Image Vložit obrázek Rename Přejmenovat Select All Vybrat vše About O programu Name Název Time Čas Size Velikost Type Typ Reverse Obráceně Show Hidden Files Ukázat skryté soubory Show Labels Ukázat štítky Small Icons Malé ikony Hide Docks Title Bar Skrýt název panelu Classic Thumbs Klasické náhledy Compact Zabírající málo místa Squarish Přibližně čtvercové Reload Nahrát znovu Include Sub-folders Zahrnout podsložky Paste Here Vložit zde New Folder Nová složka Manage Spravovat Back Zpět Forward Vpřed Up Nahoru Home Začáteční stránka Slide Show Promítání Next Další Previous Předchozí First První Last Poslední Random Náhodný Open Otevřít Show Clipboard Ukázat schránku Open With Otevřít pomocí Manage External Applications Spravovat vnější programy Zoom Out Oddálit Zoom In Přiblížit Reset Zoom Nastavit zvětšení znovu Original Size Původní velikost Keep Zoom Zachovat zvětšení Rotate 90 degree CCW Otočit vlevo Rotate 90 degree CW Otočit vpravo Flip Horizontally Převrátit vodorovně Flip Vertically Převrátit svisle Cropping Oříznutí Scale Image Změnit velikost obrázku Rotate 1 degree CCW Otočit o 1 stupeň vlevo Rotate 1 degree CW Otočit o 1 stupeň vpravo Colors Barvy Disable Zakázat Dual Dvojice Triple Trojice Dual Vertical Dvojice svisle Quad Čtveřice Tags Značky Minimum zoom Nejmenší zvětšení Maximum zoom Největší zvětšení Rotation %1° Otočení %1° Failed to open file "%1", file not found. Failed to open file "%1": file not found. Nepodařilo se otevřít obrázek "%1": soubor nebyl nalezen. Can not move or copy images to this folder. Nelze přesunout nebo kopírovat obrázky do této složky. Destination folder is same as source. Cílová složka je stejná jako zdroj. Move "%1" to "%2"? Přesunout "%1" do "%2? Failed to move folder. Nepodařilo se přesunout složku. Failed to open folder: Nepodařilo se otevřít složku: Duplicate images in %1 Zdvojit obrázky v %1 Invalid name entered. Zadán neplatný název. Failed to rename folder. Nepodařilo se přejmenovat složku. Enter a new name for "%1": Zadat nový název pro "%1": No name entered. Nebyl zadán žádný název. Failed to rename image. Nepodařilo se přejmenovat obrázek. Permanently delete "%1" and all of its contents? Smazat trvale "%1" a veškerý jeho obsah? Failed to delete folder. Nepodařilo se smazat složku. Removed "%1" Odstraněno "%1" Failed to create new folder. Nepodařilo se vytvořit novou složku. Created "%1" Vytvořeno "%1" Cannot perform action with temporary image. Činnost nelze s dočasným souborem provést. Keep Transformations Zachovat proměny Move Left Posunout vlevo Move Right Posunout vpravo Move Up Posunout nahoru Move Down Posunout dolů Invert Selection Obrátit výběr &File &Soubor &Edit Úp&ravy &Go &Pohyb &View Po&hled Sort By Řadit dle &Help Nápo&věda Edit Úpravy Navigation Pohyb View Pohled Filter Filtr Initializing... Spouští se... File System Souborový systém <p>Image viewer and organizer</p> <p>Prohlížeč a správce obrázků</p> Failed to start external application. Nepodařilo se spustit vnější program. Invalid selection. Neplatný výběr. Failed to copy or move image. Nepodařilo se kopírovat nebo přesunout obrázek. Zoom %1% Zvětšení %1% Rotation %1u00B0 Otočení %1u00B0 Copied Zkopírováno Moved Přesunout %n image(s) %n obrázek %n obrázky %n obrázků Permanently delete Smazat trvale Failed to delete image. Nepodařilo se smazat obrázek. Deleted Smazáno Invalid Path: Neplatná cesta: Viewer Prohlížeč <p>Git build v1.03.02 ( <p>Sestavení Git v1.03.02 ( Built with Qt Sestaveno s Qt Home page Domovská stránka Bug reports Hlášení chyb Contributors:<br> Přispěvatelé:<br> Contributors / Translations:<br> Přispěvatelé/Překladatelé:<br> Translators:<br> Překladatelé:<br> Invalid selection Neplatný výběr Error Chyba Failed to start external application Nepodařilo se spustit vnější program Failed to copy or move image Nepodařilo se kopírovat nebo přesunout obrázek Can not copy or move to Nelze kopírovat nebo přesunout obrázky Can not cut and paste in the same folder Nelze vyjmout a vložit do téže složky Copied Zkopírováno Moved Přesunuto images obrázků Delete image Smazat obrázek Permanently delete Smazat trvale Failed to delete image Nepodařilo se smazat obrázek No selection Žádný výběr Delete images Smazat obrázky Permanently delete selected images? Trvale smazat vybrané obrázky? Copy to... Kopírovat do... Move to... Přesunout do... Copy Image Data Kopírovat data obrázku Paste Image Data Vložit data obrázku Hide Dock Title Bars Show Toolbar Ukázat nástrojový pruh Go Up Nadřízený adresář Load Clipboard Nahrát schránku Open With... Otevřít s... Add Bookmark Přidat záložku Remove Bookmark Odstranit záložku Crop to Selection Oříznout výběr Find Duplicate Images Najít zdvojené obrázky Lock Transformations Uzamknout proměny Filter by Name Filtrovat podle názvu Set Path Nastavit cestu &Tools &Nástroje Image Obrázek Bookmarks Záložky Contributors / Code: Přispěvatelé (kód): Contributors / Translations: Překladatelé: Zoom Zvětšení Zoom Reset Nastavit zvětšení znovu Zoom Locked Zvětšení zamknuto Zoom Unlocked Zvětšení odemknuto Transformations Locked Proměny zamknuty Transformations Unlocked Proměny odemknuty Rotation Otočení Flipped Vertically Převráceno svisle Unflipped Vertically Svislé převrácení zrušeno Flipped Horizontally Převráceno vodorovně Unflipped Horizontally Vodorovné převrácení zrušeno Mirroring Disabled Zrcadlení zakázáno Mirroring: Dual Zrcadlení: Dvojice Mirroring: Triple Zrcadlení: Trojice Mirroring: Dual Vertical Zrcadlení: Dvojice svisle Mirroring: Quad Zrcadlení: Čtveřice Can not copy or move to the same folder Nelze přesunout nebo kopírovat do stejné složky Yes Ano Cancel Zrušit Deleted Smazáno Invalid Path: Neplatná cesta: No images Žádné obrázky Failed to open file Nepodařilo se otevřít obrázek , file not found , soubor nebyl nalezen Slide show stopped Promítání zastaveno Stop Slide Show Zastavit promítání Slide show started Promítání spuštěno Can not move or copy images to this folder Nelze přesunout nebo kopírovat obrázky do této složky Destination folder is same as source Cílová složka je stejná jako zdroj Move Přesunout to do Move folder Přesunout složku Failed to move folder Nepodařilo se přesunout složku Folder moved Složka přesunuta Failed to open folder: Nepodařilo se otevřít složku: Rename Přejmenovat New name: Nový název: Invalid name entered Zadán neplatný název Failed to rename folder Nepodařilo se přejmenovat složku Rename Image Přejmenovat obrázek Enter a new name for Zadat nový název pro No name entered Nebyl zadán žádný název Failed to rename image Nepodařilo se přejmenovat obrázek and all of its contents? a veškerý jeho obsah? Delete folder Smazat složku Failed to delete folder Nepodařilo se smazat složku Removed Odstraněno New Sub folder Nová podsložka New folder name: Nová název složky: Failed to create new folder Nepodařilo se vytvořit novou složku Created Vytvořeno Executing file manager... Spustit správce souborů... Warning Varování Cannot perform action with temporary image Činnost nelze s dočasným souborem provést ProgressDialog Cancel Zrušit QObject Usage: phototonic [FILE or DIRECTORY]... Použití: phototonic [SOUBOR nebo ADRESÁŘ]... ResizeDialog Scale Image Změnit velikost obrázku Scale Změnit velikost Cancel Zrušit Original size: Původní velikost: Width: Šířka: Height: Výška: Units: Jednotky: New size: Nová velikost: Original size: Původní velikost: Width: Šířka: Height: Výška: Units: Jednotky: New size: Nová velikost: Pixels Pixelů Percent Procento Lock aspect ratio Zamknout poměr stran SettingsDialog Preferences Nastavení By width or height Podle šířky nebo výšky Default quality when saving images: Výchozí jakost obrazu při ukládání obrázků: Label color: Barva štítku: OK OK Cancel Zrušit Background color: Barva pozadí: Rotate image according to Exif orientation Otočit obrázek podle údaje o natočení v EXIF Label color: Barva štítku: Background image: Obrázek pozadí: Add space between thumbnails: Vložit mezi náhledy odstup: Show original size of images smaller than the thumbnail size Ukázat původní velikost obrázků menších, než je velikost náhledu Number of thumbnail pages to read ahead: Počet stránek s náhledy k načtení dopředu: Rotate thumbnails according to Exif orientation Otočit náhledy podle údaje o natočení v EXIF Thumbnails Náhledy Fit Large Images Přizpůsobit velké obrázky Disable Zakázat By width and height Podle šířky a výšky By width Podle šířky By height Podle výšky Stretch disproportionately Roztáhnout nepoměrně Fit Small Images Přizpůsobit malé obrázky Exit instead of closing, when image is loaded from command line Ukončit místo zavření, když je obrázek nahrán z příkazového řádku Wrap image list when reaching last or first image Zalomit seznam obrázků, když je dosaženo posledního nebo prvního obrázku Default quality when saving images: Výchozí jakost obrazu při ukládání obrázků: Enable GIF animation Povolit animaci GIF Open File Otevřít soubor Images Obrázky Rotate according to Exif orientation Otočit podle údaje o natočení v EXIF Show image file name in full screen mode Zobrazit název souboru obrázku v režimu celé obrazovky Background color: Barva pozadí: Show image file name in viewer Zobrazit název souboru obrázku v prohlížeči Background image: Obrázek pozadí: Add space between thumbnails: Vložit mezi náhledy odstup: Number of thumbnail pages to read ahead: Počet stránek s náhledy, jež se mají načíst dopředu: Delay between slides in seconds: Zpoždění mezi snímky v sekundách: Startup folder Složka při spuštění programu Default, or specified by command line argument Výchozí nebo stanovená parametrem příkazového řádku Remember last Zapamatovat si poslední Specify: Vybrat: Delete confirmation Potvrzení smazání Keyboard Shortcuts Klávesové zkratky Viewer Prohlížeč Delay between slides in seconds: Zpoždění mezi snímky v sekundách: Show random images Ukázat náhodně vybrané obrázky Slide Show Promítání Swap mouse left-click and middle-click actions Vyměnit klepnutí levým tlačítkem myši za klepnutí prostředním tlačítkem Keyboard Shortcuts: Klávesové zkratky: Keyboard and Mouse Klávesnice a myš General Obecné Choose Startup Folder Vybrat složku při spuštění programu ShortcutsTableView Action Činnost Shortcut Klávesová zkratka Delete shortcut Smazat klávesovou zkratku Set shortcut Nastavit klávesovou zkratku "%1" is reserved for shortcuts to external applications. "%1" je vyhrazeno pro klávesové zkratky vnějších programů. "%1" is already assigned to "%2" action. "%1" je již přiřazeno činnosti "%2". is reserved for shortcuts to external applications je vyhrazeno pro klávesové zkratky vnějších programů is already assigned to " je již přiřazeno činnosti " " action " ThumbView images obrázků Selected Vybráno of z File name Název souboru Location Umístění Format Formát Resolution Rozlišení Megapixel Megapixelů Selected %1 of %2 Vybráno %1 z %2 Scanned %1, displaying %2 (%3 and %4) Prohledáno %1, zobrazuje se %2 (%3 a %4) %n original(s) %n originál %n originály %n originálů %n duplicate(s) %n zdvojený obrázek %n zdvojené obrázky %n zdvojených obrázků Size Velikost General Obecné Modified Změněno Error Chyba %n image(s) %n obrázek %n obrázky %n obrázků Selected %1 of%2 Vybráno %1 z%2 %n image(s) %n obrázek %n obrázky %n obrázků Searching duplicate images... Hledají se zdvojené obrázky... Scanned Prohledáno %n images, displaying %n obrázek, zobrazuje se %n obrázky, zobrazují se %n obrázků, zobrazuje se %n images ( %n obrázek ( %n obrázky ( %n obrázků ( %n originals and %n originál a %n originály a %n originálů a %n duplicates) %n zdvojený obrázek) %n zdvojené obrázky) %n zdvojených obrázků) No images Žádné obrázky phototonic-1.7.20/translations/phototonic_de.qm000066400000000000000000000706451271214516700217270ustar00rootroot00000000000000_**%O*0+1bycGLb LbLb"LbcM *N-Nn1NP7.?Tl7-XOX X Y%N \Zwikn/$xFRLFt,PAC52n$c]9"*9{QxYb[)ndCVeJj:rIA!snTOÙ.#\Ȳ0`; U! 9N@<\N>5w 5d~*tnYf3? %8s *fG?QxYQxYc:Rg<3SW44eFu4oG ve%*w(.w ^rf+CH$GýW4uw-M } m!& #A3lu6Nz^aVtX] ]III ILIL ILEIQ f`6`6oI &,fZ': q:)fR7֓dOC}E}V1}AaB= FW BKإ O+O IP)nSUDJl/^(p3M~~CK]=5t=F{FH5>nde+%HH jNI^I^,ߺNnY?) /r#Cx%n6%9$e>eTPtTK[_.%Jq_PK0}n)MZjZF6j\77UȜMЍDF( JDPB(9;(eaq;EBVND*D#%8c=-!MCl;k]46jN%Qg1g6>'A0I>$0מuמ96Q[=OY G*]*O@  D%ED8F!?=[ gl  gl lq^:H t7J8 y-[ zdJM tB *# G3< DP Rk S #TGn Ds"% a8 dg idE p=D p=\ q%: *'v a v >& +L )4 3 sV ye } yeT C\ 2'e }8P ~ ~ B ʺWy N ص EXa Bn,  &e1 ,@~n , .@Q A. O PG'F^ PrG R";I]d6!b^ߔKuiTbBo0+L7igD$Manuell hinzufgen Add manually AppMgmtDialog6Programmpfad und -argumenteApplication path and arguments AppMgmtDialogAuswhlenChoose AppMgmtDialog&Anwendung auswhlenChoose Application AppMgmtDialog:Externe Anwendungen verwaltenManage External Applications AppMgmtDialogNameName AppMgmtDialog Neue ApplikationNew Application AppMgmtDialogOKOK AppMgmtDialogEntfernenRemove AppMgmtDialog"Betroffene KanleAffected Channels ColorsDialogBlauBlue ColorsDialogHelligkeit Brightness ColorsDialog.Helligkeit und KontrastBrightness and Contrast ColorsDialogFarbabstimmung Color Balance ColorsDialogEinfrbenColorize ColorsDialog FarbenColors ColorsDialogKontrastContrast ColorsDialogGrnGreen ColorsDialogFarbtonHue ColorsDialog*Farbton und SttigungHue and Saturation ColorsDialogHelligkeit Lightness ColorsDialogNegativNegative ColorsDialogOKOK ColorsDialogRotRed ColorsDialogZurcksetzenReset ColorsDialogSttigung Saturation ColorsDialogDurchsuchen... Browse...CopyMoveToDialogAbbrechenCancelCopyMoveToDialog$Verzeichnis whlen Choose FolderCopyMoveToDialog Kopieren nach... Copy to...CopyMoveToDialog Ziel: Destination:CopyMoveToDialog&Verschieben nach... Move to...CopyMoveToDialogOKOKCopyMoveToDialogEntfernenRemoveCopyMoveToDialogAbbrechenCancel CpMvDialog.Kopiere "%1" nach "%2".Copying "%1" to "%2". CpMvDialog4Verschiebe "%1" nach "%2".Moving "%1" to "%2". CpMvDialog UntenBottom CropDialogZuschneidenCropping CropDialog LinksLeft CropDialogOKOK CropDialogZurcksetzenReset CropDialog RechtsRight CropDialogObenTop CropDialog$ existiert bereits already exists ImageTags(Neuen Tag hinzufgen Add a new tag ImageTagsAbbrechenCancel ImageTags&Filter zurcksetzen Clear Filters ImageTags.Namen des Tags eingebenEnter new tag name ImageTags FehlerError ImageTagsBSpeichern des Tags fehlgeschlagenFailed to save tags to  ImageTags FilterFilter ImageTagsImage Tags Image Tags ImageTagsUmkehrenNegate ImageTagsNeuer TagNew Tag ImageTags(Kein Name eingegebenNo name entered ImageTagsTag entfernen Remove Tag ImageTags@Ausgewhlte(n) Tag(s) entfernen?Remove selected tags(s)? ImageTagsTag entfernen Remove tag ImageTagsTagTag ImageTagsTagTag  ImageTagsTagging Tagging  ImageTags UntagUntag ImageTagsUntagging  Untagging  ImageTagsJaYes ImageTagsZwischenablage Clipboard ImageView FehlerError ImageViewRFehler beim Speichern der EXIF-Metadaten.Failed to save Exif metadata. ImageView,Fehler beim Speichern.Failed to save image. ImageViewHalten Sie die STRG-Taste gedrckt und markieren einen Bereich mit der Maus.;Hold down the Ctrl key and select a region using the mouse. ImageView"Bild gespeichert. Image saved. ImageView BilderImages ImageViewKeine Auswahl No selection ImageView$Bild speichern als Save image as ImageViewSpeichere... Saving... ImageView Gre auswhlen:Selection size:  ImageViewKopierenCopyInfoView%n Bild%n Bilder %n image(s) Phototonic&Bearbeiten&Edit Phototonic &Datei&File Phototonic&Los&Go Phototonic &Hilfe&Help Phototonic&Werkzeuge&Tools Phototonic&Ansicht&View Phototonic@<p>Bildbetrachter und -verwalter!

Image viewer and organizer

 PhototonicberAbout Phototonic,Lesezeichen hinzufgen Add Bookmark Phototonic ZurckBack PhototonicLesezeichen Bookmarks Phototonic UntenBottom PhototonicFehlerberichte Bug reports PhototonicNKopieren oder Verschieben nicht mglichCan not copy or move to  PhototonicxKopieren oder Verschieben in den selben Ordner nicht mglich'Can not copy or move to the same folder PhototonicVerschieben oder Kopieren von Bildern in dieses Verzeichnis nicht mglich.+Can not move or copy images to this folder. PhototonicAbbrechenCancel PhototonicpAktion kann mit temporrem Bild nicht ausgefhrt werden.+Cannot perform action with temporary image. Phototonic4Klassische MiniaturansichtClassic Thumbs PhototonicBild schlieen Close Image Phototonic FarbenColors PhototonicKompaktCompact PhototonicKopiertCopied PhototonicKopierenCopy Phototonic&Bild-Daten kopierenCopy Image Data Phototonic Kopieren nach... Copy to... PhototonicErstellt "%1" Created "%1" Phototonic.Auswahl zum ZuschneidenCrop to Selection PhototonicZuschneidenCropping PhototonicAusschneidenCut PhototonicLschenDelete Phototonic&Verzeichnis lschen Delete folder PhototonicBild lschen Delete image PhototonicBilder lschen Delete images PhototonicGelschtDeleted PhototonicGelscht Deleted  PhototonicTZiel- und Quellverzeichnis sind identisch.%Destination folder is same as source. PhototonicDeaktivierenDisable Phototonic.Dock und WerkzeugleisteDocks and Toolbars PhototonicZweifachDual Phototonic"Zweifach vertikal Dual Vertical PhototonicDuplikate in %1Duplicate images in %1 PhototonicBearbeitenEdit Phototonic8Miniaturansichten vergrernEnlarge Thumbnails Phototonic4Neuen Namen eingeben "%1":Enter a new name for "%1": Phototonic FehlerError PhototonicBeendenExit PhototonichKopieren oder Verschieben des Bildes fehlgeschlagen.Failed to copy or move image. PhototonicdErstellen des neuen Verzeichnisses fehlgeschlagen.Failed to create new folder. PhototonicTLschen des Verzeichnisses fehlgeschlagen.Failed to delete folder. PhototonicBLschen des Bildes fehlgeschlagenFailed to delete image PhototonicDLschen des Bildes fehlgeschlagen.Failed to delete image. Phototonic\Verschieben des Verzeichnisses fehlgeschlagen.Failed to move folder. Phototonicffnen der Datei fehlgeschlagen "%1": Datei wurde nicht gefunden.)Failed to open file "%1", file not found. PhototonicRffnen des Verzeichnisses fehlgeschlagen:Failed to open folder: PhototonicZUmbenennen des Verzeichnisses fehlgeschlagen.Failed to rename folder. PhototonicJUmbenennen des Bildes fehlgeschlagen.Failed to rename image. Phototonic`Externe Anwendung konnte nicht gestartet werden.%Failed to start external application. PhototonicDateisystem File System Phototonic FilterFilter Phototonic$Nach Namen filternFilter by Name PhototonicSuche DuplikateFind Duplicate Images Phototonic ErstesFirst Phototonic&Horizontal spiegelnFlip Horizontally Phototonic"Vertikal spiegelnFlip Vertically Phototonic*Horizontal gespiegeltFlipped Horizontally Phototonic&Vertikal gespiegeltFlipped Vertically Phototonic,Verzeichnis verschoben Folder moved PhototonicVorwrtsForward PhototonicVollbild Full Screen PhototonicNach obenGo Up Phototonic4Dock-Titelleiste verbergenHide Dock Title Bars Phototonic0Persnliches VerzeichnisHome PhototonicHomepage Home page PhototonicBildImage Phototonic"Bildinformationen Image Info Phototonic<Unterverzeichnisse einbeziehenInclude Sub-folders Phototonic Initialisiere...Initializing... Phototonic Ungltiger Pfad: Invalid Path: PhototonicName ungltig.Invalid name entered. Phototonic"Ungltige AuswahlInvalid selection Phototonic$Ungltige Auswahl.Invalid selection. Phototonic Auswahl umkehrenInvert Selection Phototonic Zoom beibehalten Keep Zoom PhototonicLetztesLast Phototonic(Zwischenablage ladenLoad Clipboard Phototonic8Transformationen beibehaltenLock Transformations Phototonic:Externe Anwendungen verwaltenManage External Applications PhototonicGrter Zoom Maximum zoom PhototonicKleinster Zoom Minimum zoom PhototonicSpiegeln Mirroring Phototonic(Spiegeln deaktiviertMirroring Disabled Phototonic$Spiegeln: ZweifachMirroring: Dual Phototonic6Spiegeln: Zweifach vertikalMirroring: Dual Vertical Phototonic$Spiegeln: VierfachMirroring: Quad Phototonic$Spiegeln: DreifachMirroring: Triple Phototonic4Verschiebe "%1" nach "%2"?Move "%1" to "%2"? PhototonicNach unten Move Down PhototonicNach links Move Left PhototonicNach rechts Move Right PhototonicNach obenMove Up Phototonic.Verzeichnis verschieben Move folder Phototonic&Verschieben nach... Move to... PhototonicVerschiebenMoved PhototonicNameName PhototonicNavigation Navigation Phototonic"Neues Verzeichnis New Folder Phototonic,Neues UnterverzeichnisNew Sub folder Phototonic,Neuer Verzeichnisname:New folder name: PhototonicNeuer Name: New name: Phototonic WeiterNext PhototonicKeine Bilder No images Phototonic*Kein Name eingegeben.No name entered. PhototonicKeine Auswahl No selection Phototonic ffnenOpen Phototonicffnen mit... Open With... PhototonicOriginalgre Original Size PhototonicHier einfgen Paste Here Phototonic&Bild-Daten einfgenPaste Image Data Phototonic"Endgltig lschenPermanently delete Phototonic\Endgltig lschen "%1" und der gesamte Inhalt?0Permanently delete "%1" and all of its contents? PhototoniclMchten Sie die ausgewhlten Bilder endgltig lschen?#Permanently delete selected images? PhototonicEinstellungen Preferences PhototonicVorherigesPrevious PhototonicVierfachQuad PhototonicZuflligRandom PhototonicNeu ladenReload Phototonic*Lesezeichen entfernenRemove Bookmark PhototonicEntfernt "%1" Removed "%1" PhototonicUmbenennenRename PhototonicBild umbenennen Rename Image Phototonic"Zoom zurcksetzen Reset Zoom PhototonicUmgekehrtReverse PhototonicHUm 1 gegen den Uhrzeigersinn drehenRotate 1 degree CCW Phototonic:Um 1 im Uhrzeigersinn drehenRotate 1 degree CW PhototonicD90 gegen den Uhrzeigersinn drehenRotate 90 degree CCW Phototonic690 im Uhrzeigersinn drehenRotate 90 degree CW PhototonicDrehung %1 Rotation %1° PhototonicSpeichernSave PhototonicSpeichern unterSave As PhototonicBild skalieren Scale Image PhototonicAlle auswhlen Select All PhototonicPfad setzenSet Path Phototonic6Versteckte Dateien anzeigenShow Hidden Files PhototonicNamen anzeigen Show Labels Phototonic.Werkzeugleiste anzeigen Show Toolbar Phototonic:Miniaturansichten verkleinernShrink Thumbnails Phototonic GreSize PhototonicDiashow Slide Show Phototonic"Diashow gestartetSlide show started Phototonic$Diashow angehaltenSlide show stopped PhototonicKleine Symbole Small Icons PhototonicSortieren nachSort By PhototonicQuadratischSquarish PhototonicDiashow beendenStop Slide Show PhototonicTagsTags PhototonicZeitTime PhototonicObenTop PhototonicTransformieren Transform Phototonic8Transformationen beibehaltenTransformations Locked Phototonic6Transformationen entsperrenTransformations Unlocked PhototonicDreifachTriple PhototonicTypType Phototonic<Horizontal spiegeln rckgngigUnflipped Horizontally Phototonic8Vertikal spiegeln rckgngigUnflipped Vertically PhototonicAnsichtView PhototonicBetrachterViewer PhototonicWarnungWarning PhototonicJaYes PhototonicZoomZoom PhototonicZoom %1%Zoom %1% PhototonicZoom erhhenZoom In Phototonic Zoom beibehalten Zoom Locked PhototonicZoom verringernZoom Out Phototonic"Zoom zurcksetzen Zoom Reset PhototonicZoom entsperren Zoom Unlocked PhototonicAbbrechenCancelProgressDialogAbbrechenCancel ResizeDialog Hhe:Height: ResizeDialog8Grenverhltnis beibehaltenLock aspect ratio ResizeDialogNeue Gre: New size: ResizeDialogOriginalgre:Original size: ResizeDialogProzentPercent ResizeDialog PixelPixels ResizeDialogSkalierenScale ResizeDialogBild skalieren Scale Image ResizeDialogEinheit:Units: ResizeDialogBreite:Width: ResizeDialog`Abstand zwischen den Miniaturansichten einfgen:Add space between thumbnails:SettingsDialog"Hintergrundfarbe:Background color:SettingsDialog Hintergrundbild:Background image:SettingsDialogNach Hhe By heightSettingsDialogNach BreiteBy widthSettingsDialog*Nach Breite oder HheBy width or heightSettingsDialogAbbrechenCancelSettingsDialogHVerzeichnis bei Programmstart whlenChoose Startup FolderSettingsDialogJStandard-Bildqualitt beim Speichern:#Default quality when saving images:SettingsDialog`Standard oder mit Befehlszeilenparameter angeben.Default, or specified by command line argumentSettingsDialogTVerzgerung zwischen den Dias in Sekunden: Delay between slides in seconds:SettingsDialog$Lschen besttigenDelete confirmationSettingsDialogDeaktivierenDisableSettingsDialog0GIF-Animation aktivierenEnable GIF animationSettingsDialogBeenden statt Schlieen, wenn das Bild von der Kommandozeile geladen wird?Exit instead of closing, when image is loaded from command lineSettingsDialog*Groe Bilder anpassenFit Large ImagesSettingsDialog,Kleine Bilder anpassenFit Small ImagesSettingsDialogAllgemeinGeneralSettingsDialog BilderImagesSettingsDialog&TastenkombinationenKeyboard ShortcutsSettingsDialogLabelfarbe: Label color:SettingsDialogtAnzahl der Seiten, die im Voraus eingelesen werden sollen:(Number of thumbnail pages to read ahead:SettingsDialogOKOKSettingsDialogDatei ffnen Open FileSettingsDialogEinstellungen PreferencesSettingsDialog"Letztes speichern Remember lastSettingsDialogFBild gem EXIF-Orientierung drehen*Rotate image according to Exif orientationSettingsDialog`Miniaturansichten gem EXIF-Orientierung drehen/Rotate thumbnails according to Exif orientationSettingsDialog@Dateiname im Betrachter anzeigenShow image file name in viewerSettingsDialogOriginalgre der Bilder anzeigen, wenn sie kleiner als die Miniaturansicht ist AppMgmtDialog Manage External Applications Externe Anwendungen verwalten Name Name Application path and arguments Programmpfad und -argumente Choose Auswählen Add manually Manuell hinzufügen Remove Entfernen OK OK Choose Application Anwendung auswählen New Application Neue Applikation ColorsDialog Colors Farben Reset Zurücksetzen OK OK Hue Farbton Saturation Sättigung Lightness Helligkeit Channels Kanäle Enable Aktivieren Colorize Einfärben Negative Negativ Red Rot Green Grün Blue Blau Hue and Saturation Farbton und Sättigung Affected Channels Betroffene Kanäle Brightness Helligkeit Contrast Kontrast Brightness and Contrast Helligkeit und Kontrast Color Balance Farbabstimmung CopyMoveToDialog Copy or Move Images to... Bilder kopieren oder verschieben nach... Add Hinzufügen Move to... Verschieben nach... Copy to... Kopieren nach... Browse... Durchsuchen... Remove Entfernen Cancel Abbrechen OK OK Destination: Ziel: Destination: Ziel: Close Schließen Copy Kopieren Move Verschieben Choose Folder Verzeichnis wählen CpMvDialog Cancel Abbrechen Copying "%1" to "%2". Kopiere "%1" nach "%2". Moving "%1" to "%2". Verschiebe "%1" nach "%2". Copying Kopiere Moving Verschiebe to nach CropDialog Cropping Zuschneiden Reset Zurücksetzen OK OK Top Oben Left Links Right Rechts Bottom Unten ImageTags Tag Tag Untag Untag Clear Filters Filter zurücksetzen New Tag Neuer Tag Image Tags Image Tags Filter Filter Remove Tag Tag entfernen Negate Umkehren Error Fehler Failed to save tags to Speichern des Tags fehlgeschlagen Tagging Tagging Untagging Untagging Add a new tag Neuen Tag hinzufügen Enter new tag name Namen des Tags eingeben No name entered Kein Name eingegeben Tag Tag already exists existiert bereits Remove selected tags(s)? Ausgewählte(n) Tag(s) entfernen? Remove tag Tag entfernen Yes Ja Cancel Abbrechen ImageView Clipboard Zwischenablage Selection size: Größe auswählen: No selection Keine Auswahl Hold down the Ctrl key and select a region using the mouse. Halten Sie die STRG-Taste gedrückt und markieren einen Bereich mit der Maus. Failed to save image. Fehler beim Speichern. Failed to save Exif metadata. Fehler beim Speichern der EXIF-Metadaten. Image saved. Bild gespeichert. Hold down the Ctrl key and select a region using the mouse Halten Sie die STRG-Taste gedrückt und markieren einen Bereich mit der Maus Saving... Speichere... Error Fehler Failed to save image Fehler beim Speichern Failed to save Exif metadata Fehler beim Speichern der EXIF-Metadaten Image saved Bild gespeichert Save image as Bild speichern als Images Bilder Image Files Bild-Dateien InfoView Copy Kopieren KeyGrabLineEdit Set shortcut Verknüpfung setzen is reserved for shortcuts to external applications ist für Zugriff auf externe Programme reserviert is already assigned to " ist bereits " " action " zugewiesen Phototonic Image Info Bildinformationen Zoom Zoom Transform Transformieren Top Oben Bottom Unten Close Image Bild schließen Full Screen Vollbild Preferences Einstellungen Exit Beenden Enlarge Thumbnails Miniaturansichten vergrößern Shrink Thumbnails Miniaturansichten verkleinern Cut Ausschneiden Copy Kopieren Copy to... Kopieren nach... Move to... Verschieben nach... Copy Image Data Bild-Daten kopieren Paste Image Data Bild-Daten einfügen Hide Dock Title Bars Dock-Titelleiste verbergen Show Toolbar Werkzeugleiste anzeigen Go Up Nach oben Load Clipboard Zwischenablage laden Open With... Öffnen mit... Crop to Selection Auswahl zum Zuschneiden Lock Transformations Transformationen beibehalten Filter by Name Nach Namen filtern Set Path Pfad setzen &Tools &Werkzeuge Image Bild Bookmarks Lesezeichen Tags Tags Minimum zoom Kleinster Zoom Maximum zoom Größter Zoom Rotation %1° Drehung %1° Failed to open file "%1", file not found. Öffnen der Datei fehlgeschlagen "%1": Datei wurde nicht gefunden. Failed to open file "%1": file not found. Öffnen der Datei fehlgeschlagen "%1": Datei wurde nicht gefunden. Can not move or copy images to this folder. Verschieben oder Kopieren von Bildern in dieses Verzeichnis nicht möglich. Destination folder is same as source. Ziel- und Quellverzeichnis sind identisch. Move "%1" to "%2"? Verschiebe "%1" nach "%2"? Failed to move folder. Verschieben des Verzeichnisses fehlgeschlagen. Failed to open folder: Öffnen des Verzeichnisses fehlgeschlagen: Duplicate images in %1 Duplikate in %1 Invalid name entered. Name ungültig. Failed to rename folder. Umbenennen des Verzeichnisses fehlgeschlagen. Enter a new name for "%1": Neuen Namen eingeben "%1": No name entered. Kein Name eingegeben. Failed to rename image. Umbenennen des Bildes fehlgeschlagen. Permanently delete "%1" and all of its contents? Endgültig löschen "%1" und der gesamte Inhalt? Failed to delete folder. Löschen des Verzeichnisses fehlgeschlagen. Removed "%1" Entfernt "%1" Failed to create new folder. Erstellen des neuen Verzeichnisses fehlgeschlagen. Created "%1" Erstellt "%1" Cannot perform action with temporary image. Aktion kann mit temporärem Bild nicht ausgeführt werden. Failed to start external application Externe Anwendung konnte nicht gestartet werden Zoom Zoom Zoom Reset Zoom zurücksetzen Zoom Locked Zoom beibehalten Zoom Unlocked Zoom entsperren Transformations Locked Transformationen beibehalten Transformations Unlocked Transformationen entsperren Rotation Drehung Flipped Vertically Vertikal gespiegelt Unflipped Vertically Vertikal spiegeln rückgängig Flipped Horizontally Horizontal gespiegelt Unflipped Horizontally Horizontal spiegeln rückgängig Mirroring Disabled Spiegeln deaktiviert Mirroring: Dual Spiegeln: Zweifach Mirroring: Triple Spiegeln: Dreifach Mirroring: Dual Vertical Spiegeln: Zweifach vertikal Mirroring: Quad Spiegeln: Vierfach Can not copy or move to the same folder Kopieren oder Verschieben in den selben Ordner nicht möglich Copied Kopiert Moved Verschieben Permanently delete Endgültig löschen Failed to delete image. Löschen des Bildes fehlgeschlagen. Deleted Gelöscht Invalid Path: Ungültiger Pfad: Viewer Betrachter Docks and Toolbars Dock und Werkzeugleiste Mirroring Spiegeln Delete Löschen Save Speichern Save As Speichern unter Copy Image Bild kopieren Paste Image Bild einfügen Rename Umbenennen Select All Alle auswählen About Über Name Name Time Zeit Size Größe Type Typ Reverse Umgekehrt Show Hidden Files Versteckte Dateien anzeigen Show Labels Namen anzeigen Small Icons Kleine Symbole Classic Thumbs Klassische Miniaturansicht Compact Kompakt Squarish Quadratisch Reload Neu laden Include Sub-folders Unterverzeichnisse einbeziehen Paste Here Hier einfügen New Folder Neues Verzeichnis Manage Verwalten Back Zurück Forward Vorwärts Up Übergeordnetes Verzeichnis Home Persönliches Verzeichnis Slide Show Diashow Next Weiter Previous Vorheriges First Erstes Last Letztes Random Zufällig Open Öffnen Scale Image Bild skalieren <u>Contributors</u>:<br> <u>Mitwirkende</u>:<br> <u>Translators</u>:<br> <u>Übersetzer</u>:<br> Stop Slide Show Diashow beenden New Image Neues Bild Open With Öffnen mit Manage External Applications Externe Anwendungen verwalten Add Bookmark Lesezeichen hinzufügen Remove Bookmark Lesezeichen entfernen Zoom Out Zoom verringern Zoom In Zoom erhöhen Reset Zoom Zoom zurücksetzen Original Size Originalgröße Keep Zoom Zoom beibehalten Rotate 90 degree CCW 90° gegen den Uhrzeigersinn drehen Rotate 90 degree CW 90° im Uhrzeigersinn drehen Flip Horizontally Horizontal spiegeln Flip Vertically Vertikal spiegeln Cropping Zuschneiden Rotate 1 degree CCW Um 1° gegen den Uhrzeigersinn drehen Rotate 1 degree CW Um 1° im Uhrzeigersinn drehen Colors Farben Find Duplicate Images Suche Duplikate Disable Deaktivieren Dual Zweifach Triple Dreifach Dual Vertical Zweifach vertikal Quad Vierfach Keep Transformations Transformationen beibehalten Move Left Nach links Move Right Nach rechts Move Up Nach oben Move Down Nach unten Invert Selection Auswahl umkehren File Datei Edit Bearbeiten Go Los View Ansicht Sort By Sortieren nach Help Hilfe Navigation Navigation Filter Filter Initializing... Initialisiere... File System Dateisystem <p>Image viewer and organizer</p> <p>Bildbetrachter und -verwalter <p>Built with Qt <p>Kompiliert mit Qt Home page Homepage Bug reports Fehlerberichte Contact Kontakt Translations: Übersetzungen: Copy or Move to... Kopieren oder Verschieben nach... Show Lables Label anzeigen Compact (slower) Kompakt (langsamer) Show Clipboard Zwischenablage anzeigen Resize Image Bildgröße ändern &File &Datei &Edit &Bearbeiten &Go &Los &View &Ansicht &Help &Hilfe <p>Git release <p>Git-Version Built with Qt <p>Kompiliert mit Qt Invalid selection Ungültige Auswahl Error Fehler Failed to copy or move image Kopieren oder Verschieben des Bildes fehlgeschlagen Can not copy or move to Kopieren oder Verschieben nicht möglich Can not cut and paste in the same folder Ausschneiden und Einfügen im selben Verzeichnis nicht möglich Copied Kopiert Moved Verschoben images Bilder Delete image Bild löschen Permanently delete Endgültig löschen Failed to delete image Löschen des Bildes fehlgeschlagen No selection Keine Auswahl Delete images Bilder löschen Permanently delete selected images? Möchten Sie die ausgewählten Bilder endgültig löschen? Hide Docks Title Bar Dock-Titelleisten verbergen Contributors / Code: Mitwirkende / Code: Contributors / Translations: Mitwirkende / Übersetzungen: Failed to start external application. Externe Anwendung konnte nicht gestartet werden. Invalid selection. Ungültige Auswahl. Failed to copy or move image. Kopieren oder Verschieben des Bildes fehlgeschlagen. Zoom %1% Zoom %1% Rotation %1u00B0 Drehung %1u00B0 %n image(s) %n Bild %n Bilder Yes Ja Cancel Abbrechen Deleted Gelöscht Invalid Path: Ungültiger Pfad: Preview Vorschau No images Keine Bilder Failed to open file Öffnen der Datei fehlgeschlagen , file not found , Datei wurde nicht gefunden Slide show stopped Diashow angehalten Slide show started Diashow gestartet Can not move or copy images to this folder Verschieben oder Kopieren von Bildern in dieses Verzeichnis nicht möglich Destination folder is same as source Ziel- und Quellverzeichnis sind identisch Move Verschieben to nach Move folder Verzeichnis verschieben Failed to move folder Verschieben des Verzeichnisses fehlgeschlagen Folder moved Verzeichnis verschoben Failed to open folder: Öffnen des Verzeichnisses fehlgeschlagen: Rename Umbenennen New name: Neuer Name: Invalid name entered Name ungültig Failed to rename folder Umbenennen des Verzeichnisses fehlgeschlagen Rename Image Bild umbenennen Enter a new name for Neuen Namen eingeben No name entered Kein Name eingegeben Failed to rename image Umbenennen des Bildes fehlgeschlagen and all of its contents? und der gesamte Inhalt? Delete folder Verzeichnis löschen Failed to delete folder Löschen des Verzeichnisses fehlgeschlagen Removed Entfernt New Sub folder Neues Unterverzeichnis New folder name: Neuer Verzeichnisname: Failed to create new folder Erstellen des neuen Verzeichnisses fehlgeschlagen Created Erstellt Executing file manager... Datei-Manager ausführen... Warning Warnung Cannot perform action with temporary image Aktion kann mit temporärem Bild nicht ausgeführt werden ProgressDialog Cancel Abbrechen QObject Usage: phototonic [FILE or DIRECTORY]... Usage: phototonic [FILE or DIRECTORY]... ResizeDialog Scale Image Bild skalieren Scale Skalieren Cancel Abbrechen Original size: Originalgröße: Width: Breite: Height: Höhe: Units: Einheit: New size: Neue Größe: Original size: Originalgröße: Width: Breite: Height: Höhe: Units: Einheit: New size: Neue Größe: Pixels Pixel Percent Prozent Lock aspect ratio Größenverhältnis beibehalten SettingsDialog Preferences Einstellungen By width or height Nach Breite oder Höhe Default quality when saving images: Standard-Bildqualität beim Speichern: Label color: Labelfarbe: OK OK Cancel Abbrechen Background color: Hintergrundfarbe: Rotate image according to Exif orientation Bild gemäß EXIF-Orientierung drehen Label color: Labelfarbe: Background image: Hintergrundbild: Add space between thumbnails: Abstand zwischen den Miniaturansichten einfügen: Show original size of images smaller than the thumbnail size Originalgröße der Bilder anzeigen, wenn sie kleiner als die Miniaturansicht ist Number of thumbnail pages to read ahead: Anzahl der Seiten, die im Voraus eingelesen werden sollen: Rotate thumbnails according to Exif orientation Miniaturansichten gemäß EXIF-Orientierung drehen Keyboard shortcuts Tastenkombinationen Thumbnails Miniaturansichten Fit Large Images Große Bilder anpassen Disable Deaktivieren By width and height Nach Breite und Höhe By width Nach Breite By height Nach Höhe Stretch disproportionately Unverhältnismäßig dehnen Fit Small Images Kleine Bilder anpassen Exit instead of closing, when image is loaded from command line Beenden statt Schließen, wenn das Bild von der Kommandozeile geladen wird Wrap image list when reaching last or first image Bilderliste umbrechen, wenn das letzte oder erste Bild erreicht wird Default quality when saving images: Standard-Bildqualität beim Speichern: Enable GIF animation GIF-Animation aktivieren Open File Datei öffnen Images Bilder Rotate according to Exif orientation Gemäß EXIF-Orientierung drehen Show image file name in full screen mode Name der Bilddatei im Vollbildmodus anzeigen Background color: Hintergrundfarbe: Show image file name in viewer Dateiname im Betrachter anzeigen Background image: Hintergrundbild: Add space between thumbnails: Abstand zwischen den Miniaturansichten einfügen: Number of thumbnail pages to read ahead: Anzahl der Seiten, die im Voraus eingelesen werden sollen: Delay between slides in seconds: Verzögerung zwischen den Dias in Sekunden: Startup folder Verzeichnis bei Programmstart Default, or specified by command line argument Standard oder mit Befehlszeilenparameter angeben Remember last Letztes speichern Specify: Auswählen: Delete confirmation Löschen bestätigen Keyboard Shortcuts Tastenkombinationen Viewer Betrachter Delay between slides in seconds: Verzögerung zwischen den Dias in Sekunden: Show random images Zufällig ausgewählte Bilder anzeigen Slide Show Diashow Swap mouse left-click and middle-click actions Links-Klick- und Mittel-Klick-Aktionen der Maus tauschen Keyboard Shortcuts: Tastenkombinationen: Keyboard and Mouse Tastatur und Maus General Allgemein Choose Startup Folder Verzeichnis bei Programmstart wählen ShortcutsTableView Action Aktion Shortcut Verknüpfung Delete shortcut Verknüpfung löschen Set shortcut Verknüpfung setzen "%1" is reserved for shortcuts to external applications. "%1" ist für Zugriff auf externe Programme reserviert. "%1" is already assigned to "%2" action. "%1" ist bereits "%2" zugewiesen. is reserved for shortcuts to external applications ist für Zugriff auf externe Programme reserviert is already assigned to " ist bereits " " action " zugewiesen ThumbView images Bilder Selected Ausgewählt of von File name Dateiname Location Speicherort Format Format Resolution Auflösung Megapixel Megapixel Selected %1 of %2 Ausgewählt %1 von %2 Scanned %1, displaying %2 (%3 and %4) Geprüft %1, angezeigt %2 (%3 und %4) %n original(s) %n Original %n Originale %n duplicate(s) %n Duplikat %n Duplikate Size Größe General Allgemein Modified Geändert Error Fehler %n image(s) %n Bild %n Bilder Selected %1 of%2 Ausgewählt %1 von%2 %n image(s) %n Bild %n Bilder Searching duplicate images... Suche Duplikate... Scanned Geprüft %n images, displaying %n Bild, angezeigt %n Bilder, angezeigt %n images ( %n Bild ( %n Bilder ( %n originals and %n Original und %n Originale und %n duplicates) %n Duplikat) %n Duplikate) No images Keine Bilder phototonic-1.7.20/translations/phototonic_en.qm000066400000000000000000000374741271214516700217440ustar00rootroot000000000000000* *% *0 + =1by3YG LbdLbLb3M JNNn/N P7TlXXXY%'i=knxF.'%Ft0A!nc/9*DQxY2P[)nsdC,e& jrIA]sn v+9Ù.fȲW +! e9N K<\ Nw 53~Nn.6f3 n% nfGQxY 9QxY3 Rg<SW4[eFuvew(w03r5C$$$Iý,u!& # ~lucz^1t-]C] ;IyII QI&I)fn1,66 o b,:fRL֓4!}x},bAa,OO $P)n*UD&0l/^ p3'~~!K]5tFFH5In4K4%$ j(Q%S0`I^ߺ(xn- #C %n69$4>e+pPtT&[_.%%_P&Z}nV'Fj/IȜ'Ѝ.D aJKD)G((4qAE !%(%*"$%8c -1Clp]4:jNI)g6g>>ממs6)=)Y #]*( `@ "% "8#R\ glh gl\ lq^ t7J y-. zdJ'W t  G *E * #T$ Ds au dg < id#, p="w p=/ q% * a M >  )$ 3 s, ye ye+ C. 2'5 }8)s ~ ~ !O ʺ, ( E-_ BnV  &e ,@~  .  A! O PG'#y R ] 4q P%x 1  ©- <,8 <4& S Ss#)5u0:&";I/6!2^ߔ&iT2!o0 #i5 Add manually AppMgmtDialogApplication path and arguments AppMgmtDialogChoose AppMgmtDialogChoose Application AppMgmtDialogManage External Applications AppMgmtDialogName AppMgmtDialogNew Application AppMgmtDialogOK AppMgmtDialogRemove AppMgmtDialogAffected Channels ColorsDialogBlue ColorsDialog Brightness ColorsDialogBrightness and Contrast ColorsDialog Color Balance ColorsDialogColorize ColorsDialogColors ColorsDialogContrast ColorsDialogGreen ColorsDialogHue ColorsDialogHue and Saturation ColorsDialog Lightness ColorsDialogOK ColorsDialogRed ColorsDialogReset ColorsDialog Saturation ColorsDialog Browse...CopyMoveToDialogCancelCopyMoveToDialog Choose FolderCopyMoveToDialog Copy to...CopyMoveToDialog Destination:CopyMoveToDialog Move to...CopyMoveToDialogOKCopyMoveToDialogRemoveCopyMoveToDialogCancel CpMvDialogCopying "%1" to "%2". CpMvDialogMoving "%1" to "%2". CpMvDialogBottom CropDialogCropping CropDialogLeft CropDialogOK CropDialogReset CropDialogRight CropDialogTop CropDialog Clipboard ImageViewError ImageViewFailed to save Exif metadata. ImageViewFailed to save image. ImageView;Hold down the Ctrl key and select a region using the mouse. ImageView Image saved. ImageViewImages ImageView No selection ImageView Save image as ImageView Saving... ImageViewCopyInfoView%n image%n images %n image(s) Phototonic&Edit Phototonic&File Phototonic&Go Phototonic&Help Phototonic&Tools Phototonic&View Phototonic!

Image viewer and organizer

 PhototonicAbout Phototonic Add Bookmark PhototonicBack Phototonic Bookmarks PhototonicBottom Phototonic Bug reports PhototonicCan not copy or move to  Phototonic'Can not copy or move to the same folder Phototonic+Can not move or copy images to this folder. PhototonicCancel Phototonic+Cannot perform action with temporary image. PhototonicClassic Thumbs Phototonic Close Image PhototonicColors PhototonicCompact PhototonicCopied PhototonicCopy PhototonicCopy Image Data Phototonic Copy to... Phototonic Created "%1" PhototonicCrop to Selection PhototonicCropping PhototonicCut PhototonicDelete Phototonic Delete folder Phototonic Delete image Phototonic Delete images PhototonicDeleted Phototonic%Destination folder is same as source. PhototonicDisable PhototonicDocks and Toolbars PhototonicDual Phototonic Dual Vertical PhototonicDuplicate images in %1 PhototonicEdit PhototonicEnlarge Thumbnails PhototonicEnter a new name for "%1": PhototonicError PhototonicExit PhototonicFailed to copy or move image. PhototonicFailed to create new folder. PhototonicFailed to delete folder. PhototonicFailed to delete image PhototonicFailed to delete image. PhototonicFailed to move folder. PhototonicFailed to open folder: PhototonicFailed to rename folder. PhototonicFailed to rename image. Phototonic%Failed to start external application. Phototonic File System PhototonicFilter PhototonicFilter by Name PhototonicFind Duplicate Images PhototonicFirst PhototonicFlip Horizontally PhototonicFlip Vertically PhototonicFlipped Horizontally PhototonicFlipped Vertically Phototonic Folder moved PhototonicForward Phototonic Full Screen PhototonicGo Up PhototonicHome Phototonic Home page PhototonicImage Phototonic Image Info PhototonicInclude Sub-folders PhototonicInitializing... Phototonic Invalid Path: PhototonicInvalid name entered. PhototonicInvalid selection PhototonicInvalid selection. PhototonicInvert Selection Phototonic Keep Zoom PhototonicLast PhototonicLoad Clipboard PhototonicLock Transformations PhototonicManage External Applications Phototonic Mirroring PhototonicMirroring Disabled PhototonicMirroring: Dual PhototonicMirroring: Dual Vertical PhototonicMirroring: Quad PhototonicMirroring: Triple PhototonicMove "%1" to "%2"? Phototonic Move Down Phototonic Move Left Phototonic Move Right PhototonicMove Up Phototonic Move folder Phototonic Move to... PhototonicMoved PhototonicName Phototonic Navigation Phototonic New Folder PhototonicNew Sub folder PhototonicNew folder name: Phototonic New name: PhototonicNext Phototonic No images PhototonicNo name entered. Phototonic No selection PhototonicOpen Phototonic Open With... Phototonic Original Size Phototonic Paste Here PhototonicPaste Image Data PhototonicPermanently delete Phototonic0Permanently delete "%1" and all of its contents? Phototonic#Permanently delete selected images? Phototonic Preferences PhototonicPrevious PhototonicQuad PhototonicRandom PhototonicReload PhototonicRemove Bookmark Phototonic Removed "%1" PhototonicRename Phototonic Rename Image Phototonic Reset Zoom PhototonicReverse PhototonicRotate 1 degree CCW PhototonicRotate 1 degree CW PhototonicRotate 90 degree CCW PhototonicRotate 90 degree CW Phototonic Rotation %1° PhototonicSave PhototonicSave As Phototonic Scale Image Phototonic Select All PhototonicSet Path PhototonicShow Hidden Files Phototonic Show Labels Phototonic Show Toolbar PhototonicShrink Thumbnails PhototonicSize Phototonic Slide Show PhototonicSlide show started PhototonicSlide show stopped Phototonic Small Icons PhototonicSort By PhototonicSquarish PhototonicStop Slide Show PhototonicTime PhototonicTop Phototonic Transform PhototonicTransformations Locked PhototonicTransformations Unlocked PhototonicTriple PhototonicType PhototonicUnflipped Horizontally PhototonicUnflipped Vertically PhototonicView PhototonicViewer PhototonicWarning PhototonicYes PhototonicZoom PhototonicZoom %1% PhototonicZoom In Phototonic Zoom Locked PhototonicZoom Out Phototonic Zoom Reset Phototonic Zoom Unlocked PhototonicCancel ResizeDialogHeight: ResizeDialogLock aspect ratio ResizeDialog New size: ResizeDialogOriginal size: ResizeDialogPercent ResizeDialogPixels ResizeDialogScale ResizeDialog Scale Image ResizeDialogUnits: ResizeDialogWidth: ResizeDialogAdd space between thumbnails:SettingsDialogBackground color:SettingsDialogBackground image:SettingsDialog By heightSettingsDialogBy widthSettingsDialogCancelSettingsDialogChoose Startup FolderSettingsDialog#Default quality when saving images:SettingsDialog.Default, or specified by command line argumentSettingsDialog Delay between slides in seconds:SettingsDialogDelete confirmationSettingsDialogDisableSettingsDialogEnable GIF animationSettingsDialog?Exit instead of closing, when image is loaded from command lineSettingsDialogFit Large ImagesSettingsDialogFit Small ImagesSettingsDialogGeneralSettingsDialogImagesSettingsDialogKeyboard ShortcutsSettingsDialog Label color:SettingsDialog(Number of thumbnail pages to read ahead:SettingsDialogOKSettingsDialog Open FileSettingsDialog PreferencesSettingsDialog Remember lastSettingsDialog*Rotate image according to Exif orientationSettingsDialog/Rotate thumbnails according to Exif orientationSettingsDialog AppMgmtDialog Manage External Applications Name Application path and arguments Choose Add manually Remove OK Choose Application New Application ColorsDialog Colors Reset OK Hue Saturation Lightness Colorize Negative Red Green Blue Hue and Saturation Affected Channels Brightness Contrast Brightness and Contrast Color Balance CopyMoveToDialog Move to... Copy to... Browse... Remove Cancel OK Destination: Choose Folder CpMvDialog Cancel Copying "%1" to "%2". Moving "%1" to "%2". CropDialog Cropping Reset OK Left Right Top Bottom ImageTags Tag Untag Clear Filters New Tag Image Tags Filter Remove Tag Negate Error Failed to save tags to Tagging Untagging Add a new tag Enter new tag name No name entered Tag already exists Remove selected tags(s)? Remove tag Yes Cancel ImageView Clipboard Selection size: No selection Hold down the Ctrl key and select a region using the mouse. Saving... Error Failed to save image. Failed to save Exif metadata. Image saved. Save image as Images InfoView Copy Phototonic Image Info Zoom Mirroring Transform View Top Bottom Close Image Full Screen Preferences Exit Enlarge Thumbnails Shrink Thumbnails Cut Copy Copy to... Move to... Delete Save Save As Copy Image Data Paste Image Data Rename Select All About Name Time Size Type Reverse Show Hidden Files Show Labels Small Icons Hide Dock Title Bars Show Toolbar Classic Thumbs Compact Squarish Reload Include Sub-folders Paste Here New Folder Back Forward Go Up Home Slide Show Next Previous First Last Random Open Load Clipboard Open With... Manage External Applications Add Bookmark Remove Bookmark Zoom Out Zoom In Reset Zoom Original Size Keep Zoom Rotate 90 degree CCW Rotate 90 degree CW Flip Horizontally Flip Vertically Cropping Crop to Selection Scale Image Rotate 1 degree CCW Rotate 1 degree CW Colors Find Duplicate Images Disable Dual Triple Dual Vertical Quad Lock Transformations Move Left Move Right Move Up Move Down Invert Selection Filter by Name Set Path &File &Edit &Go &View Sort By &Tools &Help Edit Navigation Filter Image Initializing... File System Bookmarks Tags <p>Image viewer and organizer</p> Home page Bug reports Error Failed to start external application. Invalid selection. Failed to copy or move image. Minimum zoom Zoom %1% Maximum zoom Zoom Reset Zoom Locked Zoom Unlocked Transformations Locked Transformations Unlocked Rotation %1° Flipped Vertically Unflipped Vertically Flipped Horizontally Unflipped Horizontally No selection Mirroring Disabled Mirroring: Dual Mirroring: Triple Mirroring: Dual Vertical Mirroring: Quad Can not copy or move to Can not copy or move to the same folder Copied Moved %n image(s) %n image %n images Permanently delete Delete image Yes Cancel Deleted Failed to delete image Permanently delete selected images? Delete images Failed to delete image. Deleted Invalid Path: Viewer Docks and Toolbars No images Failed to open file "%1", file not found. Slide show stopped Stop Slide Show Slide show started Can not move or copy images to this folder. Destination folder is same as source. Move "%1" to "%2"? Move folder Failed to move folder. Folder moved Failed to open folder: Duplicate images in %1 New name: Invalid name entered. Failed to rename folder. Invalid selection Rename Image Enter a new name for "%1": No name entered. Failed to rename image. Permanently delete "%1" and all of its contents? Delete folder Failed to delete folder. Removed "%1" New Sub folder New folder name: Failed to create new folder. Created "%1" Warning Cannot perform action with temporary image. ProgressDialog Cancel ResizeDialog Scale Image Scale Cancel Original size: Width: Height: Units: New size: Pixels Percent Lock aspect ratio SettingsDialog Preferences Fit Large Images Disable By width By height Stretch disproportionately Fit Small Images Exit instead of closing, when image is loaded from command line Wrap image list when reaching last or first image Default quality when saving images: Enable GIF animation Rotate image according to Exif orientation Background color: By width or height Show image file name in viewer Label color: Background image: Add space between thumbnails: Show original size of images smaller than the thumbnail size Number of thumbnail pages to read ahead: Rotate thumbnails according to Exif orientation Delay between slides in seconds: Show random images Startup folder Default, or specified by command line argument Remember last Specify: Swap mouse left-click and middle-click actions Delete confirmation Keyboard Shortcuts OK Cancel Viewer Thumbnails Slide Show General Choose Startup Folder Open File Images ShortcutsTableView Action Shortcut Delete shortcut Set shortcut "%1" is reserved for shortcuts to external applications. "%1" is already assigned to "%2" action. ThumbView General File name Location Size Modified Format Resolution Megapixel Error %n image(s) %n image %n images No images Selected %1 of%2 %n image(s) %n image %n images Scanned %1, displaying %2 (%3 and %4) %n original(s) %n original %n originals %n duplicate(s) %n duplicates %n duplicate %n duplicates Searching duplicate images... phototonic-1.7.20/translations/phototonic_fr.qm000066400000000000000000000720171271214516700217410ustar00rootroot00000000000000BEiG5HeIJ]Kx20h&o('A>b"**%*0y+1byeGLb LbQLb#Lbf+M + N-oNn2DNP7.Tl8)XX X Y%O~\Zw~ikn/fxFVMFt,AE 5n$c_9#V*:uQxYd[)n dCWeKj;rIA"asn7V!Ù.$2Ȳ0< W! 9NA<\N?[w 5fZ~*n[f3@)%9_ +RfG@QxYQxYe|Rg<4QSW45eFu5zoG ve%w(.Ew `ri(+CI$IýY(u}w- } !& #BKlu7@z^ctZ] 0]IDI *I IIMPIMIRfb66|o '>,Z'U: :*BfR8֓fDh}}X1Aa+B= 0FW zKإ#O,SO JKP)nU{UDL"l/^(p3OK~~DK]>5t?$FFH5?nggu%I jP$J`I^-/ߺP[n[+) /#Cb%n6W9$g>eVPtTM[_.%K_PLj}n)VNj\F7j^77ȜOЍ$D( HJDQ(:1(gq<E6C~O*E%8c-"Cl(qA0>%W0Lמ מ:6R=QxY Hn]*Q"@! FE%F8Gg@> gl [ gl lq^;> t7J9 y-] zdJNt tC8 *s G3 DRY T T #TH Ds" a9 dg idG/ p=F p=^ q%; *' aC  >& + )4 3S sX ye!M yeU C^ 2'h( }8R ~ ~ C ʺY{ P ص EZC Bnb ) &e1l ,@~B , T .Ao A O PG'G Pr R? Z Td/ ڎ Nh  DC} Sd3 h`B i, p r. ] g< PK c ] © <Xb <f S S\sF)15ua:=f3q:M3.?";I_d6!e ^ߔLiTdo0#8ii(Ajouter manuellement Add manually AppMgmtDialogNEmplacement et options de l'applicationApplication path and arguments AppMgmtDialogChoisirChoose AppMgmtDialog*Choisir l'applicationChoose Application AppMgmtDialogBGestion des applications externesManage External Applications AppMgmtDialogNomName AppMgmtDialog(Nouvelle ApplicationNew Application AppMgmtDialogOKOK AppMgmtDialogSupprimerRemove AppMgmtDialogCanaux affectsAffected Channels ColorsDialogBleuBlue ColorsDialogLuminosit Brightness ColorsDialog.Luminosit et ContrasteBrightness and Contrast ColorsDialog(Balance des couleurs Color Balance ColorsDialogColoriserColorize ColorsDialogCouleursColors ColorsDialogContrasteContrast ColorsDialogVertGreen ColorsDialog TeinteHue ColorsDialog(Teinte et SaturationHue and Saturation ColorsDialog Clart Lightness ColorsDialogNgatifNegative ColorsDialogOKOK ColorsDialog RougeRed ColorsDialogRinitialiserReset ColorsDialogSaturation Saturation ColorsDialogParcourir... Browse...CopyMoveToDialogAnnulerCancelCopyMoveToDialog.Slectionner le dossier Choose FolderCopyMoveToDialogCopier vers... Copy to...CopyMoveToDialogDestination : Destination:CopyMoveToDialog Dplacer vers... Move to...CopyMoveToDialogOKOKCopyMoveToDialogSupprimerRemoveCopyMoveToDialogAnnulerCancel CpMvDialog0Copie de "%1" vers "%2".Copying "%1" to "%2". CpMvDialog<Dplacement de "%1" vers "%2".Moving "%1" to "%2". CpMvDialogBasBottom CropDialog RognerCropping CropDialog GaucheLeft CropDialogOKOK CropDialogRinitialiserReset CropDialog DroiteRight CropDialogHautTop CropDialog existe dj already exists ImageTags,Ajouter un nouveau tag Add a new tag ImageTagsAnnulerCancel ImageTags&Effacer les filtres Clear Filters ImageTags8Entrer le nouveau nom du tagEnter new tag name ImageTags ErreurError ImageTagsJchec de la sauvegarde des tags vers Failed to save tags to  ImageTags FiltreFilter ImageTagsTag de l'image Image Tags ImageTagsAnnulerNegate ImageTagsNouveau tagNew Tag ImageTagsAucun nom saisiNo name entered ImageTags Supprimer le tag Remove Tag ImageTagsNSupprimer le(s) tag(s) slectionn(s) ?Remove selected tags(s)? ImageTags Supprimer le tag Remove tag ImageTags TaguerTag ImageTagsLe tag Tag  ImageTags Tague Tagging  ImageTagsDtaguerUntag ImageTagsDtague  Untagging  ImageTagsOuiYes ImageTagsPresse-papier Clipboard ImageView ErreurError ImageViewZchec de la sauvegarde des mta-donnes Exif.Failed to save Exif metadata. ImageViewDchec de la sauvegarde de l'image.Failed to save image. ImageViewMaintenez la touche Ctrl enfonce et slectionnez une rgion l'aide de la souris.;Hold down the Ctrl key and select a region using the mouse. ImageView$Image enregistre. Image saved. ImageView ImagesImages ImageView Aucune slection No selection ImageView0Enregistrer l'image sous Save image as ImageView,Sauvegarde en cours... Saving... ImageView2Slection de la taille : Selection size:  ImageView CopierCopyInfoView%n image%n images %n image(s) Phototonic&dition&Edit Phototonic&Fichier&File PhototonicA&ller &Go Phototonic &Aide&Help Phototonic&Outils&Tools PhototonicAfficha&ge&View PhototonicV<p>Visionneuse et organisatrice d'image</p>!

Image viewer and organizer

 Phototonic propos deAbout Phototonic&Ajouter aux signets Add Bookmark Phototonic RetourBack PhototonicSignets Bookmarks PhototonicBasBottom Phototonic"Rapports de bogue Bug reports PhototonicLImpossible de copier ou dplacer vers Can not copy or move to  PhototonicjImpossible de copier ou dplacer dans le mme dossier'Can not copy or move to the same folder PhototonicxImpossible de dplacer ou couper les images dans ce dossier.+Can not move or copy images to this folder. PhototonicAnnulerCancel PhototonicvImpossible d'excuter cette action avec l'image temporaire.+Cannot perform action with temporary image. PhototonicClassiqueClassic Thumbs PhototonicFermer l'image Close Image PhototonicCouleursColors PhototonicCompactCompact Phototonic CopiCopied Phototonic CopierCopy Phototonic8Copier le contenu de l'imageCopy Image Data PhototonicCopier vers... Copy to... PhototonicCr "%1" Created "%1" Phototonic6Rogner jusqu' la slectionCrop to Selection Phototonic RognerCropping Phototonic CouperCut PhototonicSupprimerDelete Phototonic(Supprimer le dossier Delete folder Phototonic"Supprimer l'image Delete image Phototonic(Supprimer les images Delete images PhototonicSupprimDeleted PhototonicSupprimDeleted  Phototonic~Le dossier de destination et le dossier source sont identiques.%Destination folder is same as source. PhototonicDsactiverDisable Phototonic0Docks et Barres d'outilsDocks and Toolbars Phototonic DoubleDual PhototonicDouble vertical Dual Vertical Phototonic2Images dupliques dans %1Duplicate images in %1 PhototonicditionEdit Phototonic,Agrandir les vignettesEnlarge Thumbnails PhototonicBSaisir un nouveau nom pour "%1" :Enter a new name for "%1": Phototonic ErreurError PhototonicQuitterExit Phototonic^chec de la copie ou du dplacement de l'image.Failed to copy or move image. PhototonicPchec de la cration du nouveau dossier.Failed to create new folder. PhototonicFchec de la suppression du dossier.Failed to delete folder. PhototonicDchec de la suppression de l'imageFailed to delete image PhototonicFchec de la suppression de l'image.Failed to delete image. Phototonic@chec du dplacement du dossier.Failed to move folder. Phototonictchec de l'ouverture du fichier "%1", fichier introuvable.)Failed to open file "%1", file not found. PhototonicBchec de l'ouverture du dossier :Failed to open folder: Phototonic<chec du renommage du dossier.Failed to rename folder. Phototonic<chec du renommage de l'image.Failed to rename image. PhototonicXchec du lancement de l'application externe.%Failed to start external application. Phototonic&Systme de fichiers File System Phototonic FiltreFilter PhototonicFiltrer par nomFilter by Name Phototonic.Rechercher des doublonsFind Duplicate Images PhototonicPremierFirst Phototonic"Miroir horizontalFlip Horizontally PhototonicMiroir verticalFlip Vertically Phototonic0Retourn l'horizontaleFlipped Horizontally Phototonic.Retourn la verticaleFlipped Vertically PhototonicDossier dplac Folder moved PhototonicAvancerForward PhototonicPlein cran Full Screen Phototonic MonterGo Up PhototonicFMasquer les barres de titre du dockHide Dock Title Bars Phototonic DbutHome PhototonicPage d'accueil Home page Phototonic ImageImage Phototonic"Information Image Image Info Phototonic2Inclure les sous-dossiersInclude Sub-folders Phototonic"Initialisation...Initializing... Phototonic,Emplacement invalide : Invalid Path: Phototonic&Nom saisi invalide.Invalid name entered. Phototonic$Slection invalideInvalid selection Phototonic&Slection invalide.Invalid selection. Phototonic*Inverser la slectionInvert Selection Phototonic"Conserver le zoom Keep Zoom PhototonicDernierLast Phototonic0Charger le presse-papierLoad Clipboard Phototonic>Verrouiller les transformationsLock Transformations Phototonic>Grer les applications externesManage External Applications PhototonicZoom maximum Maximum zoom PhototonicZoom minimum Minimum zoom PhototonicEffet miroir Mirroring Phototonic,Effet miroir dsactivMirroring Disabled Phototonic*Effet miroir : doubleMirroring: Dual Phototonic<Effet miroir : double verticalMirroring: Dual Vertical Phototonic0Effet miroir : quadrupleMirroring: Quad Phototonic*Effet miroir : tripleMirroring: Triple Phototonic>Dplacement de "%1" vers "%2" ?Move "%1" to "%2"? Phototonic(Dplacer vers le bas Move Down Phototonic.Dplacer vers la gauche Move Left Phototonic.Dplacer vers la droite Move Right Phototonic*Dplacer vers le hautMove Up Phototonic&Dplacer le dossier Move folder Phototonic Dplacer vers... Move to... PhototonicDplacerMoved PhototonicNomName PhototonicNavigation Navigation PhototonicNouveau dossier New Folder Phototonic(Nouveau sous-dossierNew Sub folder Phototonic0Nom du nouveau dossier :New folder name: PhototonicNouveau nom : New name: PhototonicSuivantNext PhototonicAucunes images No images Phototonic Aucun nom saisi.No name entered. Phototonic Aucune slection No selection Phototonic OuvrirOpen PhototonicOuvrir avec... Open With... Phototonic Taille d'origine Original Size PhototonicColler ici Paste Here Phototonic8Coller le contenu de l'imagePaste Image Data Phototonic0Supprimer dfinitivementPermanently delete PhototonicrSupprimer dfinitivement "%1" et tout ce qu'il contient ?0Permanently delete "%1" and all of its contents? PhototonicfSupprimer dfinitivement les images slectionnes ?#Permanently delete selected images? PhototonicPrfrences Preferences PhototonicPrcdentPrevious PhototonicQuadrupleQuad PhototonicAlatoireRandom PhototonicRechargerReload Phototonic&Retirer des signetsRemove Bookmark PhototonicSupprim "%1" Removed "%1" PhototonicRenommerRename Phototonic Renommer l'image Rename Image Phototonic*Rinitialiser le zoom Reset Zoom PhototonicInverserReverse Phototonic@Rotation de 1 sens anti-horaireRotate 1 degree CCW Phototonic6Rotation de 1 sens horaireRotate 1 degree CW PhototonicBRotation de 90 sens anti-horaireRotate 90 degree CCW Phototonic8Rotation de 90 sens horaireRotate 90 degree CW PhototonicRotation de %1 Rotation %1° PhototonicEnregistrerSave Phototonic Enregistrer sousSave As Phototonic,Redimensionner l'image Scale Image Phototonic"Tout slectionner Select All Phototonic"Dfinir le cheminSet Path Phototonic8Afficher les fichiers cachsShow Hidden Files Phototonic&Afficher les labels Show Labels Phototonic4Afficher la barre d'outils Show Toolbar Phototonic,Rtrcir les vignettesShrink Thumbnails Phototonic TailleSize PhototonicDiaporama Slide Show Phototonic"Diaporama dmarrSlide show started Phototonic Diaporama stoppSlide show stopped PhototonicPetites icnes Small Icons PhototonicTrier parSort By Phototonic CarrSquarish Phototonic(Arrter le diaporamaStop Slide Show PhototonicTagsTags PhototonicDateTime PhototonicHautTop PhototonicTransformer Transform Phototonic8Transformations verrouillesTransformations Locked Phototonic<Transformations dverrouillesTransformations Unlocked Phototonic TripleTriple PhototonicTypeType Phototonic.Rtabli l'horizontaleUnflipped Horizontally Phototonic,Rtabli la verticaleUnflipped Vertically PhototonicAffichageView PhototonicVisionneuseViewer PhototonicAvertissementWarning PhototonicOuiYes PhototonicZoomZoom PhototonicZoom %1%Zoom %1% PhototonicZoom avantZoom In PhototonicZoom verrouill Zoom Locked PhototonicZoom arrireZoom Out Phototonic0Rinitialisation du zoom Zoom Reset Phototonic"Zoom dverrouill Zoom Unlocked PhototonicAnnulerCancelProgressDialogAnnulerCancel ResizeDialogHauteur :Height: ResizeDialogLVrrouiller le rapport hauteur/largeurLock aspect ratio ResizeDialog"Nouvelle taille : New size: ResizeDialog$Taille d'origine :Original size: ResizeDialogPourcentPercent ResizeDialog PixelsPixels ResizeDialogRedimensionnerScale ResizeDialog8Redimensionnement de l'image Scale Image ResizeDialogUnits :Units: ResizeDialogLargeur :Width: ResizeDialogNAjouter un espace entre les vignettes :Add space between thumbnails:SettingsDialog"Couleur de fond :Background color:SettingsDialogImage de fond :Background image:SettingsDialogPar la hauteur By heightSettingsDialogPar la largeurBy widthSettingsDialog,Par largeur ou hauteurBy width or heightSettingsDialogAnnulerCancelSettingsDialog>Choisir le dossier de dmarrageChoose Startup FolderSettingsDialogjQualit par dfaut lors de la sauvegarde des images :#Default quality when saving images:SettingsDialog|Par dfaut, ou spcifi par l'argument de la ligne de commande.Default, or specified by command line argumentSettingsDialogTTemps entre les diapositives en secondes : Delay between slides in seconds:SettingsDialog2Supprimer la confirmationDelete confirmationSettingsDialogDsactiverDisableSettingsDialog.Activer l'animation GIFEnable GIF animationSettingsDialogQuitter au lieu de fermer, quand l'image est charge depuis la ligne de commande?Exit instead of closing, when image is loaded from command lineSettingsDialog:Adaptation des grandes imagesFit Large ImagesSettingsDialog:Adaptation des petites imagesFit Small ImagesSettingsDialogGnralGeneralSettingsDialog ImagesImagesSettingsDialog$Raccourcis clavierKeyboard ShortcutsSettingsDialog$Couleur du label : Label color:SettingsDialogTNombre de pages de vignettes parcourir :(Number of thumbnail pages to read ahead:SettingsDialogOKOKSettingsDialog"Ouvrir un fichier Open FileSettingsDialogPrfrences PreferencesSettingsDialog&Rappeler le dernier Remember lastSettingsDialogXRotation de l'image selon l'orientation Exif*Rotate image according to Exif orientationSettingsDialog^Rotation des vignettes selon l'orientation Exif/Rotate thumbnails according to Exif orientationSettingsDialog\Afficher le nom de l'image dans la visionneuseShow image file name in viewerSettingsDialogAfficher la taille d'origine des images qui sont plus petites que les vignettes AppMgmtDialog Manage External Applications Gestion des applications externes Name Nom Application path and arguments Emplacement et options de l'application Choose Choisir Add manually Ajouter manuellement Remove Supprimer OK OK Choose Application Choisir l'application New Application Nouvelle Application ColorsDialog Colors Couleurs Reset Réinitialiser OK OK Hue Teinte Saturation Saturation Lightness Clarté Channels Canaux Enable Activer Colorize Coloriser Negative Négatif Red Rouge Green Vert Blue Bleu Hue and Saturation Teinte et Saturation Affected Channels Canaux affectés Brightness Luminosité Contrast Contraste Brightness and Contrast Luminosité et Contraste Color Balance Balance des couleurs CopyMoveToDialog Copy or Move Images to... Copier ou Déplacer les images vers... Add Ajouter Move to... Déplacer vers... Copy to... Copier vers... Browse... Parcourir... Remove Supprimer Cancel Annuler OK OK Destination: Destination : Destination: Destination : Close Fermer Copy Copier Move Déplacer Choose Folder Sélectionner le dossier CpMvDialog Cancel Annuler Copying "%1" to "%2". Copie de "%1" vers "%2". Moving "%1" to "%2". Déplacement de "%1" vers "%2". Copying Copie de Moving Déplacement de to vers CropDialog Cropping Rogner Reset Réinitialiser OK OK Top Haut Left Gauche Right Droite Bottom Bas ImageTags Tag Taguer Untag Détaguer Clear Filters Effacer les filtres New Tag Nouveau tag Image Tags Tag de l'image Filter Filtre Remove Tag Supprimer le tag Negate Annuler Error Erreur Failed to save tags to Échec de la sauvegarde des tags vers Tagging Tague Untagging Détague Add a new tag Ajouter un nouveau tag Enter new tag name Entrer le nouveau nom du tag No name entered Aucun nom saisi Tag Le tag already exists existe déjà Remove selected tags(s)? Supprimer le(s) tag(s) sélectionné(s) ? Remove tag Supprimer le tag Yes Oui Cancel Annuler ImageView Clipboard Presse-papier Selection size: Sélection de la taille : No selection Aucune sélection Hold down the Ctrl key and select a region using the mouse. Maintenez la touche Ctrl enfoncée et sélectionnez une région à l'aide de la souris. Failed to save image. Échec de la sauvegarde de l'image. Failed to save Exif metadata. Échec de la sauvegarde des méta-données Exif. Image saved. Image enregistrée. Hold down the Ctrl key and select a region using the mouse Maintenez la touche Ctrl enfoncée et sélectionnez une région à l'aide de la souris Saving... Sauvegarde en cours... Error Erreur Failed to save image Échec de la sauvegarde de l'image Failed to save Exif metadata Échec de la sauvegarde des méta-données Exif Image saved Image enregistrée Save image as Enregistrer l'image sous Images Images Image Files Fichiers Image InfoView Copy Copier KeyGrabLineEdit Set shortcut Définir un raccourci is reserved for shortcuts to external applications est réservé pour les raccourcis d'applications externes is already assigned to " est déjà attribué à " " action " action Phototonic Docks and Toolbars Docks et Barres d'outils Image Info Information Image Zoom Zoom Transform Transformer Mirroring Effet miroir Top Haut Bottom Bas Close Image Fermer l'image Full Screen Plein écran Preferences Préférences Exit Quitter Enlarge Thumbnails Agrandir les vignettes Shrink Thumbnails Rétrécir les vignettes Cut Couper Copy Copier Copy or Move to... Copier ou Déplacer vers... Delete Supprimer Save Enregistrer Save As Enregistrer sous Copy Image Copier l'image Paste Image Coller l'image Rename Renommer Select All Tout sélectionner About À propos de Name Nom Time Date Size Taille Type Type Reverse Inverser Show Hidden Files Afficher les fichiers cachés Show Labels Afficher les labels Small Icons Petites icônes Hide Docks Title Bar Masquer la barre de titre des Docks Show Toolbar Afficher la barre d'outils Classic Thumbs Classique Compact Compact Squarish Carré Reload Recharger Include Sub-folders Inclure les sous-dossiers Paste Here Coller ici New Folder Nouveau dossier Manage Gérer Back Retour Forward Avancer Up Monter Home Début Slide Show Diaporama Next Suivant Previous Précédent First Premier Last Dernier Random Aléatoire Open Ouvrir Show Clipboard Afficher le presse-papier Open With Ouvrir avec Manage External Applications Gérer les applications externes Add Bookmark Ajouter aux signets Remove Bookmark Retirer des signets Zoom Out Zoom arrière Zoom In Zoom avant Reset Zoom Réinitialiser le zoom Original Size Taille d'origine Keep Zoom Conserver le zoom Rotate 90 degree CCW Rotation de 90° sens anti-horaire Rotate 90 degree CW Rotation de 90° sens horaire Flip Horizontally Miroir horizontal Flip Vertically Miroir vertical Cropping Rogner Crop to Selection Rogner jusqu'à la sélection Scale Image Redimensionner l'image Rotate 1 degree CCW Rotation de 1° sens anti-horaire Rotate 1 degree CW Rotation de 1° sens horaire Colors Couleurs Find Duplicate Images Rechercher des doublons Disable Désactiver Dual Double Triple Triple Dual Vertical Double vertical Quad Quadruple Tags Tags Minimum zoom Zoom minimum Maximum zoom Zoom maximum Rotation %1° Rotation de %1° Failed to open file "%1", file not found. Échec de l'ouverture du fichier "%1", fichier introuvable. Failed to open file "%1": file not found. Échec de l'ouverture du fichier "%1": fichier introuvable. Can not move or copy images to this folder. Impossible de déplacer ou couper les images dans ce dossier. Destination folder is same as source. Le dossier de destination et le dossier source sont identiques. Move "%1" to "%2"? Déplacement de "%1" vers "%2" ? Failed to move folder. Échec du déplacement du dossier. Failed to open folder: Échec de l'ouverture du dossier : Duplicate images in %1 Images dupliquées dans %1 Invalid name entered. Nom saisi invalide. Failed to rename folder. Échec du renommage du dossier. Enter a new name for "%1": Saisir un nouveau nom pour "%1" : No name entered. Aucun nom saisi. Failed to rename image. Échec du renommage de l'image. Permanently delete "%1" and all of its contents? Supprimer définitivement "%1" et tout ce qu'il contient ? Failed to delete folder. Échec de la suppression du dossier. Removed "%1" Supprimé "%1" Failed to create new folder. Échec de la création du nouveau dossier. Created "%1" Créé "%1" Cannot perform action with temporary image. Impossible d'exécuter cette action avec l'image temporaire. Keep Transformations Conserver les transformations Move Left Déplacer vers la gauche Move Right Déplacer vers la droite Move Up Déplacer vers le haut Move Down Déplacer vers le bas Invert Selection Inverser la sélection Filter by Name Filtrer par nom Set Path Définir le chemin &File &Fichier &Edit &Édition &Go A&ller à &View Afficha&ge Sort By Trier par &Tools &Outils &Help &Aide Edit Édition Navigation Navigation View Affichage Filter Filtre Initializing... Initialisation... File System Système de fichiers <p>Image viewer and organizer</p> <p>Visionneuse et organisatrice d'image</p> <p>Git release <p>Révision Git Built with Qt Compilé avec Qt Home page Page d'accueil Bug reports Rapports de bogue Failed to start external application. Échec du lancement de l'application externe. Invalid selection. Sélection invalide. Failed to copy or move image. Échec de la copie ou du déplacement de l'image. Zoom %1% Zoom à %1% Rotation %1u00B0 Rotation de %1u00B0 Copied Copié Moved Déplacer %n image(s) %n image %n images Permanently delete Supprimer définitivement Failed to delete image. Échec de la suppression de l'image. Deleted Supprimé Invalid Path: Emplacement invalide : Viewer Visionneuse Contributors:<br> Contributeurs:<br> Contributors / Translations:<br> Contributeurs / Traductions:<br> Invalid selection Sélection invalide Error Erreur Copy to... Copier vers... Move to... Déplacer vers... Copy Image Data Copier le contenu de l'image Paste Image Data Coller le contenu de l'image Hide Dock Title Bars Masquer les barres de titre du dock Go Up Monter Load Clipboard Charger le presse-papier Open With... Ouvrir avec... Lock Transformations Verrouiller les transformations Image Image Bookmarks Signets Failed to start external application Échec du lancement de l'application externe Failed to copy or move image Échec de la copie ou du déplacement de l'image Zoom Out to Zoom arrière sur Zoom In to Zoom avant sur Zoom Reset Réinitialisation du zoom Zoom Locked Zoom verrouillé Zoom Unlocked Zoom déverrouillé Transformations Locked Transformations verrouillées Transformations Unlocked Transformations déverrouillées Rotation Rotation de Flipped Vertically Retourné à la verticale Unflipped Vertically Rétabli à la verticale Flipped Horizontally Retourné à l'horizontale Unflipped Horizontally Rétabli à l'horizontale Mirroring Disabled Effet miroir désactivé Mirroring: Dual Effet miroir : double Mirroring: Triple Effet miroir : triple Mirroring: Dual Vertical Effet miroir : double vertical Mirroring: Quad Effet miroir : quadruple Can not copy or move to Impossible de copier ou déplacer vers Can not cut and paste in the same folder Impossible de couper et coller dans le même dossier Copied Copié Moved Déplacé images images Delete image Supprimer l'image Permanently delete Supprimer définitivement Failed to delete image Échec de la suppression de l'image No selection Aucune sélection Delete images Supprimer les images Permanently delete selected images? Supprimer définitivement les images sélectionnées ? Contributors / Code: Contributeurs / Code : Contributors / Translations: Contributeurs / Traductions : Zoom Zoom à Can not copy or move to the same folder Impossible de copier ou déplacer dans le même dossier image(s) image(s) Yes Oui Cancel Annuler Deleted Supprimé Invalid Path: Emplacement invalide : Preview Prévisualisation No images Aucunes images Failed to open file Échec de l'ouverture du fichier , file not found , fichier introuvable Slide show stopped Diaporama stoppé Stop Slide Show Arrêter le diaporama Slide show started Diaporama démarré Can not move or copy images to this folder Impossible de déplacer ou couper les images dans ce dossier Destination folder is same as source Le dossier de destination et le dossier source sont identiques Move Déplacer to vers Move folder Déplacer le dossier Failed to move folder Échec du déplacement du dossier Folder moved Dossier déplacé Failed to open folder: Échec de l'ouverture du dossier : Rename Renommer New name: Nouveau nom : Invalid name entered Nom saisi invalide Failed to rename folder Échec du renommage du dossier Rename Image Renommer l'image Enter a new name for Saisir un nouveau nom pour No name entered Aucun nom saisi Failed to rename image Échec du renommage de l'image and all of its contents? et tout ce qu'il contient ? Delete folder Supprimer le dossier Failed to delete folder Échec de la suppression du dossier Removed Supprimé New Sub folder Nouveau sous-dossier New folder name: Nom du nouveau dossier : Failed to create new folder Échec de la création du nouveau dossier Created Créé Executing file manager... Exécution du gestionnaire de fichiers... Warning Avertissement Cannot perform action with temporary image Impossible d'exécuter cette action avec l'image temporaire ProgressDialog Cancel Annuler QObject Usage: phototonic [FILE or DIRECTORY]... Utilisation : phototonic [FICHIER ou REPERTOIRE]... ResizeDialog Scale Image Redimensionnement de l'image Scale Redimensionner Cancel Annuler Original size: Taille d'origine : Width: Largeur : Height: Hauteur : Units: Unités : New size: Nouvelle taille : Original size: Taille d'origine : Width: Largeur : Height: Hauteur : Units: Unités : New size: Nouvelle taille : Pixels Pixels Percent Pourcent Lock aspect ratio Vérrouiller le rapport hauteur/largeur SettingsDialog Preferences Préférences Fit Large Images Adaptation des grandes images Disable Désactiver By width and height Par la largeur et la hauteur By width Par la largeur By height Par la hauteur Stretch disproportionately Étirer de manière disproportionnée Fit Small Images Adaptation des petites images Background color: Couleur de fond : Exit instead of closing, when image is loaded from command line Quitter au lieu de fermer, quand l'image est chargée depuis la ligne de commande Wrap image list when reaching last or first image Enrouler la liste d'image en arrivant à la dernière ou à la première image Default quality when saving images: Qualité par défaut lors de la sauvegarde des images : Background color: Couleur de fond : By width or height Par largeur ou hauteur Show image file name in viewer Afficher le nom de l'image dans la visionneuse Background image: Image de fond : Add space between thumbnails: Ajouter un espace entre les vignettes : Number of thumbnail pages to read ahead: Nombre de pages de vignettes à parcourir : Delay between slides in seconds: Temps entre les diapositives en secondes : Default quality when saving images: Qualité par défaut lors de la sauvegarde des images : Enable GIF animation Activer l'animation GIF Rotate image according to Exif orientation Rotation de l'image selon l'orientation Exif Show image file name in full screen mode Afficher le nom du fichier de l'image en mode plein écran Label color: Couleur du label : Background image: Image de fond : Add space between thumbnails: Ajouter un espace entre les vignettes : Show original size of images smaller than the thumbnail size Afficher la taille d'origine des images qui sont plus petites que les vignettes Number of thumbnail pages to read ahead: Nombre de pages de vignettes à parcourir : Rotate thumbnails according to Exif orientation Rotation des vignettes selon l'orientation Exif Delay between slides in seconds: Temps entre les diapositives en secondes : Label color: Couleur du label : Show random images Afficher des images aléatoires Startup folder Dossier de démarrage Default, or specified by command line argument Par défaut, ou spécifié par l'argument de la ligne de commande Remember last Rappeler le dernier Specify: Spécifier : Swap mouse left-click and middle-click actions Permuter les actions des clic gauche et clic du milieu de la souris Delete confirmation Supprimer la confirmation Keyboard Shortcuts Raccourcis clavier Open File Ouvrir un fichier Images Images Keyboard shortcuts Raccourcis clavier OK OK Cancel Annuler Viewer Visionneuse Thumbnails Vignettes Slide Show Diaporama General Général Choose Startup Folder Choisir le dossier de démarrage ShortcutsTableView Action Action Shortcut Raccourci Delete shortcut Supprimer le raccourci Set shortcut Définir un raccourci "%1" is reserved for shortcuts to external applications. "%1" est réservé pour les raccourcis d'applications externes. "%1" is already assigned to "%2" action. "%1" est déjà attribué à "%2" action. is reserved for shortcuts to external applications est réservé pour les raccourcis d'applications externes is already assigned to " est déjà attribué à " " action " action ThumbView images images Selected Sélection de of sur File name Nom du fichier Location Emplacement Format Format Resolution Résolution Megapixel Mégapixel Selected %1 of %2 Sélection de %1 sur %2 Scanned %1, displaying %2 (%3 and %4) Analyse de %1, affichage de %2 (%3 et %4) %n original(s) %n original %n originaux %n duplicate(s) %n doublon %n doublons Size Taille General Général Modified Modifié Error Erreur %n image(s) %n image %n images Selected %1 of%2 Sélection de %1 sur%2 %n image(s) %n image %n images Searching duplicate images... Recherche de doublons... Scanned Analyse de %n images, displaying %n image, affichage de %n images, affichage de %n images ( %n image pertinente ( %n images pertinentes ( %n originals and %n original et %n originaux et %n duplicates) %n doublon) %n doublons) No images Aucunes images phototonic-1.7.20/translations/phototonic_hr.qm000066400000000000000000000660011271214516700217370ustar00rootroot00000000000000Z**%E*0+1by]GLb 9LbLb!Lb^\M 'TN)Nn-NP7*bTl2X3X XX Y%I\Zw ikn+9xFDGFt(A?+1 n"cXX9 *5 QxY\[)ndCPeEj60rIAsnO:Ù.!xȲ,7o P! 9N< <\N9w 5^~&nTf3:f%4$ 'fG;QxYQxY]}Rg</lSW40GeFu0oG %ve"w(*w AYra;("CD$CFýRu } !& #<lu2-z^[tS] ]xIII rIIGIGTIL/fZ6<6<o,Z' : :&xfR3֓^>}}Qy-AaB= hFW O(}O DpP)nNUDF%l/^%,p3H~~>K]9*5t9aFuF}H5:/n_'_%C jIDYTI^)WߺInT&8 +}#CB%n6 9$`>eOPtTF[k_.%E_PFi}n%HSjUMF2kjW_7 73ȜHЍD0( JDKW(4(_q6E=IW*?~%8c-wCl7"]41jN#cLgg2>$A0I>"0מIמ5q6Ld=KY B]*J@ @V%f@8A:8 gl gl9 lq^5 t7J4w y-U zdJH t=o & G. DK M` N #TB Ds M a3 dgi idAJ p=@ p=W q%6 *$@ a  ># ' )/ 3 sQ ye yeN CV 2'`K }8K ~u ~_ = ʺRL J ص ES4 Bn  &e-' ,@~ , .; A^ O PG'A Pr R< u1f u1 8g Zn+ 8 Sv T\ ڎ N`  < DC# Sd/ h`< i)! r* ] _] PE1 [  ©e <Q? <^ Sc S(sA ),5uY8:G9";IW6!]^ߔFiT\_o0 3UiaDodaj ru no Add manually AppMgmtDialog<Putanja i argumenti aplikacijeApplication path and arguments AppMgmtDialogIzaberiChoose AppMgmtDialog$Izaberi aplikacijuChoose Application AppMgmtDialog@Upravljaj eksternim aplikacijamaManage External Applications AppMgmtDialogImeName AppMgmtDialogNova aplikacijaNew Application AppMgmtDialog UreduOK AppMgmtDialog UkloniRemove AppMgmtDialogPogoeni kanaliAffected Channels ColorsDialog PlavaBlue ColorsDialogSvjetlost Brightness ColorsDialog(Svjetlost i kontrastBrightness and Contrast ColorsDialogBalans boja Color Balance ColorsDialog ObojiColorize ColorsDialogBojeColors ColorsDialogKontrastContrast ColorsDialog ZelenaGreen ColorsDialogNijansaHue ColorsDialog(Nijansa i zasienostHue and Saturation ColorsDialogSvjetlina Lightness ColorsDialogNegativNegative ColorsDialog UreduOK ColorsDialog CrvenaRed ColorsDialogPovratiReset ColorsDialogZasienost Saturation ColorsDialogPregledaj... Browse...CopyMoveToDialog Otka~iCancelCopyMoveToDialog Izaberi fasciklu Choose FolderCopyMoveToDialogKopiraj u... Copy to...CopyMoveToDialogDestinacija: Destination:CopyMoveToDialogPomjeri u... Move to...CopyMoveToDialog UreduOKCopyMoveToDialog UkloniRemoveCopyMoveToDialog Otka~iCancel CpMvDialog(Kopiram "%1" u "%2".Copying "%1" to "%2". CpMvDialog*Pomjeram "%1" u "%2".Moving "%1" to "%2". CpMvDialogDoleBottom CropDialog Izre~iCropping CropDialog LijevoLeft CropDialog UreduOK CropDialogPovratiReset CropDialog DesnoRight CropDialogGoreTop CropDialogve postoji already exists ImageTags"Dodaj novu oznaku Add a new tag ImageTags Otka~iCancel ImageTagsUkloni filtere Clear Filters ImageTags Unesi ime oznakeEnter new tag name ImageTags GreakaError ImageTags4Neuspijelo snimanje oznakeFailed to save tags to  ImageTags FilterFilter ImageTagsNova oznakaNew Tag ImageTagsIme nije unesnoNo name entered ImageTagsUkloni oznaku Remove Tag ImageTags4Ukloni izabrane oznaku(e)?Remove selected tags(s)? ImageTagsUkloni oznaku Remove tag ImageTags Ozna iTag ImageTags OznakaTag  ImageTagsOzna ivanjeTagging  ImageTagsUkloni oznakuUntag ImageTags"Uklanjanje oznaka Untagging  ImageTagsDaYes ImageTagsKlipbord Clipboard ImageView GreakaError ImageViewDGreaka pri snimanju Exif podataka.Failed to save Exif metadata. ImageView4Greaka pri snimanju slike.Failed to save image. ImageViewtDr~i Ctrl dugme pritisnuto i izaberi regiju koristei mia.;Hold down the Ctrl key and select a region using the mouse. ImageView Slika snimljena. Image saved. ImageView SlikeImages ImageViewBez selekcije No selection ImageViewSnimi sliku kao Save image as ImageViewSnimam... Saving... ImageView&Veli ina selekcije:Selection size:  ImageViewKopirajCopyInfoView Phototonic%n slika%n slike%n slika %n image(s) Phototonic &Uredi&Edit Phototonic &Fajl&File Phototonic&Idi&Go Phototonic &Pomo&Help Phototonic &Alati&Tools Phototonic&Pogled&View Phototonic:Pregleda i organizator slika!

Image viewer and organizer

 PhototonicOAbout PhototonicDodaj kraticu Add Bookmark Phototonic NazadBack PhototonicKartice Bookmarks PhototonicDoleBottom PhototonicPrijavi greake Bug reports PhototonicDNemogue kopirati ili pomjeriti u Can not copy or move to  Phototonic^Nemogue kopirati ili pomjeriti u istu fasciklu'Can not copy or move to the same folder PhototonicjNemogue pomjeriti ili kopirati slike u ovu fasciklu.+Can not move or copy images to this folder. Phototonic Otka~iCancel Phototonic^Nemogue izvesti akciju sa primvremenom slikom.+Cannot perform action with temporary image. Phototonic4Klasi ne minijaturne slikeClassic Thumbs PhototonicZatvori sliku Close Image PhototonicBojeColors PhototonicKompaktnoCompact PhototonicKopiranoCopied PhototonicKopirajCopy Phototonic*Kopiraj podatke slikeCopy Image Data PhototonicKopiraj u... Copy to... PhototonicNapravljen "%1" Created "%1" Phototonic Izre~i selekcijuCrop to Selection Phototonic Izre~iCropping Phototonic Izre~iCut PhototonicIzbriaiDelete Phototonic Izbriai fasciklu Delete folder PhototonicIzbriai sliku Delete image PhototonicIzbriai slike Delete images PhototonicIzbrisanoDeleted PhototonicIzbrisanoDeleted  PhototonicROdrediana fascikla je ista kao i po etna.%Destination folder is same as source. PhototonicIsklju enoDisable Phototonic,Sidrene i alatne trakeDocks and Toolbars PhototonicDvostrukoDual Phototonic(Dvostruko vertikalno Dual Vertical Phototonic Duple slike u %1Duplicate images in %1 Phototonic UrediEdit Phototonic6Poveaj minijaturne prikazeEnlarge Thumbnails Phototonic.Unesi novo ime za "%1":Enter a new name for "%1": Phototonic GreakaError Phototonic IzaiExit PhototonicTNeuspijelo kopiranje ili pomjeranje slike.Failed to copy or move image. PhototonicHNeuspijelo pravljenje nove fascikle.Failed to create new folder. Phototonic:Neuspijelo brisanje fascikle.Failed to delete folder. Phototonic2Neuspijelo brisanje slikeFailed to delete image Phototonic4Neuspijelo brisanje slike.Failed to delete image. Phototonic>Neuspijelo pomjeranje fascikle.Failed to move folder. Phototonic<Neuspijelo otvaranje fascikle:Failed to open folder: PhototonicDNeuspijelo preimenovanje fascikle.Failed to rename folder. Phototonic>Neuspijelo preimenovanje slike.Failed to rename image. PhototonicTGreaka pri pokretanju eksterne aplikacije.%Failed to start external application. PhototonicFajl sistem File System Phototonic FilterFilter Phototonic$Filtriraj po imenuFilter by Name Phototonic&Pronai duple slikeFind Duplicate Images PhototonicPrvaFirst Phototonic$Obrni horizontalnoFlip Horizontally Phototonic Obrni vertikalnoFlip Vertically Phototonic(Obrnuto horizontalnoFlipped Horizontally Phototonic$Obrnuto vertikalnoFlipped Vertically Phototonic$Fascikla pomjerena Folder moved PhototonicNaprijedForward Phototonic4Prikaz preko cijelo ekrana Full Screen PhototonicIdi goreGo Up PhototonicPo etnaHome Phototonic Po etna stranica Home page Phototonic SlikaImage Phototonic&Informacije o slici Image Info Phototonic(Uklju i pod-fascikleInclude Sub-folders PhototonicPokreem...Initializing... Phototonic$Nevaljala putanja: Invalid Path: Phototonic*Neva~ee ime uneseno.Invalid name entered. Phototonic&Nevaljala selekcijaInvalid selection Phototonic(Nevaljala selekcija.Invalid selection. PhototonicObrni selekcijuInvert Selection PhototonicZadr~i zum Keep Zoom Phototonic ZadnjaLast PhototonicU itaj klipbordLoad Clipboard Phototonic0Zaklju aj transformacijeLock Transformations Phototonic@Upravljaj eksternim aplikacijamaManage External Applications Phototonic(Preslikaj (ogledalo) Mirroring Phototonic0Preslikavanje isklju enoMirroring Disabled Phototonic0Preslikavanje: dvostrukoMirroring: Dual PhototonicFPreslikavanje. dvostruko vertikalnoMirroring: Dual Vertical Phototonic8Preslikavanje:  etverostrukoMirroring: Quad Phototonic0Preslikavanje: trostrukoMirroring: Triple Phototonic(Pomjeri "%1" u "%2"?Move "%1" to "%2"? PhototonicPomjeri dole Move Down PhototonicPomjeri lijevo Move Left PhototonicPomjeri desno Move Right PhototonicPomjeri goreMove Up Phototonic Pomjeri fasciklu Move folder PhototonicPomjeri u... Move to... PhototonicPomjerenoMoved PhototonicImeName PhototonicNavigacija Navigation PhototonicNova fascikla New Folder Phototonic"Nova pod-fasciklaNew Sub folder Phototonic$Novo ime fascikle:New folder name: PhototonicNovo ime: New name: PhototonicSljedeaNext PhototonicNema slika No images Phototonic"Ime nije uneseno.No name entered. PhototonicBez selekcije No selection Phototonic OtvoriOpen Phototonic Otvori pomou... Open With... Phototonic&Originalna veli ina Original Size PhototonicNalijepi ovdje Paste Here Phototonic,Nalijepi podatke slikePaste Image Data PhototonicTrajno izbriaiPermanently delete PhototonicDTrajno izbriai "%1" i sav sadr~aj?0Permanently delete "%1" and all of its contents? Phototonic<Trajno izbriai odabrane slike?#Permanently delete selected images? PhototonicPostavke Preferences Phototonic ProalaPrevious Phototonic etverostrukoQuad PhototonicNasumi naRandom PhototonicU itaj ponovoReload PhototonicUkloni kraticuRemove Bookmark PhototonicUkljonjen %1" Removed "%1" PhototonicPreimenujRename PhototonicPreimenuj sliku Rename Image PhototonicPovrati zum Reset Zoom Phototonic ObrniReverse PhototonicDRotiraj 1 stepen suprotno kazaljciRotate 1 degree CCW PhototonicDRotiraj 1 stepen u smjeru kazaljkeRotate 1 degree CW PhototonicHRotiraj 90 stepeni suprotno kazaljciRotate 90 degree CCW PhototonicHRotiraj 90 stepeni u smjeru kazaljkeRotate 90 degree CW PhototonicRotacija %1 Rotation %1° Phototonic SnimiSave PhototonicSnimi kaoSave As Phototonic.Promjeni veli inu slike Scale Image PhototonicOzna i sve Select All PhototonicPostavi putanjuSet Path Phototonic2Prika~i skrivene datotekeShow Hidden Files PhototonicPrika~i natpise Show Labels Phototonic(Prika~i alatnu traku Show Toolbar Phototonic4Umanji minijaturne prikazeShrink Thumbnails PhototonicVeli inaSize PhototonicSlajd prikaz Slide Show Phototonic$Slajd prikaz po etSlide show started Phototonic0Slajd prikaz obustavljenSlide show stopped PhototonicMale ikone Small Icons PhototonicSortiraj poSort By PhototonicKockastoSquarish Phototonic*Obustani slajd prikazStop Slide Show Phototonic OznakeTags PhototonicVrijemeTime PhototonicGoreTop PhototonicTransformiai Transform Phototonic2Transformacije zaklju aneTransformations Locked Phototonic2Transformacije otklju aneTransformations Unlocked PhototonicTrostrukoTriple PhototonicTipType Phototonic,Neobrnuto horizontalnoUnflipped Horizontally Phototonic(Neobrnuto vertikalnoUnflipped Vertically Phototonic PogledView PhototonicPregleda Viewer Phototonic Pa~njaWarning PhototonicDaYes Phototonic Ubli~iZoom PhototonicUbli~i %1%Zoom %1% Phototonic Ubli~iZoom In PhototonicZum zaklju an Zoom Locked Phototonic UdaljiZoom Out PhototonicZum vraen Zoom Reset PhototonicZum otklju an Zoom Unlocked Phototonic Otka~iCancelProgressDialog Otka~iCancel ResizeDialogVisina:Height: ResizeDialogZaklju aj omjerLock aspect ratio ResizeDialogNova veli ina: New size: ResizeDialog(Originalna veli ina:Original size: ResizeDialogPostotakPercent ResizeDialogPikseliPixels ResizeDialogUveaj/SmanjiScale ResizeDialog.Promjeni veli inu slike Scale Image ResizeDialogJedinice:Units: ResizeDialog`irina:Width: ResizeDialogRDodaj razmak izmeu minijaturnih prikaza:Add space between thumbnails:SettingsDialogBoja pozadine:Background color:SettingsDialog"Pozadinska slika:Background image:SettingsDialogPo visini By heightSettingsDialogPo airiniBy widthSettingsDialog(Po airini ili visiniBy width or heightSettingsDialog Otka~iCancelSettingsDialog0Izaberi po etnu fascikluChoose Startup FolderSettingsDialogNStandardni kvalitet pri snimanju slika:#Default quality when saving images:SettingsDialogfStandardni, ili komandnom linijom odreeni argument.Default, or specified by command line argumentSettingsDialogFRazmak izmeu slajdova u sekundama: Delay between slides in seconds:SettingsDialog&Potvrda za brisanjeDelete confirmationSettingsDialogIsklju enoDisableSettingsDialog*Uklju i GIF animacijeEnable GIF animationSettingsDialogNapusti umjesto zatvaranja kada je u itana slika iz komandne linije?Exit instead of closing, when image is loaded from command lineSettingsDialog,Prilagodi velike slikeFit Large ImagesSettingsDialog*Prilagodi manje slikeFit Small ImagesSettingsDialogOpenitoGeneralSettingsDialog SlikeImagesSettingsDialog"Kratice tastatureKeyboard ShortcutsSettingsDialogBoja natpisa: Label color:SettingsDialognBroj stranica minijaturnih slika da se u ita unaprijed:(Number of thumbnail pages to read ahead:SettingsDialog UreduOKSettingsDialogOtvori fajl Open FileSettingsDialogPostavke PreferencesSettingsDialog$Zapamti posljednju Remember lastSettingsDialogJRotiraj slike prema Exif orijentaciji*Rotate image according to Exif orientationSettingsDialog\Rotiraj minijaturne slike po Exif orijentaciji/Rotate thumbnails according to Exif orientationSettingsDialog<Prika~i ime slike u pregleda uShow image file name in viewerSettingsDialogPrika~i originalnu veli inu slika koje su manje od minijaturne veli ine AppMgmtDialog Manage External Applications Upravljaj eksternim aplikacijama Name Ime Application path and arguments Putanja i argumenti aplikacije Choose Izaberi Add manually Dodaj ručno Remove Ukloni OK Uredu Choose Application Izaberi aplikaciju New Application Nova aplikacija ColorsDialog Colors Boje Reset Povrati OK Uredu Hue Nijansa Saturation Zasićenost Lightness Svjetlina Colorize Oboji Negative Negativ Red Crvena Green Zelena Blue Plava Hue and Saturation Nijansa i zasićenost Affected Channels Pogođeni kanali Brightness Svjetlost Contrast Kontrast Brightness and Contrast Svjetlost i kontrast Color Balance Balans boja CopyMoveToDialog Move to... Pomjeri u... Copy to... Kopiraj u... Browse... Pregledaj... Remove Ukloni Cancel Otkaži OK Uredu Destination: Destinacija: Choose Folder Izaberi fasciklu CpMvDialog Cancel Otkaži Copying "%1" to "%2". Kopiram "%1" u "%2". Moving "%1" to "%2". Pomjeram "%1" u "%2". CropDialog Cropping Izreži Reset Povrati OK Uredu Left Lijevo Right Desno Top Gore Bottom Dole ImageTags Image Tags Filter Filter Tag Označi Untag Ukloni oznaku New Tag Nova oznaka Remove Tag Ukloni oznaku Clear Filters Ukloni filtere Negate Error Greška Failed to save tags to Neuspijelo snimanje oznake Tagging Označivanje Untagging Uklanjanje oznaka Add a new tag Dodaj novu oznaku Enter new tag name Unesi ime oznake No name entered Ime nije unesno Tag Oznaka already exists već postoji Remove selected tags(s)? Ukloni izabrane oznaku(e)? Remove tag Ukloni oznaku Yes Da Cancel Otkaži ImageView Clipboard Klipbord Selection size: Veličina selekcije: No selection Bez selekcije Hold down the Ctrl key and select a region using the mouse. Drži Ctrl dugme pritisnuto i izaberi regiju koristeći miš. Saving... Snimam... Error Greška Failed to save image. Greška pri snimanju slike. Failed to save Exif metadata. Greška pri snimanju Exif podataka. Image saved. Slika snimljena. Save image as Snimi sliku kao Images Slike InfoView Copy Kopiraj Phototonic Image Info Informacije o slici Zoom Ubliži Mirroring Ovo treba popraviti Preslikaj (ogledalo) Transform Transformiši View Pogled Top Gore Bottom Dole Close Image Zatvori sliku Full Screen Prikaz preko cijelo ekrana Preferences Postavke Exit Izađi Enlarge Thumbnails Povećaj minijaturne prikaze Shrink Thumbnails Umanji minijaturne prikaze Cut Izreži Copy Kopiraj Copy to... Kopiraj u... Move to... Pomjeri u... Delete Izbriši Save Snimi Save As Snimi kao Copy Image Data Kopiraj podatke slike Paste Image Data Nalijepi podatke slike Rename Preimenuj Select All Označi sve About O Name Ime Time Vrijeme Size Veličina Type Tip Reverse Obrni Show Hidden Files Prikaži skrivene datoteke Show Labels Prikaži natpise Small Icons Male ikone Hide Docks Title Bar Sakrij naslovnu traku sidrene trake Hide Dock Title Bars Show Toolbar Prikaži alatnu traku Classic Thumbs Klasične minijaturne slike Compact Kompaktno Squarish Kockasto Reload Učitaj ponovo Include Sub-folders Uključi pod-fascikle Paste Here Nalijepi ovdje New Folder Nova fascikla Back Nazad Forward Naprijed Go Up Idi gore Home Početna Slide Show Slajd prikaz Next Sljedeća Previous Prošla First Prva Last Zadnja Random Nasumična Open Otvori Load Clipboard Učitaj klipbord Open With... Otvori pomoću... Manage External Applications Upravljaj eksternim aplikacijama Add Bookmark Dodaj kraticu Remove Bookmark Ukloni kraticu Zoom Out Udalji Zoom In Ubliži Reset Zoom Povrati zum Original Size Originalna veličina Keep Zoom Zadrži zum Rotate 90 degree CCW Rotiraj 90 stepeni suprotno kazaljci Rotate 90 degree CW Rotiraj 90 stepeni u smjeru kazaljke Flip Horizontally Obrni horizontalno Flip Vertically Obrni vertikalno Cropping Izreži Crop to Selection Izreži selekciju Scale Image Promjeni veličinu slike Rotate 1 degree CCW Rotiraj 1 stepen suprotno kazaljci Rotate 1 degree CW Rotiraj 1 stepen u smjeru kazaljke Colors Boje Find Duplicate Images Pronađi duple slike Disable Isključeno Dual Dvostruko Triple Trostruko Dual Vertical Dvostruko vertikalno Quad Četverostruko Lock Transformations Zaključaj transformacije Move Left Pomjeri lijevo Move Right Pomjeri desno Move Up Pomjeri gore Move Down Pomjeri dole Invert Selection Obrni selekciju Filter by Name Filtriraj po imenu Set Path Postavi putanju &File &Fajl &Edit &Uredi &Go &Idi &View &Pogled Sort By Sortiraj po &Tools &Alati &Help &Pomoć Edit Uredi Navigation Navigacija Filter Filter Image Slika Initializing... Pokrećem... File System Fajl sistem Bookmarks Kartice Tags Oznake <p>Image viewer and organizer</p> Pregledač i organizator slika Home page Početna stranica Bug reports Prijavi greške Error Greška Failed to start external application. Greška pri pokretanju eksterne aplikacije. Invalid selection. Nevaljala selekcija. Failed to copy or move image. Neuspijelo kopiranje ili pomjeranje slike. Minimum zoom Zoom %1% Ubliži %1% Maximum zoom Zoom Reset Zum vraćen Zoom Locked Zum zaključan Zoom Unlocked Zum otključan Transformations Locked Transformacije zaključane Transformations Unlocked Transformacije otključane Rotation %1° Rotacija %1° Failed to open file "%1", file not found. Flipped Vertically Obrnuto vertikalno Unflipped Vertically Ovo treba provjeriti Neobrnuto vertikalno Flipped Horizontally Obrnuto horizontalno Unflipped Horizontally Ovo treba provjeriti Neobrnuto horizontalno No selection Bez selekcije Mirroring Disabled Preslikavanje isključeno Mirroring: Dual Preslikavanje: dvostruko Mirroring: Triple Preslikavanje: trostruko Mirroring: Dual Vertical Preslikavanje. dvostruko vertikalno Mirroring: Quad Preslikavanje: četverostruko Can not copy or move to Nemoguće kopirati ili pomjeriti u Can not copy or move to the same folder Nemoguće kopirati ili pomjeriti u istu fasciklu Copied Kopirano Moved Pomjereno %n image(s) %n slika %n slike %n slika Permanently delete Trajno izbriši Delete image Izbriši sliku Yes Da Cancel Otkaži Deleted Izbrisano Failed to delete image Neuspijelo brisanje slike Permanently delete selected images? Trajno izbriši odabrane slike? Delete images Izbriši slike Failed to delete image. Neuspijelo brisanje slike. Deleted Izbrisano Invalid Path: Nevaljala putanja: Viewer Pregledač Docks and Toolbars Sidrene i alatne trake No images Nema slika Failed to open file "%1": file not found. Neuspijelo otvaranje fajla %1": fajl nije pronađen. Slide show stopped Slajd prikaz obustavljen Stop Slide Show Obustani slajd prikaz Slide show started Slajd prikaz počet Can not move or copy images to this folder. Nemoguće pomjeriti ili kopirati slike u ovu fasciklu. Destination folder is same as source. Odredišna fascikla je ista kao i početna. Move "%1" to "%2"? Pomjeri "%1" u "%2"? Move folder Pomjeri fasciklu Failed to move folder. Neuspijelo pomjeranje fascikle. Folder moved Fascikla pomjerena Failed to open folder: Neuspijelo otvaranje fascikle: Duplicate images in %1 Duple slike u %1 New name: Novo ime: Invalid name entered. Nevažeće ime uneseno. Failed to rename folder. Neuspijelo preimenovanje fascikle. Invalid selection Nevaljala selekcija Rename Image Preimenuj sliku Enter a new name for "%1": Unesi novo ime za "%1": No name entered. Ime nije uneseno. Failed to rename image. Neuspijelo preimenovanje slike. Permanently delete "%1" and all of its contents? Trajno izbriši "%1" i sav sadržaj? Delete folder Izbriši fasciklu Failed to delete folder. Neuspijelo brisanje fascikle. Removed "%1" Ukljonjen %1" New Sub folder Nova pod-fascikla New folder name: Novo ime fascikle: Failed to create new folder. Neuspijelo pravljenje nove fascikle. Created "%1" Napravljen "%1" Warning Pažnja Cannot perform action with temporary image. Nemoguće izvesti akciju sa primvremenom slikom. ProgressDialog Cancel Otkaži QObject Usage: phototonic [FILE or DIRECTORY]... Koristi ovako: phototonic [FAJL ili FASCIKLA]... ResizeDialog Scale Image Promjeni veličinu slike Scale Možda ima bolja jedinstvena rječ Uvećaj/Smanji Cancel Otkaži Original size: Originalna veličina: Width: Širina: Height: Visina: Units: Jedinice: New size: Nova veličina: Pixels Pikseli Percent Postotak Lock aspect ratio Zaključaj omjer SettingsDialog Preferences Postavke Fit Large Images Prilagodi velike slike Disable Isključeno By width or height Po širini ili visini By width Po širini By height Po visini Stretch disproportionately Razvuci disproporcionalno Fit Small Images Prilagodi manje slike Background color: Boja pozadine: Exit instead of closing, when image is loaded from command line Napusti umjesto zatvaranja kada je učitana slika iz komandne linije Wrap image list when reaching last or first image Ovo definitivno popraviti Umotaj listu slika pri kraju Default quality when saving images: Standardni kvalitet pri snimanju slika: Enable GIF animation Uključi GIF animacije Rotate image according to Exif orientation Rotiraj slike prema Exif orijentaciji Show image file name in viewer Prikaži ime slike u pregledaču Label color: Boja natpisa: Background image: Pozadinska slika: Add space between thumbnails: Dodaj razmak između minijaturnih prikaza: Show original size of images smaller than the thumbnail size Popraviti Prikaži originalnu veličinu slika koje su manje od minijaturne veličine Number of thumbnail pages to read ahead: Broj stranica minijaturnih slika da se učita unaprijed: Rotate thumbnails according to Exif orientation Rotiraj minijaturne slike po Exif orijentaciji Delay between slides in seconds: Razmak između slajdova u sekundama: Show random images Prikaži nasumične slike Startup folder Početna fascikla Default, or specified by command line argument Popraviti Standardni, ili komandnom linijom određeni argument Remember last Zapamti posljednju Specify: Odredi: Swap mouse left-click and middle-click actions Zamjeni akcije lijevog i srednjeg klika mišem Delete confirmation Potvrda za brisanje Keyboard Shortcuts Kratice tastature OK Uredu Cancel Otkaži Viewer Pregledač Thumbnails Minijaturni prikaz Slide Show Slajd prikaz General Općenito Choose Startup Folder Izaberi početnu fasciklu Open File Otvori fajl Images Slike ShortcutsTableView Action Akcija Shortcut Prečice Delete shortcut Izbriši prečicu Set shortcut Postavi prečicu "%1" is reserved for shortcuts to external applications. Definitivno popraviti "%1" je obrnuto za prečice kod eksternih aplikacija. "%1" is already assigned to "%2" action. Popraviti "%1" je već upotrebljeno za "%2" akciju. ThumbView General Uopćeno File name Ime fajla Location Lokacija Size Veličina Modified Modificiran Format Format Resolution Rezolucija Megapixel Megapiksel Error Greška Selected %1 of%2 Izabrano %1 od %2 %n image(s) %n slika %n slike %n slika %n image(s) %n slika %n slike %n slika No images Nema slika Searching duplicate images... Tražim duple slike... Scanned %1, displaying %2 (%3 and %4) Moguće da nevalja Skeniran %1, prikazujem %2 (%3 i %4) %n original(s) %n original %n originala %n originala %n duplicate(s) %n duplikat %n duplikata %n duplikata phototonic-1.7.20/translations/phototonic_pl.qm000066400000000000000000000636221271214516700217470ustar00rootroot00000000000000=_ _Ae"y[yS|qv5&*()+ H5H5/sL1f2t5Z9e;]5>e?@]AN*(&o'A>U**%0*0+1byYGLb Lb LbJLbZVM #N%Nn*vNP7&Tl/7XX MX {Y%Ei kn'pxF 8HD/Ft%)A; -2n?cS9*1uQxYXb[)nHdCLeBj2rIAsn0KOÙ.Ȳ(3 L! 9N8h<\N6w 5Z~#I nPf36%0g #fG7QxYQxYYcRg<+SW4,eFu,ve;w(&Yw *Tr]w$uC?$?ýN,uR!& #8lu.dz^W_tO] ]III IICICIH4fV6J6uo,: 6:"fR/֓Z:}K}M*+Aa"O$O @XP)nJUDBEl/^!p3ET~~:K]55t5FuF\H56n[[%? jF@TI^%ߺF>nP" '#CQ%n B6 9$\>eKPtTC%[}_.%A_PB}n!DF.jRȜEЍD!JmDG(13([q3E-9E*;s%8c-Cl3m]4.jNHgg.> !>מ}מ16Ho=GOY >i]*G@ <;%<8={7q5! gl glv lq^2J t7J0 y-QZ zdJD t9 " G+X Ik J& #T> Ds a0 dg id=; p=; p=R q%2 * aB  >  $- ),+ 3 sM ye yeK CR9 2'\W }8G ~@ ~ : ʺNy Fy EOA Bn  &e) ,@~7 , .8 A O PG'= RPrzegldarka obrazkw i organizator</p>!

Image viewer and organizer

 PhototonicOAbout PhototonicDodaj zakBadk Add Bookmark Phototonic PowrtBack PhototonicZakBadki Bookmarks Phototonic DolnyBottom PhototonicRaporty bBdw Bug reports PhototonicJNie mo|na skopiowa lub przenie[ do Can not copy or move to  PhototonicrNie mo|na skopiowa lub przenie[ do tego samego katalogu'Can not copy or move to the same folder PhototonicxNie mo|na przenie[ lub skopiowa obrazkw do tego katalogu.+Can not move or copy images to this folder. PhototonicZrezygnujCancel Phototonic`Nie mo|na wykona akcji z tymczasowym obrazkiem.+Cannot perform action with temporary image. Phototonic&Klasyczne MiniaturyClassic Thumbs PhototonicZamknij Obrazek Close Image Phototonic KoloryColors Phototonic ZwartyCompact PhototonicSkopiowanoCopied PhototonicSkopiujCopy Phototonic(Skopiuj dane obrazkaCopy Image Data PhototonicSkopiuj do... Copy to... PhototonicStworzony %1  Created "%1" Phototonic$Przytnij do wyboruCrop to Selection PhototonicPrzycinanieCropping Phototonic WytnijCut PhototonicUsuDDelete PhototonicUsuD katalog Delete folder PhototonicUsuD obrazek Delete image PhototonicUsuD obrazki Delete images PhototonicUsunitoDeleted PhototonicUsunite Deleted  PhototonicXKatalog docelowy jest taki sam jak zrdBowy.%Destination folder is same as source. Phototonic WyBczDisable Phototonic*Doki i Paski narzdziDocks and Toolbars PhototonicPodwjneDual Phototonic Podwjne Pionowe Dual Vertical Phototonic.Duplikaty obrazkw w %1Duplicate images in %1 Phototonic EdycjaEdit Phototonic$Powiksz MiniaturyEnlarge Thumbnails Phototonic:Wprowadz now nazw dla %1 :Enter a new name for "%1": PhototonicBBdError PhototonicWyj[cieExit Phototonic\Nie udaBo si skopiowa lub przenie[ obrazka.Failed to copy or move image. PhototonicNNie udaBo si stworzy nowego katalogu.Failed to create new folder. Phototonic<Nie udaBo si usun katalogu.Failed to delete folder. Phototonic8Nie udaBo si usun obrazkaFailed to delete image Phototonic:Nie udaBo si usun obrazka.Failed to delete image. PhototonicBNie udaBo si przenie[ katalogu.Failed to move folder. Phototonic@Nie udaBo si otworzy katalogu:Failed to open folder: PhototonicJNie udaBo si zmieni nazwy katalogu.Failed to rename folder. Phototonic@Nie mo|na zmieni nazwy obrazka.Failed to rename image. PhototonicJNieudany start zewntrznej aplikacji.%Failed to start external application. PhototonicSystem Plikw File System Phototonic FiltrFilter Phototonic Filtruj wg nazwyFilter by Name Phototonic2Znajdz duplikaty obrazkwFind Duplicate Images PhototonicPierwszyFirst PhototonicObr PoziomoFlip Horizontally PhototonicObr PionowoFlip Vertically Phototonic*Odwrcenie w poziomieFlipped Horizontally Phototonic&Odwrcenie w pionieFlipped Vertically Phototonic(Katalog przeniesiony Folder moved PhototonicNaprzdForward PhototonicPeBny Ekran Full Screen PhototonicIdz do gryGo Up Phototonic DomowyHome PhototonicStrona domowa Home page PhototonicObrazekImage PhototonicInfo o Obrazku Image Info Phototonic,Uwzgldnij PodkatalogiInclude Sub-folders Phototonic$Inicjalizowanie...Initializing... Phototonic,NieprawidBowa [cie|ka: Invalid Path: Phototonic@Wprowadzono nieprawidBow nazw.Invalid name entered. Phototonic2NieprawidBowe zaznaczenieInvalid selection Phototonic4NieprawidBowe zaznaczenie.Invalid selection. Phototonic$Odwr ZaznaczenieInvert Selection Phototonic*Zachowaj Powikszenie Keep Zoom PhototonicOstatniLast PhototonicWczytaj schowekLoad Clipboard Phototonic0Zablokuj przeksztaBceniaLock Transformations PhototonicDZarzdzaj Zewntrznymi AplikacjamiManage External Applications Phototonic Lustro Mirroring Phototonic Lustro wyBczoneMirroring Disabled Phototonic Lustro:podwjne Mirroring: Dual Phototonic0Lustro: podwjne pionoweMirroring: Dual Vertical Phototonic"Lustro: poczwrneMirroring: Quad Phototonic Lustro: potrjneMirroring: Triple Phototonic.Przenie[ %1  do %2 ?Move "%1" to "%2"? PhototonicPrzenie[ w DB Move Down PhototonicPrzenie[ w Lewo Move Left Phototonic Przenie[ w Prawo Move Right PhototonicPrzenie[ w GrMove Up Phototonic Przenie[ katalog Move folder PhototonicPrzenie[ do... Move to... PhototonicPrzeniesionoMoved Phototonic NazwaName PhototonicNawigacja Navigation PhototonicNowy Katalog New Folder PhototonicNowy PodkatalogNew Sub folder Phototonic,Nazwa nowego katalogu:New folder name: PhototonicNowa nazwa: New name: PhototonicNastpnyNext PhototonicBrak obrazkw No images Phototonic,Nie wprowadzono nazwy.No name entered. Phototonic Brak zaznaczenia No selection Phototonic OtwrzOpen PhototonicOtwrz Z... Open With... Phototonic$Oryginalny Rozmiar Original Size PhototonicWklej Tutaj Paste Here Phototonic$Wklej dane obrazkaPaste Image Data PhototonicTrwale usunitePermanently delete PhototonicRTrwale usun %1" i caB jego zawarto[?0Permanently delete "%1" and all of its contents? PhototonicBTrwale usun zaznaczone obrazki?#Permanently delete selected images? PhototonicPreferencje Preferences PhototonicPoprzedniPrevious PhototonicPoczwrneQuad Phototonic LosowyRandom Phototonic Wczytaj ponownieReload PhototonicUsuD zakBadkRemove Bookmark PhototonicUsunity %1  Removed "%1" PhototonicZmieD nazwRename Phototonic&ZmieD nazw Obrazka Rename Image Phototonic*Zresetuj Powikszenie Reset Zoom PhototonicOdwrotno[Reverse Phototonic,Obr 1 stopieD w lewoRotate 1 degree CCW Phototonic.Obr 1 stopieD w prawoRotate 1 degree CW Phototonic,Obr 90 stopni w lewoRotate 90 degree CCW Phototonic.Obr 90 stopni w prawoRotate 90 degree CW PhototonicObrt %1 Rotation %1° Phototonic ZapiszSave PhototonicZapisz JakoSave As PhototonicSkaluj Obrazek Scale Image Phototonic Wybierz Wszystko Select All PhototonicSet Path Phototonic$Poka| Ukryte PlikiShow Hidden Files PhototonicPoka| Etykiety Show Labels Phototonic(Poka| pasek narzdzi Show Toolbar Phototonic$Zmniejsz MiniaturyShrink Thumbnails PhototonicRozmiarSize PhototonicPokaz Slajdw Slide Show Phototonic0Pokaz slajdw rozpocztySlide show started Phototonic0Pokaz slajdw zatrzymanySlide show stopped PhototonicMaBe ikony Small Icons PhototonicSortuj WedBugSort By PhototonicKwadratowySquarish Phototonic.Zatrzymaj Pokaz SlajdwStop Slide Show PhototonicCzasTime Phototonic GrnyTop PhototonicPrzeksztaBcenie Transform Phototonic6PrzeksztaBcenia zablokowaneTransformations Locked Phototonic6PrzeksztaBcenia odblokowaneTransformations Unlocked PhototonicPotrjneTriple Phototonic RodzajType Phototonic8Cofnij odwrcenie w poziomieUnflipped Horizontally Phototonic4Cofnij odwrcenie w pionieUnflipped Vertically Phototonic WidokView PhototonicPrzegldarkaViewer PhototonicOstrze|enieWarning PhototonicTakYes PhototonicPowikszenieZoom Phototonic Powikszenie %1%Zoom %1% PhototonicPowikszZoom In Phototonic0Powikszenie zablokowane Zoom Locked PhototonicPomniejszZoom Out Phototonic$Reset powikszenia Zoom Reset Phototonic0Powikszenie odblokowane Zoom Unlocked PhototonicZrezygnujCancelProgressDialogZrezygnujCancel ResizeDialogWysoko[:Height: ResizeDialog$Zablokuj proporcjeLock aspect ratio ResizeDialogNowy rozmiar: New size: ResizeDialog&Oryginalny rozmiar:Original size: ResizeDialogProcentPercent ResizeDialogPikseliPixels ResizeDialog SkalujScale ResizeDialogSkaluj Obrazek Scale Image ResizeDialogJednostki:Units: ResizeDialogSzeroko[:Width: ResizeDialogNDodaj przestrzeD pomidzy miniaturkami:Add space between thumbnails:SettingsDialogKolor tBa:Background color:SettingsDialogObrazek tBa:Background image:SettingsDialog WedBug wysoko[ci By heightSettingsDialog"WedBug szeroko[ciBy widthSettingsDialogZrezygnujCancelSettingsDialog2Wybierz Folder PocztkowyChoose Startup FolderSettingsDialogLDomy[lna jako[ przy zapisie obrazkw:#Default quality when saving images:SettingsDialogjDomy[lny lub okre[lony przez argument wiersza poleceD.Default, or specified by command line argumentSettingsDialogROpznienie pomidzy slajdami w sekundach: Delay between slides in seconds:SettingsDialog(Potwierdzaj usuwanieDelete confirmationSettingsDialog WyBczDisableSettingsDialog(WBcz animowane GIFyEnable GIF animationSettingsDialogWyjdz zamiast zamykania, gdy obrazek jest wczytany z linii komend?Exit instead of closing, when image is loaded from command lineSettingsDialog6Dopasowanie Du|ych ObrazkwFit Large ImagesSettingsDialog6Dopasowanie MaBych ObrazkwFit Small ImagesSettingsDialog OglneGeneralSettingsDialogObrazkiImagesSettingsDialog&Skrty klawiaturoweKeyboard ShortcutsSettingsDialogKolor etykiety: Label color:SettingsDialogTLiczba stron miniatur do odczytu z przodu:(Number of thumbnail pages to read ahead:SettingsDialogOKOKSettingsDialogOtwrz plik Open FileSettingsDialogPreferencje PreferencesSettingsDialog$Zapamitaj ostatni Remember lastSettingsDialogNObr obrazek zgodnie z orientacj Exif*Rotate image according to Exif orientationSettingsDialogRObr miniatury zgodnie z orientacj Exif/Rotate thumbnails according to Exif orientationSettingsDialogPoka| oryginalny rozmiar obrazkw mniejszy ni| rozmiar miniatury AppMgmtDialog Manage External Applications Zarządzaj Zewnętrznymi Aplikacjami Name Nazwa Path Ścieżka Add Dodaj Application path and arguments Ścieżka aplikacji i argumenty Choose Wybierz Add manually Dodaj ręcznie Remove Usuń OK OK Choose Application Wybierz Aplikację New Application Nowa aplikacja Error Błąd Not an executable Nie wykonywalny ColorsDialog Colors Kolory Reset Reset OK OK Hue Barwa Saturation Nasycenie Lightness Jasność Channels Kanały Enable Włącz Colorize Kolorowanie Negative Red Czerwony Green Zielony Blue Niebieski Hue and Saturation Barwa i nasycenie Affected Channels Dotknięte kanały Brightness Jasność Contrast Kontrast Brightness and Contrast Jasność i Kontrast Color Balance Balans koloru CopyMoveToDialog Copy or Move Images to... Skopiuj lub Przenieś Obrazki do... Add Dodaj Move to... Przenieś do... Copy to... Skopiuj do... Browse... Przeglądaj... Remove Usuń Cancel Zrezygnuj OK OK Destination: Miejsce przeznaczenia: Destination: Miejsce przeznaczenia: Close Zamknij Copy Skopiuj Move Przenieś Choose Folder Wybierz Folder Choose Directory Wybierz Katalog CpMvDialog Cancel Zrezygnuj Copying "%1" to "%2". Kopiowanie „%1” do „%2”. Moving "%1" to "%2". Przenoszenie „%1” do „%2”. Copying Kopiowanie Moving Przenoszenie to do CropDialog Cropping Przycinanie Reset Reset OK OK Top Górny Left Lewy Right Prawy Bottom Dolny ImageTags Tag Untag Clear Filters New Tag Image Tags Filter Filtr Remove Tag Negate Error Błąd Failed to save tags to Tagging Untagging Add a new tag Enter new tag name No name entered Nie wprowadzono nazwy Tag already exists Remove selected tags(s)? Remove tag Yes Tak Cancel Zrezygnuj ImageView New image Nowy obrazek Clipboard Schowek Selection size: No selection Brak zaznaczenia Hold down the Ctrl key and select a region using the mouse. Przytrzymaj klawisz Ctrl i zaznacz rejon używając mysz. Failed to save image. Nie udało się zapisać obrazka. Failed to save Exif metadata. Nie udało się zapisać metadanych Exif. Image saved. Obrazek zapisany. Hold down the Ctrl key and select a region using the mouse Przytrzymaj klawisz Ctrl i zaznacz rejon używając mysz Saving... Zapisywanie... Error Błąd Failed to save image Nie udało się zapisać obrazka Failed to save Exif metadata Nie udało się zapisać metadanych Exif Image saved Obrazek zapisany Save image as Zapisz obrazek jako Images Obrazki Image Files Pliki Graficzne InfoView Copy Skopiuj KeyGrabLineEdit Set shortcut Ustaw skrót is reserved for shortcuts to external applications jest zarezerwowany dla skrótów do zewnętrznych aplikacji is already assigned to " jest już przypisany do " Already assigned to " Już przypisany do " " action " akcja Phototonic Image Info Info o Obrazku Zoom Powiększenie Transform Przekształcenie Mirror Lustro Top Górny Bottom Dolny Close Image Zamknij Obrazek Full Screen Pełny Ekran Preferences Preferencje Exit Wyjście Enlarge Thumbnails Powiększ Miniatury Shrink Thumbnails Zmniejsz Miniatury Cut Wytnij Copy Skopiuj Copy/Move to... Skopiuj/Przenieś do... Docks and Toolbars Doki i Paski narzędzi Mirroring Lustro Delete Usuń Save Zapisz Save As Zapisz Jako Copy Image Skopiuj Obrazek Paste Image Wklej Obrazek Rename Zmień nazwę Select All Wybierz Wszystko About O Name Nazwa Time Czas Size Rozmiar Type Rodzaj Reverse Odwrotność Show Hidden Files Pokaż Ukryte Pliki Show Labels Pokaż Etykiety Small Icons Małe ikony Show Toolbar Pokaż pasek narzędzi Classic Thumbs Klasyczne Miniatury Compact Zwarty Squarish Kwadratowy Reload Wczytaj ponownie Include Sub-folders Uwzględnij Podkatalogi Paste Here Wklej Tutaj New Folder Nowy Katalog Manage Zarządzaj Back Powrót Forward Naprzód Up W górę Home Domowy Slide Show Pokaz Slajdów Next Następny Previous Poprzedni First Pierwszy Last Ostatni Random Losowy Open Otwórz Open With... Otwórz Z... Scale Image Skaluj Obrazek Tags Failed to start external application. Nieudany start zewnętrznej aplikacji. Invalid selection. Nieprawidłowe zaznaczenie. Failed to copy or move image. Nie udało się skopiować lub przenieść obrazka. Minimum zoom Zoom %1% Powiększenie %1% Rotation %1u00B0 Obrót %1u00B0 Copied Skopiowano Moved Przeniesiono %n image(s) %n obrazka %n obrazków %n obrazków Permanently delete Trwale usunięte Failed to delete image. Nie udało się usunąć obrazka. Deleted Usunięto Invalid Path: Nieprawidłowa ścieżka: Failed to open file "%1": file not found. Nie udało się otworzyć pliku "%1": plik nie znaleziony. Stop Slide Show Zatrzymaj Pokaz Slajdów Can not move or copy images to this folder. Nie można przenieść lub skopiować obrazków do tego katalogu. Destination folder is same as source. Katalog docelowy jest taki sam jak źródłowy. Move "%1" to "%2"? Przenieść „%1” do „%2”? Failed to move folder. Nie udało się przenieść katalogu. Failed to open folder: Nie udało się otworzyć katalogu: Duplicate images in %1 Duplikaty obrazków w %1 Invalid name entered. Wprowadzono nieprawidłową nazwę. Failed to rename folder. Nie udało się zmienić nazwy katalogu. Enter a new name for "%1": Wprowadź nową nazwę dla „%1”: No name entered. Nie wprowadzono nazwy. Failed to rename image. Nie można zmienić nazwy obrazka. Permanently delete "%1" and all of its contents? Trwale usunąć „%1" i całą jego zawartość? Failed to delete folder. Nie udało się usunąć katalogu. Removed "%1" Usunięty „%1” Failed to create new folder. Nie udało się stworzyć nowego katalogu. Created "%1" Stworzony „%1” Cannot perform action with temporary image. Nie można wykonać akcji z tymczasowym obrazkiem. New Image Nowy Obrazek Open With Otwórz Z Manage External Applications Zarządzaj Zewnętrznymi Aplikacjami Add Bookmark Dodaj zakładkę Remove Bookmark Usuń zakładkę Zoom Out Pomniejsz Zoom In Powiększ Reset Zoom Zresetuj Powiększenie Original Size Oryginalny Rozmiar Keep Zoom Zachowaj Powiększenie Rotate 90 degree CCW Obróć 90 stopni w lewo Rotate 90 degree CW Obróć 90 stopni w prawo Flip Horizontally Obróć Poziomo Flip Vertically Obróć Pionowo Cropping Przycinanie Crop to Selection Przytnij do wyboru Rotate 1 degree CCW Obróć 1 stopień w lewo Rotate 1 degree CW Obróć 1 stopień w prawo Colors Kolory Find Duplicate Images Znajdź duplikaty obrazków Disable Wyłącz Dual Podwójne Triple Potrójne Dual Vertical Podwójne Pionowe Quad Poczwórne Failed to open file "%1", file not found. Keep Transformations Zachowaj Przekształcenia Move Left Przenieś w Lewo Move Right Przenieś w Prawo Move Up Przenieś w Górę Move Down Przenieś w Dół Invert Selection Odwróć Zaznaczenie File Plik Edit Edycja Go Idź View Widok Sort By Sortuj Według Help Pomoc Navigation Nawigacja Filter Filtr Initializing... Inicjalizowanie... File System System Plików <p>Image viewer and organizer</p> <p>Przeglądarka obrazków i organizator</p> Home page Strona domowa Bug reports Raporty błędów Copy or Move to... Skopiuj lub Przenieś do... Show Clipboard Pokaż Schowek &File &Plik &Edit &Edycja &Go &Idź &View &Widok &Help &Pomoc Built with Qt Zbudowany z Qt Translators:<br> Tłumacze:<br> Invalid selection Nieprawidłowe zaznaczenie Error Błąd Failed to copy or move image Nie udało się skopiować lub przenieść obrazka Can not copy or move to Nie można skopiować lub przenieść do Can not cut and paste in the same folder Nie można wyciąć i wkleić w tym samym katalogu Copied Skopiowane Moved Przeniesione images obrazki Delete image Usuń obrazek Permanently delete Trwale usunięte Failed to delete image Nie udało się usunąć obrazka No selection Brak zaznaczenia Maximum zoom Rotation %1° Obrót %1° Delete images Usuń obrazki Permanently delete selected images? Trwale usunąć zaznaczone obrazki? Copy to... Skopiuj do... Move to... Przenieś do... Copy Image Data Skopiuj dane obrazka Paste Image Data Wklej dane obrazka Hide Dock Title Bars Go Up Idź do góry Load Clipboard Wczytaj schowek Lock Transformations Zablokuj przekształcenia Filter by Name Filtruj wg nazwy Set Path Ustaw ścieżkę &Tools &Narzędzia Image Obrazek Bookmarks Zakładki Contributors / Code: Autorzy/Kod: Contributors / Translations: Autorzy/Tłumaczenia: Failed to start external application Nieudany start zewnętrznej aplikacji Zoom Powiększenie Zoom Reset Reset powiększenia Zoom Locked Powiększenie zablokowane Zoom Unlocked Powiększenie odblokowane Transformations Locked Przekształcenia zablokowane Transformations Unlocked Przekształcenia odblokowane Rotation Obrót Flipped Vertically Odwrócenie w pionie Unflipped Vertically Cofnij odwrócenie w pionie Flipped Horizontally Odwrócenie w poziomie Unflipped Horizontally Cofnij odwrócenie w poziomie Mirroring Disabled Lustro wyłączone Mirroring: Dual Lustro:podwójne Mirroring: Triple Lustro: potrójne Mirroring: Dual Vertical Lustro: podwójne pionowe Mirroring: Quad Lustro: poczwórne Can not copy or move to the same folder Nie można skopiować lub przenieść do tego samego katalogu image(s) obrazek(i) Yes Tak Cancel Zrezygnuj Deleted Usunięte Invalid Path: Nieprawidłowa Ścieżka: Viewer Przeglądarka No images Brak obrazków Failed to open file Nie udało się otworzyć pliku , file not found , plik nie znaleziony Slide show stopped Pokaz slajdów zatrzymany End Slide Show Zakończ Pokaz Slajdów Slide show started Pokaz slajdów rozpoczęty Can not move or copy images to this folder Nie można przenieść lub skopiować obrazków do tego katalogu Destination folder is same as source Katalog docelowy jest taki sam jak źródłowy Move Przenieś to do Move folder Przenieś katalog Failed to move folder Nie udało się przenieść katalogu Folder moved Katalog przeniesiony Failed to open folder: Nie udało się otworzyć katalogu: Rename Zmień nazwę New name: Nowa nazwa: Invalid name entered Wprowadzono nieprawidłową nazwę Failed to rename folder Nie udało się zmienić nazwy katalogu Rename Image Zmień nazwę Obrazka Enter a new name for Wprowadź nową nazwę dla No name entered Nie wprowadzono nazwy Failed to rename image Nie można zmienić nazwy obrazka and all of its contents? i całą jego zawartość? Delete folder Usuń katalog Failed to delete folder Nie udało się usunąć katalogu Removed Usunięty New Sub folder Nowy Podkatalog New folder name: Nazwa nowego katalogu: Failed to create new folder Nie udało się stworzyć nowego katalogu Created Stworzony Executing file manager... Uruchomienie managera plików... Warning Ostrzeżenie Cannot perform action with temporary image Nie można wykonać akcji z tymczasowym obrazkiem ProgressDialog Cancel Zrezygnuj QObject Usage: phototonic [FILE or DIRECTORY]... Użycie: phototonic [PLIK lub KATALOG]... ResizeDialog OK OK Scale Image Skaluj Obrazek Scale Skaluj Cancel Zrezygnuj Original size: Oryginalny rozmiar: Width: Szerokość: Height: Wysokość: Units: Jednostki: New size: Nowy rozmiar: Original size: Oryginalny rozmiar: Width: Szerokość: Height: Wysokość: Units: Jednostki: New size: Nowy rozmiar: Pixels Pikseli Percent Procent Lock aspect ratio Zablokuj proporcje SettingsDialog Preferences Preferencje By width or height Default quality when saving images: Domyślna jakość przy zapisie obrazków: Label color: Kolor etykiety: OK OK Cancel Zrezygnuj Background color: Kolor tła: Rotate image according to Exif orientation Obróć obrazek zgodnie z orientacją Exif Label color: Kolor etykiety: Background image: Obrazek tła: Add space between thumbnails: Dodaj przestrzeń pomiędzy miniaturkami: Show original size of images smaller than the thumbnail size Pokaż oryginalny rozmiar obrazków mniejszy niż rozmiar miniatury Number of thumbnail pages to read ahead: Liczba stron miniatur do odczytu z przodu: Rotate thumbnails according to Exif orientation Obróć miniatury zgodnie z orientacją Exif Thumbnails Miniatury Fit Large Images Dopasowanie Dużych Obrazków Disable Wyłącz By width and height Według szerokości i wysokości By width Według szerokości By height Według wysokości Stretch disproportionately Rozciągnij nieproporcjonalnie Fit Small Images Dopasowanie Małych Obrazków Exit instead of closing, when image is loaded from command line Wyjdź zamiast zamykania, gdy obrazek jest wczytany z linii komend Wrap image list when reaching last or first image Zawiń listę obrazków gdy osiągnie się ostatni lub pierwszy obrazek Default quality when saving images: Domyślna jakość gdy zapisywane obrazki: Enable GIF animation Włącz animowane GIFy Open File Otwórz plik Images Obrazki Rotate according to Exif orientation Obróć według orientacji Exif Show image file name in full screen mode Pokaż nazwę pliku obrazka w trybie pełnoekranowym Background color: Kolor tła: Show image file name in viewer Background image: Obrazek tła: Add space between thumbnails: Dodaj przestrzeń pomiędzy miniaturkami: Number of thumbnail pages to read ahead: Liczba stron miniatur do odczytu z przodu: Delay between slides in seconds: Opóźnienie pomiędzy slajdami w sekundach: Startup folder Folder początkowy Default, or specified by command line argument Domyślny lub określony przez argument wiersza poleceń Remember last Zapamiętaj ostatni Specify: Określ: Delete confirmation Potwierdzaj usuwanie Keyboard Shortcuts Skróty klawiaturowe Viewer Przeglądarka Delay between slides in seconds: Opóźnienie pomiędzy slajdami w sekundach: Show random images Pokaż losowe obrazki Slide Show Pokaz Slajdów Swap mouse left-click and middle-click actions Zamień akcje lewokliku i środkowego kliku myszy Keyboard Shortcuts: Skróty Klawiaturowe: Keyboard and Mouse Klawiatura i Mysz General Ogólne Choose Startup Folder Wybierz Folder Początkowy ShortcutsTableView Action Akcja Shortcut Skrót Delete shortcut Usuń skrót Set shortcut Ustaw skrót "%1" is reserved for shortcuts to external applications. „%1” jest zarezerwowany dla skrótów do zewnętrznych aplikacji. "%1" is already assigned to "%2" action. „%1” jest już przypisany do akcji „%2”. is reserved for shortcuts to external applications jest zarezerwowany dla skrótów do zewnętrznych aplikacji is already assigned to "%1" action jest już przypisany do akcji "%1" is already assigned to " jest już przypisany do " " action " akcja ThumbView images obrazków Selected Wybrane of z File name Nazwa pliku Location Położenie Format Format Resolution Rozdzielczość Megapixel Megapikseli Selected %1 of%2 Wybrane %1 z%2 %n image(s) %n obrazek %n obrazków %n obrazków Selected %1 of %2 Wybrane %1 z %2 Scanned %1, displaying %2 (%3 and %4) Przeskanowanych %1, wyświetlonych %2 (%3 i %4) %n original(s) %n oryginał %n oryginałów %n oryginałów %n duplicate(s) %n duplikat %n duplikatów %n duplikatów Size Rozmiar General Ogólne Modified Zmodyfikowany Error Błąd %n image(s) %n obrazek %n obrazków %n obrazków Selected %1 of %n image(s) Wybrano %1 z %n obrazka Wybrano %1 z %n obrazków Wybrano %1 z %n obrazków Searching duplicate images... Wyszukiwanie duplikatów obrazków... Scanned Skanowane %n images, displaying %n obrazka, wyświetlonych %n obrazków, wyświetlonych %n obrazków, wyświetlonych %n images ( %n obrazka ( %n obrazków ( %n obrazków ( %n originals and %n oryginału i %n oryginałów i %n oryginałów i %n duplicates) %n duplikatu) %n duplikatów) %n duplikatów) No images Brak obrazków phototonic-1.7.20/translations/phototonic_ru.qm000066400000000000000000000647371271214516700217720ustar00rootroot00000000000000;P*JFO X[` [`@5_ _Ck yby|5&(*+ H5H50L2f3t6;=`%5@eAB]CV+),&o'A>X**%Q*0+"1by\bGLb %Lb LbLb\M $;N&Nn+,NP7'CTl0OX.X cX Y%Gi kn((xF NFFt%A=.JncU9g*2{QxYZ[)ndCNeDj3rIAvsnMÙ.3Ȳ)4 NT! 9N9<\N71w 5]~# nRf38%1u $kfG8QxYQxY[Rg<,SW4-eFu-vew(&w JVr_%!CA$AýOu!& #:alu/xz^YtQ] ]III IVIEwIEIJ>fX6d6oS,x: T:#CfR0֓]HeMfPtTE![_.%C_PD}n"eFF/jTȜG&ЍDNJDI(25(^\q4*E;G*=w%8c?-$Cl4]4/1jN &Jgg0> !p>Lממ26Js=IgY @a]*I@ >1%>8?m86U gl gl lq^3H t7J1 y-SL zdJF t;P #t G, K L@ #T@ Ds a1, dg id?+ p== p=T q%3 *! a  > $ )- 3 sO yeX yeL CT= 2'^ }8J ~h ~/ ; ʺP? H EQ Bn>  &e*D ,@~ .9k AB O PG'? R))5uW%5:E7";IUy6![t^ߔDiTZo0Ov0i`S >1028BL 2@CG=CN Add manually AppMgmtDialog:CBL : ?@8;>65=8N 8 0@3C<5=BKApplication path and arguments AppMgmtDialogK1@0BLChoose AppMgmtDialog$K1@0BL ?@8;>65=85Choose Application AppMgmtDialog@#?@02;5=85 2=5H=8<8 ?@8;>65=8O<8Manage External Applications AppMgmtDialog<OName AppMgmtDialog >2>5 ?@8;>65=85New Application AppMgmtDialogOKOK AppMgmtDialog#40;8BLRemove AppMgmtDialog,0459AB2>20==K5 :0=0;KAffected Channels ColorsDialog !8=89Blue ColorsDialog/@:>ABL Brightness ColorsDialog./@:>ABL 8 :>=B@0AB=>ABLBrightness and Contrast ColorsDialog&25B>2>9 10;0=A Color Balance ColorsDialog 0A:@0A8BLColorize ColorsDialog &25B0Colors ColorsDialog>=B@0AB=>ABLContrast ColorsDialog5;Q=K9Green ColorsDialogBB5=>:Hue ColorsDialog,BB5=>: 8 =0AKI5==>ABLHue and Saturation ColorsDialog/@:>ABL Lightness ColorsDialogOKOK ColorsDialog@0A=K9Red ColorsDialog!1@>A8BLReset ColorsDialog0AKI5==>ABL Saturation ColorsDialog17>@... Browse...CopyMoveToDialog B<5=0CancelCopyMoveToDialogK1@0BL ?0?:C Choose FolderCopyMoveToDialog>?8@>20BL 2... Copy to...CopyMoveToDialog&5;520O ?0?:0: Destination:CopyMoveToDialog 5@5<5AB8BL 2... Move to...CopyMoveToDialogOKOKCopyMoveToDialog#40;8BLRemoveCopyMoveToDialog B<5=0Cancel CpMvDialog0>?8@>20=85 "%1" 2 "%2".Copying "%1" to "%2". CpMvDialog05@5<5I5=85 "%1" 2 "%2".Moving "%1" to "%2". CpMvDialog !=87CBottom CropDialog1@57:0Cropping CropDialog !;520Left CropDialogOKOK CropDialog!1@>A8BLReset CropDialog !?@020Right CropDialog !25@ECTop CropDialog B<5=0Cancel ImageTags H81:0Error ImageTags $8;LB@Filter ImageTags0Yes ImageTagsCD5@ >1<5=0 Clipboard ImageView H81:0Error ImageViewJ5 C40;>AL A>E@0=8BL <5B040==K5 Exif.Failed to save Exif metadata. ImageViewB5 C40;>AL A>E@0=8BL 87>1@065=85.Failed to save image. ImageView06<8B5 :;028HC Ctrl 8 2K45;8B5 >1;0ABL 87>1@065=8O A ?><>ILN <KH8.;Hold down the Ctrl key and select a region using the mouse. ImageView,7>1@065=85 A>E@0=5=>. Image saved. ImageView7>1@065=8OImages ImageView5B 2K45;5=8O No selection ImageView2!>E@0=8BL 87>1@065=85 :0: Save image as ImageView!>E@0=5=85... Saving... ImageView>?8@>20BLCopyInfoView%n 87>1@065=85%n 87>1@065=8O%n 87>1@065=89 %n image(s) Phototonic&@02:0&Edit Phototonic &$09;&File Phototonic&5@5E>4&Go Phototonic&!?@02:0&Help Phototonic&=AB@C<5=BK&Tools Phototonic&84&View PhototonicV<p>@>A<>B@I8: 8 >@30=0975@ 87>1@065=89</p>!

Image viewer and organizer

 Phototonic ?@>3@0<<5About Phototonic">1028BL 70:;04:C Add Bookmark Phototonic 0704Back Phototonic0:;04:8 Bookmarks Phototonic=87Bottom Phototonic(!>>1I5=8O >1 >H81:0E Bug reports PhototonicP52>7<>6=> :>?8@>20BL 8;8 ?5@5<5AB8BL 2 Can not copy or move to  Phototonict52>7<>6=> :>?8@>20BL 8;8 ?5@5<5AB8BL 2 >4=C 8 BC 65 ?0?:C'Can not copy or move to the same folder Phototonic|52>7<>6=> ?5@5<5AB8BL 8;8 :>?8@>20BL 87>1@065=8O 2 MBC ?0?:C.+Can not move or copy images to this folder. Phototonic B<5=0Cancel Phototonicn52>7<>6=> 2K?>;=8BL 459AB285 A 2@5<5==K< 87>1@065=85<.+Cannot perform action with temporary image. Phototonic&;0AA8G5A:85 MA:87KClassic Thumbs Phototonic&0:@KBL 87>1@065=85 Close Image Phototonic &25B0Colors Phototonic><?0:B=K9 284Compact Phototonic!:>?8@>20=>Copied Phototonic>?8@>20BLCopy Phototonic<>?8@>20BL 87>1@065=85 2 1CD5@Copy Image Data Phototonic>?8@>20BL 2... Copy to... Phototonic!>740=0 "%1" Created "%1" Phototonic(1@570BL 2 2K45;5=85Crop to Selection Phototonic1@57:0Cropping PhototonicK@570BLCut Phototonic#40;8BLDelete Phototonic#40;8BL ?0?:C Delete folder Phototonic&#40;8BL 87>1@065=85 Delete image Phototonic&#40;8BL 87>1@065=8O Delete images Phototonic#40;5=>Deleted PhototonicL0?:0 =07=0G5=8O A>2?0405B A 8AE>4=>9.%Destination folder is same as source. Phototonic0?@5B8BLDisable Phototonic4>:8 8 ?0=5;8 8=AB@C<5=B>2Docks and Toolbars Phototonic 2064KDual Phototonic&2064K ?> 25@B8:0;8 Dual Vertical Phototonic<>2B>@ONI85AO 87>1@065=8O 2 %1Duplicate images in %1 Phototonic @02:0Edit Phototonic #25;8G8BL MA:87KEnlarge Thumbnails Phototonic62548B5 =>2>5 8<O 4;O "%1":Enter a new name for "%1": Phototonic H81:0Error Phototonic K9B8Exit Phototonicd5 C40;>AL :>?8@>20BL 8;8 ?5@5<5AB8BL 87>1@065=85.Failed to copy or move image. Phototonic>5 C40;>AL A>740BL =>2CN ?0?:C.Failed to create new folder. Phototonic25 C40;>AL C40;8BL ?0?:C.Failed to delete folder. Phototonic<5 C40;>AL C40;8BL 87>1@065=85Failed to delete image Phototonic>5 C40;>AL C40;8BL 87>1@065=85.Failed to delete image. Phototonic:5 C40;>AL ?5@5<5AB8BL ?0?:C.Failed to move folder. Phototonic25 C40;>AL >B:@KBL ?0?:C:Failed to open folder: Phototonic>5 C40;>AL ?5@58<5=>20BL ?0?:C.Failed to rename folder. PhototonicJ5 C40;>AL ?5@58<5=>20BL 87>1@065=85.Failed to rename image. PhototonicP5 C40;>AL 70?CAB8BL 2=5H=55 ?@8;>65=85.%Failed to start external application. Phototonic $09;>20O A8AB5<0 File System Phototonic $8;LB@Filter Phototonic($8;LB@>20BL ?> 8<5=8Filter by Name Phototonic>09B8 ?>2B>@ONI85AO 87>1@065=8OFind Duplicate Images Phototonic 5@2>5First Phototonic.B@078BL ?> 3>@87>=B0;8Flip Horizontally Phototonic*B@078BL ?> 25@B8:0;8Flip Vertically Phototonic.B@065=> ?> 3>@87>=B0;8Flipped Horizontally Phototonic*B@065=> ?> 25@B8:0;8Flipped Vertically Phototonic 0?:0 ?5@5<5I5=0 Folder moved Phototonic ?5@Q4Forward Phototonic> 25AL M:@0= Full Screen Phototonic 25@EGo Up Phototonic ><>9Home Phototonic"><0H=OO AB@0=8F0 Home page Phototonic7>1@065=85Image Phototonic0=D>@<0F8O > 87>1@065=88 Image Info Phototonic :;NG0O ?>4?0?:8Include Sub-folders Phototonic =8F80;870F8O...Initializing... Phototonic$5?@028;L=K9 ?CBL: Invalid Path: Phototonic22545=> =5?@028;L=>5 8<O.Invalid name entered. Phototonic,5?@028;L=>5 2K45;5=85Invalid selection Phototonic.5?@028;L=>5 2K45;5=85.Invalid selection. Phototonic.=25@B8@>20BL 2K45;5=85Invert Selection Phototonic"!>E@0=8BL <0AHB01 Keep Zoom Phototonic>A;54=55Last Phototonic<AB028BL 87>1@065=85 87 1CD5@0Load Clipboard Phototonic80D8:A8@>20BL ?@5>1@07>20=8OLock Transformations Phototonic@#?@02;5=85 2=5H=8<8 ?@8;>65=8O<8Manage External Applications Phototonic5@:0;8@>20=85 Mirroring Phototonic05@:0;8@>20=85 >B:;NG5=>Mirroring Disabled Phototonic,5@:0;8@>20=85: 42064KMirroring: Dual PhototonicF5@:0;8@>20=85: 42064K ?> 25@B8:0;8Mirroring: Dual Vertical Phototonic25@:0;8@>20=85: G5BK@564KMirroring: Quad Phototonic,5@:0;8@>20=85: B@864KMirroring: Triple Phototonic05@5<5AB8BL "%1" 2 "%2"?Move "%1" to "%2"? Phototonic!428=CBL 2=87 Move Down Phototonic!428=CBL 2;52> Move Left Phototonic!428=CBL 2?@02> Move Right Phototonic!428=CBL 225@EMove Up Phototonic"5@5<5AB8BL ?0?:C Move folder Phototonic 5@5<5AB8BL 2... Move to... Phototonic5@5<5AB8BLMoved Phototonic<OName Phototonic02830F8O Navigation Phototonic>20O ?0?:0 New Folder Phototonic>20O ?>4?0?:0New Sub folder Phototonic <O =>2>9 ?0?:8:New folder name: Phototonic>2>5 8<O: New name: Phototonic!;54CNI55Next Phototonic5B 87>1@065=89 No images Phototonic(<O =5 1K;> 22545=>.No name entered. Phototonic5B 2K45;5=8O No selection PhototonicB:@KBLOpen Phototonic(B:@KBL A ?><>ILN... Open With... PhototonicAE>4=K9 @07<5@ Original Size PhototonicAB028BL 745AL Paste Here Phototonic<AB028BL 87>1@065=85 87 1CD5@0Paste Image Data Phototonic 02A5340 C40;8BLPermanently delete PhototonicR02A5340 C40;8BL "%1" 8 2AQ 5Q A>45@68>5?0Permanently delete "%1" and all of its contents? PhototonicP02A5340 C40;8BL 2K45;5==K5 87>1@065=8O?#Permanently delete selected images? Phototonic0AB@>9:8 Preferences Phototonic@54K4CI55Previous Phototonic'5BK@564KQuad Phototonic!;CG09=>5Random Phototonic1=>28BLReload Phototonic #40;8BL 70:;04:CRemove Bookmark Phototonic#40;5=0 "%1" Removed "%1" Phototonic5@58<5=>20BLRename Phototonic25@58<5=>20BL 87>1@065=85 Rename Image Phototonic !1@>A8BL <0AHB01 Reset Zoom Phototonic 1@0B=K9 ?>@O4>:Reverse PhototonicL>25@=CBL =0 1 ?@>B82 G0A>2>9 AB@5;:8Rotate 1 degree CCW PhototonicD>25@=CBL =0 1 ?> G0A>2>9 AB@5;:5Rotate 1 degree CW PhototonicN>25@=CBL =0 90 ?@>B82 G0A>2>9 AB@5;:8Rotate 90 degree CCW PhototonicF>25@=CBL =0 90 ?> G0A>2>9 AB@5;:5Rotate 90 degree CW Phototonic>2>@>B %1 Rotation %1° Phototonic!>E@0=8BLSave Phototonic!>E@0=8BL :0:Save As Phototonic40AHB018@>20BL 87>1@065=85 Scale Image PhototonicK1@0BL 2AQ Select All Phototonic#AB0=>28BL ?CBLSet Path Phototonic,>:070BL A:@KBK5 D09;KShow Hidden Files Phototonic>:070BL <5B:8 Show Labels Phototonic8>:070BL ?0=5;L 8=AB@C<5=B>2 Show Toolbar Phototonic #<5=LH8BL MA:87KShrink Thumbnails Phototonic  07<5@Size Phototonic!;094-H>C Slide Show Phototonic$0G0;>AL A;094-H>CSlide show started Phototonic*!;094-H>C >AB0=>2;5=>Slide show stopped Phototonic 0;5=L:85 7=0G:8 Small Icons Phototonic#?>@O4>G8BL ?>Sort By Phototonic @O<>C3>;L=8:0<8Squarish Phototonic&AB0=>28B A;094-H>CStop Slide Show Phototonic @5<OTime Phototonic 25@ETop Phototonic@5>1@07>20BL Transform Phototonic8@5>1@07>20=8O 70D8:A8@>20=KTransformations Locked Phototonic:@5>1@07>20=8O @071;>:8@>20=KTransformations Unlocked Phototonic "@864KTriple Phototonic"8?Type Phototonic\>72@0I5=> 2 8AE>4=>5 ?>;>65=85 ?> 3>@87>=B0;8Unflipped Horizontally PhototonicX>72@0I5=> 2 8AE>4=>5 ?>;>65=85 ?> 25@B8:0;8Unflipped Vertically Phototonic84View Phototonic@>A<>B@I8:Viewer Phototonic=8<0=85Warning Phototonic0Yes PhototonicC<Zoom PhototonicC< %1%Zoom %1% Phototonic@81;878BLZoom In Phototonic(0AHB01 70D8:A8@>20= Zoom Locked PhototonicB40;8BLZoom Out Phototonic !1@>A8BL <0AHB01 Zoom Reset Phototonic*0AHB01 @071;>:8@>20= Zoom Unlocked Phototonic B<5=0CancelProgressDialog B<5=0Cancel ResizeDialogKA>B0:Height: ResizeDialog@0D8:A8@>20BL A>>B=>H5=85 AB>@>=Lock aspect ratio ResizeDialog>2K9 @07<5@: New size: ResizeDialog,5@2>=0G0;L=K9 @07<5@:Original size: ResizeDialog@>F5=BKPercent ResizeDialog8:A5;8Pixels ResizeDialog0AHB018@>20BLScale ResizeDialog40AHB018@>20BL 87>1@065=85 Scale Image ResizeDialog48=8FK:Units: ResizeDialog(8@8=0:Width: ResizeDialog>>1028BL ?@>15; <564C MA:870<8:Add space between thumbnails:SettingsDialog&25B D>=0:Background color:SettingsDialog($>=>2>5 87>1@065=85:Background image:SettingsDialog> 2KA>B5 By heightSettingsDialog> H8@8=5By widthSettingsDialog B<5=0CancelSettingsDialog.K1@0BL AB0@B>2CN ?0?:CChoose Startup FolderSettingsDialogd0G5AB2> ?> C<>;G0=8N ?@8 A>E@>0=5=88 87>1@065=89:#Default quality when saving images:SettingsDialogl> C<>;G0=8N, 8;8 7040==0O 0@3C<5=B>< :><0=4=>9 AB@>:8.Default, or specified by command line argumentSettingsDialogF045@6:0 <564C A;0940<8 2 A5:C=40E: Delay between slides in seconds:SettingsDialog0?@5B8BLDisableSettingsDialog*:;NG8BL GIF-0=8<0F8NEnable GIF animationSettingsDialogKE>4 2<5AB> 70:@KB8O, :>340 87>1@065=85 703@C65=> 87 :><0=4=>9 AB@>:8?Exit instead of closing, when image is loaded from command lineSettingsDialog:>43>=OBL 1>;LH85 87>1@065=8OFit Large ImagesSettingsDialog>>43>=OBL <0;5=L:85 87>1@065=8OFit Small ImagesSettingsDialog 1I85GeneralSettingsDialog7>1@065=8OImagesSettingsDialog !>G5B0=8O :;028HKeyboard ShortcutsSettingsDialog&25B 8<5=8: Label color:SettingsDialogf>;8G5AB2> AB@0=8F A MA:870<8 703@C605<K<8 70@0=55:(Number of thumbnail pages to read ahead:SettingsDialogOKOKSettingsDialogB:@KBL D09; Open FileSettingsDialog0AB@>9:8 PreferencesSettingsDialog&0?><=8BL ?>A;54=NN Remember lastSettingsDialogb>2>@0G820BL 87>1@065=85 A>3;0A=> >@85=B0F88 EXIF*Rotate image according to Exif orientationSettingsDialogX>2>@0G820BL MA:87K A>3;0A=> >@85=B0F88 EXIF/Rotate thumbnails according to Exif orientationSettingsDialog>:07K20BL =0AB>OI89 @07<5@ 87>1@065=89, :>B>@K5 <5=LH5 G5< @07<5@ MA:870:07K20BL A;CG09=K5 87>1@065=8OShow random imagesSettingsDialog!;094-H>C Slide ShowSettingsDialog040BL:Specify:SettingsDialog0G0;L=0O ?0?:0Startup folderSettingsDialog2?8A0BL =5?@>?>@F8>=0;L=>Stretch disproportionatelySettingsDialogt><5=OBL <5AB0<8 459AB28O ?> ;52><C 8 A@54=5<C I5;G:C <KH8.Swap mouse left-click and middle-click actionsSettingsDialog -A:87K ThumbnailsSettingsDialog@>A<>B@I8:ViewerSettingsDialog0:>;LF520BL A?8A>: 87>1@065=89 ?@8 4>AB865=88 ?>A;54=53> 8;8 ?5@2>3> 87>1@065=8O1Wrap image list when reaching last or first imageSettingsDialogB%1 C65 ?@8A2>5=> 459AB28N %2.("%1" is already assigned to "%2" action.ShortcutsTableView"%1" 70@575@28@>20=> 4;O A>G5B0=89 :;028H 4;O 2=5H=8E ?@8;>65=89.8"%1" is reserved for shortcuts to external applications.ShortcutsTableView59AB285ActionShortcutsTableView0#40;8BL A>G5B0=85 :;028HDelete shortcutShortcutsTableView4@8A2>8BL A>G5B0=85 :;028H Set shortcutShortcutsTableView !>G5B0=85 :;028HShortcutShortcutsTableView %n 87>1@065=8O %n 87>1@065=89 %n 87>1@065=89 %n image(s) ThumbView%n :>?8O%n :>?88%n :>?89%n duplicate(s) ThumbView%n 87>1@065=85%n 87>1@065=8O%n 87>1@065=89 %n image(s) ThumbView%n >@838=0;%n >@838=0;0%n >@838=0;>2%n original(s) ThumbView H81:0Error ThumbView<O D09;0 File name ThumbView $>@<0BFormat ThumbView 1I85General ThumbView5AB>?>;>65=85Location ThumbView530?8:A5;59 Megapixel ThumbView7<5=Q=Modified ThumbView5B 87>1@065=89 No images ThumbView 07@5H5=85 Resolution ThumbViewJ@>A<>B@5=> %1, ?>:070=> %2 (%3 8 %4)%Scanned %1, displaying %2 (%3 and %4) ThumbView4>8A: :>?89 87>1@065=89...Searching duplicate images... ThumbViewK1@0=> %1 87%2Selected %1 of%2 ThumbView  07<5@Size ThumbView ) , phototonic-1.7.20/translations/phototonic_ru.ts000066400000000000000000002143661271214516700217760ustar00rootroot00000000000000 AppMgmtDialog Manage External Applications Управление внешними приложениями Name Имя Application path and arguments Путь к приложению и аргументы Choose Выбрать Add manually Добавить вручную Remove Удалить OK OK Choose Application Выбрать приложение New Application Новое приложение ColorsDialog Colors Цвета Reset Сбросить OK OK Hue Оттенок Saturation Насыщенность Lightness Яркость Colorize Раскрасить Negative Red Красный Green Зелёный Blue Синий Hue and Saturation Оттенок и насыщенность Affected Channels Задействованные каналы Brightness Яркость Contrast Контрастность Brightness and Contrast Яркость и контрастность Color Balance Цветовой баланс CopyMoveToDialog Move to... Переместить в... Copy to... Копировать в... Browse... Обзор... Remove Удалить Cancel Отмена OK OK Destination: Целевая папка: Choose Folder Выбрать папку CpMvDialog Cancel Отмена Copying "%1" to "%2". Копирование "%1" в "%2". Moving "%1" to "%2". Перемещение "%1" в "%2". CropDialog Cropping Обрезка Reset Сбросить OK OK Top Сверху Left Слева Right Справа Bottom Снизу ImageTags Tag Untag Clear Filters New Tag Image Tags Filter Фильтр Remove Tag Negate Error Ошибка Failed to save tags to Tagging Untagging Add a new tag Enter new tag name No name entered Tag already exists Remove selected tags(s)? Remove tag Yes Да Cancel Отмена ImageView Clipboard Буфер обмена Selection size: No selection Нет выделения Hold down the Ctrl key and select a region using the mouse. Зажмите клавишу Ctrl и выделите область изображения с помощью мыши. Failed to save image. Не удалось сохранить изображение. Failed to save Exif metadata. Не удалось сохранить метаданные Exif. Image saved. Изображение сохранено. Saving... Сохранение... Error Ошибка Save image as Сохранить изображение как Images Изображения InfoView Copy Копировать Phototonic Image Info Информация о изображении Zoom Зум Transform Преобразовать Top Вверх Bottom Вниз Close Image Закрыть изображение Full Screen Во весь экран Preferences Настройки Exit Выйти Enlarge Thumbnails Увеличить эскизы Shrink Thumbnails Уменьшить эскизы Cut Вырезать Copy Копировать Rotation %1° Поворот %1° Docks and Toolbars Доки и панели инструментов Mirroring Зеркалирование Delete Удалить Save Сохранить Save As Сохранить как Rename Переименовать Select All Выбрать всё About О программе Name Имя Time Время Size Размер Type Тип Reverse Обратный порядок Show Hidden Files Показать скрытые файлы Show Labels Показать метки Small Icons Маленькие значки Hide Docks Title Bar Спрятать заголовки доков Classic Thumbs Классические эскизы Compact Компактный вид Squarish Прямоугольниками Reload Обновить Include Sub-folders Включая подпапки Paste Here Вставить здесь New Folder Новая папка Back Назад Forward Вперёд Up Вверх Home Домой Slide Show Слайд-шоу Next Следующее Previous Предыдущее First Первое Last Последнее Random Случайное Open Открыть Open With... Открыть с помощью... Scale Image Масштабировать изображение Contributors / Code: Участники / код: Contributors / Translations: Участники / переводчики: Failed to start external application. Не удалось запустить внешнее приложение. Invalid selection. Неправильное выделение. Failed to copy or move image. Не удалось копировать или переместить изображение. Zoom %1% Зум %1% Copied Скопировано Moved Переместить %n image(s) %n изображение %n изображения %n изображений Permanently delete Навсегда удалить Yes Да Cancel Отмена Failed to delete image. Не удалось удалить изображение. Deleted Удалено Invalid Path: Неправильный путь: Failed to open file "%1": file not found. Не удалось открыть файл "%1": файл не найден. Stop Slide Show Остановит слайд-шоу Duplicate images in %1 Повторяющиеся изображения в %1 Enter a new name for "%1": Введите новое имя для "%1": No name entered. Имя не было введено. Failed to rename image. Не удалось переименовать изображение. Permanently delete "%1" and all of its contents? Навсегда удалить "%1" и всё её содержиое? Failed to delete folder. Не удалось удалить папку. Removed "%1" Удалена "%1" Failed to create new folder. Не удалось создать новую папку. Created "%1" Создана "%1" Cannot perform action with temporary image. Невозможно выполнить действие с временным изображением. Manage External Applications Управление внешними приложениями Zoom Out Отдалить Zoom In Приблизить Reset Zoom Сбросить масштаб Original Size Исходный размер Keep Zoom Сохранить масштаб Rotate 90 degree CCW Повернуть на 90° против часовой стрелки Rotate 90 degree CW Повернуть на 90° по часовой стрелке Flip Horizontally Отразить по горизонтали Flip Vertically Отразить по вертикали Cropping Обрезка Rotate 1 degree CCW Повернуть на 1° против часовой стрелки Rotate 1 degree CW Повернуть на 1° по часовой стрелке Colors Цвета Disable Запретить Dual Дважды Triple Трижды Dual Vertical Дважды по вертикали Quad Четырежды Move Left Сдвинуть влево Move Right Сдвинуть вправо Move Up Сдвинуть вверх Move Down Сдвинуть вниз Invert Selection Инвертировать выделение Edit Правка View Вид Sort By Упорядочить по Navigation Навигация Filter Фильтр Initializing... Инициализация... File System Файловая система <p>Image viewer and organizer</p> <p>Просмотрщик и органайзер изображений</p> Home page Домашняя страница Bug reports Сообщения об ошибках &File &Файл &Edit &Правка &Go &Переход &View &Вид &Help &Справка Can not move or copy images to this folder. Невозможно переместить или копировать изображения в эту папку. Destination folder is same as source. Папка назначения совпадает с исходной. Move "%1" to "%2"? Переместить "%1" в "%2"? Failed to move folder. Не удалось переместить папку. Failed to open folder: Не удалось открыть папку: Invalid name entered. Введено неправильное имя. Failed to rename folder. Не удалось переименовать папку. Invalid selection Неправильное выделение Error Ошибка Can not copy or move to Невозможно копировать или переместить в Delete image Удалить изображение Failed to delete image Не удалось удалить изображение No selection Нет выделения Delete images Удалить изображения Permanently delete selected images? Навсегда удалить выделенные изображения? Copy to... Копировать в... Move to... Переместить в... Copy Image Data Копировать изображение в буфер Paste Image Data Вставить изображение из буфера Hide Dock Title Bars Show Toolbar Показать панель инструментов Go Up Вверх Load Clipboard Вставить изображение из буфера Add Bookmark Добавить закладку Remove Bookmark Удалить закладку Crop to Selection Обрезать в выделение Find Duplicate Images Найти повторяющиеся изображения Lock Transformations Зафиксировать преобразования Filter by Name Фильтровать по имени Set Path Установить путь &Tools &Инструменты Image Изображение Bookmarks Закладки Tags Minimum zoom Maximum zoom Zoom Reset Сбросить масштаб Zoom Locked Масштаб зафиксирован Zoom Unlocked Масштаб разблокирован Transformations Locked Преобразования зафиксированы Transformations Unlocked Преобразования разблокированы Flipped Vertically Отражено по вертикали Unflipped Vertically Возвращено в исходное положение по вертикали Flipped Horizontally Отражено по горизонтали Unflipped Horizontally Возвращено в исходное положение по горизонтали Mirroring Disabled Зеркалирование отключено Mirroring: Dual Зеркалирование: дважды Mirroring: Triple Зеркалирование: трижды Mirroring: Dual Vertical Зеркалирование: дважды по вертикали Mirroring: Quad Зеркалирование: четырежды Can not copy or move to the same folder Невозможно копировать или переместить в одну и ту же папку Deleted Viewer Просмотрщик No images Нет изображений Failed to open file "%1", file not found. Slide show stopped Слайд-шоу остановлено Slide show started Началось слайд-шоу Move folder Переместить папку Folder moved Папка перемещена New name: Новое имя: Rename Image Переименовать изображение Delete folder Удалить папку New Sub folder Новая подпапка New folder name: Имя новой папки: Warning Внимание ProgressDialog Cancel Отмена QObject Usage: phototonic [FILE or DIRECTORY]... Использование: phototonic [ФАЙЛ или ПАПКА]... ResizeDialog Scale Image Масштабировать изображение Scale Масштабировать Cancel Отмена Original size: Первоначальный размер: Width: Ширина: Height: Высота: Units: Единицы: New size: Новый размер: Pixels Пиксели Percent Проценты Lock aspect ratio Зафиксировать соотношение сторон SettingsDialog Preferences Настройки Default quality when saving images: Качество по умолчанию при сохроанении изображений: Background color: Цвет фона: By width or height Show image file name in viewer Background image: Фоновое изображение: Add space between thumbnails: Добавить пробел между эскизами: Number of thumbnail pages to read ahead: Количество страниц с эскизами загружаемыми заранее: Delay between slides in seconds: Задержка между слайдами в секундах: OK OK Cancel Отмена Rotate image according to Exif orientation Поворачивать изображение согласно ориентации EXIF Show original size of images smaller than the thumbnail size Показывать настоящий размер изображений, которые меньше чем размер эскиза Rotate thumbnails according to Exif orientation Поворачивать эскизы согласно ориентации EXIF Thumbnails Эскизы Fit Large Images Подгонять большие изображения Disable Запретить By width and height По ширине и высоте By width По ширине By height По высоте Stretch disproportionately Вписать непропорционально Fit Small Images Подгонять маленькие изображения Exit instead of closing, when image is loaded from command line Выход вместо закрытия, когда изображение загружено из командной строки Wrap image list when reaching last or first image Закольцевать список изображений при достижении последнего или первого изображения Enable GIF animation Включить GIF-анимацию Show image file name in full screen mode Показывать полное имя изображения в полноэкранном режиме Startup folder Начальная папка Default, or specified by command line argument По умолчанию, или заданная аргументом командной строки Remember last Запомнить последнюю Specify: Задать: Delete confirmation Keyboard Shortcuts Сочетания клавиш Viewer Просмотрщик Open File Открыть файл Images Изображения Show random images Показывать случайные изображения Slide Show Слайд-шоу Swap mouse left-click and middle-click actions Поменять местами действия по левому и среднему щелчку мыши Label color: Цвет имени: General Общие Choose Startup Folder Выбрать стартовую папку ShortcutsTableView Action Действие Shortcut Сочетание клавиш Delete shortcut Удалить сочетание клавиш Set shortcut Присвоить сочетание клавиш "%1" is reserved for shortcuts to external applications. "%1" зарезервировано для сочетаний клавиш для внешних приложений. "%1" is already assigned to "%2" action. «%1» уже присвоено действию «%2». ThumbView File name Имя файла Location Местоположение Format Формат Resolution Разрешение Megapixel Мегапикселей Size Размер General Общие Modified Изменён Error Ошибка %n image(s) %n изображение %n изображения %n изображений No images Нет изображений Selected %1 of%2 Выбрано %1 из%2 %n image(s) In Russian "of" changes declension of a noun after number %n изображения %n изображений %n изображений Scanned %1, displaying %2 (%3 and %4) Просмотрено %1, показано %2 (%3 и %4) %n original(s) %n оригинал %n оригинала %n оригиналов %n duplicate(s) %n копия %n копии %n копий Searching duplicate images... Поиск копий изображений... phototonic-1.7.20/translations/phototonic_sr.qm000066400000000000000000000653711271214516700217630ustar00rootroot00000000000000OXZw_[` [`A_w_Dy?y|!5)q(,+ H5H52zL3f5t8/Y**%!*0y+1by\GLb 'LbLb Lb]RM &N)=Nn-YNP7)Tl2FX)X FX xY%H1\Zwikn*xFDFFt(bA>[0on!cWX9 *4lQxY[[)ndCOeEj5|rIAsnNJÙ.!HȲ,6 O! 9N;C<\N8w 5]~&nSf39%3r 'fG:^QxYQxY\sRg<.SW4/eFu0oG ve"w()w 5Wr`3'CC5$BnýQ u } !& #;lu1z^ZwtR] ]TIII `IIF=IFrIKEfY646ou,lZ' : :&fR2֓]=}}P-AaB= VFW O( O CP)nMUDEIl/^$p3G~~>K]8l5t8FqFqH59on^^%B jHD XLI^(ߺInS% +#C%n69$_>eNPtTE[c_.%D_PE}n%2GmjTMF1jV_7 q7ȜGЍD ( JDJm(40(^q6 E<Ho*>%8ck-GCl6d]41BjN#Kgg2>}$OA01>"I0מ%מ46Kz=JY A]*I@ ?%@?8@:.7 gl gl lq^51 t7J3 y-T zdJG' t< &9 G.3 DJ Lt M+ #TB Ds  a3# dg= id@x p=?E p=V q%5 *# a v >#y 'd )/8 3i sP ye} yeN CU 2'_C }8J ~k ~3 =1 ʺQT I5 ص ER8 Bn  &e, ,@~ , .: A0 O PG'@ Pr R40X @CG=> Add manually AppMgmtDialog:CB0Z0 8 0@3C<5=B8 0?;8:0F8X5Application path and arguments AppMgmtDialog7015@8Choose AppMgmtDialog$7015@8 0?;8:0F8XCChoose Application AppMgmtDialog>#?@02Y0X 5:AB5@=8< 0?;8:0F8X0<0Manage External Applications AppMgmtDialog<5Name AppMgmtDialog>20 0?;8:0F8X0New Application AppMgmtDialog #@54COK AppMgmtDialog #:;>=8Remove AppMgmtDialog>3>R5=8 :0=0;8Affected Channels ColorsDialog ;020Blue ColorsDialog!25B;>AB Brightness ColorsDialog&!25B;>AB 8 :>=B@0ABBrightness and Contrast ColorsDialog0;0=A 1>X0 Color Balance ColorsDialog 1>X8Colorize ColorsDialog>X5Colors ColorsDialog>=B@0ABContrast ColorsDialog 5;5=0Green ColorsDialog8X0=A0Hue ColorsDialog(8X0=A0 8 70A8[5=>ABHue and Saturation ColorsDialog!25B;8=0 Lightness ColorsDialog530B82Negative ColorsDialog #@54COK ColorsDialog &@25=0Red ColorsDialog>2@0B8Reset ColorsDialog0A8[5=>AB Saturation ColorsDialog@53;540X... Browse...CopyMoveToDialog B:068CancelCopyMoveToDialog 7015@8 D0AF8:;C Choose FolderCopyMoveToDialog>?8@0X C... Copy to...CopyMoveToDialog5AB8=0F8X0: Destination:CopyMoveToDialog><5@8 C... Move to...CopyMoveToDialog #@54COKCopyMoveToDialog #:;>=8RemoveCopyMoveToDialog B:068Cancel CpMvDialog(>?8@0< "%1" C "%2".Copying "%1" to "%2". CpMvDialog(><5@0< "%1" C "%2".Moving "%1" to "%2". CpMvDialog>;5Bottom CropDialog 7@568Cropping CropDialog52>Left CropDialog #@54COK CropDialog>2@0B8Reset CropDialog 5A=>Right CropDialog>@5Top CropDialog5[ ?>AB>X8 already exists ImageTags">40X =>2C >7=0:C Add a new tag ImageTags B:068Cancel ImageTags#:;>=8 D8;B5@5 Clear Filters ImageTags #=5A8 8<5 >7=0:5Enter new tag name ImageTags @5H:0Error ImageTags.5CA?5;> A=8<0Z5 >7=0:5Failed to save tags to  ImageTags $8;B5@Filter ImageTags>20 >7=0:0New Tag ImageTags <5 =8X5 C=5A5=>No name entered ImageTags#:;>=8 >7=0:C Remove Tag ImageTags4#:;>=8 8701@0=C >7=0:C(5)?Remove selected tags(s)? ImageTags#:;>=8 >7=0:C Remove tag ImageTags 7=0G8Tag ImageTags 7=0:0Tag  ImageTags7=0G820Z5Tagging  ImageTags#:;>=8 >7=0:CUntag ImageTags#:;0Z0Z5 >7=0:0 Untagging  ImageTags0Yes ImageTags;81>@4 Clipboard ImageView @5H:0Error ImageViewB@5H:0 ?@8 A=8<0ZC Exif ?>40B0:0.Failed to save Exif metadata. ImageView2@5H:0 ?@8 A=8<0ZC A;8:5.Failed to save image. ImageViewt@68 Ctrl 4C3<5 ?@8B8A=CB> 8 87015@8 @538XC :>@8AB5[8 <8H.;Hold down the Ctrl key and select a region using the mouse. ImageView!;8:0 A=8<Y5=0. Image saved. ImageView !;8:5Images ImageView57 A5;5:F8X5 No selection ImageView!=8<8 A;8:C :0> Save image as ImageView!=8<0<... Saving... ImageView&5;8G8=0 A5;5:F8X5:Selection size:  ImageView>?8@0XCopyInfoView Phototonic%n A;8:0%n A;8:5%n A;8:0 %n image(s) Phototonic &#@548&Edit Phototonic &$0X;&File Phototonic&48&Go Phototonic &><>[&Help Phototonic &;0B8&Tools Phototonic&>3;54&View Phototonic:@53;540G 8 >@30=870B>@ A;8:0!

Image viewer and organizer

 PhototonicAbout Phototonic>40X :@0B8FC Add Bookmark Phototonic 0704Back Phototonic0@B8F5 Bookmarks Phototonic>;5Bottom Phototonic@8X028 3@5H:5 Bug reports PhototonicB5<>3C[5 :>?8@0B8 8;8 ?><5@8B8 C Can not copy or move to  Phototonic\5<>3C[5 :>?8@0B8 8;8 ?><5@8B8 C 8ABC D0AF8:;C'Can not copy or move to the same folder Phototonich5<>3C[5 ?><5@8B8 8;8 :>?8@0B8 A;8:5 C >2C D0AF8:;C.+Can not move or copy images to this folder. Phototonic B:068Cancel Phototonic\5<>3C[5 8725AB8 0:F8XC A0 ?@82@5<5=>< A;8:><.+Cannot perform action with temporary image. Phototonic4;0A8G=5 <8=8X0BC@=5 A;8:5Classic Thumbs Phototonic0B2>@8 A;8:C Close Image Phototonic>X5Colors Phototonic><?0:B=>Compact Phototonic>?8@0=>Copied Phototonic>?8@0XCopy Phototonic*>?8@0X ?>40B:5 A;8:5Copy Image Data Phototonic>?8@0X C... Copy to... Phototonic0?@02Y5= "%1" Created "%1" Phototonic 7@568 A5;5:F8XCCrop to Selection Phototonic 7@568Cropping Phototonic 7@568Cut Phototonic71@8H8Delete Phototonic 71@8H8 D0AF8:;C Delete folder Phototonic71@8H8 A;8:C Delete image Phototonic71@8H8 A;8:5 Delete images Phototonic71@8A0=>Deleted Phototonic71@8A0=>Deleted  PhototonicR4@548H=0 D0AF8:;0 X5 8AB0 :0> 8 ?>G5B=0.%Destination folder is same as source. PhototonicA:YCG5=>Disable Phototonic,!84@5=5 8 0;0B=5 B@0:5Docks and Toolbars Phototonic2>AB@C:>Dual Phototonic(2>AB@C:> 25@B8:0;=> Dual Vertical Phototonic C?;5 A;8:5 C %1Duplicate images in %1 Phototonic #@548Edit Phototonic6>25[0X <8=8X0BC@=5 ?@8:075Enlarge Thumbnails Phototonic.#=5A8 =>2> 8<5 70 "%1":Enter a new name for "%1": Phototonic @5H:0Error Phototonic 70R8Exit PhototonicJ5CA?5;> :>?8@0Z5 8;8 ?><5@0Z5 A;8:5.Failed to copy or move image. Phototonic@5CA?5;> ?@02Y5Z5 =>25 D0AF8:;5.Failed to create new folder. Phototonic45CA?5;> 1@8A0Z5 D0AF8:;5.Failed to delete folder. Phototonic,5CA?5;> 1@8A0Z5 A;8:5Failed to delete image Phototonic.5CA?5;> 1@8A0Z5 A;8:5.Failed to delete image. Phototonic65CA?5;> ?><5@0Z5 D0AF8:;5.Failed to move folder. Phototonic6=5CA?5;> >B20@0Z5 D0AF8:;5:Failed to open folder: Phototonic>5CA?5;> ?@58<5=>20Z5 D0AF8:;5.Failed to rename folder. Phototonic85CA?5;> ?@58<5=>20Z5 A;8:5.Failed to rename image. PhototonicR@5H:0 ?@8 ?>:@5B0ZC 5:AB5@=5 0?;8:0F8X5.%Failed to start external application. Phototonic$0X; A8AB5< File System Phototonic $8;B5@Filter Phototonic$$8;B@8@0X ?> 8<5=CFilter by Name Phototonic&@>=0R8 4C?;5 A;8:5Find Duplicate Images Phototonic@20First Phototonic$1@=8 E>@87>=B0;=>Flip Horizontally Phototonic 1@=8 25@B8:0;=>Flip Vertically Phototonic(1@=CB> E>@87>=B0;=>Flipped Horizontally Phototonic$1@=CB> 25@B8:0;=>Flipped Vertically Phototonic"$0AF8:;0 ?><5@5=0 Folder moved Phototonic 0?@54Forward Phototonic2@8:07 ?@5:> F5;>3 5:@0=0 Full Screen Phototonic48 3>@5Go Up Phototonic>G5B=0Home Phototonic >G5B=0 AB@0=8F0 Home page Phototonic !;8:0Image Phototonic&=D>@<0F8X5 > A;8F8 Image Info Phototonic&#:YCG8 ?>4-D0AF8:;5Include Sub-folders Phototonic>:@5[5<...Initializing... Phototonic 520Y0;0 ?CB0Z0: Invalid Path: Phototonic*52065[5 8<5 C=5A5=>.Invalid name entered. Phototonic$520Y0;0 A5;5:F8X0Invalid selection Phototonic&520Y0;0 A5;5:F8X0.Invalid selection. Phototonic1@=8 A5;5:F8XCInvert Selection Phototonic04@68 7C< Keep Zoom Phototonic 04Z0Last Phototonic#G8B0X :;8?1>@4Load Clipboard Phototonic.0:YCG0X B@0=AD>@<0F8X5Lock Transformations Phototonic>#?@02Y0X 5:AB5@=8< 0?;8:0F8X0<0Manage External Applications Phototonic&@5A;8:0 (>3;540;>) Mirroring Phototonic,@5A;8:020Z5 8A:YCG5=>Mirroring Disabled Phototonic,@5A;8:020Z5 42>AB@C:>Mirroring: Dual PhototonicB@5A;8:020Z5 42>AB@C:> 25@B8:0;=>Mirroring: Dual Vertical Phototonic4@5A;8:020Z5 G5B25@>AB@C:>Mirroring: Quad Phototonic,@5A;8:020Z5 B@>AB@C:>Mirroring: Triple Phototonic&><5@8 "%1" C "%2"?Move "%1" to "%2"? Phototonic><5@8 4>;5 Move Down Phototonic><5@8 ;52> Move Left Phototonic><5@8 45A=> Move Right Phototonic><5@8 3>@5Move Up Phototonic><5@8 D0AF8:;C Move folder Phototonic><5@8 C... Move to... Phototonic><5@5=>Moved Phototonic<5Name Phototonic02830F8X0 Navigation Phototonic>20 D0AF8:;0 New Folder Phototonic">20 ?>4-D0AF8:;0New Sub folder Phototonic$>2> 8<5 D0AF8:;5:New folder name: Phototonic>2> 8<5: New name: Phototonic!;545[aNext Phototonic5<0 A;8:0 No images Phototonic"<5 =8X5 C=5A5=>.No name entered. Phototonic57 A5;5:F8X5 No selection Phototonic B2>@8Open Phototonic B2>@8 ?><>[C... Open With... Phototonic&@838=0;=0 25;8G8=0 Original Size Phototonic0;5?8 >245 Paste Here Phototonic(0;5?8 ?>40B:5 A;8:5Paste Image Data Phototonic"@0X=> 871@8H8Permanently delete PhototonicD"@0X=> 71@8H8 "%1" 8 A02 A04@60X?0Permanently delete "%1" and all of its contents? Phototonic<"@0X=> 871@8H8 >401@0=5 A;8:5?#Permanently delete selected images? Phototonic>AB02:5 Preferences Phototonic @>H;0Previous Phototonic'5B25@>AB@C:>Quad Phototonic0AC<8G=0Random Phototonic#G8B0X ?>=>2>Reload Phototonic#:;>=8 :@0B8FCRemove Bookmark Phototonic#:;>Z5= "%1" Removed "%1" Phototonic@58<5=CXRename Phototonic@58<5=CX A;8:C Rename Image Phototonic>2@0B8 7C< Reset Zoom Phototonic 1@=8Reverse PhototonicB >B8@0X 1 AB5?5= AC?@>B=> :070YF8Rotate 1 degree CCW Phototonic@@>B8@0X 1 AB5?5= C A<5@C :070Y:5Rotate 1 degree CW PhototonicF >B8@0X 90 AB5?5=8 AC?@>B=> :070YF8Rotate 90 degree CCW PhototonicD >B8@0X 90 AB5?5=8 C A<5@C :070Y:5Rotate 90 degree CW Phototonic >B0F8X0 %1 Rotation %1° Phototonic !=8<8Save Phototonic!=8<8 :0>Save As Phototonic,@><5=8 25;8G8=C A;8:5 Scale Image Phototonic7=0G8 A25 Select All Phototonic>AB028 ?CB0ZCSet Path Phototonic2@8:068 A:@825=5 40B>B5:5Show Hidden Files Phototonic@8:068 =0B?8A5 Show Labels Phototonic(@8:068 0;0B=C B@0:C Show Toolbar Phototonic4#<0=Z8 <8=8X0BC@=5 ?@8:075Shrink Thumbnails Phototonic5;8G8=0Size Phototonic!;0X4 ?@8:07 Slide Show Phototonic$!;0X4 ?@8:07 ?>G5BSlide show started Phototonic.!;0X4 ?@8:07 >1CAB02Y5=Slide show stopped Phototonic0;5 8:>=5 Small Icons Phototonic!>@B8@0X ?>Sort By Phototonic>F:0AB>Squarish Phototonic*1CAB0=8 A;0X4 ?@8:07Stop Slide Show Phototonic 7=0:5Tags Phototonic @5<5Time Phototonic>@5Top Phototonic"@0=AD>@<8H8 Transform Phototonic0"@0=AD>@<0F8X5 70:YCG0=5Transformations Locked Phototonic0"@0=AD>@<0F8X5 >B:YCG0=5Transformations Unlocked Phototonic"@>AB@C:>Triple Phototonic"8?Type Phototonic,5>1@=CB> E>@87>=B0;=>Unflipped Horizontally Phototonic(5>1@=CB> 25@B8:0;=>Unflipped Vertically Phototonic >3;54View Phototonic@53;540GViewer Phototonic 06Z0Warning Phototonic0Yes Phototonic #1;868Zoom Phototonic#1;868 %1%Zoom %1% Phototonic #1;868Zoom In PhototonicC< 70:YCG0= Zoom Locked Phototonic #40Y8Zoom Out PhototonicC< 2@0[5= Zoom Reset PhototonicC< >B:YCG0= Zoom Unlocked Phototonic B:068CancelProgressDialog B:068Cancel ResizeDialog8A8=0:Height: ResizeDialog0:YCG0X ><5@Lock aspect ratio ResizeDialog>20 25;8G8=0: New size: ResizeDialog(@838=0;=0 25;8G8=0:Original size: ResizeDialog>AB>B0:Percent ResizeDialog8:A5;8Pixels ResizeDialog#25[0X/!<0Z8Scale ResizeDialog,@><5=8 25;8G8=C A;8:5 Scale Image ResizeDialog548=8F5:Units: ResizeDialog(8@8=0:Width: ResizeDialogR>40X @07<0: 87<5RC <8=8X0BC@=8E ?@8:070:Add space between thumbnails:SettingsDialog>X0 ?>7048=5:Background color:SettingsDialog">7048=A:0 A;8:0:Background image:SettingsDialog> 28A8=8 By heightSettingsDialog> H8@8=8By widthSettingsDialog(> H8@8=8 8;8 28A8=8By width or heightSettingsDialog B:068CancelSettingsDialog07015@8 ?>G5B=C D0AF8:;CChoose Startup FolderSettingsDialogL!B0=40@4=8 :20;8B5B ?@8 A=8<0ZC A;8:0:#Default quality when saving images:SettingsDialogf!B0=40@4=8, 8;8 :><0=4=>< ;8=8jom >4@5R5=8 0@3C<5=B.Default, or specified by command line argumentSettingsDialogF 07<0: 87<5RC A;0X4>20 C A5:C=40<0: Delay between slides in seconds:SettingsDialog$>B2@40 70 1@8A0Z5Delete confirmationSettingsDialogA:YCG5=>DisableSettingsDialog(#:YCG8 GIF 0=8<0F8X5Enable GIF animationSettingsDialog0?CAB8 C<5AB> 70B20@0Z0 :040 X5 CG8B0=0 A;8:0 87 :><0=4=5 ;8=8X5?Exit instead of closing, when image is loaded from command lineSettingsDialog,@8;03>48 25;8:5 A;8:5Fit Large ImagesSettingsDialog(@8;03>48 <0Z5 A;8:5Fit Small ImagesSettingsDialog?[5=8B>GeneralSettingsDialog !;8:5ImagesSettingsDialog"@0B8F5 B0AB0BC@5Keyboard ShortcutsSettingsDialogBoja natpisa: Label color:SettingsDialogj@>X AB@0=8F0 <8=8X0BC@=8E A;8:0 40 A5 CG8B0 C=0?@54:(Number of thumbnail pages to read ahead:SettingsDialog #@54COKSettingsDialogB2>@8 D0X; Open FileSettingsDialog>AB02:5 PreferencesSettingsDialog 0?0<B8 ?>A;54ZC Remember lastSettingsDialogJ >B8@0X A;8:5 ?@5<0 Exif >@8X5=B0F8X8*Rotate image according to Exif orientationSettingsDialog\ >B8@0X <8=8X0BC@=5 A;8:5 ?> Exif >@8X5=B0F8X8/Rotate thumbnails according to Exif orientationSettingsDialog<@8:068 8<5 A;8:5 C ?@53;540GCShow image file name in viewerSettingsDialog@8:068 >@838=0;=C 25;8G8=C A;8:0 :>X5 AC <0=Z5 >4 <8=8X0BC@=5 25;8G8=5G5B=0 D0AF8:;0Startup folderSettingsDialog2 072CF8 48A?@>?>@F8>=0;=>Stretch disproportionatelySettingsDialogR0<5=8 0:F8X5 ;52>3 8 A@54Z53 :;8:0 <8H5<.Swap mouse left-click and middle-click actionsSettingsDialog$8=8X0BC@=8 ?@8:07 ThumbnailsSettingsDialog@53;540GViewerSettingsDialog8#<>B0X ;8ABC A;8:0 ?@8 :@0XC1Wrap image list when reaching last or first imageSettingsDialogN"%1" X5 25[ C?>B@51Y5=> 70 "%2" 0:F8XC.("%1" is already assigned to "%2" action.ShortcutsTableViewh"%1" X5 >1@=CB> 70 ?@5G8F5 :>4 5:AB5@=8E 0?;8:0F8X0.8"%1" is reserved for shortcuts to external applications.ShortcutsTableView :F8X0ActionShortcutsTableView71@8H8 ?@5G8FCDelete shortcutShortcutsTableView>AB028 ?@5G8FC Set shortcutShortcutsTableView@5G8F5ShortcutShortcutsTableView%n A;8:0%n A;8:5%n A;8:0 %n image(s) ThumbView%n 4C?;8:0B%n 4C?;8:0B0%n 4C?;8:0B0%n duplicate(s) ThumbView%n A;8:0%n A;8:5%n A;8:0 %n image(s) ThumbView%n >@838=0;%n >@838=0;0%n >@838=0;0%n original(s) ThumbView @5H:0Error ThumbView<5 D0X;0 File name ThumbView D>@<0BFormat ThumbView#>?HB5=>General ThumbView>:0F8X0Location ThumbView530?8:A5; Megapixel ThumbView>48D8F8@0=Modified ThumbView5<0 A;8:0 No images ThumbView 57>;CF8X0 Resolution ThumbViewH!:5=8@0= %1, ?@8:07CX5< %2 (%3 8 %4)%Scanned %1, displaying %2 (%3 and %4) ThumbView*"@068< 4C?;5 A;8:5...Searching duplicate images... ThumbView"701@0=> %1 >4 %2Selected %1 of%2 ThumbView5;8G8=0Size ThumbView ) , phototonic-1.7.20/translations/phototonic_sr.ts000066400000000000000000002112731271214516700217660ustar00rootroot00000000000000 AppMgmtDialog Manage External Applications Управљај екстерним апликацијама Name Име Application path and arguments Путања и аргументи апликације Choose Изабери Add manually Додај ручно Remove Уклони OK Уреду Choose Application Изабери апликацију New Application Нова апликација ColorsDialog Colors Боје Reset Поврати OK Уреду Hue Нијанса Saturation Засићеност Lightness Светлина Colorize Обоји Negative Негатив Red Црвена Green Зелена Blue Плава Hue and Saturation Нијанса и засићеност Affected Channels Popravi Погођени канали Brightness Светлост Contrast Контраст Brightness and Contrast Светлост и контраст Color Balance Баланс боја CopyMoveToDialog Move to... Помери у... Copy to... Копирај у... Browse... Прегледај... Remove Уклони Cancel Откажи OK Уреду Destination: Дестинација: Choose Folder Изабери фасциклу CpMvDialog Cancel Откажи Copying "%1" to "%2". Копирам "%1" у "%2". Moving "%1" to "%2". Померам "%1" у "%2". CropDialog Cropping Изрежи Reset Поврати OK Уреду Left Лево Right Десно Top Горе Bottom Доле ImageTags Image Tags Filter Филтер Tag Означи Untag Уклони ознаку New Tag Нова ознака Remove Tag Уклони ознаку Clear Filters Уклони филтере Negate Error Грешка Failed to save tags to Неуспело снимање ознаке Tagging Означивање Untagging Уклањање ознака Add a new tag Додај нову ознаку Enter new tag name Унеси име ознаке No name entered Име није унесено Tag Ознака already exists Већ постоји Remove selected tags(s)? Уклони изабрану ознаку(е)? Remove tag Уклони ознаку Yes Да Cancel Откажи ImageView Clipboard Клиборд Selection size: Величина селекције: No selection Без селекције Hold down the Ctrl key and select a region using the mouse. Држи Ctrl дугме притиснуто и изабери регију користећи миш. Saving... Снимам... Error Грешка Failed to save image. Грешка при снимању слике. Failed to save Exif metadata. Грешка при снимању Exif података. Image saved. Слика снимљена. Save image as Сними слику као Images Слике InfoView Copy Копирај Phototonic Image Info Информације о слици Zoom Уближи Mirroring Ово треба поправити Преслика (огледало) Transform Трансформиши View Поглед Top Горе Bottom Доле Close Image Затвори слику Full Screen Приказ преко целог екрана Preferences Поставке Exit Изађи Enlarge Thumbnails Повећај минијатурне приказе Shrink Thumbnails Уманњи минијатурне приказе Cut Изрежи Copy Копирај Copy to... Копирај у... Move to... Помери у... Delete Избриши Save Сними Save As Сними као Copy Image Data Копирај податке слике Paste Image Data Налепи податке слике Rename Преименуј Select All Означи све About О Name Име Time Време Size Величина Type Тип Reverse Обрни Show Hidden Files Прикажи скривене датотеке Show Labels Прикажи натписе Small Icons Мале иконе Hide Docks Title Bar Сакриј насловну траку сидрене траке Hide Dock Title Bars Show Toolbar Прикажи алатну траку Classic Thumbs Класичне минијатурне слике Compact Компактно Squarish Коцкасто Reload Учитај поново Include Sub-folders Укључи под-фасцикле Paste Here Налепи овде New Folder Нова фасцикла Back Назад Forward Напред Go Up Иди горе Home Почетна Slide Show Слајд приказ Next Следећa Previous Прошла First Прва Last Задња Random Насумична Open Отвори Load Clipboard Учитај клипборд Open With... Отвори помоћу... Manage External Applications Управљај екстерним апликацијама Add Bookmark Додај кратицу Remove Bookmark Уклони кратицу Zoom Out Удаљи Zoom In Уближи Reset Zoom Поврати зум Original Size Оригинална величина Keep Zoom Задржи зум Rotate 90 degree CCW Ротирај 90 степени супротно казаљци Rotate 90 degree CW Ротирај 90 степени у смеру казаљке Flip Horizontally Обрни хоризонтално Flip Vertically Обрни вертикално Cropping Изрежи Crop to Selection Изрежи селекцију Scale Image Промени величину слике Rotate 1 degree CCW Ротирај 1 степен супротно казаљци Rotate 1 degree CW ротирај 1 степен у смеру казаљке Colors Боје Find Duplicate Images Пронађи дупле слике Disable Искључено Dual Двоструко Triple Троструко Dual Vertical Двоструко вертикално Quad Четвероструко Lock Transformations Закључај трансформације Move Left Помери лево Move Right Помери десно Move Up Помери горе Move Down Помери доле Invert Selection Обрни селекцију Filter by Name Филтрирај по имену Set Path Постави путању &File &Фајл &Edit &Уреди &Go &Иди &View &Поглед Sort By Сортирај по &Tools &Алати &Help &Помоћ Edit Уреди Navigation Навигација Filter Филтер Image Слика Initializing... Покрећем... File System Фајл систем Bookmarks Картице Tags Ознаке <p>Image viewer and organizer</p> Прегледач и организатор слика Home page Почетна страница Bug reports Пријави грешке Error Грешка Failed to start external application. Грешка при покретању екстерне апликације. Invalid selection. Неваљала селекција. Failed to copy or move image. Неуспело копирање или померање слике. Minimum zoom Zoom %1% Уближи %1% Maximum zoom Zoom Reset Зум враћен Zoom Locked Зум закључан Zoom Unlocked Зум откључан Transformations Locked Трансформације закључане Transformations Unlocked Трансформације откључане Rotation %1° Ротација %1° Failed to open file "%1", file not found. Flipped Vertically Обрнуто вертикално Unflipped Vertically Необрнуто вертикално Flipped Horizontally Обрнуто хоризонтално Unflipped Horizontally Необрнуто хоризонтално No selection Без селекције Mirroring Disabled Пресликавање искључено Mirroring: Dual Пресликавање двоструко Mirroring: Triple Пресликавање троструко Mirroring: Dual Vertical Пресликавање двоструко вертикално Mirroring: Quad Пресликавање четвероструко Can not copy or move to Немогуће копирати или померити у Can not copy or move to the same folder Немогуће копирати или померити у исту фасциклу Copied Копирано Moved Померено %n image(s) %n слика %n слике %n слика Permanently delete Трајно избриши Delete image Избриши слику Yes Да Cancel Откажи Deleted Избрисано Failed to delete image Неуспело брисање слике Permanently delete selected images? Трајно избриши одабране слике? Delete images Избриши слике Failed to delete image. Неуспело брисање слике. Deleted Избрисано Invalid Path: Неваљала путања: Viewer Прегледач Docks and Toolbars Сидрене и алатне траке No images Нема слика Failed to open file "%1": file not found. неуспело отварање фајла "%1": фајл није пронађен. Slide show stopped Слајд приказ обустављен Stop Slide Show Обустани слајд приказ Slide show started Слајд приказ почет Can not move or copy images to this folder. Немогуће померити или копирати слике у ову фасциклу. Destination folder is same as source. Одредишна фасцикла је иста као и почетна. Move "%1" to "%2"? Помери "%1" у "%2"? Move folder Помери фасциклу Failed to move folder. Неуспело померање фасцикле. Folder moved Фасцикла померена Failed to open folder: неуспело отварање фасцикле: Duplicate images in %1 Дупле слике у %1 New name: Ново име: Invalid name entered. Неважеће име унесено. Failed to rename folder. Неуспело преименовање фасцикле. Invalid selection Неваљала селекција Rename Image Преименуј слику Enter a new name for "%1": Унеси ново име за "%1": No name entered. Име није унесено. Failed to rename image. Неуспело преименовање слике. Permanently delete "%1" and all of its contents? Трајно Избриши "%1" и сав садржај? Delete folder Избриши фасциклу Failed to delete folder. Неуспело брисање фасцикле. Removed "%1" Уклоњен "%1" New Sub folder Нова под-фасцикла New folder name: Ново име фасцикле: Failed to create new folder. Неуспело прављење нове фасцикле. Created "%1" Направљен "%1" Warning Пажња Cannot perform action with temporary image. Немогуће извести акцију са привременом сликом. ProgressDialog Cancel Откажи QObject Usage: phototonic [FILE or DIRECTORY]... Користи овако: phototonic [ФАЈЛ или ФАСЦИКЛА]... ResizeDialog Scale Image Промени величину слике Scale Можа има болја јединствена реч Увећај/Смањи Cancel Откажи Original size: Оригинална величина: Width: Ширина: Height: Висина: Units: Јединице: New size: Нова величина: Pixels Пиксели Percent Постотак Lock aspect ratio Закључај омер SettingsDialog Preferences Поставке Fit Large Images Прилагоди велике слике Disable Искључено By width or height По ширини или висини By width По ширини By height По висини Stretch disproportionately Развуци диспропорционално Fit Small Images Прилагоди мање слике Background color: Боја позадине: Exit instead of closing, when image is loaded from command line Напусти уместо затварања када је учитана слика из командне линије Wrap image list when reaching last or first image Ово дефинитивно поправити Умотај листу слика при крају Default quality when saving images: Стандардни квалитет при снимању слика: Enable GIF animation Укључи GIF анимације Rotate image according to Exif orientation Ротирај слике према Exif оријентацији Show image file name in viewer Прикажи име слике у прегледачу Label color: Boja natpisa: Background image: Позадинска слика: Add space between thumbnails: Додај размак између минијатурних приказа: Show original size of images smaller than the thumbnail size Поправити Прикажи оригиналну величину слика које су манње од минијатурне величине Number of thumbnail pages to read ahead: Број страница минијатурних слика да се учита унапред: Rotate thumbnails according to Exif orientation Ротирај минијатурне слике по Exif оријентацији Delay between slides in seconds: Размак између слајдова у секундама: Show random images Прикажи насумичне слике Startup folder Почетна фасцикла Default, or specified by command line argument Поправити Стандардни, или командном линиjom одређени аргумент Remember last Запамти последњу Specify: Одреди: Swap mouse left-click and middle-click actions Замени акције левог и средњег клика мишем Delete confirmation Потврда за брисање Keyboard Shortcuts Кратице тастатуре OK Уреду Cancel Откажи Viewer Прегледач Thumbnails Минијатурни приказ Slide Show Слајд приказ General Опћенито Choose Startup Folder Изабери почетну фасциклу Open File Отвори фајл Images Слике ShortcutsTableView Action Акција Shortcut Пречице Delete shortcut Избриши пречицу Set shortcut Постави пречицу "%1" is reserved for shortcuts to external applications. Дефинитивно поправити "%1" је обрнуто за пречице код екстерних апликација. "%1" is already assigned to "%2" action. Поправити "%1" је већ употребљено за "%2" акцију. ThumbView General Уопштено File name Име фајла Location Локација Size Величина Modified Модифициран Format формат Resolution Резолуција Megapixel Мегапиксел Error Грешка Selected %1 of%2 Изабрано %1 од %2 %n image(s) %n слика %n слике %n слика %n image(s) %n слика %n слике %n слика No images Нема слика Searching duplicate images... Тражим дупле слике... Scanned %1, displaying %2 (%3 and %4) Скениран %1, приказујем %2 (%3 и %4) %n original(s) %n оригинал %n оригинала %n оригинала %n duplicate(s) %n дупликат %n дупликата %n дупликата