pax_global_header00006660000000000000000000000064145465410770014527gustar00rootroot0000000000000052 comment=3f41ad837f11d57269ddf1cdd0e3742e1fe1df7b dde-store-1.2.5/000077500000000000000000000000001454654107700134225ustar00rootroot00000000000000dde-store-1.2.5/.github/000077500000000000000000000000001454654107700147625ustar00rootroot00000000000000dde-store-1.2.5/.github/workflows/000077500000000000000000000000001454654107700170175ustar00rootroot00000000000000dde-store-1.2.5/.github/workflows/builds.yml000066400000000000000000000041731454654107700210310ustar00rootroot00000000000000name: Build Check on: push: branches: [ master ] paths-ignore: [ '**.md' ] pull_request: branches: [ master ] workflow_dispatch: jobs: arch: name: Arch Linux runs-on: ubuntu-latest container: docker.io/library/archlinux:latest steps: - name: Checkout branch uses: actions/checkout@v2 - name: Update packages run: pacman -Syu --noconfirm - name: Install build dependencies run: pacman -S --noconfirm base-devel cmake ninja qt5-base qt5-tools dtkwidget appstream-qt5 packagekit-qt5 - name: CMake and Make run: | mkdir build cd build cmake ../ -G Ninja ninja debian: name: Debian runs-on: ubuntu-latest container: docker.io/library/debian:unstable steps: - name: Checkout branch uses: actions/checkout@v2 - name: Refresh repos run: apt-get update - name: Install build dependencies run: DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential cmake ninja-build pkg-config qtbase5-dev libdtkwidget-dev libdtkcore-dev libdtkgui-dev libpackagekitqt5-dev libappstreamqt5-dev libsnapd-qt-dev qttools5-dev - name: CMake and Make run: | mkdir build cd build cmake ../ -G Ninja ninja ubuntudde: name: UbuntuDDE runs-on: ubuntu-latest container: docker.io/library/ubuntu:24.04 steps: - name: Checkout branch uses: actions/checkout@v2 - name: Refresh repos run: apt-get update - name: Add UbuntuDDE PPA run: | apt-get -y install software-properties-common add-apt-repository -y ppa:ubuntudde-dev/stable apt-get update - name: Install build dependencies run: DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential cmake ninja-build pkg-config qtbase5-dev libdtkwidget-dev libdtkcore-dev libdtkgui-dev libpackagekitqt5-dev libappstreamqt5-dev (>= 1.0.0~) libsnapd-qt-dev qttools5-dev - name: CMake and Make run: | mkdir build cd build cmake ../ -G Ninja ninja dde-store-1.2.5/.gitignore000066400000000000000000000000361454654107700154110ustar00rootroot00000000000000/.vscode /Makefile /build *.qmdde-store-1.2.5/CMakeLists.txt000066400000000000000000000040201454654107700161560ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.0) project(dde-store) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_CCX_STANDARD 11) set(CMAKE_CCX_STANDARD_REQUIRED ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(PkgConfig REQUIRED) find_package(Qt5 REQUIRED Core Widgets Network DBus Gui LinguistTools) find_package(Dtk REQUIRED Widget Gui) find_package(PackageKitQt5 REQUIRED) find_package(AppStreamQt5 1.0 REQUIRED) find_package(PkgConfig REQUIRED) include(FindPkgConfig) include(GNUInstallDirs) include_directories( ${PackageKitQt5_INCLUDE_DIR} ${AppStreamQt5_INCLUDE_DIRS} ) file(GLOB TS_FILES ./translations/*.ts) qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) file(GLOB SRC main.cpp mainwindow.cpp mainwindow.h pages/homepage.cpp pages/homepage.h pages/itempage.cpp pages/itempage.h pages/categorypage.cpp pages/categorypage.h pages/updatespage.cpp pages/updatespage.h backend/sourcemanager.cpp backend/sourcemanager.h backend/sources/packagekit/packagekitsource.cpp backend/sources/packagekit/packagekitsource.h backend/ratingshelper.cpp backend/ratingshelper.h backend/settings.cpp backend/settings.h widgets/gallery.cpp widgets/gallery.h widgets/stars.cpp widgets/stars.h widgets/list.cpp widgets/list.h resources/resources.qrc ) add_executable(${PROJECT_NAME} ${SRC} ${TS_FILES} ${QM_FILES} ) target_include_directories(${PROJECT_NAME} PUBLIC ${PackageKitQt5_INCLUDE_DIR} ${AppStreamQt5_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} ${DtkWidget_LIBRARIES} ${DtkCore_LIBRARIES} ${DtkGui_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES} ${PackageKitQt5_LIBRARIES} AppStreamQt5 ) add_subdirectory(backend/sources) set(CMAKE_INSTALL_PREFIX /usr) install(TARGETS dde-store DESTINATION bin) install(FILES ${QM_FILES} DESTINATION share/dde-store/translations) install(FILES resources/dde-store.desktop DESTINATION share/applications) dde-store-1.2.5/LICENSE000066400000000000000000001057571454654107700144460ustar00rootroot00000000000000 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 . dde-store-1.2.5/README.md000066400000000000000000000045101454654107700147010ustar00rootroot00000000000000

DDE Store

An app store for DDE built with DTK

🇪🇸 Español | 🇩🇪 Deutsch | 🇳🇱 Nederlands | 🇯🇵 日本語 | 🇩🇿 Taqbaylit | 🇹🇷 Türkçe | 🇸🇦 العربية | 🇧🇷 Português

## What is this? This app store is designed for use with the Deepin Desktop Environment on other distributions. The official Deepin store is built around Debian and a web view with the Deepin repos on it, making it incompatible with other distros. This store is built with PackageKit and AppStream, so it should work perfect on [almost](#deepin-distro) any distro! ## Deepin Distro This only applies to the official Deepin distro, not DDE in general. Deepin does not support AppStream, which provides this app with all the needed data. **This store is not supported on the Deepin distribution.** This was intended for other distros running DDE anyways, so I have no plans on ever supporting it. If Deepin starts using AppStream, I may consider it. If you're running Deepin and looking for an alternative app store, check out some other awesome projects like [Spark Store](https://www.spark-app.store) or [Deepines Store](https://deepines.com)! ## Installation ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Building from source **Dependencies (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Building** ``` git clone https://github.com/UbuntuDDE/dde-store.git cd dde-store cmake . sudo make install ``` ## Contributions Pull requests are always welcome for bug fixes, improvements, translations, or anything else! ## License [GPLv3](LICENSE) dde-store-1.2.5/backend/000077500000000000000000000000001454654107700150115ustar00rootroot00000000000000dde-store-1.2.5/backend/ratingshelper.cpp000066400000000000000000000035631454654107700203730ustar00rootroot00000000000000#include "ratingshelper.h" #include #include #include #include #include #include RatingsHelper *RatingsHelper::currentInstance = nullptr; RatingsHelper *RatingsHelper::instance() { if (!currentInstance) { currentInstance = new RatingsHelper; } return currentInstance; } RatingsHelper::RatingsHelper() { QNetworkAccessManager *networkManager = new QNetworkAccessManager; QNetworkRequest request(QUrl("https://odrs.gnome.org/1.0/reviews/api/ratings")); networkManager->get(request); qDebug() << "[ RATINGS ] Fetching ratings..."; connect(networkManager, &QNetworkAccessManager::finished, this, [ = ] (QNetworkReply *reply) { QByteArray data = reply->readAll(); QJsonObject array = QJsonDocument::fromJson(data).object(); for (const QString &key : array.keys()) { ratingsList.insert(key, array.value(key).toObject()); } emit(fetched()); available = true; qDebug() << "[ RATINGS ] Ratings fetched"; disconnect(this, &RatingsHelper::fetched, nullptr, nullptr); }); } double RatingsHelper::averageRating(QString app) { double ratings = 0; ratings += ratingsList.value(app).value("star1").toInt(); ratings += ratingsList.value(app).value("star2").toInt() * 2; ratings += ratingsList.value(app).value("star3").toInt() * 3; ratings += ratingsList.value(app).value("star4").toInt() * 4; ratings += ratingsList.value(app).value("star5").toInt() * 5; double rating = floor((ratings / totalRatings(app) * 2) + 0.5) / 2; if (rating != rating) { rating = 0; } return rating; } int RatingsHelper::totalRatings(QString app) { int total = ratingsList.value(app).value("total").toInt(); if (total != total) { total = 0; } return total; }dde-store-1.2.5/backend/ratingshelper.h000066400000000000000000000007401454654107700200320ustar00rootroot00000000000000#ifndef RATINGSHELPER_H #define RATINGSHELPER_H #include #include #include class RatingsHelper : public QObject { Q_OBJECT public: static RatingsHelper *instance(); double averageRating(QString app); int totalRatings(QString app); bool available; private: static RatingsHelper *currentInstance; RatingsHelper(); QHash ratingsList; signals: void fetched(); }; #endif // RATINGSHELPER_Hdde-store-1.2.5/backend/settings.cpp000066400000000000000000000056621454654107700173660ustar00rootroot00000000000000#include "settings.h" #include #include #include #include settings *settings::currentInstance = nullptr; settings *settings::instance() { if (!currentInstance) { currentInstance = new settings; } return currentInstance; } settings::settings() : QObject(qApp) { QString path = QString("%1/%2/%3/config.conf") .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)) .arg(qApp->organizationName()) .arg(qApp->applicationName()); Dtk::Core::QSettingBackend *backend = new QSettingBackend(path); appsettings = DSettings::fromJsonFile("://settings.json"); appsettings->setBackend(backend); appsettings->option("basic.view.nonapps")->setData("items", QStringList({tr("\"System Updates\""), tr("Individual Packages")})); appsettings->option("basic.behaviour.updatetime")->setData("items", QStringList({tr("Hourly"), tr("Never")})); } int settings::maxItems() { return appsettings->option("basic.view.maxitems")->value().toInt(); } int settings::nonApps() { return appsettings->option("basic.view.nonapps")->value().toInt(); } bool settings::notifyInstall() { return appsettings->option("basic.notifications.install")->value().toBool(); } bool settings::notifyUninstall() { return appsettings->option("basic.notifications.uninstall")->value().toBool(); } bool settings::notifyAvailableUpdates() { return appsettings->option("basic.notifications.availableupdates")->value().toBool(); } bool settings::notifyFinishedUpdates() { return appsettings->option("basic.notifications.finishedupdates")->value().toBool(); } bool settings::tray() { return appsettings->option("basic.behaviour.tray")->value().toBool(); } bool settings::remembered() { return appsettings->option("basic.behaviour.remember")->value().toBool(); } int settings::updateTime() { return appsettings->option("basic.behaviour.updatetime")->value().toInt(); } void settings::setValue(QString key, QVariant value) { appsettings->setOption(key, value); appsettings->sync(); } void GenerateSettingTranslate() { auto group_basicName = QObject::tr("Basic"); auto group_basic_viewName = QObject::tr("View"); auto group_basic_behaviourName = QObject::tr("Behaviour"); auto group_basic_notificationsName = QObject::tr("Notifications"); auto basic_view_nonapps = QObject::tr("Show non-app updates as"); auto basic_view_maxitems = QObject::tr("Max apps per list"); auto basic_behaviour_tray = QObject::tr("Minimize to tray on exit"); auto basic_behaviour_updatetime = QObject::tr("Check for updates"); auto basic_notifications_install = QObject::tr("App installed"); auto basic_notifications_uninstall = QObject::tr("App uninstalled"); auto basic_notifications_availableupdates = QObject::tr("Available updates"); auto basic_notifications_finishedupdates = QObject::tr("Finished updates"); }dde-store-1.2.5/backend/settings.h000066400000000000000000000011021454654107700170140ustar00rootroot00000000000000#ifndef SETTINGS_H #define SETTINGS_H #include #include DCORE_USE_NAMESPACE class settings : public QObject { Q_OBJECT public: static settings *instance(); DSettings *appsettings; int maxItems(); int nonApps(); bool notifyInstall(); bool notifyUninstall(); bool notifyAvailableUpdates(); bool notifyFinishedUpdates(); bool tray(); bool remembered(); int updateTime(); void setValue(QString key, QVariant value); private: static settings *currentInstance; settings(); }; #endif // SETTINGS_Hdde-store-1.2.5/backend/sourcemanager.cpp000066400000000000000000000023741454654107700203560ustar00rootroot00000000000000#include "sourcemanager.h" #include "sources/packagekit/packagekitsource.h" #include #include #include DWIDGET_USE_NAMESPACE SourceManager *SourceManager::currentInstance = nullptr; SourceManager *SourceManager::instance() { if (!currentInstance) currentInstance = new SourceManager; return currentInstance; } SourceManager::SourceManager() { QPluginLoader *loader = new QPluginLoader("dde-store/snapplugin"); if (loader->load()) m_sources << qobject_cast(loader->instance()); m_sources << new PackageKitSource; } QList SourceManager::sources() { return m_sources; } Source *SourceManager::getSource(QString name) { for (Source *source : m_sources) { if (source->name() == name) return source; } return nullptr; } bool SourceManager::preventingClose() { for (Source *source : m_sources) { if (source->preventingClose) return true; } return false; } void Source::error(QString text) { qDebug() << "[ ERROR ]" << name() + " - " + text; DDialog dialog(name() + " Error", text); dialog.setIcon(DStyle().standardIcon(QStyle::SP_MessageBoxCritical)); dialog.addButton("OK"); dialog.exec(); } dde-store-1.2.5/backend/sourcemanager.h000066400000000000000000000036571454654107700200300ustar00rootroot00000000000000#ifndef SOURCE_H #define SOURCE_H #include #include struct App; class Source : public QObject { Q_OBJECT public: virtual QString name() = 0; virtual void getInstalled() = 0; virtual void getUpdates(bool refreshCache = false) = 0; virtual void getFullData(App *app) = 0; virtual void install(App *app) = 0; virtual void uninstall(App *app) = 0; virtual void launch(App *app) = 0; virtual void search(QString query) = 0; virtual void update() = 0; virtual QStringList urlSchemes() = 0; virtual App *appFromUrl(QUrl url) = 0; void error(QString text); bool preventingClose = false; signals: void gotInstalled(QList installed); void gotUpdates(QList updates); void gotFullData(App *app); void percentageChanged(App *app, int percentage); void installFinished(App *app); void uninstallFinished(App *app); void searchFinished(QList results); void updateFinished(); void stateChanged(App *app); }; Q_DECLARE_INTERFACE(Source, "org.dekzi.dde-store.SourceInterface") struct App { Source *source; QString id; QString package; QString name; QIcon icon; QString description; QString developer; QList screenshots; int ratings; qulonglong downloadSize; bool fullData = false; bool hasMetadata; enum State { Installed, Installing, NotInstalled, Launchable } state; void install() { source->install(this); }; void uninstall() { source->uninstall(this); }; void launch() { source->launch(this); }; void getFullData() { source->getFullData(this); }; }; class SourceManager : public QObject { Q_OBJECT public: static SourceManager *instance(); QList sources(); Source *getSource(QString name); bool preventingClose(); private: SourceManager(); static SourceManager *currentInstance; QList m_sources; }; #endif // SOURCE_Hdde-store-1.2.5/backend/sources/000077500000000000000000000000001454654107700164745ustar00rootroot00000000000000dde-store-1.2.5/backend/sources/CMakeLists.txt000066400000000000000000000002171454654107700212340ustar00rootroot00000000000000find_package(Snapd QUIET) option(BUILD_SNAP "Build with Snap support" "ON") if (BUILD_SNAP AND Snapd_FOUND) add_subdirectory(snap) endif() dde-store-1.2.5/backend/sources/packagekit/000077500000000000000000000000001454654107700205775ustar00rootroot00000000000000dde-store-1.2.5/backend/sources/packagekit/packagekitsource.cpp000066400000000000000000000241401454654107700246300ustar00rootroot00000000000000#include "packagekitsource.h" #include "backend/settings.h" #include "backend/ratingshelper.h" #include
#include #include #include #include #include using namespace PackageKit; using namespace AppStream; PackageKitSource::PackageKitSource() { AppStream::Pool pool; if (!pool.load()) Source::error(tr("ERROR: Unable to open AppStream metadata pool") + " - " + pool.lastError()); for (const Component & app : pool.componentsByKind(AppStream::Component::KindDesktopApp)) { for (const QString & pkgName : app.packageNames()) { metadata.insert(pkgName, app); } } connect(RatingsHelper::instance(), &RatingsHelper::fetched, this, [ = ] { for (App *app : ratingsQueue) app->ratings = RatingsHelper::instance()->totalRatings(app->id); ratingsQueue.clear(); }); Daemon::global()->setHints(QStringList() << QStringLiteral("interactive=true")); } QString PackageKitSource::name() { return "PackageKit"; } void PackageKitSource::getInstalled() { Transaction *transaction = Daemon::getPackages(Transaction::FilterInstalled | Transaction::FilterApplication); QList *installed = new QList(); connect(transaction, &Transaction::errorCode, this, &PackageKitSource::error); connect(transaction, &Transaction::package, this, [ = ] (Transaction::Info info, const QString &packageID) { if (metadata.contains(Daemon::packageName(packageID))) installed->append(getData(Daemon::packageName(packageID), true)); }); connect(transaction, &Transaction::finished, this, [ = ] { if (RatingsHelper::instance()->available) emit(gotInstalled(*installed)); else connect(RatingsHelper::instance(), &RatingsHelper::fetched, this, [ = ] { emit(gotInstalled(*installed)); }); }); } void PackageKitSource::getUpdates(bool refreshCache) { if (refreshCache) { connect(Daemon::refreshCache(false), &Transaction::finished, this, &Source::getUpdates); return; } Transaction *transaction = Daemon::getUpdates(); updates.clear(); connect(transaction, &Transaction::errorCode, this, &PackageKitSource::error); connect(transaction, &Transaction::package, this, [ = ] (Transaction::Info info, const QString &packageID) { updates.insert(packageID, getData(Daemon::packageName(packageID))); }); connect(transaction, &Transaction::finished, this, [ = ] { Transaction *getDetails = Daemon::getDetails(updates.keys()); connect(getDetails, &Transaction::details, this, [ = ] (const Details &values) { updates[values.packageId()]->downloadSize = values.size(); }); connect(getDetails, &Transaction::finished, this, [ = ] { emit(gotUpdates(updates.values())); }); }); } void PackageKitSource::getCategory(QString category) { QList items; for (QString key : metadata.keys()) { if (items.length() >= settings::instance()->maxItems()) break; if (metadata.value(key).categories().contains(category)) items << getData(key, true); } if (RatingsHelper::instance()->available) emit(gotCategory(category, items)); else connect(RatingsHelper::instance(), &RatingsHelper::fetched, this, [ = ] { emit(gotCategory(category, items)); }); } void PackageKitSource::getFullData(App *app) { if (metadata.contains(app->package)) { const Component data = metadata.value(app->package); app->developer = data.developer().name(); app->description = data.description(); for (Screenshot screenshot : data.screenshotsAll()) { for (Image image : screenshot.images()) { if (image.kind() == Image::KindSource) app->screenshots << image.url(); } } if (app->ratings == 0) app->ratings = RatingsHelper::instance()->totalRatings(app->id); } Transaction *resolve = Daemon::resolve(app->package); connect(resolve, &Transaction::package, this, [ = ] (Transaction::Info info, const QString &packageID) { app->state = info == Transaction::InfoInstalled ? App::Installed : App::NotInstalled; Transaction *getDetails = Daemon::getDetails(packageID); connect(getDetails, &Transaction::details, this, [ = ] (const Details &values) { app->downloadSize = values.size(); }); connect(getDetails, &Transaction::finished, this, [ = ] { app->fullData = true; emit(gotFullData(app)); }); }); } void PackageKitSource::install(App *app) { preventingClose = true; Transaction *getID = Daemon::resolve(app->package); connect(getID, &Transaction::package, this, [ = ] (Transaction::Info info, const QString &packageID) { Transaction *transaction = Daemon::installPackage(packageID); app->state = App::Installing; emit(stateChanged(app)); connect(transaction, &Transaction::errorCode, this, &PackageKitSource::error); connect(transaction, &Transaction::percentageChanged, this, [ = ] { if (transaction->percentage() <= 100) emit(percentageChanged(app, transaction->percentage())); }); connect(transaction, &Transaction::finished, this, [ = ] { app->state = App::Installed; emit(stateChanged(app)); emit(installFinished(app)); preventingClose = false; }); }); } void PackageKitSource::uninstall(App *app) { preventingClose = true; Transaction *getID = Daemon::resolve(app->package); connect(getID, &Transaction::package, this, [ = ] (Transaction::Info info, const QString &packageID) { Transaction *transaction = Daemon::removePackage(packageID); app->state = App::Installing; emit(stateChanged(app)); connect(transaction, &Transaction::errorCode, this, &PackageKitSource::error); connect(transaction, &Transaction::percentageChanged, this, [ = ] { if (transaction->percentage() <= 100) emit(percentageChanged(app, transaction->percentage())); }); connect(transaction, &Transaction::finished, this, [ = ](PackageKit::Transaction::Exit status, uint) { if (status == Transaction::ExitSuccess) { app->state = App::NotInstalled; emit(stateChanged(app)); emit(uninstallFinished(app)); } else { app->state = App::Installed; emit(stateChanged(app)); } preventingClose = false; }); }); } void PackageKitSource::search(QString query) { QList results; for (QString key : metadata.keys()) { if (results.length() >= settings::instance()->maxItems()) break; Component component = metadata.value(key); bool noMatch = false; for (QString item : query.split(QRegExp("\\s"), Qt::SkipEmptyParts)) { if (!component.name().contains(item, Qt::CaseInsensitive) && !component.description().contains(item, Qt::CaseInsensitive)) noMatch = true; } if (!noMatch) results << getData(key); } if (RatingsHelper::instance()->available) emit(searchFinished(results)); else connect(RatingsHelper::instance(), &RatingsHelper::fetched, this, [ = ] { emit(searchFinished(results)); }); } void PackageKitSource::launch(App *app) { } void PackageKitSource::update() { preventingClose = true; Transaction *transaction = Daemon::updatePackages(updates.keys()); connect(transaction, &Transaction::errorCode, this, &PackageKitSource::error); connect(transaction, &Transaction::itemProgress, this, [ = ] (const QString &packageID, Transaction::Status, uint percent) { if (percent <= 100) emit(percentageChanged(updates[packageID], percent)); }); connect(transaction, &Transaction::finished, this, [ = ] { emit(updateFinished()); preventingClose = false; }); } QStringList PackageKitSource::urlSchemes() { return { "appstream" }; } App *PackageKitSource::appFromUrl(QUrl url) { QString id(QUrl::fromLocalFile(url.toString()).fileName()); QString shortId; if (id.endsWith(".desktop")) shortId = id.left(id.lastIndexOf(".")); for (QString key : metadata.keys()) { if (metadata[key].id() == id || metadata[key].id() == shortId) return getData(key); } return nullptr; } void PackageKitSource::error(Transaction::Error code, const QString &text) { Source::error(QVariant::fromValue(code).toString() + " - " + text); } App *PackageKitSource::getData(QString package, bool fetchRatings) { App *app = new App(); if (metadata.contains(package)) { const Component data = metadata.value(package); app->name = data.name(); app->id = data.id(); if (fetchRatings) { if (RatingsHelper::instance()->available) app->ratings = RatingsHelper::instance()->totalRatings(app->id); else ratingsQueue << app; } for (Icon icon : data.icons()) { if (icon.kind() == Icon::KindStock) { app->icon = QIcon::fromTheme(icon.name()); if (!app->icon.isNull()) break; } } if (app->icon.isNull()) { Icon packageIcon = data.icon(QSize(64, 64)); app->icon.addFile(packageIcon.url().toLocalFile(), packageIcon.size()); } } app->package = package; app->source = this; app->hasMetadata = metadata.contains(package); if (app->name.isEmpty()) app->name = package; if (app->icon.isNull()) app->icon = QIcon::fromTheme("application-x-executable"); return app; } App *PackageKitSource::getDataFromID(QString ID) { for (QString key : metadata.keys()) { if (metadata.value(key).id() == ID) return getData(key); } return getData(ID); } dde-store-1.2.5/backend/sources/packagekit/packagekitsource.h000066400000000000000000000020731454654107700242760ustar00rootroot00000000000000#ifndef PACKAGEKITSOURCE_H #define PACKAGEKITSOURCE_H #include "backend/sourcemanager.h" #include #include class PackageKitSource : public Source { Q_OBJECT public: PackageKitSource(); QString name() override; void getInstalled() override; void getUpdates(bool refreshCache) override; void getCategory(QString category); App *getData(QString package, bool fetchRatings = false); App *getDataFromID(QString ID); void getFullData(App *app) override; void install(App *app) override; void uninstall(App *app) override; void launch(App *app) override; void search(QString query) override; void update() override; QStringList urlSchemes() override; App *appFromUrl(QUrl url) override; signals: void gotCategory(QString category, QList items); private: void error(PackageKit::Transaction::Error code, const QString &text); QHash updates; QHash metadata; QList ratingsQueue; }; #endif // PACKAGEKITSOURCE_Hdde-store-1.2.5/backend/sources/snap/000077500000000000000000000000001454654107700174355ustar00rootroot00000000000000dde-store-1.2.5/backend/sources/snap/CMakeLists.txt000066400000000000000000000010531454654107700221740ustar00rootroot00000000000000add_library(snapplugin MODULE snapsource.cpp ../../sourcemanager.h ../../ratingshelper.h) target_link_libraries(snapplugin Qt5::Core Qt5::Widgets Qt5::Network ${DtkWidget_LIBRARIES} Snapd::Core) get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake LOCATION) execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS OUTPUT_VARIABLE QT_INSTALL_PLUGINS OUTPUT_STRIP_TRAILING_WHITESPACE ) install(TARGETS snapplugin DESTINATION ${QT_INSTALL_PLUGINS}/dde-store) install(FILES dde-store-snapplugin.desktop DESTINATION /usr/share/applications) dde-store-1.2.5/backend/sources/snap/dde-store-snapplugin.desktop000066400000000000000000000002621454654107700250740ustar00rootroot00000000000000[Desktop Entry] Name=DDE Store Icon=deepin-app-store Exec=/usr/bin/dde-store %U Type=Application Categories=System;PackageManager; MimeType=x-scheme-handler/snap; NoDisplay=true dde-store-1.2.5/backend/sources/snap/snapsource.cpp000066400000000000000000000157421454654107700223340ustar00rootroot00000000000000#include "snapsource.h" #include "../../ratingshelper.h" #include #include #include #include #include #include SnapSource::SnapSource() : client(new QSnapdClient(this)) { } QString SnapSource::name() { return "Snap"; } void SnapSource::getInstalled() { auto request = client->getSnaps(); request->runAsync(); QList *apps = new QList; connect(request, &QSnapdRequest::complete, this, [ = ] { installed.clear(); for (int i = 0; i < request->snapCount(); i++) { apps->append(getData(request->snap(i))); installed << request->snap(i)->id(); } if (RatingsHelper::instance()->available) emit(gotInstalled(*apps)); else connect(RatingsHelper::instance(), &RatingsHelper::fetched, this, [ = ] { emit(gotInstalled(*apps)); }); }); } void SnapSource::getUpdates(bool refreshCache) { emit(gotUpdates(QList())); } void SnapSource::getFullData(App *app) { auto request = client->find(QSnapdClient::MatchName, app->package); request->runAsync(); connect(request, &QSnapdRequest::complete, this, [ = ] { QSnapdSnap *snap = request->snap(0); app->developer = snap->publisherDisplayName(); app->description = snap->description(); app->downloadSize = snap->downloadSize(); app->state = installed.contains(app->id) ? (app->hasMetadata ? App::Launchable : App::Installed) : App::NotInstalled; for (int i = 0; i < snap->mediaCount(); i++) { if (snap->media(i)->type() == "screenshot") app->screenshots << QUrl(snap->media(i)->url()); } app->fullData = true; emit(gotFullData(app)); }); } void SnapSource::install(App *app) { QSnapdInstallRequest *request; if (useClassic) { request = client->install(QSnapdClient::Classic, app->package); useClassic = false; } else { request = client->install(app->package); } request->runAsync(); preventingClose = true; app->state = App::Installing; emit(stateChanged(app)); connect(request, &QSnapdRequest::progress, this, [ = ] { int percent = 0; for (int i = 0; i < request->change()->taskCount(); i++) { percent += (100 * request->change()->task(i)->progressDone()) / request->change()->task(i)->progressTotal(); } percent /= qMax(request->change()->taskCount(), 1); emit(percentageChanged(app, percent)); }); connect(request, &QSnapdRequest::complete, this, [ = ] { if (request->error() == QSnapdRequest::NoError) { app->state = App::Installed; emit(stateChanged(app)); installed << app->id; } else if (request->error() == QSnapdRequest::NeedsClassic) { if (requestClassic() == 1) { useClassic = true; install(app); } } else { error(QVariant::fromValue(request->error()).toString() + " - " + request->errorString()); app->state = App::NotInstalled; emit(stateChanged(app)); } emit(installFinished(app)); preventingClose = false; }); } void SnapSource::uninstall(App *app) { auto request = client->remove(app->package); request->runAsync(); preventingClose = true; app->state = App::Installing; emit(stateChanged(app)); connect(request, &QSnapdRequest::progress, this, [ = ] { int percent = 0; for (int i = 0; i < request->change()->taskCount(); i++) { percent += (100 * request->change()->task(i)->progressDone()) / request->change()->task(i)->progressTotal(); } percent /= qMax(request->change()->taskCount(), 1); emit(percentageChanged(app, percent)); }); connect(request, &QSnapdRequest::complete, this, [ = ] { if (request->error() == QSnapdRequest::NoError) { app->state = App::NotInstalled; emit(stateChanged(app)); installed.removeAll(app->id); } else { error(QVariant::fromValue(request->error()).toString() + " - " + request->errorString()); app->state = App::Installed; emit(stateChanged(app)); } emit(uninstallFinished(app)); preventingClose = false; }); } void SnapSource::launch(App *app) { QProcess::startDetached("snap", { "run", app->package }); } void SnapSource::search(QString query) { auto request = client->find(query); request->runAsync(); QList *results = new QList; connect(request, &QSnapdRequest::complete, this, [ = ] { for (int i = 0; i < request->snapCount(); i++) { results->append(getData(request->snap(i))); } if (RatingsHelper::instance()->available) emit(searchFinished(*results)); else connect(RatingsHelper::instance(), &RatingsHelper::fetched, this, [ = ] { emit(searchFinished(*results)); }); }); } void SnapSource::update() { } QStringList SnapSource::urlSchemes() { return { "snap" }; } App *SnapSource::appFromUrl(QUrl url) { auto request = client->find(QSnapdClient::MatchCommonId, QUrl::fromLocalFile(url.toString()).fileName()); request->runSync(); return getData(request->snap(0)); } App *SnapSource::getData(QSnapdSnap *snap) { App *app = new App(); app->name = snap->title(); app->id = snap->id(); if (RatingsHelper::instance()->available) app->ratings = RatingsHelper::instance()->totalRatings(commonId(snap)); else ratingsQueue.insert(app, snap); if (snap->icon().startsWith("/")) { app->icon = QIcon(QPixmap(snap->icon())); } else if (snap->icon().isEmpty()) { app->icon = QIcon::fromTheme("application-x-executable"); } else { auto iconrequest = client->getIcon(app->package); iconrequest->runSync(); if (!iconrequest->error()) { QBuffer buffer; buffer.setData(iconrequest->icon()->data()); QImageReader reader(&buffer); reader.read(); app->icon = QIcon(QPixmap::fromImage(reader.read())); } } if (app->icon.isNull()) app->icon = QIcon::fromTheme("application-x-executable"); app->package = snap->name(); app->source = this; app->hasMetadata = snap->snapType() == QSnapdEnums::SnapTypeApp; return app; } QString SnapSource::commonId(QSnapdSnap *snap) { if (snap->commonIds().length() > 0) return snap->commonIds()[0]; return QString("io.snapcraft.%1-%2").arg(snap->name()).arg(snap->id()); } int SnapSource::requestClassic() { Dtk::Widget::DDialog dialog(tr("Classic mode required"), tr("This snap requires confinement to be disabled via classic mode")); dialog.setIcon(Dtk::Widget::DStyle().standardIcon(QStyle::SP_MessageBoxWarning)); dialog.addButton(tr("Cancel")); dialog.addButton(tr("Continue"), true, Dtk::Widget::DDialog::ButtonRecommend); return dialog.exec(); } dde-store-1.2.5/backend/sources/snap/snapsource.h000066400000000000000000000016511454654107700217730ustar00rootroot00000000000000#ifndef SNAPSOURCE_H #define SNAPSOURCE_H #include "../../sourcemanager.h" #include class SnapSource : public Source { Q_OBJECT Q_PLUGIN_METADATA(IID "org.dekzi.dde-store.SnapPlugin") Q_INTERFACES(Source) public: SnapSource(); QString name() override; void getInstalled() override; void getUpdates(bool refreshCache) override; void getFullData(App *app) override; void install(App *app) override; void uninstall(App *app) override; void launch(App *app) override; void search(QString query) override; void update() override; QStringList urlSchemes() override; App *appFromUrl(QUrl url) override; private: App *getData(QSnapdSnap *snap); QString commonId(QSnapdSnap *snap); int requestClassic(); QSnapdClient *client; bool useClassic = false; QStringList installed; QMap ratingsQueue; }; #endif // SNAPSOURCE_Hdde-store-1.2.5/debian/000077500000000000000000000000001454654107700146445ustar00rootroot00000000000000dde-store-1.2.5/debian/changelog000066400000000000000000000036061454654107700165230ustar00rootroot00000000000000dde-store (1.2.3) groovy; urgency=low * Added Japanese translation (by @MMP0) * Added Dutch translation (by @dutchdevil83) * Added Russian translation (by @thellage) * Added Kabyle translation (by @SelyanKab) * Bug fixes -- dekzi Sun, 26 Jul 2021 00:47:12 -0800 dde-store (1.2.2) groovy; urgency=medium * Added "appstream://" and "snap://" url handling * Bug fixes -- dekzi Mon, 22 Feb 2021 23:42:48 -0800 dde-store (1.2.1) groovy; urgency=low * Added Chinese translation (by @ShuiHuo) * Improved integration with additional backends (Snap) * Bug fixes -- dekzi Sun, 17 Jan 2021 13:58:09 -0800 dde-store (1.2.0) groovy; urgency=low * Added Snap support * Bug fixes -- dekzi Tue, 29 Dec 2020 22:32:20 -0800 dde-store (1.1.0) groovy; urgency=low * Added automatic hourly background update checking * Various performance improvements * Translation improvements * Bug fixes -- dekzi Sun, 13 Dec 2020 16:52:52 -0800 dde-store (1.0.4) groovy; urgency=medium * Bug fixes -- dekzi Mon, 07 Dec 2020 21:36:08 -0800 dde-store (1.0.3) groovy; urgency=low * Added Arabic translation (by @AhmadDakhlallah) * Bug fixes -- dekzi Mon, 30 Nov 2020 17:37:49 -0800 dde-store (1.0.2) groovy; urgency=medium * Added Turkish translation (by @candancelik) * Bug fixes -- dekzi Thu, 26 Nov 2020 23:07:38 -0800 dde-store (1.0.1) groovy; urgency=low * Added Spanish translation (by @Eboon-05) * Added German translation (by @Nesewebel) * Various bug fixes -- dekzi Wed, 25 Nov 2020 12:17:49 -0800 dde-store (1.0.0) groovy; urgency=low * Initial release -- dekzi Sun, 22 Nov 2020 16:17:00 -0800 dde-store-1.2.5/debian/compat000066400000000000000000000000031454654107700160430ustar00rootroot0000000000000010 dde-store-1.2.5/debian/control000066400000000000000000000007721454654107700162550ustar00rootroot00000000000000Source: dde-store Maintainer: dekzi Section: utils Priority: optional Standards-Version: 4.5.0 Build-Depends: debhelper (>=9), cmake, qtbase5-dev, libdtkwidget-dev, libdtkcore-dev, libdtkgui-dev, libpackagekitqt5-dev, libappstreamqt-dev, libsnapd-qt-dev, qttools5-dev, pkg-config, cmake-data, Homepage: https://github.com/dekzi/dde-store Package: dde-store Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: DDE Store An app store for DDE built with DTK dde-store-1.2.5/debian/copyright000066400000000000000000000020261454654107700165770ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: dde-store Upstream-Contact: dekzi Source: https://github.com/dekzi/dde-store Files: * Copyright: 2020 dekzi License: GPL-3+ License: GPL-3+ This package 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 compete text of the GNU General Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". dde-store-1.2.5/debian/rules000077500000000000000000000000361454654107700157230ustar00rootroot00000000000000#!/usr/bin/make -f %: dh $@ dde-store-1.2.5/debian/source/000077500000000000000000000000001454654107700161445ustar00rootroot00000000000000dde-store-1.2.5/debian/source/format000066400000000000000000000000151454654107700173530ustar00rootroot000000000000003.0 (native) dde-store-1.2.5/main.cpp000066400000000000000000000031741454654107700150570ustar00rootroot00000000000000#include "mainwindow.h" #include "backend/sourcemanager.h" #include #include #include #include #include #include DWIDGET_USE_NAMESPACE int main(int argc, char *argv[]) { DApplication app(argc, argv); QCommandLineParser parser; parser.addHelpOption(); parser.addPositionalArgument("url", "Appstream url of an app to open"); parser.process(app); if (app.setSingleInstance("dde-store")) { app.loadTranslator(); app.setApplicationName("dde-store"); app.setOrganizationName("dekzi"); app.setAttribute(Qt::AA_UseHighDpiPixmaps); DAboutDialog about; app.setAboutDialog(&about); about.setProductIcon(QIcon::fromTheme("deepin-app-store")); about.setProductName("DDE Store"); about.setDescription(qApp->translate("main", "An app store for DDE built with DTK") + "
" + qApp->translate("main", "Created by %1").arg("dekzi") + "

https://github.com/dekzi/dde-store"); about.setVersion("1.2.3"); MainWindow w; Dtk::Widget::moveToCenter(&w); w.show(); if (!parser.positionalArguments().isEmpty()) { QUrl url(parser.positionalArguments()[0]); for (Source *source : SourceManager::instance()->sources()) { if (source->urlSchemes().contains(url.scheme()) && source->appFromUrl(url)) w.openItem(source->appFromUrl(url)); } } return app.exec(); } return 0; } dde-store-1.2.5/mainwindow.cpp000066400000000000000000000270551454654107700163130ustar00rootroot00000000000000#include "mainwindow.h" #include "pages/homepage.h" #include "pages/updatespage.h" #include "backend/settings.h" #include "pages/categorypage.h" #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : DMainWindow(parent) { this->setMinimumSize(950, 600); QWidget *centralWidget = new QWidget; QHBoxLayout *layout = new QHBoxLayout; layout->setContentsMargins(0, 0, 0, 0); centralWidget->setLayout(layout); setCentralWidget(centralWidget); // Initialize updates page here so tray button works UpdatesPage *updates = new UpdatesPage(this); updatesPage = updates; updateIndicator = new DViewItemAction(Qt::AlignVCenter, QSize(16, 16), QSize(16, 16), false); updateIndicator->setIcon(QIcon("://icons/indicator.svg")); updateIndicator->setVisible(false); // Initialize tray item and buttons trayIcon = new QSystemTrayIcon(QIcon::fromTheme("deepin-app-store")); DMenu *trayIconMenu = new DMenu; QAction *checkUpdatesAction = new QAction(tr("Check for updates")); QAction *quitAction = new QAction(tr("Quit")); trayIconMenu->addActions({checkUpdatesAction, quitAction}); trayIcon->setContextMenu(trayIconMenu); trayIcon->setToolTip("DDE Store"); // Set up button actions connect(quitAction, &QAction::triggered, this, &MainWindow::close); connect(updates, &UpdatesPage::cantRefresh, this, [ = ] { checkUpdatesAction->setDisabled(true); }); connect(updates, &UpdatesPage::canRefresh, this, [ = ] { checkUpdatesAction->setDisabled(false); }); connect(checkUpdatesAction, &QAction::triggered, updates, [ = ] { updates->refresh(true); }); connect(trayIcon, &QSystemTrayIcon::activated, this, [ = ] { show(); trayIcon->hide(); }); stackedWidget = new QStackedWidget(this); // Initialize sidebar (navView) and titlebar initTitlebar(); initNav(); layout->addWidget(navView, 1); layout->addWidget(stackedWidget, 7); } void MainWindow::initTitlebar() { DTitlebar *titlebar = this->titlebar(); titlebar->setIcon(QIcon::fromTheme("deepin-app-store")); // Create back button backButton = new DButtonBoxButton(DStyle::SP_ArrowLeave); backButton->setDisabled(true); backButton->setFixedSize(36, 36); connect(backButton, &DButtonBoxButton::clicked, this, [ = ] { pageHistoryIndex -= 1; buttonNavigated = true; stackedWidget->setCurrentWidget(pageHistory[pageHistoryIndex]); // If the new current page has an entry in the sidebar then select that entry if (pageHistoryIndex < navModel->rowCount()) navView->setCurrentIndex(navModel->index(stackedWidget->indexOf(pageHistory[pageHistoryIndex]), 0)); }); // Create forward button forwardButton = new DButtonBoxButton(DStyle::SP_ArrowEnter); forwardButton->setDisabled(true); forwardButton->setFixedSize(36, 36); connect(forwardButton, &DButtonBoxButton::clicked, this, [ = ] { // The same as back button, just increases the index rather than decreasing it pageHistoryIndex += 1; buttonNavigated = true; stackedWidget->setCurrentWidget(pageHistory[pageHistoryIndex]); if (pageHistoryIndex < navModel->rowCount()) navView->setCurrentIndex(navModel->index(stackedWidget->indexOf(pageHistory[pageHistoryIndex]), 0)); }); // Initialize the button box and add the buttons DButtonBox *buttonBox = new DButtonBox(this); buttonBox->setButtonList({backButton, forwardButton}, false); buttonBox->setFocusPolicy(Qt::NoFocus); titlebar->addWidget(buttonBox, Qt::AlignLeft); // Create search box DSearchEdit *searchBox = new DSearchEdit(this); searchBox->setFixedWidth(300); titlebar->addWidget(searchBox); connect(searchBox, &DSearchEdit::returnPressed, this, [ = ] { // Create a new category page for the search CategoryPage *page = new CategoryPage(this, QString("\"%1\"").arg(searchBox->text()), searchBox->text()); // Open it stackedWidget->addWidget(page); stackedWidget->setCurrentWidget(page); // Clear the sidebar selection navView->setCurrentIndex(QModelIndex()); navView->clearSelection(); }); connect(searchBox, &DSearchEdit::searchAborted, this, [ = ] { // Go to homepage when search aborted navView->setCurrentIndex(navModel->index(0, 0)); stackedWidget->setCurrentIndex(0); }); titlebar->setMenu(new QMenu(titlebar)); QAction *settingsAction = new QAction(tr("Settings"), this); titlebar->menu()->addAction(settingsAction); connect(titlebar->menu(), &QMenu::triggered, this, [ = ] (QAction *action) { if (action == settingsAction) { DSettingsDialog *dialog = new DSettingsDialog; dialog->updateSettings(settings::instance()->appsettings); dialog->exec(); } }); } void MainWindow::initNav() { // Set up list navView->setViewportMargins(QMargins(10, 10, 10, 10)); navView->setMinimumWidth(188); navView->setSpacing(0); navView->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); navView->setIconSize(QSize(28, 28)); navView->setItemSize(QSize(168, 56)); navView->setAutoFillBackground(true); navView->setModel(navModel); navView->setEditTriggers(QListView::NoEditTriggers); // Add entries addPage(tr("Home"), "home.svg", new HomePage(this)); addPage(tr("Messaging"), "chat.svg", new CategoryPage(this, tr("Messaging"), "InstantMessaging")); addPage(tr("Internet"), "internet.svg", new CategoryPage(this, tr("Internet"), "Network")); addPage(tr("Games"), "games.svg", new CategoryPage(this, tr("Games"), "Game")); addPage(tr("Development"), "development.svg", new CategoryPage(this, tr("Development"), "Development")); addPage(tr("Office"), "office.svg", new CategoryPage(this, tr("Office"), "Office")); addPage(tr("Graphics"), "graphics.svg", new CategoryPage(this, tr("Graphics"), "Graphics")); addPage(tr("Video"), "video.svg", new CategoryPage(this, tr("Video"), "Video")); addPage(tr("Music"), "music.svg", new CategoryPage(this, tr("Music"), "Music")); addPage(tr("System"), "system.svg", new CategoryPage(this, tr("System"), "System")); addPage(tr("Installed"), "installed.svg", new CategoryPage(this, tr("Installed"), "Installed")); addPage(tr("Updates"), "updates.svg", updatesPage); updateIcons(); // When the current entry is changed connect(navView, qOverload(&DListView::currentChanged), this, [ = ] (const QModelIndex &previous) { updateIcons(); if (navView->currentIndex().row() != -1) stackedWidget->setCurrentIndex(navView->currentIndex().row()); if (!buttonNavigated) { // Add the page to history and increase index by 1 pageHistory << stackedWidget->currentWidget(); pageHistoryIndex += 1; // If the index isn't at the end of the history (the user pressed back) if (pageHistoryIndex != pageHistory.length() - 1) { // Remove all entries after this current one for (int i = 0; i < pageHistory.length() - pageHistoryIndex + 1; i++) { pageHistory.removeLast(); } pageHistory << stackedWidget->currentWidget(); pageHistoryIndex = pageHistory.length() - 1; } } else { buttonNavigated = false; } backButton->setDisabled(pageHistoryIndex < 1); forwardButton->setDisabled(pageHistoryIndex == pageHistory.length() - 1); }); // Select homepage by default navView->setCurrentIndex(navModel->index(0, 0)); connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &MainWindow::updateIcons); } void MainWindow::addPage(QString name, QString iconname, QWidget *widget) { DStandardItem *item = new DStandardItem(name); navModel->appendRow(item); pageIcons[name] = iconname; stackedWidget->addWidget(widget); if (qobject_cast(widget)) item->setActionList(Qt::Edge::RightEdge, {updateIndicator}); } void MainWindow::openItem(App *app) { // If the item page is in the list if (itemPageList.contains(app->id)) { // Open it stackedWidget->setCurrentWidget(itemPageList.value(app->id)); } else { // If not, create the page and add it to the list ItemPage *widget = new ItemPage(app); stackedWidget->addWidget(widget); stackedWidget->setCurrentWidget(widget); itemPageList.insert(app->id, widget); } navView->setCurrentIndex(QModelIndex()); navView->clearSelection(); } void MainWindow::closeEvent(QCloseEvent *event) { if (!trayIcon->isVisible()) { if (!settings::instance()->remembered()) { DDialog dialog; DRadioButton *exitButton = new DRadioButton(tr("Exit")); exitButton->setChecked(!settings::instance()->tray()); DRadioButton *minimizeButton = new DRadioButton(tr("Minimize to system tray")); minimizeButton->setChecked(settings::instance()->tray()); DCheckBox *rememberBox = new DCheckBox(tr("Do not ask again")); dialog.setTitle(tr("Please choose your action")); dialog.setIcon(QIcon::fromTheme("deepin-app-store")); dialog.addContent(exitButton); dialog.addContent(minimizeButton); dialog.addContent(rememberBox); dialog.addButton(tr("Cancel"), false, DDialog::ButtonNormal); dialog.addButton(tr("Confirm"), true, DDialog::ButtonRecommend); int index = dialog.exec(); if (index == 1) { if (rememberBox->isChecked()) { settings::instance()->setValue("basic.behaviour.remember", true); } if (exitButton->isChecked()) { settings::instance()->setValue("basic.behaviour.tray", false); } else if (minimizeButton->isChecked()) { settings::instance()->setValue("basic.behaviour.tray", true); event->ignore(); trayIcon->show(); hide(); } } else { event->ignore(); } } else { if (settings::instance()->tray()) { event->ignore(); trayIcon->show(); hide(); } } } if (SourceManager::instance()->preventingClose()) { DDialog dialog; dialog.setIcon(style()->standardIcon(QStyle::SP_MessageBoxCritical)); dialog.setTitle(tr("Cannot close while app is being installed")); dialog.addButton(tr("OK")); dialog.exec(); event->ignore(); } } void MainWindow::updateIcons() { auto type = DGuiApplicationHelper::instance()->themeType(); for (int i = 0; i < navModel->rowCount(); i++) { QString icon = pageIcons.value(navModel->item(i)->text()); if (type == DGuiApplicationHelper::LightType) icon = "://icons/" + QString(navView->currentIndex().row() == i ? "active/" : "light/") + icon; else icon = "://icons/dark/" + icon; if (navModel->item(i)->icon().name() != icon) navModel->item(i)->setIcon(QIcon(icon)); } } void MainWindow::setUpdateIndicatorVisible(bool value) { updateIndicator->setVisible(value); } dde-store-1.2.5/mainwindow.h000066400000000000000000000022161454654107700157500ustar00rootroot00000000000000#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include #include #include "pages/itempage.h" #include "backend/sourcemanager.h" DWIDGET_USE_NAMESPACE class MainWindow : public DMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); void openItem(App *app); void setUpdateIndicatorVisible(bool value); DListView *navView = new DListView; QStandardItemModel *navModel = new QStandardItemModel; private: void initNav(); void initTitlebar(); void addPage(QString name, QString icon, QWidget *widget); void updateIcons(); QStackedWidget *stackedWidget; QHash pageIcons; QHash itemPageList; DViewItemAction *updateIndicator; QList pageHistory; int pageHistoryIndex = 0; DButtonBoxButton *backButton; DButtonBoxButton *forwardButton; bool buttonNavigated = false; QSystemTrayIcon *trayIcon; QWidget *updatesPage; protected Q_SLOTS: void closeEvent(QCloseEvent *event); }; #endif // MAINWINDOW_H dde-store-1.2.5/pages/000077500000000000000000000000001454654107700145215ustar00rootroot00000000000000dde-store-1.2.5/pages/categorypage.cpp000066400000000000000000000103251454654107700177000ustar00rootroot00000000000000#include "pages/categorypage.h" #include "backend/sources/packagekit/packagekitsource.h" #include #include CategoryPage::CategoryPage(MainWindow *parent, QString name, QString category) { QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); this->setLayout(layout); list = new List(name); DLabel *sortLabel = new DLabel(tr("Sort by")); list->addHeaderWidget(sortLabel); QComboBox *sortBox = new QComboBox; QString sortAlphabetical = tr("Alphabetical"); QString sortRatings = tr("Ratings"); sortBox->addItems(QStringList() << sortAlphabetical << sortRatings); connect(sortBox, &QComboBox::currentTextChanged, this, [ = ] (const QString &text) { if (text == sortAlphabetical) { load(Alphabetical); } else if (text == sortRatings) { load(Ratings); } }); list->addHeaderWidget(sortBox); connect(list, &List::currentItemChanged, this, [ = ] (QVariant data) { for (App *app : apps) { if (app->id == data.toString()) { parent->openItem(app); break; } } }); layout->addWidget(list); init(category, name); } void CategoryPage::init(QString category, QString name) { if (category == "Installed") { for (Source *source : SourceManager::instance()->sources()) { connect(source, &Source::gotInstalled, this, [ = ] (QList installed) { for (App *app : installed) { insertItem(app); } if (SourceManager::instance()->sources().endsWith(source)) load(); else SourceManager::instance()->sources()[SourceManager::instance()->sources().indexOf(source) + 1]->getInstalled(); disconnect(source, &Source::gotInstalled, this, nullptr); }); } SourceManager::instance()->sources().first()->getInstalled(); } else if (name.startsWith("\"")) { list->setEmptyText(tr("No results for %1").arg(name)); for (Source *source : SourceManager::instance()->sources()) { connect(source, &Source::searchFinished, this, [ = ] (QList results) { if (SourceManager::instance()->sources().startsWith(source)) { list->clear(); apps.clear(); } for (App *app : results) { insertItem(app); } if (SourceManager::instance()->sources().endsWith(source)) load(); else SourceManager::instance()->sources()[SourceManager::instance()->sources().indexOf(source) + 1]->search(category); disconnect(source, &Source::searchFinished, this, nullptr); }); } SourceManager::instance()->sources().first()->search(category); } else { PackageKitSource *pk = static_cast(SourceManager::instance()->getSource("PackageKit")); connect(pk, &PackageKitSource::gotCategory, this, [ = ] (QString cat, QList items) { if (cat == category) { for (App *app : items) { insertItem(app); } load(); disconnect(pk, &PackageKitSource::gotCategory, this, nullptr); } }); pk->getCategory(category); } } void CategoryPage::insertItem(App *app) { list->addItem(app->name, app->icon, app->id); apps << app; } void CategoryPage::load(SortType sort) { list->clear(); if (sort == Alphabetical) { QMap map; for (App *app : apps) { map.insert(app->name.toLower(), app); } apps.clear(); for (App *app : map.values()) { insertItem(app); } } else { QMultiMap map; for (App *app : apps) { map.insert(app->ratings, app); } QList appList; for (App *app : map.values()) { appList.insert(0, app); } apps.clear(); for (App *app : appList) { insertItem(app); } } list->load(); }dde-store-1.2.5/pages/categorypage.h000066400000000000000000000007621454654107700173510ustar00rootroot00000000000000#ifndef LISTVIEW_H #define LISTVIEW_H #include "mainwindow.h" #include "widgets/list.h" #include class CategoryPage : public QWidget { Q_OBJECT public: enum SortType { Alphabetical, Ratings }; CategoryPage(MainWindow *parent, QString name, QString category); void insertItem(App *app); void load(SortType sort = Alphabetical); private: void init(QString category, QString name); QList apps; List *list; }; #endif // LISTVIEW_H dde-store-1.2.5/pages/homepage.cpp000066400000000000000000000057771454654107700170320ustar00rootroot00000000000000#include "pages/homepage.h" #include "backend/settings.h" #include "backend/sourcemanager.h" #include "backend/sources/packagekit/packagekitsource.h" #include "backend/ratingshelper.h" #include "widgets/gallery.h" #include "widgets/list.h" #include #include #include #include #include #include #include DWIDGET_USE_NAMESPACE HomePage::HomePage(MainWindow *parent) { QScrollArea *scroll = new QScrollArea(this); QWidget *widget = new QWidget; scroll->setWidget(widget); scroll->setWidgetResizable(true); scroll->setFrameShape(QFrame::NoFrame); layout = new QVBoxLayout; layout->setAlignment(Qt::AlignTop); widget->setLayout(layout); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->setMargin(0); mainLayout->setSpacing(0); setLayout(mainLayout); mainLayout->addWidget(scroll); addCategory(tr("Messaging"), "InstantMessaging", parent); addCategory(tr("Internet"), "Network", parent); addCategory(tr("Games"), "Game", parent); addCategory(tr("Development"), "Development", parent); addCategory(tr("Office"), "Office", parent); addCategory(tr("Graphics"), "Graphics", parent); addCategory(tr("Video"), "Video", parent); addCategory(tr("Music"), "Music", parent); addCategory(tr("System"), "System", parent); } void HomePage::addCategory(QString name, QString category, MainWindow *parent) { categories << category; List *list = new List(name); list->listView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); list->listView->setFixedHeight(168); list->listView->verticalScrollBar()->setEnabled(false); list->listView->verticalScrollBar()->setVisible(false); list->listView->setOrientation(QListView::LeftToRight, true); PackageKitSource *pk = static_cast(SourceManager::instance()->getSource("PackageKit")); QList *apps = new QList(); connect(pk, &PackageKitSource::gotCategory, this, [ = ] (QString cat, QList items) { if (cat == category) { QMultiMap map; for (App *app : items) { map.insert(app->ratings, app); } items.clear(); for (App *app : map.values()) { items.insert(0, app); } for (int i = 0; i < 10; i++) { list->addItem(items[i]->name, items[i]->icon, i); apps->append(items[i]); } list->load(); } }); pk->getCategory(category); DSuggestButton *moreBtn = new DSuggestButton(tr("View More")); connect(moreBtn, &DSuggestButton::clicked, this, [ = ] { parent->navView->setCurrentIndex(parent->navModel->index(categories.indexOf(category) + 1, 0)); }); list->addHeaderWidget(moreBtn); layout->addWidget(list); connect(list, &List::currentItemChanged, this, [ = ] (QVariant data) { parent->openItem(apps->value(data.toInt())); }); } dde-store-1.2.5/pages/homepage.h000066400000000000000000000005441454654107700164620ustar00rootroot00000000000000#ifndef HOMEPAGE_H #define HOMEPAGE_H #include #include #include "mainwindow.h" class HomePage : public QWidget { Q_OBJECT public: HomePage(MainWindow *parent); private: void addCategory(QString name, QString category, MainWindow *parent); QVBoxLayout *layout; QStringList categories; }; #endif // HOMEPAGE_Hdde-store-1.2.5/pages/itempage.cpp000066400000000000000000000120211454654107700170140ustar00rootroot00000000000000#include "pages/itempage.h" #include "backend/ratingshelper.h" #include "backend/settings.h" #include "widgets/gallery.h" #include "widgets/stars.h" #include #include #include ItemPage::ItemPage(App *app) { QScrollArea *scroll = new QScrollArea(this); QWidget *widget = new QWidget; scroll->setWidget(widget); scroll->setWidgetResizable(true); scroll->setFrameShape(QFrame::NoFrame); layout = new QVBoxLayout; layout->setAlignment(Qt::AlignTop); widget->setLayout(layout); this->app = app; QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->setMargin(0); mainLayout->setSpacing(0); setLayout(mainLayout); mainLayout->addWidget(scroll); spinner->setFixedSize(50, 50); if (!app->fullData) { app->getFullData(); spinner->start(); layout->addWidget(spinner, 1, Qt::AlignCenter); connect(app->source, &Source::gotFullData, this, [ = ] (App *data) { if (data->id == app->id) { load(); disconnect(app->source, &Source::gotFullData, this, nullptr); } }); } else { load(); } } void ItemPage::load() { spinner->hide(); layout->removeWidget(spinner); QHBoxLayout *header = new QHBoxLayout; header->setMargin(10); header->setAlignment(Qt::AlignVCenter); QLabel *icon = new QLabel; icon->setPixmap(app->icon.pixmap(app->icon.actualSize(QSize(64, 64)))); header->addWidget(icon); QVBoxLayout *nameSection = new QVBoxLayout; nameSection->setMargin(0); nameSection->setAlignment(Qt::AlignTop); DLabel *name = new DLabel(app->name); QFont nameFont; nameFont.setPixelSize(22); name->setFont(nameFont); nameSection->addWidget(name); if (!app->developer.isNull()) { nameSection->addWidget(new DLabel(app->developer)); } if (RatingsHelper::instance()->averageRating(app->id) != 0) { nameSection->addWidget(new stars(app->id)); } header->addLayout(nameSection); header->addStretch(); removeBtn = new DWarningButton; removeBtn->setText(tr("Uninstall")); removeBtn->hide(); header->addWidget(removeBtn, 0, Qt::AlignVCenter); connect(removeBtn, &DWarningButton::clicked, this, [ = ] { app->uninstall(); }); header->addSpacing(10); installBtn = new DSuggestButton; installBtn->hide(); header->addWidget(installBtn, 0, Qt::AlignVCenter); connect(installBtn, &DSuggestButton::clicked, this, [ = ] { if (app->state == App::Launchable) app->launch(); else app->install(); }); layout->addLayout(header); progressBar = new DProgressBar; progressBar->hide(); layout->addWidget(progressBar, 0, Qt::AlignTop); if (!app->screenshots.isEmpty()) { layout->addWidget(new gallery(app->screenshots)); } DLabel *description = new DLabel; description->setWordWrap(true); description->setAlignment(Qt::AlignHCenter); description->setMargin(15); if (app->description.isNull()) { description->setText(QString("%1").arg(tr("No description provided."))); } else { description->setText(app->description); } layout->addWidget(description); connect(app->source, &Source::percentageChanged, this, [ = ] (App *data, int percentage) { if (data->id == app->id) progressBar->setValue(percentage); }); connect(app->source, &Source::stateChanged, this, [ = ] (App *data) { if (data->id == app->id) updateButtons(); }); connect(app->source, &Source::installFinished, this, [ = ] (App *data) { if (data->id == app->id && settings::instance()->notifyInstall()) DUtil::DNotifySender(tr("Installed \"%1\"").arg(app->name)).appIcon("dialog-ok").appName("DDE Store").timeOut(5000).call(); }); connect(app->source, &Source::uninstallFinished, this, [ = ] (App *data) { if (data->id == app->id && settings::instance()->notifyUninstall()) DUtil::DNotifySender(tr("Uninstalled \"%1\"").arg(app->name)).appIcon("dialog-ok").appName("DDE Store").timeOut(5000).call(); }); updateButtons(); } void ItemPage::updateButtons() { switch (app->state) { case App::NotInstalled: removeBtn->hide(); progressBar->hide(); installBtn->show(); installBtn->setDisabled(false); installBtn->setText(tr("Install (%1)").arg(QLocale().formattedDataSize(app->downloadSize))); break; case App::Launchable: progressBar->hide(); installBtn->show(); installBtn->setDisabled(false); installBtn->setText(tr("Open")); removeBtn->show(); break; case App::Installed: progressBar->hide(); installBtn->hide(); removeBtn->show(); break; case App::Installing: progressBar->show(); progressBar->setValue(0); removeBtn->hide(); installBtn->setDisabled(true); break; default: break; } } dde-store-1.2.5/pages/itempage.h000066400000000000000000000010641454654107700164660ustar00rootroot00000000000000#ifndef ITEMPAGE_H #define ITEMPAGE_H #include #include #include #include #include #include #include "backend/sourcemanager.h" DWIDGET_USE_NAMESPACE class ItemPage : public QWidget { Q_OBJECT public: ItemPage(App *app); void load(); private: QVBoxLayout *layout; DWarningButton *removeBtn; DSuggestButton *installBtn; DProgressBar *progressBar; DSpinner *spinner = new DSpinner; App *app; void updateButtons(); }; #endif // ITEMPAGE_Hdde-store-1.2.5/pages/updatespage.cpp000066400000000000000000000133061454654107700175320ustar00rootroot00000000000000#include "pages/updatespage.h" #include "backend/settings.h" #include #include #include #include UpdatesPage::UpdatesPage(MainWindow *parent) { QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); this->setLayout(layout); list = new List(tr("Updates")); list->setEmptyText(tr("Up to date")); systemUpdatesItem = tr("System Updates"); systemUpdatesPopup = new DDialog(systemUpdatesItem, ""); systemUpdatesPopup->setIcon(style()->standardIcon(QStyle::SP_MessageBoxInformation)); mainwindow = parent; connect(list, &List::currentItemChanged, this, [ = ] (QVariant data) { if (data == systemUpdatesItem) { systemUpdatesPopup->exec(); } else { for (App *app : appUpdates) { if (app->id == data.toString()) { parent->openItem(app); break; } } } }); refreshButton = new DIconButton(this); connect(refreshButton, &DIconButton::clicked, this, [ = ] { refresh(true); }); connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [ = ] { if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { refreshButton->setIcon(QIcon::fromTheme("refresh")); } else { refreshButton->setIcon(QIcon::fromTheme("refresh_dark")); } }); refreshButton->setIcon(QIcon::fromTheme("refresh_dark")); refreshButton->setIconSize(QSize(20, 20)); refreshButton->setDisabled(false); Q_EMIT(canRefresh()); list->addHeaderWidget(refreshButton); updateButton = new DSuggestButton(tr("Update All")); updateButton->setDisabled(true); connect(updateButton, &DSuggestButton::clicked, this, [ = ] { updateButton->setDisabled(true); updateButton->setText(tr("Updating...")); refreshButton->setDisabled(true); Q_EMIT(cantRefresh()); SourceManager::instance()->sources().first()->update(); }); list->addHeaderWidget(updateButton); for (Source *source : SourceManager::instance()->sources()) { connect(source, &Source::gotUpdates, this, [ = ] (QList updates) { for (App *app : updates) { if (app->source->name() == "PackageKit" && settings::instance()->nonApps() == 0 && !app->hasMetadata) { if (systemUpdates.length() == 0) list->addItem(systemUpdatesItem, QIcon::fromTheme("application-x-executable")); systemUpdates << app; systemUpdatesPopup->setMessage(systemUpdatesPopup->message() + "
" + app->package + " - " + QLocale().formattedDataSize(app->downloadSize)); } else { appUpdates << app; list->addItem(app->name, app->icon, app->id); } } if (SourceManager::instance()->sources().endsWith(source)) { list->load(); updateButton->setDisabled(appUpdates.size() + systemUpdates.size() == 0); refreshButton->setDisabled(false); emit(canRefresh()); mainwindow->setUpdateIndicatorVisible(appUpdates.size() + systemUpdates.size() > 0); qulonglong totalSize = 0; for (App *app : systemUpdates + appUpdates) { totalSize += app->downloadSize; } updateButton->setText(tr("Update All (%1)").arg(QLocale().formattedDataSize(totalSize))); if (appUpdates.size() + systemUpdates.size() > 0 && settings::instance()->notifyAvailableUpdates()) DUtil::DNotifySender(tr("Updates Available")).appIcon("system-updated").appName("DDE Store").timeOut(10000).call(); } else { SourceManager::instance()->sources()[SourceManager::instance()->sources().indexOf(source) + 1]->getUpdates(); } }); connect(source, &Source::updateFinished, this, [ = ] { if (SourceManager::instance()->sources().endsWith(source)) { refreshButton->setDisabled(false); refresh(); if (settings::instance()->notifyFinishedUpdates()) DUtil::DNotifySender(tr("Updates Installed")).appIcon("system-updated").appName("DDE Store").timeOut(5000).call(); } else { SourceManager::instance()->sources()[SourceManager::instance()->sources().indexOf(source) + 1]->update(); } }); connect(source, &Source::percentageChanged, this, [ = ] (App *app, int percentage) { if (appUpdates.contains(app)) list->editItemText(app->id, QString::number(percentage) + "%"); else if (systemUpdates.contains(app)) list->editItemText(systemUpdatesItem, QString::number(percentage) + "%"); }); } layout->addWidget(list); if (settings::instance()->updateTime() != 1) { QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, [ = ] { if (appUpdates.size() + systemUpdates.size() == 0) refresh(true); }); timer->start(3600000); } list->load(); refresh(); } void UpdatesPage::refresh(bool refreshCache) { if (refreshButton->isEnabled()) { updateButton->setDisabled(true); refreshButton->setDisabled(true); Q_EMIT(cantRefresh()); list->clear(); list->unload(); appUpdates.clear(); systemUpdates.clear(); systemUpdatesPopup->setMessage(""); SourceManager::instance()->sources().first()->getUpdates(); } } dde-store-1.2.5/pages/updatespage.h000066400000000000000000000013001454654107700171660ustar00rootroot00000000000000#ifndef UPDATEVIEW_H #define UPDATEVIEW_H #include "mainwindow.h" #include "widgets/list.h" #include "backend/sourcemanager.h" #include #include #include #include DWIDGET_USE_NAMESPACE class UpdatesPage : public QWidget { Q_OBJECT public: UpdatesPage(MainWindow *parent); void refresh(bool refreshCache = false); private: List *list; DDialog *systemUpdatesPopup; QList appUpdates; QList systemUpdates; DSuggestButton *updateButton; MainWindow *mainwindow; QString systemUpdatesItem; DIconButton *refreshButton; signals: void canRefresh(); void cantRefresh(); }; #endif // UPDATEVIEW_H dde-store-1.2.5/resources/000077500000000000000000000000001454654107700154345ustar00rootroot00000000000000dde-store-1.2.5/resources/dde-store.desktop000066400000000000000000000023321454654107700207150ustar00rootroot00000000000000[Desktop Entry] Name=App Store Name[ar]=متجر التطبيقات Name[br]=Loja de aplicativos Name[es]=Tienda de Aplicaciones Name[de]=App Store Name[ja]=アプリストア Name[kab]=App Store Name[nl]=App Store Name[tr]=Uygulama Mağazası Name[zh_CN]=应用商店 Name[ru]=Магазин приложений Comment=An app store for DDE built with DTK Comment[ar]=متجر تطبيقات لـ DDE مبني على DTK Comment[br]=Uma loja de aplicativos para DDE contruída com DTK Comment[es]=Una tienda de aplicaciones para DDE hecha con DTK Comment[de]=Ein App Store für DDE erstellt mit DTK Comment[ja]=DTK で構築された DDE 用アプリストア Comment[kab]= Alzuz n yisnasen i DDE s DTK Comment[nl]=Een App Store voor DDE gebouwd met DTK Comment[tr]=DTK ile oluşturulmuş DDE için bir uygulama mağazası Comment[zh_CN]=一个用了 DTK 给深度桌面环境开发的应用软件商店 Comment[ru]=Магазин приложений для DDE, написанный с использованием DTK Icon=deepin-app-store Exec=/usr/bin/dde-store %U Terminal=false Type=Application Categories=System;PackageManager; Keywords=Package;Installer;App;Store; X-Deepin-TurboType=dtkwidget MimeType=x-scheme-handler/appstream; dde-store-1.2.5/resources/icons/000077500000000000000000000000001454654107700165475ustar00rootroot00000000000000dde-store-1.2.5/resources/icons/active/000077500000000000000000000000001454654107700200225ustar00rootroot00000000000000dde-store-1.2.5/resources/icons/active/chat.svg000066400000000000000000000030131454654107700214570ustar00rootroot00000000000000 category_chat备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/development.svg000066400000000000000000000015751454654107700230750ustar00rootroot00000000000000 category_develop备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/games.svg000066400000000000000000000071551454654107700216470ustar00rootroot00000000000000 category_game备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/graphics.svg000066400000000000000000000023211454654107700223410ustar00rootroot00000000000000 category_graphic备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/home.svg000066400000000000000000000020321454654107700214700ustar00rootroot00000000000000 category_recommend备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/installed.svg000066400000000000000000000034321454654107700225240ustar00rootroot00000000000000 user-application备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/internet.svg000066400000000000000000000074621454654107700224040ustar00rootroot00000000000000 category_network备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/music.svg000066400000000000000000000024011454654107700216600ustar00rootroot00000000000000 category_music备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/office.svg000066400000000000000000000030041454654107700217730ustar00rootroot00000000000000 category_office备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/system.svg000066400000000000000000000045461454654107700221000ustar00rootroot00000000000000 category_system备份 Created with Sketch. dde-store-1.2.5/resources/icons/active/updates.svg000077500000000000000000000047561454654107700222270ustar00rootroot00000000000000 gengxin Created with Sketch. dde-store-1.2.5/resources/icons/active/video.svg000066400000000000000000000040411454654107700216500ustar00rootroot00000000000000 category_video备份 Created with Sketch. dde-store-1.2.5/resources/icons/dark/000077500000000000000000000000001454654107700174705ustar00rootroot00000000000000dde-store-1.2.5/resources/icons/dark/chat.svg000066400000000000000000000027771454654107700211450ustar00rootroot00000000000000 category_chat Created with Sketch. dde-store-1.2.5/resources/icons/dark/development.svg000066400000000000000000000015611454654107700225360ustar00rootroot00000000000000 category_develop Created with Sketch. dde-store-1.2.5/resources/icons/dark/games.svg000066400000000000000000000071411454654107700213100ustar00rootroot00000000000000 category_game Created with Sketch. dde-store-1.2.5/resources/icons/dark/graphics.svg000066400000000000000000000023051454654107700220110ustar00rootroot00000000000000 category_graphic Created with Sketch. dde-store-1.2.5/resources/icons/dark/home.svg000066400000000000000000000020161454654107700211400ustar00rootroot00000000000000 category_recommend Created with Sketch. dde-store-1.2.5/resources/icons/dark/installed.svg000066400000000000000000000034161454654107700221740ustar00rootroot00000000000000 user-application Created with Sketch. dde-store-1.2.5/resources/icons/dark/internet.svg000066400000000000000000000074461454654107700220540ustar00rootroot00000000000000 category_network Created with Sketch. dde-store-1.2.5/resources/icons/dark/music.svg000066400000000000000000000023651454654107700213370ustar00rootroot00000000000000 category_music Created with Sketch. dde-store-1.2.5/resources/icons/dark/office.svg000066400000000000000000000027701454654107700214520ustar00rootroot00000000000000 category_office Created with Sketch. dde-store-1.2.5/resources/icons/dark/system.svg000066400000000000000000000045321454654107700215410ustar00rootroot00000000000000 category_system Created with Sketch. dde-store-1.2.5/resources/icons/dark/updates.svg000077500000000000000000000047561454654107700216750ustar00rootroot00000000000000 gengxin Created with Sketch. dde-store-1.2.5/resources/icons/dark/video.svg000066400000000000000000000040251454654107700213200ustar00rootroot00000000000000 category_video Created with Sketch. dde-store-1.2.5/resources/icons/indicator.svg000066400000000000000000000024641454654107700212520ustar00rootroot00000000000000 dcc_common_subscript dde-store-1.2.5/resources/icons/light/000077500000000000000000000000001454654107700176565ustar00rootroot00000000000000dde-store-1.2.5/resources/icons/light/chat.svg000066400000000000000000000027771454654107700213330ustar00rootroot00000000000000 category_chat Created with Sketch. dde-store-1.2.5/resources/icons/light/development.svg000066400000000000000000000015611454654107700227240ustar00rootroot00000000000000 category_develop Created with Sketch. dde-store-1.2.5/resources/icons/light/games.svg000066400000000000000000000071411454654107700214760ustar00rootroot00000000000000 category_game Created with Sketch. dde-store-1.2.5/resources/icons/light/graphics.svg000066400000000000000000000023051454654107700221770ustar00rootroot00000000000000 category_graphic Created with Sketch. dde-store-1.2.5/resources/icons/light/home.svg000066400000000000000000000020161454654107700213260ustar00rootroot00000000000000 category_recommend Created with Sketch. dde-store-1.2.5/resources/icons/light/installed.svg000066400000000000000000000034101454654107700223540ustar00rootroot00000000000000 user-application Created with Sketch. dde-store-1.2.5/resources/icons/light/internet.svg000066400000000000000000000074461454654107700222420ustar00rootroot00000000000000 category_network Created with Sketch. dde-store-1.2.5/resources/icons/light/music.svg000066400000000000000000000023651454654107700215250ustar00rootroot00000000000000 category_music Created with Sketch. dde-store-1.2.5/resources/icons/light/office.svg000066400000000000000000000027701454654107700216400ustar00rootroot00000000000000 category_office Created with Sketch. dde-store-1.2.5/resources/icons/light/system.svg000066400000000000000000000045321454654107700217270ustar00rootroot00000000000000 category_system Created with Sketch. dde-store-1.2.5/resources/icons/light/updates.svg000077500000000000000000000047561454654107700220630ustar00rootroot00000000000000 gengxin Created with Sketch. dde-store-1.2.5/resources/icons/light/video.svg000066400000000000000000000040211454654107700215020ustar00rootroot00000000000000 category_video Created with Sketch. dde-store-1.2.5/resources/icons/star.png000066400000000000000000000006541454654107700202330ustar00rootroot00000000000000PNG  IHDRa pHYs ntEXtSoftwarewww.inkscape.org<9IDAT8Q=K@~˵\mmq 4HD7"u!$"d"Gvp`K^unfm3tF$ ڡTK:CW) t_5{}s~GQn:陁P":1MfkvOŒEAp 4'޸ixf N&kmBor/k+>ʇx|0 FN!<$*K)YĀ*h 9o xa#YmXk7LhuvJ甲.ֹa&we~;IENDB`dde-store-1.2.5/resources/icons/starhalf.png000066400000000000000000000007421454654107700210640ustar00rootroot00000000000000PNG  IHDRa pHYs ntEXtSoftwarewww.inkscape.org<oIDAT8O/Qyi`TDBZ& |[M|¦%醆 I雹v25հnysr$g%g[yT+Q#[ymzqU @1VU @ŭ~@"muc$3mޚx4{o8gc6=@=ܦ_'"G  ^ZO_6pt-@.mEsT|49`8n֫mMr#FS7eו&2 `N~d/ W"2[/ j>]jКLxrǨ Fv #l"sRHvBKG3MDZB}>G QIENDB`dde-store-1.2.5/resources/resources.qrc000066400000000000000000000034231454654107700201570ustar00rootroot00000000000000 settings.json icons/star.png icons/starhalf.png icons/indicator.svg icons/light/home.svg icons/light/internet.svg icons/light/games.svg icons/light/office.svg icons/light/development.svg icons/light/graphics.svg icons/light/video.svg icons/light/music.svg icons/light/installed.svg icons/light/updates.svg icons/light/chat.svg icons/light/system.svg icons/dark/home.svg icons/dark/internet.svg icons/dark/games.svg icons/dark/office.svg icons/dark/development.svg icons/dark/graphics.svg icons/dark/video.svg icons/dark/music.svg icons/dark/installed.svg icons/dark/updates.svg icons/dark/chat.svg icons/dark/system.svg icons/active/home.svg icons/active/internet.svg icons/active/games.svg icons/active/office.svg icons/active/development.svg icons/active/graphics.svg icons/active/video.svg icons/active/music.svg icons/active/installed.svg icons/active/updates.svg icons/active/chat.svg icons/active/system.svg dde-store-1.2.5/resources/settings.json000066400000000000000000000061411454654107700201710ustar00rootroot00000000000000{ "groups": [ { "key": "basic", "name": "Basic", "groups": [ { "key": "view", "name": "View", "options": [ { "key": "nonapps", "name": "Show non-app updates as", "type": "combobox", "items": ["\"System Updates\"","Individual Packages"], "default": 0 }, { "key": "maxitems", "name": "Max apps per list", "type": "spinbutton", "min": 20, "max": 100, "default": 50 } ] }, { "key": "behaviour", "name": "Behaviour", "options": [ { "key": "tray", "text": "Minimize to tray on exit", "type": "checkbox", "default": true }, { "key": "remember", "text": "", "type": "checkbox", "default": false, "hide": true }, { "key": "updatetime", "name": "Check for updates", "type": "combobox", "items": ["Hourly", "Never"], "default": 0 } ] }, { "key": "notifications", "name": "Notifications", "options": [ { "key": "install", "name": "App installed", "type": "switchbutton", "default": true }, { "key": "uninstall", "name": "App uninstalled", "type": "switchbutton", "default": true }, { "key": "availableupdates", "name": "Available updates", "type": "switchbutton", "default": true }, { "key": "finishedupdates", "name": "Finished updates", "type": "switchbutton", "default": true } ] } ] } ] } dde-store-1.2.5/translations/000077500000000000000000000000001454654107700161435ustar00rootroot00000000000000dde-store-1.2.5/translations/README/000077500000000000000000000000001454654107700171005ustar00rootroot00000000000000dde-store-1.2.5/translations/README/README.ar.md000066400000000000000000000061471454654107700207700ustar00rootroot00000000000000

DDE Store

متجر تطبيقات لـ DDE مبني على DTK

ما هذا؟

هذا المتجر صمم ليعمل على واجهة Deepin في توزيعات اخرى. المتجر الاصلي في Deepin مبنى بطرقة عرض ويب ويحتوي على مستوداعات Deepin مما يجعله غير متوافق مع التوزيعات الأخرى. هذا المتجر مبنى على PackageKit و AppStream مما يجعله متوافق مع تقريبا جميع التوزيعات التي تحمل واجهة Deepin

Deepin

هذا ينطبق على توزيعة Deepin فقط وليس على واجهة Deepin بشكل عام. توزيعة Deepin لا تدعم AppStream بشكل رسمي وهو ما يزود هذا المتجر بجميع البيانات اللازمة. **هذا المتجر غير مدعوم في توزيعة Deepin.** هذا المتجر مخصص ليعمل على التوزيعات التي تعمل بواجهة Deepin وليس على التوزيعة Deepin نفسها وبالتالي ليس لدي أي خطة لدعم توزيعة Deepin في هذا المتجر. في حال بدات Deepin بإستخدام AppStream، قد أقوم بتوفير الدعم. في حال كنت من مستخدمي Deepin وترغب في إستخدام متجر اخر، يمكنك تفقد مشارع رائعة أخرى مثل Spark Store أو Deepines Store!

التثبيت

UbuntuDDE

``` sudo apt-get install dde-store ```

Arch

``` sudo pacman -S deepin-store ```

البناء من الكود المصدري

إعتماديات (Ubuntu)

  • cmake
  • qtbase5-dev
  • qttools5-dev
  • libdtkwidget-dev
  • libdtkcore-dev
  • libdtkgui-dev
  • libpackagekitqt5-dev
  • libappstreamqt-dev
  • libsnapd-qt-dev

البناء

``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ```

المساهمة

المساهمة في المشروع مرحب بها دائما سواء أكانت لإصلاح العيوب البرمجية، التحسينات، الترجمات أو أي شيء آخر!

الترخيص

GPLv3

dde-store-1.2.5/translations/README/README.br.md000066400000000000000000000036611454654107700207670ustar00rootroot00000000000000

DDE Store

Uma loja de aplicativos para DDE contruída com DTK

## O que é isso? Esta loja foi projetada para uso com o Deepin Desktop Environment em outras distribuições. A loja oficial da Deepin é construída em torno do Debian e uma página web com os repositórios do Deepin nela, tornando-a incompatível com outras distros. Esta loja é construída com PackageKit e AppStream, então deve funcionar perfeitamente em [quase] (#deepin-distro) qualquer distro! ## Deepin Distro Isso se aplica apenas à distribuição oficial da Deepin, não ao DDE em geral. Deepin não oferece suporte a AppStream, que fornece a este aplicativo todos os dados necessários. **Esta loja não é compatível com a distribuição Deepin.** Esta loja foi projetada para outras distros executando DDE, então não tenho planos de oferecer suporte. Se o Deepin começar a usar AppStream, posso considerar isso. Se você estiver executando o Deepin e procurando uma loja de aplicativos alternativa, verifique alguns outros projetos incríveis como [Spark Store](https://www.spark-app.store) ou [Deepines Store](https://deepines.com)! ## Instalação ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Empacotando a partir da fonte **Dependências (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-devLicença - libsnapd-qt-dev **Empacotando** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Contribuições Pull requests são sempre bem-vindas para correções de bugs, melhorias, traduções ou qualquer outra coisa! ## Licença [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/README.de.md000066400000000000000000000035621454654107700207540ustar00rootroot00000000000000

DDE Store

Ein App Store für DDE, erstellt mit DTK

## Was ist es? Dieser App Store ist für die Verwendung mit der Deepin Desktop-Umgebung in anderen Distributionen gedacht. Der offizielle Deepin Store basiert auf Debian und einer Webansicht mit den Deepin-Repositories, was ihn inkompatibel mit anderen Distributionen macht. Dieser Store wurde mit PackageKit und AppStream erstellt und sollte daher perfekt auf [fast](#deepin-distro) jeder Distribution funktionieren! ## Deepin Distro Dies gilt nur für die offizielle Deepin-Distro, nicht für DDE im Allgemeinen. Deepin unterstützt kein AppStream, was diese App mit allen erforderlichen Daten versorgt. **Dieser Store wird auf der Deepin-Distribution nicht unterstützt.** Es war sowieso für andere Distributionen gedacht, die DDE verwenden, daher habe ich nicht vor, es jemals zu unterstützen. Sollte Deepin anfangen AppStream zu verwendet, werde ich darüber nachdenken. Wenn Sie Deepin nutzen und nach einem alternativen App Store suchen, sehen Sie sich andere tolle Projekte wie [Spark Store](https://www.spark-app.store) oder [Deepines Store](https://deepines.com) an! ## Installation ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Bauen vom Quellcode **Abhängigkeiten (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Bauen** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Beiträge Pull-Anfragen sind für Fehlerbehebungen, Verbesserungen, Übersetzungen oder andere Dinge immer gerne gesehen! ## License [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/README.es.md000066400000000000000000000037621454654107700207750ustar00rootroot00000000000000

DDE Store

Una tienda de aplicaciones para DDE hecha con DTK

## Qué es esto? Esta tienda de aplicaciones está diseñada para el uso con el Entorno de Escritorio de Deepin (Deepin Desktop Envoirment, o DDE) en otras distribuciones. La tienda oficial de Deepin está hecha a base de Debian y una vista web con los repositorios de Deepin, haciéndola incompatible con otras distribuciones. ¡Esta tienda está hecha con PackageKit y AppStream así que debería trabajar perfecto con [casi](#distribución-deepin) cualquier distribución! ## Distribución Deepin Esto solo aplica a la distribución oficial de Deepin, no DDE en general. Deepin no es compatible con AppStream, lo que provee a DDE Store de todos los datos necesarios.. **Esta tienda no es compatible con la distribución Deepin** De todas formas, DDE Store fue diseñada para otras distribuciones con DDE, así que no tengo planes de hacerla compatible con Deepin. Si Deepin empieza a usar AppStream, podría considerarlo. ¡Si estás usando Deepin y estás buscando una tienda de aplicaciones, prueba otros proyectos muy buenos como [Spark Store](https://www.spark-app.store) o [Deepines Store](https://deepines.com)! ## Instalación ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch/Manjaro ``` sudo pacman -S deepin-store ``` ### Construyéndolo desde la fuente **Dependencias (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Construyéndolo** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Contribuciones ¡Pull requests son siempre bienvenidas para arreglo de bugs, mejoras, traducciones, o cualquier otra cosa! ## Licencia [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/README.ja.md000066400000000000000000000045051454654107700207540ustar00rootroot00000000000000

DDE Store

DTK で構築された DDE 用アプリストア

## DDE Store とは このアプリストアは、他のディストリビューションの Deepin デスクトップ環境で使用するように設計されています。公式の Deepin ストアは、Debian と Deepin リポジトリを含む Web ビューを中心に構築されているため、他のディストリビューションとの互換性がありません。このストアは PackageKit と AppStream で構築されているため、[ほぼ](#deepin-ディストリビューション)任意のディストリビューションで完璧に動作するはずです! ## Deepin ディストリビューション 以下は、DDE 全般ではなく、公式 Deepin ディストリビューションにのみ適用されます。 Deepin は、このアプリに必要なすべてのデータを提供する AppStream をサポートしていません。 **このストアは Deepin ディストリビューションではサポートされていません。** とにかくこのプロジェクトは、DDE を実行している他のディストリビューションを対象としていたため、Deepin をサポートする予定はありません。Deepin が AppStream を使い始めた場合は、検討するかもしれません。もし Deepin をお使いで、代替のアプリストアをお探しのようでしたら、他の [Spark Store](https://www.spark-app.store) や [Deepines Store](https://deepines.com) のような素晴らしいプロジェクトをチェックしてみてください! ## インストール方法 ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### ソースからビルド **依存関係 (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **ビルド** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## 貢献 バグ修正、改善、翻訳など、プルリクエストはいつでも歓迎です! ## ライセンス [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/README.kab.md000066400000000000000000000031571454654107700211210ustar00rootroot00000000000000

DDE Store

Alzuz n yisnasen i DDE yebnan s DTK

## Acu-t waya? Asnas-a n ulzuz ittwafeṣel i useqdec akked tnarit Deepin deg isedggiren-nniḍen. Asnas unṣib n Deepin store ittwabna i Debian akked web view s ukemmus Deepin, aya yerra-t d aramṣaḍan akked ikemmusen-nniḍen. Alzuz-a ittwabna s PackageKit akked AppStream, ihi issefk ad yeddu akken iwata deg [tuget](#tussa-deepin) isedggiren meṛṛa! ## Tussa Deepin Aya ad iddu kan i tussa tunṣibt n Deepin, mačči i DDE. Deepin ur isefrak ara AppStream, iseddun asnas-a akked isefka yesra. **Alzuz-a ur imṣaḍa ara akked tussa Deepin.** Aya ur ittwasra ara i isedggiren-nniḍen iseddayen DDE,ɣef waya ǧǧiɣ-t. Ma yebda Deepin iseqdac AppStream, ahat ad n-uɣaleɣ ɣer-s. Ma yella tseqdaceḍ Deepin tettnadiḍ alzuz-nniḍen, nadi asenfaṛ-nniḍen am [Spark Store](https://www.spark-app.store) neɣ [Deepines Store](https://deepines.com)! ## Asebded ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Lebni seg teɣbalut **Tigilin (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Lebni** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Attekki Ansuf yal tikkelt s usuter n uttekki d uqaɛed, asenqed, asuqel, neɣ ayen-nniḍen! ## Turagt [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/README.nl.md000066400000000000000000000036001454654107700207660ustar00rootroot00000000000000

DDE Store

Een app store voor DDE gebouwd met DTK

## Wat is dit? Deze App Store is ontworpen voor gebruik met de Deepin Desktop Environment op andere distributies. De officiële Deepin-winkel is gebouwd rond Debian en een webweergave met de Deepin-repo's erop, waardoor deze niet compatibel is met andere distributies. Deze App Store is gebouwd met PackageKit en AppStream, dus het zou perfect moeten werken op [bijna](#deepin-distro) alle distributies! ## Deepin Distro Dit is alleen van toepassing op de officiële Deepin-distro, niet op DDE in het algemeen. Deepin ondersteunt AppStream niet, die deze app van alle benodigde gegevens voorziet. **Deze App Store wordt niet ondersteund op de Deepin-distributie.** Dit was sowieso bedoeld voor andere distributies met DDE, dus ik heb geen plannen om het ooit te ondersteunen. Als Deepin AppStream gaat gebruiken, kan ik het overwegen. Als je Deepin gebruikt en op zoek bent naar een alternatieve app store, bekijk dan enkele andere geweldige projecten zoals [Spark Store](https://www.spark-app.store) of [Deepines Store](https://deepines.com)! ## Installatie ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Vanaf de bron installeren **Dependencies (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Building** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Bijdrage aan ontwikkeling Upload verzoeken zijn altijd welkom voor bugfixes, verbeteringen, vertalingen of iets anders! ## Licentie [GPLv3](../../LICENSE)dde-store-1.2.5/translations/README/README.ru.md000066400000000000000000000053251454654107700210110ustar00rootroot00000000000000

DDE Store

Магазин приложений для DDE, написанный с использованием DTK

## Что это? Это приложение предназначено для использования С Deepin Desktop Environment, поставляемым в других дистрибутивах. Официальный магазин Deepin написан для Debian и репозиториев Deepin, что делает его несовместимым с другими дистрибутивами. Этот магазин написан с использованием PackageKit и AppStream, благодаря чему он должен работать [почти](#deepin-distro) с каждым дистрибутивом! ## Дистрибутив Deepin Это относится только к официальному дистрибутиву Deepin, а не к DDE. Deepin не поддерживает AppStream, предоставляющий этому приложению все необходимые данные. **Этот магазин не поддерживает дистрибутив Deepin.** В любом случае этот магазин был создан для других дистрибутивов, использующих DDE, поэтому у меня нет никаких планов его поддерживать. Если Deepin начнет использовать AppStream, то я могу задуматься об этом. Если вы используете Deepin и ищете альтернативный магазин, обратите внимание на другие превосходные проекты, вроде [Spark Store](https://www.spark-app.store) или [Deepines Store](https://deepines.com)! ## Установка ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Сборка из исходного кода **Зависимости (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Сборка** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Внести вклад Пул-реквесты с исправлениями ошибок, улучшениями, переводами и прочим всегда приветствуются! ## Лицензия [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/README.tr.md000066400000000000000000000041101454654107700207770ustar00rootroot00000000000000

DDE Store

DTK ile oluşturulmuş DDE için bir uygulama mağazası

## Bu nedir? Bu uygulama mağazası, Deepin Masaüstü Ortamı'nın (Deepin Desktop Environment, DDE) diğer dağıtımlar üzerinde kullanılması amacıyla tasarlanmıştır. Resmi Deepin mağazası Debian ve üzerinde Deepin depolarının bulunduğu bir web görünümü kapsamında inşa edilmiştir, bu da Deepin mağazasını diğer dağıtımlarla uyumsuz hale getirir. Bu mağaza, PackageKit ve AppStream ile oluşturulmuştur, bu nedenle herhangi bir dağıtım üzerinde [neredeyse](#deepin-dağıtımı) mükemmel çalışmalıdır! ## Deepin Dağıtımı Bu sadece resmi Deepin dağıtımı için geçerlidir, genel olarak DDE için geçerli değildir. Deepin, bu uygulamaya gerekli tüm verileri sağlayan AppStream'i desteklemez. **Bu mağaza, Deepin dağıtımında desteklenmiyor.** Bu, yine de DDE'yi çalıştıran diğer dağıtımlar için tasarlandı, bu yüzden onu desteklemeye dair hiçbir planım yok. Deepin AppStream'i kullanmaya başlarsa, düşünebilirim. Deepin kullanıyor ve alternatif bir uygulama mağazası arıyorsanız, [Spark Store](https://www.spark-app.store) veya [Deepines Store](https://deepines.com) gibi diğer harika projelere göz atın! ## Kurulum ### UbuntuDDE ``` sudo apt-get install dde-store ``` ### Arch ``` sudo pacman -S deepin-store ``` ### Kaynak dosyadan kurulum **Dependencies (Ubuntu)** - cmake - qtbase5-dev - qttools5-dev - libdtkwidget-dev - libdtkcore-dev - libdtkgui-dev - libpackagekitqt5-dev - libappstreamqt-dev - libsnapd-qt-dev **Kurulum** ``` git clone https://github.com/dekzi/dde-store.git cd dde-store cmake . sudo make install ``` ## Katkılar Hata düzeltmeleri, iyileştirmeler, çeviriler veya başka herhangi bir şey için çekme talepleri (pull requests) her zaman memnuniyetle karşılanır! ## Lisans [GPLv3](../../LICENSE) dde-store-1.2.5/translations/README/TRANSLATIONS.md000066400000000000000000000044121454654107700213440ustar00rootroot00000000000000# Translation Guide To start translating, create a fork of this repository. ## .ts file In the `/translations` folder, you'll see several files with the extension `.ts`. Make a copy of `dde-store.ts` or `dde-store_en.ts` and rename it to `dde-store_yourlanguagecode.ts` (Spanish = `dde-store_es.ts`, German = `dde-store_de.ts`, etc). Open the file and change the `language="en"` in the first line to match the same language code. ```xml ``` Every piece of text that needs to be translated comes in a format like this: ```xml Created by %1 Created by %1 ``` Anything between the `` tags is the original text. Don't change it. Anything between the `` tags is what needs to be translated. See how this example says `Created by %1`? %1 is text that will the app will replace. In this case, %1 will be changed to my name. You can move around %1 to wherever is gramatically correct, just don't remove it. Some things may be repeated, like the categories or "OK". You can just copy the same translation as before. Make sure to not translate anything else like the `` tags! ## README.md Create a copy of `README.md` and rename it to `README.languagecode.md`. Delete the language selector at the top (the flags and languages) and the rest is pretty simple. Just translate it! Just don't change `DDE Store`. The name needs to stay. Once you're done, move it to `translations/README/`, and add the flag, name, and link to the main README's language selector formatted the same way as the rest. ## .desktop file Edit `dde-store.desktop` and 2 new lines: `Name[languagecode]=` and the translation of "App Store", and `Comment[languagecode]=` and the same translation of "An app store for DDE built with DTK" you put in the README. Make sure the lines are inserted alphabetically by language code. If you're confused about anything, take a look at another translation to see what they changed, or just ask me. Once you're done with both files, just submit a pull request. I'll make sure everything looks fine and merge it. Thank you for taking interest in contributing! dde-store-1.2.5/translations/dde-store.ts000066400000000000000000000344361454654107700204130ustar00rootroot00000000000000 CategoryPage Sort by Alphabetical Ratings No results for %1 HomePage Messaging Internet Games Development Office Graphics Video Music System View More ItemPage Uninstall No description provided. Installed "%1" Uninstalled "%1" Install (%1) Open MainWindow Check for updates Check for updates Quit Settings Home Messaging Internet Games Development Office Graphics Video Music System Installed Updates Exit Minimize to system tray Do not ask again Please choose your action Cancel Confirm Cannot close while app is being installed OK PackageKitSource ERROR: Unable to open AppStream metadata pool QObject Basic View Behaviour Notifications Show non-app updates as Max apps per list Minimize to tray on exit Check for updates Check for updates App installed App uninstalled Available updates Finished updates SnapSource Classic mode required This snap requires confinement to be disabled via classic mode Cancel Continue UpdatesPage Updates Up to date System Updates Update All Updating... Update All (%1) Updates Available Updates Installed main An app store for DDE built with DTK Created by %1 settings "System Updates" Individual Packages Hourly Never stars (%1 ratings) dde-store-1.2.5/translations/dde-store_ar.ts000066400000000000000000000346531454654107700210760ustar00rootroot00000000000000 CategoryPage Sort by فرز حسب Alphabetical الأبجدية Ratings التقييم No results for %1 لم يتم العثور على نتائج حول %1 HomePage Messaging المراسلة Internet الإنترنت Games الألعاب Development التطوير Office المكتب Graphics الصور Video الفديو Music الموسيقى System النظام View More عرض المزيد ItemPage Uninstall إلغاء التثبيت No description provided. لا يتوفر وصف. Installed "%1" تم تثبيت "%1" Uninstalled "%1" تم إزالة تثبيت "%1" Install (%1) تثبيت (%1) Open فتح MainWindow Check for updates Quit Settings الإعدادات Home الرئيسية Messaging المراسلة Internet الإنترنت Games الألعاب Development التطوير Office المكتب Graphics الصور Video الفيديو Music الموسيقى System النظام Installed البرامج المثبتة Updates التحديثات Exit Minimize to system tray Do not ask again Please choose your action Cancel Confirm Cannot close while app is being installed يتعذر الإغلاق خلال تثبيت البرامج OK موافق PackageKitSource ERROR: Unable to open AppStream metadata pool خطأ: تعذر فتح مستودع معلومات AppStream QObject Basic View Behaviour Notifications Show non-app updates as Max apps per list Minimize to tray on exit Check for updates App installed App uninstalled Available updates Finished updates SnapSource Classic mode required This snap requires confinement to be disabled via classic mode Cancel Continue UpdatesPage Updates التحديثات Up to date لا يوجد تحديثات System Updates تحديثات النظام Update All جميع التحديثات Updating... يتم التحديث... Update All (%1) تحديث جميع (%1) Updates Available يتوفر تحديثات جديدة Updates Installed تم تثبيت التحديثات main An app store for DDE built with DTK متجر تطبيقات مخصص لـ DDE مبني على DTK Created by %1 بواسطة %1 settings "System Updates" Individual Packages Hourly Never stars (%1 ratings) (%1 تقييم) dde-store-1.2.5/translations/dde-store_de.ts000066400000000000000000000341571454654107700210630ustar00rootroot00000000000000 CategoryPage Sort by Sortieren nach Alphabetical Alphabetisch Ratings Bewertungen No results for %1 Kein Ergebnis für %1 HomePage Messaging Messaging Internet Internet Games Spiele Development Entwicklung Office Büro Graphics Grafik Video Video Music Musik System System View More Mehr anzeigen ItemPage Uninstall Deinstallieren No description provided. Keine Übersetzung vorhanden. Installed "%1" "%1" wurde installiert Uninstalled "%1" "%1" wurde deinstalliert Install (%1) Installieren (%1) Open Öffnen MainWindow Check for updates Auf Updates prüfen Quit Schließen Settings Einstellungen Home Startseite Messaging Messaging Internet Internet Games Spiele Development Entwicklung Office Büro Graphics Grafik Video Video Music Musik System System Installed Installiert Updates Aktualisierungen Exit Beenden Minimize to system tray In die Statusleiste minimieren Do not ask again Nicht erneut nachfragen Please choose your action Cancel Abbrechen Confirm Bestätigen Cannot close while app is being installed Kann nicht geschlossen werden, während eine App installiert wird OK OK PackageKitSource ERROR: Unable to open AppStream metadata pool FEHLER: AppStream-Metadatenpool kann nicht geladen werden QObject Basic View Aussehen Behaviour Verhalten Notifications Benachrichtigungen Show non-app updates as Nicht-App-Updates sehen kuje aus Max apps per list Minimize to tray on exit Check for updates Auf Updates prüfen App installed App uninstalled Available updates Finished updates SnapSource Classic mode required This snap requires confinement to be disabled via classic mode Cancel Abbrechen Continue UpdatesPage Updates Aktualisierungen Up to date Auf dem neuesten Stand System Updates Systemaktualisierungen Update All Alle aktualisieren Updating... Wird aktualisiert... Update All (%1) Alle aktualisieren (%1) Updates Available Aktualisierungen verfügbar Updates Installed Wurde aktualisiert main An app store for DDE built with DTK Ein App Store für DDE, erstellt mit DTK Created by %1 Erstellt von %1 settings "System Updates" Individual Packages Hourly Never stars (%1 ratings) (%1 Bewertung) dde-store-1.2.5/translations/dde-store_en.ts000066400000000000000000000335751454654107700211000ustar00rootroot00000000000000 CategoryPage Sort by Sort by Alphabetical Alphabetical Ratings Ratings No results for %1 No results for %1 HomePage Messaging Messaging Internet Internet Games Games Development Development Office Office Graphics Graphics Video Video Music Music System System View More View More ItemPage Uninstall Uninstall No description provided. No description provided. Installed "%1" Installed "%1" Uninstalled "%1" Uninstalled "%1" Install (%1) Install (%1) Open Open MainWindow Check for updates Check for updates Quit Quit Settings Settings Home Home Messaging Messaging Internet Internet Games Games Development Development Office Office Graphics Graphics Video Video Music Music System System Installed Installed Updates Updates Exit Exit Minimize to system tray Minimize Do not ask again Do not ask again Please choose your action Please choose your action Cancel Cancel Confirm Confirm Cannot close while app is being installed Cannot close while app is being installed OK OK PackageKitSource ERROR: Unable to open AppStream metadata pool ERROR: Unable to open AppStream metadata pool QObject Basic Basic View View Behaviour Behaviour Notifications Notifications Show non-app updates as Show non-app updates as Max apps per list Max apps per list Minimize to tray on exit Minimize to tray on exit Check for updates Check for updates App installed App installed App uninstalled App uninstalled Available updates Available updates Finished updates Finished updates SnapSource Classic mode required Classic mode required This snap requires confinement to be disabled via classic mode This snap requires confinement to be disabled via classic mode Cancel Cancel Continue Continue UpdatesPage Updates Updates Up to date Up to date System Updates System Updates Update All Update All Updating... Updating... Update All (%1) Update All (%1) Updates Available Updates Available Updates Installed Updates Installed main An app store for DDE built with DTK An app store for DDE built with DTK Created by %1 Created by %1 settings "System Updates" "System Updates" Individual Packages Individual Packages Hourly Hourly Never Never stars (%1 ratings) (%1 ratings) dde-store-1.2.5/translations/dde-store_es.ts000066400000000000000000000351441454654107700210770ustar00rootroot00000000000000 CategoryPage Sort by Ordenar Alphabetical Alfabéticamente Ratings Calificación No results for %1 Sin resultados para %1 HomePage Messaging Comunicación Internet Internet Games Juegos Development Desarrollo Office Ofimática Graphics Gráficos Video Video Music Música System Sistema View More Ver más ItemPage Uninstall Desinstalar No description provided. Sin descripción brindada. Installed "%1" Instalado "%1" Uninstalled "%1" Desinstalado "%1" Install (%1) Instalar (%1) Open Abrir MainWindow Check for updates Buscar actualizaciones Quit Salir Settings Configuración Home Inicio Messaging Comunicación Internet Internet Games Juegos Development Desarrollo Office Ofimática Graphics Gráficos Video Video Music Música System Sistema Installed Instalados Updates Actualizaciones Exit Salir Minimize to system tray Minimizar a bandeja de sistema Do not ask again No preguntar de nuevo Please choose your action Elige qué hacer Cancel Cancelar Confirm Confirmar Cannot close while app is being installed No se puede cerrar mientras la aplicación esta siendo instalada OK OK PackageKitSource ERROR: Unable to open AppStream metadata pool ERROR: No se puede abir Appstream metadata pool QObject Basic Básico View Vista Behaviour Comportamiento Notifications Notificaciones Show non-app updates as Mostrar actualizaciones de no-aplicaciones Max apps per list Cantidad máxima de apps a mostrar por lista Minimize to tray on exit Minimizar a la bandeja del sistema al salir Check for updates Buscar actualizaciones App installed Aplicación instaladas App uninstalled Aplicaciones desinstaladas Available updates Actualizaciones disponibles Finished updates Actualizaciones terminadas SnapPlugin Installed "%1" Instalado "%1" Uninstalled "%1" Desinstalado "%1" Cancel Cancelar SnapSource Classic mode required This snap requires confinement to be disabled via classic mode Cancel Cancelar Continue UpdatesPage Updates Actualizaciones Up to date Actualizado System Updates Actualizaciones del sistema Update All Actualizar todo Updating... Actualizando... Update All (%1) Actualizar todo (%1) Updates Available Actualizaciones disponibles Updates Installed Actualizaciones instaladas main An app store for DDE built with DTK Una tienda de aplicaciones para DDE hecha con DTK Created by %1 Creada por %1 settings "System Updates" "Actualizaciones del sistema" Individual Packages Paquetes individuales Hourly Cada hora Never Nunca stars (%1 ratings) (%1 calificaciones) dde-store-1.2.5/translations/dde-store_ja.ts000066400000000000000000000346201454654107700210600ustar00rootroot00000000000000 CategoryPage Sort by 並べ替え Alphabetical 名前 Ratings 評価 No results for %1 結果なし: %1 HomePage Messaging メッセージング Internet インターネット Games ゲーム Development 開発 Office オフィス Graphics グラフィックス Video 動画 Music 音楽 System システム View More さらに表示 ItemPage Uninstall アンインストール No description provided. 説明がありません。 Installed "%1" "%1" をインストールしました Uninstalled "%1" "%1" をアンインストールしました Install (%1) インストール (%1) Open 開く MainWindow Check for updates 更新を確認 Quit 終了 Settings 設定 Home ホーム Messaging メッセージング Internet インターネット Games ゲーム Development 開発 Office オフィス Graphics グラフィックス Video 動画 Music 音楽 System システム Installed インストール済み Updates 更新 Exit 終了 Minimize to system tray 最小化 Do not ask again 再度確認しない Please choose your action アクションを選択してください Cancel キャンセル Confirm 確定 Cannot close while app is being installed アプリのインストール中に終了することはできません OK OK PackageKitSource ERROR: Unable to open AppStream metadata pool エラー: AppStream メタデータ プールを開けません QObject Basic 基本 View 表示 Behaviour 動作 Notifications 通知 Show non-app updates as アプリ以外の更新の表示方法 Max apps per list リストあたりの最大アプリ数 Minimize to tray on exit 終了時にトレイに最小化 Check for updates 更新を確認 App installed インストールされたアプリ App uninstalled アンインストールされたアプリ Available updates 利用可能な更新 Finished updates 終了した更新 SnapSource Classic mode required クラシック モードが必要です This snap requires confinement to be disabled via classic mode このスナップでは、クラシック モードで制限を無効にする必要があります Cancel キャンセル Continue 続行 UpdatesPage Updates 更新 Up to date 最新の状態です System Updates システム更新 Update All すべて更新 Updating... 更新しています... Update All (%1) すべて更新 (%1) Updates Available 利用可能な更新 Updates Installed インストール済みの更新 main An app store for DDE built with DTK DTK で構築された DDE 用アプリストア Created by %1 作成者: %1 settings "System Updates" "システム更新" Individual Packages 個別パッケージ Hourly 毎時 Never しない stars (%1 ratings) (%1 件の評価) dde-store-1.2.5/translations/dde-store_kab.ts000066400000000000000000000336601454654107700212260ustar00rootroot00000000000000 CategoryPage Sort by Smizwar s Alphabetical S ugemmay Ratings Efk-d ṛṛay-ik·im No results for %1 Ulac agemmuḍ i %1 HomePage Messaging Izen Internet Internet Games Uraren Development Taneflit Office Tanarit Graphics Uldifen Video Ividyuten Music Aẓawan System Anagraw View More Sken-d ugar ItemPage Uninstall Kkes No description provided. Ulac aglam. Installed "%1" ibdded "%1" Uninstalled "%1" Ittwakkes "%1" Install (%1) Sebded (%1) Open Ldi MainWindow Check for updates Senqed ileqman Quit Ffeɣ Settings Iɣewwaṛen Home Agejdan Messaging Izen Internet Internet Games Uraren Development Taneflit Office Tanarit Graphics Uldifen Video Ividyuten Music Aẓawan System Anagraw Installed Ibdded Updates Aleqqem Exit Ffeɣ Minimize to system tray Semẓi ɣer tfeggagt n twura Do not ask again Ur d-sutur ara tikkelt-nniḍen Please choose your action Ttxil fren tigawt Cancel Sefsex Confirm Sentem Cannot close while app is being installed Ur yizmir ara ad imdel deg lawan n usebded n usnas OK IH PackageKitSource ERROR: Unable to open AppStream metadata pool TUCCḌƐ: Ur yizmir ara ad yeldi AppStream metadata pool QObject Basic Azadur View Sken Behaviour Tiddin Notifications Ilɣa Show non-app updates as Sken ileqman am Max apps per list Amḍan afellay n yisnasen i tebdert Minimize to tray on exit Semẓi ɣer twura ticki yemdel Check for updates Senqed aleqqem App installed Inasen ibedden App uninstalled Isnasne ittwaksen Available updates Ileqman yellan Finished updates Ileqman ifukken SnapSource Classic mode required Yesra askar aklasiki This snap requires confinement to be disabled via classic mode snap-agi yesra aɛzal akken ad yens s uskar aklasiki Cancel Sefsex Continue Kemmel UpdatesPage Updates Leqqem Up to date D imaynuten System Updates Ileqman n unagraw Update All Leqqem meṛṛa Updating... Aleqqem... Update All (%1) Leqqem meṛṛa (%1) Updates Available Llan ileqman Updates Installed Bedden ileqman main An app store for DDE built with DTK Alzuz n yisnasen i DDE yebnan s DTK Created by %1 Sɣur %1 settings "System Updates" "Ileqman n unagraw" Individual Packages Ikemmusen yiwen yiwen Hourly Yal asrag Never Werǧin stars (%1 ratings) (%1 n tefranin) dde-store-1.2.5/translations/dde-store_nl.ts000066400000000000000000000342321454654107700210760ustar00rootroot00000000000000 CategoryPage Sort by Sorteer op Alphabetical Alfabetische volgorde Ratings Waardering No results for %1 Geen resultaat gevonden voor %1 HomePage Messaging Sociaal netwerken Internet Internet Games Spellen Development Ontwikkelaarstools Office Productiviteit Graphics Grafisch en ontwerp Video Video Music Muziek System Systeemtools View More Laat meer zien ItemPage Uninstall Verwijderen No description provided. Geen beschrijving toegevoegd. Installed "%1" Geinstalleerd "%1" Uninstalled "%1" Verwijderd "%1" Install (%1) Installeren (%1) Open Openen MainWindow Check for updates Controleer op updates Quit Afsluiten Settings Instellingen Home Home Messaging Sociaal netwerken Internet Internet Games Spellen Development Ontwikkelaartools Office Productiviteit Graphics Grafisch en ontwerp Video Video Music Muziek System Systeemtools Installed Geïnstalleerd Updates Updates Exit Afsluiten Minimize to system tray Minimaliseer naar systeemvak Do not ask again Vraag niet opnieuw Please choose your action Selecteer actie Cancel Annuleren Confirm Bevestigen Cannot close while app is being installed Kan programma niet sluiten wanneer er een installatie bezig is OK OK PackageKitSource ERROR: Unable to open AppStream metadata pool ERROR: Kan AppStream metadata niet openen QObject Basic Basis View Bekijk Behaviour Gedrag Notifications Berichten Show non-app updates as Laat niet-app updates zien als Max apps per list Maximale programma`s per lijst Minimize to tray on exit Minimimaliseer naar taakbalk bij verlaten Check for updates Controleer op updates App installed Programma geïnstalleerd App uninstalled Programma verwijderd Available updates Beschikbare updates Finished updates Voltooide updates SnapSource Classic mode required Klassiek modus vereist This snap requires confinement to be disabled via classic mode Voor deze module dient vertrouwelijk uitgeschakeld te zijn in klassieke modus Cancel Annuleer Continue Doorgaan UpdatesPage Updates Updates Up to date Actueel System Updates Systemupdates Update All Update Alles Updating... Bijwerken... Update All (%1) Update Alles (%1) Updates Available Updates Beschikbaar Updates Installed Updates Geïnstalleerd main An app store for DDE built with DTK Een app store voor DDE gebouwd met DTK Created by %1 Gemaakt door %1 settings "System Updates" "Systeem Updates" Individual Packages Individuele Paketten Hourly Elk uur Never Nooit stars (%1 ratings) (%1 waardering) dde-store-1.2.5/translations/dde-store_pt_BR.ts000066400000000000000000000343471454654107700215020ustar00rootroot00000000000000 CategoryPage Sort by Classificar por Alphabetical Ordem alfabetica Ratings Avaliações No results for %1 Nenhum resultado encontrado para %1 HomePage Messaging Comunicação Internet Internet Games Jogos Development Desenvolvimento Office Escritório Graphics Gráficos Video Vídeo Music Música System Sistema View More Ver Mais ItemPage Uninstall Remover No description provided. Nenhuma descrição foi disponibilizada. Installed "%1" Instalado "%1" Uninstalled "%1" Removido "%1" Install (%1) Instalar (%1) Open Abrir MainWindow Check for updates Verificar atualizações Quit Sair Settings Configurações Home Início Messaging Comunicação Internet Internet Games Jogos Development Desenvolvimento Office Excritório Graphics Gráficos Video Vídeo Music Música System Sistema Installed Instalados Updates Atualizações Exit Sair Minimize to system tray Miniminar para a bandeja do sistema Do not ask again Não perguntar novamente Please choose your action Escolha uma ação Cancel Cancelar Confirm Confirmar Cannot close while app is being installed Não é possível fechar enquanto um aplicativo estiver em instalação OK OK PackageKitSource ERROR: Unable to open AppStream metadata pool ERRO: Não é possível abrir os metadas do AppStream QObject Basic Básico View Exibir Behaviour Comportamento Notifications Notificações Show non-app updates as Mostrar outras atualizações como Max apps per list Máximos de aplicativos por lista Minimize to tray on exit Minimizar para a bandeja ao sair Check for updates Checar por atualizações App installed Aplicativo instalado App uninstalled Aplicativo removido Available updates Atualizações disponíveis Finished updates Atualizações concluídas SnapSource Classic mode required Modo clássico necessário This snap requires confinement to be disabled via classic mode Esse snap exige que o confinamento seja desativado no modo clássico Cancel Cancelar Continue Continuar UpdatesPage Updates Atualizações Up to date Atualizado System Updates Atualizações do Sistema Update All Atualizar tudo Updating... Atualizando... Update All (%1) Atualizar Tudo (%1) Updates Available Atualizações Disponíveis Updates Installed Atualizações Instaladas main An app store for DDE built with DTK Uma loja de aplicativos para DDE contruída com DTK Created by %1 Criado por %1 settings "System Updates" "Atualizações do Sistema" Individual Packages Pacotes Individuais Hourly A cada hora Never Nunca stars (%1 ratings) (%1 avaliações) dde-store-1.2.5/translations/dde-store_ru.ts000066400000000000000000000362121454654107700211130ustar00rootroot00000000000000 CategoryPage Sort by Сортировать Alphabetical По алфавиту Ratings По оценке No results for %1 Нет результатов для %1 HomePage Messaging Обмен сообщениями Internet Интернет Games Игры Development Разработка Office Офис Graphics Графика Video Видео Music Музыка System Система View More Показать больше ItemPage Uninstall Удалить No description provided. Описание отсуствует. Installed "%1" "%1" установлен Uninstalled "%1" "%1" удален Install (%1) Установить (%1) Open Открыть MainWindow Check for updates Проверить обновления Quit Выйти Settings Настройки Home На главную Messaging Обмен сообщениями Internet Интернет Games Игры Development Разработка Office Офис Graphics Графика Video Видео Music Музыка System Система Installed Установленные Updates Обновления Exit Выйти Minimize to system tray Свернуть в трей Do not ask again Больше не спрашивать Please choose your action Выберите действие Cancel Отменить Confirm Подтвердить Cannot close while app is being installed Невозможно закрыть окно, пока приложение не закончило установку OK ОК PackageKitSource ERROR: Unable to open AppStream metadata pool ОШИБКА: Невозможно открыть пул метаданных AppStream QObject Basic Базовые View Отображение Behaviour Поведение Notifications Уведомления Show non-app updates as Показать обновления, не касающиеся приложений, как Max apps per list Максимум приложений в списке Minimize to tray on exit Свернуть в трей при выходе Check for updates Проверять обновления App installed Приложение установлено App uninstalled Приложение удалено Available updates Доступны обновления Finished updates Завершение обновлений SnapSource Classic mode required Требуется классический режим This snap requires confinement to be disabled via classic mode Этот Snap пакет требует подтверждения для отключения через классический режим Cancel Отменить Continue Продолжить UpdatesPage Updates Обновления Up to date Обновления отсутствуют System Updates Системные обновления Update All Обновить все Updating... Идет обновление... Update All (%1) Обновить все (%1) Updates Available Доступны обновления Updates Installed Установленные обновления main An app store for DDE built with DTK Магазин приложений для DDE, написанный с использованием DTK Created by %1 Разработан %1 settings "System Updates" "Обновления системы" Individual Packages Отдельные пакеты Hourly Каждый час Never Никогда stars (%1 ratings) (Оценок: %1) dde-store-1.2.5/translations/dde-store_tr.ts000066400000000000000000000341421454654107700211120ustar00rootroot00000000000000 CategoryPage Sort by Sıralama türü Alphabetical Alfabetık Ratings Derecelendirmeye göre No results for %1 %1 için sonuç bulunamadı HomePage Messaging Mesajlaşma Internet İnternet Games Oyunlar Development Geliştirme Office Ofis Graphics Grafikler Video Video Music Müzik System Sistem View More Daha fazla ItemPage Uninstall Kaldır No description provided. Açıklama sağlanmadı. Installed "%1" Kuruldu "%1" Uninstalled "%1" Kaldırıldı "%1" Install (%1) Kur (%1) Open MainWindow Check for updates Quit Settings Ayarlar Home Ana sayfa Messaging Mesajlaşma Internet İnternet Games Oyunlar Development Geliştirme Office Ofis Graphics Grafikler Video Video Music Müzik System Sistem Installed Yüklenenler Updates Güncellemeler Exit Minimize to system tray Do not ask again Please choose your action Cancel Confirm Cannot close while app is being installed Uygulama yüklenirken kapatılamaz OK Tamam PackageKitSource ERROR: Unable to open AppStream metadata pool Hata: AppStream metaveri havuzu açılamıyor QObject Basic View Behaviour Notifications Show non-app updates as Max apps per list Minimize to tray on exit Check for updates App installed App uninstalled Available updates Finished updates SnapSource Classic mode required This snap requires confinement to be disabled via classic mode Cancel Continue UpdatesPage Updates Güncellemeler Up to date Güncel System Updates Sistem güncellemeleri Update All Tümünü güncelle Updating... Güncelleniyor... Update All (%1) Tümünü güncelle (%1) Updates Available Güncellemeler mevcut Updates Installed Güncelleştirmeler kuruldu main An app store for DDE built with DTK DTK ile oluşturulmuş DDE için bir uygulama mağazası Created by %1 %1 tarafından oluşturuldu settings "System Updates" Individual Packages Hourly Never stars (%1 ratings) (%1 derecelendirme) dde-store-1.2.5/translations/dde-store_zh_CN.ts000066400000000000000000000335661454654107700214770ustar00rootroot00000000000000 CategoryPage Sort by 排序方式 Alphabetical 字母 Ratings 评分 No results for %1 没有找到 %1 HomePage Messaging 消息 Internet 网络 Games 游戏 Development 开发 Office 办公 Graphics 图形图像 Video 视频 Music 音乐 System 系统 View More 查看更多 ItemPage Uninstall 卸载 No description provided. 没有提供描述。 Installed "%1" 已安装 %1 Uninstalled "%1" 已卸载 %1 Install (%1) 安装(%1) Open 打开 MainWindow Check for updates 检查更新 Quit 退出 Settings 设置 Home 主页 Messaging 消息 Internet 网络 Games 游戏 Development 开发 Office 办公 Graphics 图形图像 Video 视频 Music 音乐 System 系统 Installed 已装 Updates 更新 Exit 退出 Minimize to system tray 最小化到系统托盘 Do not ask again 不再询问 Please choose your action 请选择你的操作 Cancel 取消 Confirm 确认 Cannot close while app is being installed 不能在安装应用程序时关闭 OK 知道了 PackageKitSource ERROR: Unable to open AppStream metadata pool 错误:无法打开 AppStream 元数据池 QObject Basic 基础设置 View 视图 Behaviour 行为 Notifications 通知 Show non-app updates as 没有软件更新时显示 Max apps per list 列表最大软件数 Minimize to tray on exit 退出时最小化到托盘 Check for updates 检查更新频率 App installed 安装完软件 App uninstalled 卸载完软件 Available updates 更新就绪 Finished updates 更新完成 SnapSource Classic mode required 需要经典模式 This snap requires confinement to be disabled via classic mode 此 Snap 软件需要通过经典模式解除限制 Cancel 取消 Continue 继续 UpdatesPage Updates 更新 Up to date 已是最新 System Updates 系统更新 Update All 全部更新 Updating... 正在更新…… Update All (%1) 全部更新(%1) Updates Available 更新就绪 Updates Installed 已安装更新 main An app store for DDE built with DTK 一个用了 DTK 给深度桌面环境开发的应用软件商店 Created by %1 由 %1 进行开发 settings "System Updates" 系统更新 Individual Packages 单独的包 Hourly 每小时 Never 不检查 stars (%1 ratings) (%1 个评分) dde-store-1.2.5/widgets/000077500000000000000000000000001454654107700150705ustar00rootroot00000000000000dde-store-1.2.5/widgets/gallery.cpp000066400000000000000000000116321454654107700172360ustar00rootroot00000000000000#include "widgets/gallery.h" #include #include #include #include #include #include gallery::gallery(QList imageList) { init(); images = imageList; changeImage(0); pageIndicator->setPageCount(imageList.length()); connect(backButton, &DIconButton::clicked, this, [ = ] { changeImage(currentImage - 1); }); connect(forwardButton, &DIconButton::clicked, this, [ = ] { changeImage(currentImage + 1); }); } gallery::gallery(QList> imageList, MainWindow *parent) { init(); imageView->installEventFilter(this); banners = imageList; mainwindow = parent; changeLocalImage(0); pageIndicator->setPageCount(imageList.length()); connect(backButton, &DIconButton::clicked, this, [ = ] { changeLocalImage(currentImage - 1); }); connect(forwardButton, &DIconButton::clicked, this, [ = ] { changeLocalImage(currentImage + 1); }); QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, [ = ] { if (banners.length() - 1 == currentImage) { changeLocalImage(0); } else { changeLocalImage(currentImage + 1); } }); timer->start(5000); } void gallery::init() { QVBoxLayout *layout = new QVBoxLayout; layout->setAlignment(Qt::AlignTop); layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); QHBoxLayout *container = new QHBoxLayout; container->setAlignment(Qt::AlignTop); layout->addLayout(container); container->addStretch(); backButton = new DIconButton(DStyle::SP_ArrowBack); backButton->setDisabled(true); container->addWidget(backButton, 1, Qt::AlignVCenter); imageView = new QLabel; container->addWidget(imageView); spinner = new DSpinner; spinner->setFixedSize(50, 50); spinner->hide(); container->addWidget(spinner); forwardButton = new DIconButton(DStyle::SP_ArrowForward); forwardButton->setDisabled(true); container->addWidget(forwardButton, 1, Qt::AlignVCenter); container->addStretch(); pageIndicator = new DPageIndicator; layout->addWidget(pageIndicator); } void gallery::changeLocalImage(int index) { if (banners.length() != 1) { backButton->setDisabled(false); forwardButton->setDisabled(false); } if (index == 0) { backButton->setDisabled(true); } else if (index == banners.length() - 1) { forwardButton->setDisabled(true); } currentImage = index; pageIndicator->setCurrentPage(index); const int width = imageView->width() * devicePixelRatioF(); QPixmap && pixmap = QPixmap::fromImage(QImage(banners[index].first)).scaled(width, width * 9/16, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap.setDevicePixelRatio(devicePixelRatioF()); imageView->setPixmap(pixmap); } void gallery::changeImage(int index) { if (images.length() != 1) { backButton->setDisabled(false); forwardButton->setDisabled(false); } if (index == 0) { backButton->setDisabled(true); } else if (index == images.length() - 1) { forwardButton->setDisabled(true); } currentImage = index; pageIndicator->setCurrentPage(index); QNetworkAccessManager *networkManager = new QNetworkAccessManager; QNetworkDiskCache *diskCache = new QNetworkDiskCache; QString cacheDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); diskCache->setCacheDirectory(cacheDir); diskCache->setMaximumCacheSize(5242880); networkManager->setCache(diskCache); QNetworkRequest request; request.setUrl(images[index]); request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); networkManager->get(request); imageView->hide(); spinner->show(); spinner->start(); connect(networkManager, &QNetworkAccessManager::finished, this, [ = ] (QNetworkReply *reply) { QByteArray imageData = reply->readAll(); QPixmap pixmap; pixmap.loadFromData(imageData); spinner->stop(); spinner->hide(); if (pixmap.isNull()) { if (images.length() == 1) { this->hide(); } else { images.removeAt(index); pageIndicator->setPageCount(images.length()); changeImage(0); } } else { imageView->setPixmap(pixmap.scaled(imageView->width(), imageView->width() * 9/16, Qt::AspectRatioMode::KeepAspectRatio, Qt::SmoothTransformation)); imageView->show(); } }); } bool gallery::eventFilter(QObject *object, QEvent *event) { if (object == imageView && !banners.isEmpty() && event->type() == QEvent::MouseButtonRelease) { mainwindow->openItem(banners[currentImage].second); } return QObject::eventFilter(object, event); } dde-store-1.2.5/widgets/gallery.h000066400000000000000000000015501454654107700167010ustar00rootroot00000000000000#ifndef GALLERY_H #define GALLERY_H #include #include #include #include #include #include #include #include "mainwindow.h" #include "backend/sourcemanager.h" DWIDGET_USE_NAMESPACE class gallery : public QWidget { Q_OBJECT public: gallery(QList imageList); gallery(QList> imageList, MainWindow *parent); private: QLabel *imageView; int currentImage; void init(); void changeImage(int index); void changeLocalImage(int index); QList images; QList> banners; DIconButton *backButton; DIconButton *forwardButton; DSpinner *spinner; DPageIndicator *pageIndicator; MainWindow *mainwindow; bool eventFilter(QObject *object, QEvent *event); }; #endif // GALLERY_Hdde-store-1.2.5/widgets/list.cpp000066400000000000000000000055621454654107700165570ustar00rootroot00000000000000#include "widgets/list.h" List::List(QString title) { layout = new QVBoxLayout; this->setLayout(layout); headerLayout = new QHBoxLayout; headerLayout->setAlignment(Qt::AlignTop); DLabel *titleLabel = new DLabel(title); QFont titleFont; titleFont.setPixelSize(28); titleLabel->setFont(titleFont); headerLayout->addWidget(titleLabel); headerLayout->addStretch(); headerLayout->setSpacing(10); headerLayout->setMargin(10); layout->addLayout(headerLayout); listView = new DListView; listView->setViewMode(QListView::IconMode); listView->setItemSize(QSize(128,128)); listView->setIconSize(QSize(64, 64)); listView->setSpacing(20); listView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); listView->setSelectionMode(QAbstractItemView::NoSelection); listView->setMaximumWidth(QWIDGETSIZE_MAX); listView->setMinimumWidth(188); listView->setEditTriggers(QListView::NoEditTriggers); listView->setResizeMode(QListView::Adjust); listView->setOrientation(QListView::LeftToRight, true); listView->setFocusPolicy(Qt::NoFocus); DStyle::setFrameRadius(listView, 18); model = new QStandardItemModel; listView->setModel(model); connect(listView, qOverload(&DListView::currentChanged), this, [ = ] { if (listView->currentIndex().row() != -1) { emit currentItemChanged(model->item(listView->currentIndex().row())->data()); listView->setCurrentIndex(QModelIndex()); } }); loading = new DSpinner; loading->setFixedSize(50, 50); loading->start(); layout->addWidget(loading, 0, Qt::AlignHCenter | Qt::AlignTop); emptyLabel = new DLabel; QFont emptyFont; emptyFont.setPixelSize(28); emptyLabel->setFont(emptyFont); emptyLabel->setAlignment(Qt::AlignHCenter); emptyLabel->hide(); layout->addWidget(emptyLabel, 0, Qt::AlignTop); } void List::addItem(QString name, QIcon icon, QVariant data) { DStandardItem *item = new DStandardItem(icon, name); item->setData(data.isNull() ? name : data); model->appendRow(item); } void List::addHeaderWidget(QWidget *widget) { headerLayout->addWidget(widget); } void List::setEmptyText(QString text) { emptyLabel->setText(text); } void List::editItemText(QString package, QString text) { for (int i = 0; i < model->rowCount(); i++) { if (model->item(i)->data() == package) { model->item(i)->setText(text); } } } void List::clear() { model->clear(); listView->removeItems(0, listView->count()); } void List::load() { loading->hide(); if (model->rowCount() == 0) { layout->removeWidget(listView); emptyLabel->show(); } else { layout->addWidget(listView); } } void List::unload() { loading->show(); emptyLabel->hide(); layout->removeWidget(listView); }dde-store-1.2.5/widgets/list.h000066400000000000000000000013671454654107700162230ustar00rootroot00000000000000#ifndef LIST_H #define LIST_H #include #include #include #include #include #include DWIDGET_USE_NAMESPACE class List : public QWidget { Q_OBJECT public: List(QString title); void addItem(QString name, QIcon icon, QVariant data = QVariant()); void addHeaderWidget(QWidget *widget); void setEmptyText(QString text); void editItemText(QString package, QString text); void clear(); void load(); void unload(); DListView *listView; private: QHBoxLayout *headerLayout; QStandardItemModel *model; DSpinner *loading; DLabel *emptyLabel; QVBoxLayout *layout; signals: void currentItemChanged(QVariant data); }; #endif // LIST_H dde-store-1.2.5/widgets/stars.cpp000066400000000000000000000015071454654107700167330ustar00rootroot00000000000000#include "widgets/stars.h" #include "backend/ratingshelper.h" #include #include stars::stars(QString app) { QHBoxLayout *layout = new QHBoxLayout; this->setLayout(layout); layout->setMargin(0); layout->setAlignment(Qt::AlignLeft); double rating = RatingsHelper::instance()->averageRating(app); for (int i = 0; i < int(rating); i++) { QLabel *star = new QLabel; star->setPixmap(QPixmap("://icons/star.png")); layout->addWidget(star); } if (QString::number(rating).endsWith(".5")) { QLabel *halfstar = new QLabel; halfstar->setPixmap(QPixmap("://icons/starhalf.png")); layout->addWidget(halfstar); } QLabel *total = new QLabel(tr("(%1 ratings)").arg(RatingsHelper::instance()->totalRatings(app))); layout->addWidget(total); }dde-store-1.2.5/widgets/stars.h000066400000000000000000000002271454654107700163760ustar00rootroot00000000000000#ifndef STARS_H #define STARS_H #include class stars : public QWidget { Q_OBJECT public: stars(QString app); }; #endif // STARS_H