Repository: oguzhaninan/Stacer Branch: native Commit: a44d0565a05c Files: 191 Total size: 1.9 MB Directory structure: gitextract_zr7tsmtq/ ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── .travis.yml ├── CMakeLists.txt ├── LICENSE ├── README.md ├── Stacer.pro ├── applications/ │ └── stacer.desktop ├── cmake/ │ └── cxxbasics/ │ ├── CXXBasics.cmake │ ├── DefaultSettings.cmake │ ├── InitCXXBasics.cmake │ ├── UNLICENSE │ ├── accelerators/ │ │ ├── UseCCache.cmake │ │ ├── UseCompilerCacheTool.cmake │ │ ├── UseFasterLinkers.cmake │ │ └── UseSCCache.cmake │ ├── compiler_detection/ │ │ └── GetTargetArch.cmake │ └── helpers/ │ ├── FnMktemp.cmake │ ├── MacroCustomMessages.cmake │ └── MacroOpt.cmake ├── debian/ │ ├── changelog │ ├── compat │ ├── control │ ├── copyright │ ├── install │ ├── postinst │ ├── postrm │ ├── rules │ └── source/ │ └── format ├── release.sh ├── stacer/ │ ├── CMakeLists.txt │ ├── Managers/ │ │ ├── app_manager.cpp │ │ ├── app_manager.h │ │ ├── info_manager.cpp │ │ ├── info_manager.h │ │ ├── setting_manager.cpp │ │ ├── setting_manager.h │ │ ├── tool_manager.cpp │ │ └── tool_manager.h │ ├── Pages/ │ │ ├── AptSourceManager/ │ │ │ ├── apt_source_edit.cpp │ │ │ ├── apt_source_edit.h │ │ │ ├── apt_source_edit.ui │ │ │ ├── apt_source_manager_page.cpp │ │ │ ├── apt_source_manager_page.h │ │ │ ├── apt_source_manager_page.ui │ │ │ ├── apt_source_repository_item.cpp │ │ │ ├── apt_source_repository_item.h │ │ │ └── apt_source_repository_item.ui │ │ ├── Dashboard/ │ │ │ ├── circlebar.cpp │ │ │ ├── circlebar.h │ │ │ ├── circlebar.ui │ │ │ ├── dashboard_page.cpp │ │ │ ├── dashboard_page.h │ │ │ ├── dashboard_page.ui │ │ │ ├── linebar.cpp │ │ │ ├── linebar.h │ │ │ └── linebar.ui │ │ ├── GnomeSettings/ │ │ │ ├── appearance_settings.cpp │ │ │ ├── appearance_settings.h │ │ │ ├── appearance_settings.ui │ │ │ ├── gnome_settings_page.cpp │ │ │ ├── gnome_settings_page.h │ │ │ ├── gnome_settings_page.ui │ │ │ ├── unity_settings.cpp │ │ │ ├── unity_settings.h │ │ │ ├── unity_settings.ui │ │ │ ├── window_manager_settings.cpp │ │ │ ├── window_manager_settings.h │ │ │ └── window_manager_settings.ui │ │ ├── Helpers/ │ │ │ ├── helpers_page.cpp │ │ │ ├── helpers_page.h │ │ │ ├── helpers_page.ui │ │ │ ├── host_manage.cpp │ │ │ ├── host_manage.h │ │ │ └── host_manage.ui │ │ ├── Processes/ │ │ │ ├── processes_page.cpp │ │ │ ├── processes_page.h │ │ │ └── processes_page.ui │ │ ├── Resources/ │ │ │ ├── history_chart.cpp │ │ │ ├── history_chart.h │ │ │ ├── history_chart.ui │ │ │ ├── resources_page.cpp │ │ │ ├── resources_page.h │ │ │ └── resources_page.ui │ │ ├── Search/ │ │ │ ├── search_page.cpp │ │ │ ├── search_page.h │ │ │ └── search_page.ui │ │ ├── Services/ │ │ │ ├── service_item.cpp │ │ │ ├── service_item.h │ │ │ ├── service_item.ui │ │ │ ├── services_page.cpp │ │ │ ├── services_page.h │ │ │ └── services_page.ui │ │ ├── Settings/ │ │ │ ├── settings_page.cpp │ │ │ ├── settings_page.h │ │ │ └── settings_page.ui │ │ ├── StartupApps/ │ │ │ ├── startup_app.cpp │ │ │ ├── startup_app.h │ │ │ ├── startup_app.ui │ │ │ ├── startup_app_edit.cpp │ │ │ ├── startup_app_edit.h │ │ │ ├── startup_app_edit.ui │ │ │ ├── startup_apps_page.cpp │ │ │ ├── startup_apps_page.h │ │ │ └── startup_apps_page.ui │ │ ├── SystemCleaner/ │ │ │ ├── byte_tree_widget.cpp │ │ │ ├── byte_tree_widget.h │ │ │ ├── system_cleaner_page.cpp │ │ │ ├── system_cleaner_page.h │ │ │ └── system_cleaner_page.ui │ │ └── Uninstaller/ │ │ ├── uninstaller_page.cpp │ │ ├── uninstaller_page.h │ │ └── uninstallerpage.ui │ ├── app.cpp │ ├── app.h │ ├── app.ui │ ├── feedback.cpp │ ├── feedback.h │ ├── feedback.ui │ ├── main.cpp │ ├── signal_mapper.cpp │ ├── signal_mapper.h │ ├── sliding_stacked_widget.cpp │ ├── sliding_stacked_widget.h │ ├── stacer.pro │ ├── static/ │ │ ├── languages.json │ │ ├── themes/ │ │ │ ├── default/ │ │ │ │ └── style/ │ │ │ │ ├── style.qss │ │ │ │ └── values.ini │ │ │ └── light/ │ │ │ └── style/ │ │ │ ├── style.qss │ │ │ └── values.ini │ │ └── themes.json │ ├── static.qrc │ └── utilities.h ├── stacer-core/ │ ├── CMakeLists.txt │ ├── Info/ │ │ ├── cpu_info.cpp │ │ ├── cpu_info.h │ │ ├── disk_info.cpp │ │ ├── disk_info.h │ │ ├── memory_info.cpp │ │ ├── memory_info.h │ │ ├── network_info.cpp │ │ ├── network_info.h │ │ ├── process.cpp │ │ ├── process.h │ │ ├── process_info.cpp │ │ ├── process_info.h │ │ ├── system_info.cpp │ │ └── system_info.h │ ├── Tools/ │ │ ├── apt_source_tool.cpp │ │ ├── apt_source_tool.h │ │ ├── gnome_schema.h │ │ ├── gnome_settings_tool.cpp │ │ ├── gnome_settings_tool.h │ │ ├── package_tool.cpp │ │ ├── package_tool.h │ │ ├── service_tool.cpp │ │ └── service_tool.h │ ├── Utils/ │ │ ├── command_util.cpp │ │ ├── command_util.h │ │ ├── file_util.cpp │ │ ├── file_util.h │ │ ├── format_util.cpp │ │ └── format_util.h │ ├── stacer-core.pro │ └── stacer-core_global.h └── translations/ ├── stacer_ar.ts ├── stacer_ca-es.ts ├── stacer_cs.ts ├── stacer_de.ts ├── stacer_en.ts ├── stacer_es.ts ├── stacer_fr.ts ├── stacer_gl.ts ├── stacer_hi.ts ├── stacer_hu.ts ├── stacer_it.ts ├── stacer_kn.ts ├── stacer_ko.ts ├── stacer_ml.ts ├── stacer_nl.ts ├── stacer_oc.ts ├── stacer_pl.ts ├── stacer_pt.ts ├── stacer_ro.ts ├── stacer_ru.ts ├── stacer_sv.ts ├── stacer_tr.ts ├── stacer_ua.ts ├── stacer_vn.ts ├── stacer_zh-cn.ts └── stacer_zh-tw.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: oguzhaninan open_collective: stacer ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel custom: # Replace with a single custom sponsorship URL ================================================ FILE: .gitignore ================================================ Stacer.pro.* dist/ build/ #*.AppImage .vscode Release/ ================================================ FILE: .travis.yml ================================================ language: cpp compiler: clang sudo: require dist: trusty before_install: - sudo add-apt-repository ppa:beineri/opt-qt591-trusty -y - sudo apt-get update -qq install: - sudo apt-get -y -qq install cmake - sudo apt-get -y -qq install libgl1-mesa-dev qt59base qt59imageformats qt59svg qt59charts-no-lgpl qt59tools - source /opt/qt*/bin/qt*-env.sh before_script: - mkdir build && cd build - cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_PREFIX_PATH=$QTDIR/bin .. script: - make -j $(nproc) - lupdate ../stacer/stacer.pro -no-obsolete - lrelease ../stacer/stacer.pro ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.1 FATAL_ERROR) project(Stacer) # Adding features(build cache + faster linkers) and reasonable defaults(Debug build by default) include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cxxbasics/CXXBasics.cmake") # Setting a cleaner directory structure for the generated binaries set(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}/output") set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/") set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib") set(PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}") # Activating MOC and searching for the Qt5 dependencies set(CMAKE_AUTOMOC ON) find_package(Qt5 COMPONENTS Core Gui Widgets Charts Svg Concurrent REQUIRED) # Setting the minimum C++ standard and passing the Qt-specific define set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS YES) set(CMAKE_CXX_STANDARD_REQUIRED YES) add_definitions(-DQT_DEPRECATED_WARNINGS) # Subprojects add_subdirectory(stacer-core) add_subdirectory(stacer) ================================================ FILE: LICENSE ================================================ 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 . ================================================ FILE: README.md ================================================

⚠️ This project has been abandoned. There will be no further releases ⚠️

Linux System Optimizer and Monitoring
Patreon

Download Stacer Platform (GNU/Linux) Github All Releases

## Reviews

### Required Packages - curl, systemd ### PPA Repository (for ubuntu) 1. `sudo add-apt-repository ppa:oguzhaninan/stacer -y` 2. `sudo apt-get update` 3. `sudo apt-get install stacer -y` ### Arch Linux (AUR) 1. Install the stacer package with a AUR helper of your choice eg. 2. `yay -Syyu stacer` 3. `paru -S stacer` 4. `pacaur -a stacer` ### Debian x64 1. Download `stacer_1.1.0_amd64.deb` from the [Stacer releases page](https://github.com/oguzhaninan/Stacer/releases). 2. Run `sudo dpkg -i stacer*.deb` on the downloaded package. 3. Launch Stacer using the installed `stacer` command. ### Debian sid / Ubuntu 20.04+ 1. Run as root `apt install stacer` ### Fedora 1. Download `stacer_1.1.0_amd64.rpm` from the [Stacer releases page](https://github.com/oguzhaninan/Stacer/releases). 2. Run `sudo rpm --install stacer*.rpm --nodeps --force` on the downloaded package. 3. Launch Stacer using the installed `stacer` command. ### Fedora (with DNF) 1. Run: `sudo dnf install stacer` 2. Launch Stacer using the installed `stacer` command. ## Build from source with CMake (Qt Version Qt 5.x) 1. `mkdir build && cd build` 2. `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/qt/path/bin ..` 3. `make -j $(nproc)` 4. `output/bin/stacer` ## Screenshots

## Contributors ### Code Contributors This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. ### Financial Contributors Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/Stacer/contribute)] #### Individuals #### Organizations Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/Stacer/contribute)] ================================================ FILE: Stacer.pro ================================================ TEMPLATE = subdirs SUBDIRS += \ stacer-core \ stacer ================================================ FILE: applications/stacer.desktop ================================================ [Desktop Entry] Name=Stacer Exec=stacer Comment=Linux System Optimizer and Monitoring Icon=stacer Type=Application Terminal=false Categories=Utility; ================================================ FILE: cmake/cxxbasics/CXXBasics.cmake ================================================ cmake_minimum_required(VERSION 3.0 FATAL_ERROR) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") # Variables necessary in every module include(InitCXXBasics) # Set reasonable CMake defaults include(DefaultSettings) # Activate faster linkers by default include(accelerators/UseFasterLinkers) # Activate the compiler cache tool include(accelerators/UseCompilerCacheTool) # Allow the user to extend CXXBasics if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/../cxxbasics-extension.cmake") include("${CMAKE_CURRENT_LIST_DIR}/../cxxbasics-extension.cmake") endif() ================================================ FILE: cmake/cxxbasics/DefaultSettings.cmake ================================================ # This module sets reasonable defaults that probably every C/C++ CMake project should cmake_minimum_required(VERSION 3.0 FATAL_ERROR) # Default build type "Debug" opt_ifndef("Build Type(Debug, Release, RelWithDebInfo, MinSizeRel)" STRING "Debug" CMAKE_BUILD_TYPE) # Generate "compile_commands.json" - tools like clang-tidy can be run on this file set(CMAKE_EXPORT_COMPILE_COMMANDS ON) ================================================ FILE: cmake/cxxbasics/InitCXXBasics.cmake ================================================ ## This module defines common functions and variables that should be accessible in every module cmake_minimum_required(VERSION 3.0 FATAL_ERROR) # Enable C and CXX by default. This allows to run some commands in script mode, or using "-C" enable_language(C) enable_language(CXX) # Project custom messaging macros include(helpers/MacroCustomMessages) # Widely-used macros to handle the cache variables include(helpers/MacroOpt) ================================================ FILE: cmake/cxxbasics/UNLICENSE ================================================ This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to ================================================ FILE: cmake/cxxbasics/accelerators/UseCCache.cmake ================================================ # This module activates "ccache" support on Unix # This module is supposed to be used only from "UseCompilerCacheTool.cmake" cmake_minimum_required(VERSION 3.0 FATAL_ERROR) find_program(__cxxbasics_ccache_found ccache) if(__cxxbasics_ccache_found) if(NOT CMAKE_C_COMPILER_LAUNCHER) set(CMAKE_C_COMPILER_LAUNCHER ccache) endif() if(NOT CMAKE_CXX_COMPILER_LAUNCHER) set(CMAKE_CXX_COMPILER_LAUNCHER ccache) endif() endif() ================================================ FILE: cmake/cxxbasics/accelerators/UseCompilerCacheTool.cmake ================================================ # This module activates a compiler cache cmake_minimum_required(VERSION 3.0 FATAL_ERROR) opt_ifndef("Use a compiler cache tool, if supported" BOOL ON CXXBASICS_ACTIVATE_COMPILER_CACHE) if(CXXBASICS_ACTIVATE_COMPILER_CACHE) if(CMAKE_HOST_UNIX) include(accelerators/UseCCache) endif() if(NOT CMAKE_C_COMPILER_LAUNCHER OR NOT CMAKE_CXX_COMPILER_LAUNCHER) include(accelerators/UseSCCache) endif() if(CMAKE_C_COMPILER_LAUNCHER) cbok("Compiler cache tool \"${CMAKE_C_COMPILER_LAUNCHER}\" set for the C compiler") else() cbnok("Could not set a compiler cache tool for the C compiler") endif() if(CMAKE_CXX_COMPILER_LAUNCHER) cbok("Compiler cache tool \"${CMAKE_CXX_COMPILER_LAUNCHER}\" set for the CXX compiler") else() cbnok("Could not set a compiler cache tool for the CXX compiler") endif() endif() ================================================ FILE: cmake/cxxbasics/accelerators/UseFasterLinkers.cmake ================================================ # This module activates faster linkers, if these are available and supported. # It prefers the fastest linker available(as of this writing LLD -> GNU gold -> ...) # The linker is handled separately per compiler, so, you can do something like this: # -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=clang++ cmake_minimum_required(VERSION 3.0 FATAL_ERROR) cmake_policy(PUSH) if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif(POLICY CMP0054) opt_ifndef("Use faster linkers(LLD, GNU gold...) if supported" BOOL ON CXXBASICS_USE_FASTER_LINKERS) if(CXXBASICS_USE_FASTER_LINKERS) macro(__cxxbasics_set_linker compiler) # Lets check if the default linker is not actually LLD or GNU gold(ex: a symbolic link) execute_process(COMMAND ${compiler} -Wl,--version OUTPUT_VARIABLE __cxxbasics_ld_version ERROR_QUIET) if("${__cxxbasics_ld_version}" MATCHES "LLD") set(__cxxbasics_using_lld_linker ON) elseif("${__cxxbasics_ld_version}" MATCHES "GNU gold") set(__cxxbasics_using_gold_linker ON) else() set(__cxxbasics_using_default_linker ON) endif() # We don't do anything if the system linker already is the LLD linker, or links to it if(NOT __cxxbasics_using_lld_linker) # We try to set LLD first because it's the fastest linker currently if(NOT __cxxbasics_using_lld_linker) # LLD is currently production quality only on "x86_64" include(compiler_detection/GetTargetArch) if("${compiler}" STREQUAL "${CMAKE_C_COMPILER}") set(__cxxbasics_target_arch "${CXXBASICS_C_COMPILER_TARGET_ARCH}") set(__cxxbasics_current_compiler "CMAKE_C_COMPILER") elseif("${compiler}" STREQUAL "${CMAKE_CXX_COMPILER}") set(__cxxbasics_target_arch "${CXXBASICS_CXX_COMPILER_TARGET_ARCH}") set(__cxxbasics_current_compiler "CMAKE_CXX_COMPILER") else() cberror("Could not obtain CMAKE_C_COMPILER nor CMAKE_CXX_COMPILER") endif() if("${__cxxbasics_target_arch}" STREQUAL "x86_64") # Lets check if the compiler supports the LLD linker execute_process(COMMAND ${compiler} -fuse-ld=lld -Wl,--version OUTPUT_VARIABLE __cxxbasics_ld_version ERROR_QUIET) if("${__cxxbasics_ld_version}" MATCHES "LLD") if("${__cxxbasics_current_compiler}" STREQUAL "CMAKE_C_COMPILER") set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -fuse-ld=lld") else() set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -fuse-ld=lld") endif() set(__cxxbasics_using_lld_linker ON) cbok("${__cxxbasics_current_compiler}(${compiler})'s linker set to: LLD linker") endif() endif("${__cxxbasics_target_arch}" STREQUAL "x86_64") endif() # We set the GNU gold linker if we failed to set LLD if(NOT __cxxbasics_using_lld_linker AND NOT __cxxbasics_using_gold_linker) execute_process(COMMAND ${compiler} -fuse-ld=gold -Wl,--version OUTPUT_VARIABLE __cxxbasics_ld_version ERROR_QUIET) if("${__cxxbasics_ld_version}" MATCHES "GNU gold") if("${__cxxbasics_current_compiler}" STREQUAL "CMAKE_C_COMPILER") set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -fuse-ld=gold") else() set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -fuse-ld=gold") endif() set(__cxxbasics_using_gold_linker ON) cbok("${__cxxbasics_current_compiler}(${compiler})'s linker is set to: GNU gold linker") endif() endif() # If we failed to set LLD or the GNU gold linker, we fallback to the default linker if(NOT __cxxbasics_using_lld_linker AND NOT __cxxbasics_using_gold_linker) set(__cxxbasics_using_default_linker ON) cbnok("${__cxxbasics_current_compiler}(${compiler})'s linker set to the fallback: default linker") endif() endif(NOT __cxxbasics_using_lld_linker) unset(__cxxbasics_using_lld_linker) unset(__cxxbasics_using_gold_linker) unset(__cxxbasics_using_default_linker) unset(__cxxbasics_ld_version) unset(__cxxbasics_target_arch) unset(__cxxbasics_current_compiler) endmacro() # Set the linker for the C compiler __cxxbasics_set_linker("${CMAKE_C_COMPILER}") # Set the linker for the CXX compiler __cxxbasics_set_linker("${CMAKE_CXX_COMPILER}") endif() cmake_policy(POP) ================================================ FILE: cmake/cxxbasics/accelerators/UseSCCache.cmake ================================================ # This module activates "sccache" support on Unix and Windows if # another compiler cache tool was not found. # This module is supposed to be used only from "UseCompilerCacheTool.cmake" cmake_minimum_required(VERSION 3.0 FATAL_ERROR) find_program(__cxxbasics_sccache_found sccache) if(__cxxbasics_sccache_found) if(NOT CMAKE_C_COMPILER_LAUNCHER) set(CMAKE_C_COMPILER_LAUNCHER sccache) endif() if(NOT CMAKE_CXX_COMPILER_LAUNCHER) set(CMAKE_CXX_COMPILER_LAUNCHER sccache) endif() endif() ================================================ FILE: cmake/cxxbasics/compiler_detection/GetTargetArch.cmake ================================================ # This module identifies the target architecture of the C and CXX compilers # ARM("armv8" includes AArch64, "arm" is all the old ARM processors + Cortex-M): armv8, armv7, armv6, armv5, arm # Itanium: ia64 # Traditional PC architectures: x86, x86_64 # MIPS(RISC): mipsI, mipsII, mipsIII, mipsIV, mipsV, mips32, mips64, mips # PowerPC: ppc64, ppc # IBM System z: s390, s390x # SPARC: sparcv9, sparc64, sparc cmake_minimum_required(VERSION 3.0 FATAL_ERROR) cmake_policy(PUSH) if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif(POLICY CMP0054) opt_ifndef("C compiler target architecture" STRING "" CXXBASICS_C_COMPILER_TARGET_ARCH) opt_ifndef("CXX compiler target architecture" STRING "" CXXBASICS_CXX_COMPILER_TARGET_ARCH) if("${CXXBASICS_C_COMPILER_TARGET_ARCH}" STREQUAL "" OR "${CXXBASICS_CXX_COMPILER_TARGET_ARCH}" STREQUAL "") include(helpers/FnMktemp) mktemp() if("${mktemp_result}" STREQUAL "") opt_overwrite(CXXBASICS_TMP_FOLDER "${CMAKE_BINARY_DIR}") mktemp() endif() ## Based on Qt 5.9 processor detection: https://github.com/qt/qtbase/blob/dev/src/corelib/global/qprocessordetection.h file(WRITE "${mktemp_result}" " // ARM #if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__aarch64__) # if defined(__ARM64_ARCH_8__) \\ || defined(__aarch64__) \\ || defined(__CORE_CORTEXAV8__) // GHS-specific for INTEGRITY # define Q_PROCESSOR_ARM 8 # elif defined(__ARM_ARCH_7__) \\ || defined(__ARM_ARCH_7A__) \\ || defined(__ARM_ARCH_7R__) \\ || defined(__ARM_ARCH_7M__) \\ || defined(__ARM_ARCH_7S__) \\ || defined(_ARM_ARCH_7) \\ || defined(__CORE_CORTEXA__) // GHS-specific for INTEGRITY # define Q_PROCESSOR_ARM 7 # elif defined(__ARM_ARCH_6__) \\ || defined(__ARM_ARCH_6J__) \\ || defined(__ARM_ARCH_6T2__) \\ || defined(__ARM_ARCH_6Z__) \\ || defined(__ARM_ARCH_6K__) \\ || defined(__ARM_ARCH_6ZK__) \\ || defined(__ARM_ARCH_6M__) # define Q_PROCESSOR_ARM 6 # elif defined(__ARM_ARCH_5TEJ__) \\ || defined(__ARM_ARCH_5TE__) # define Q_PROCESSOR_ARM 5 # else # define Q_PROCESSOR_ARM 0 # endif # if Q_PROCESSOR_ARM >= 8 # error CMAKE_TARGET_ARCH armv8 # endif # if Q_PROCESSOR_ARM >= 7 # error CMAKE_TARGET_ARCH armv7 # endif # if Q_PROCESSOR_ARM >= 6 # error CMAKE_TARGET_ARCH armv6 # endif # if Q_PROCESSOR_ARM >= 5 # error CMAKE_TARGET_ARCH armv5 # endif # error CMAKE_TARGET_ARCH arm // old ARM, Cortex-M... #elif defined(__i386) || defined(__i386__) || defined(_M_IX86) // x86 # error CMAKE_TARGET_ARCH x86 #elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) // x86_64 # error CMAKE_TARGET_ARCH x86_64 #elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64) // Itanium # error CMAKE_TARGET_ARCH ia64 #elif defined(__mips) || defined(__mips__) || defined(_M_MRX000) // MIPS(RISC) # if defined(_MIPS_ARCH_MIPS1) || (defined(__mips) && __mips - 0 >= 1) # error CMAKE_TARGET_ARCH mipsI # endif # if defined(_MIPS_ARCH_MIPS2) || (defined(__mips) && __mips - 0 >= 2) # error CMAKE_TARGET_ARCH mipsII # endif # if defined(_MIPS_ARCH_MIPS3) || (defined(__mips) && __mips - 0 >= 3) # error CMAKE_TARGET_ARCH mipsIII # endif # if defined(_MIPS_ARCH_MIPS4) || (defined(__mips) && __mips - 0 >= 4) # error CMAKE_TARGET_ARCH mipsIV # endif # if defined(_MIPS_ARCH_MIPS5) || (defined(__mips) && __mips - 0 >= 5) # error CMAKE_TARGET_ARCH mipsV # endif # if defined(_MIPS_ARCH_MIPS32) || defined(__mips32) || (defined(__mips) && __mips - 0 >= 32) # error CMAKE_TARGET_ARCH mips32 # endif # if defined(_MIPS_ARCH_MIPS64) || defined(__mips64) # error CMAKE_TARGET_ARCH mips64 # endif # error CMAKE_TARGET_ARCH mips // Unknown MIPS #elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\ || defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\ || defined(_M_MPPC) || defined(_M_PPC) # if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__) # error CMAKE_TARGET_ARCH ppc64 // PowerPC 64 # endif # error CMAKE_TARGET_ARCH ppc // PowerPC #elif defined(__s390__) // IBM System z(s390/s390x) # if defined(__s390x__) # error CMAKE_TARGET_ARCH s390x # endif # error CMAKE_TARGET_ARCH s390 #elif defined(__sparc__) // SPARC # if defined(__sparc_v9__) # error CMAKE_TARGET_ARCH sparcv9 # endif # if defined(__sparc64__) # error CMAKE_TARGET_ARCH sparc64 # endif # error CMAKE_TARGET_ARCH sparc #endif #error CMAKE_TARGET_ARCH unknown ") macro(__cxxbasics_define_arch suffix variable) file(RENAME "${mktemp_result}" "${mktemp_result}${suffix}") set(mktemp_result "${mktemp_result}${suffix}") try_compile(run_unused_result "${CMAKE_CURRENT_BINARY_DIR}" SOURCES "${mktemp_result}" OUTPUT_VARIABLE TARGET_ARCH ) if("${TARGET_ARCH}" MATCHES "CMAKE_TARGET_ARCH") # Extracting the first "CMAKE_TARGET_ARCH [arch]" string(REGEX MATCH "CMAKE_TARGET_ARCH ([A-Za-z0-9_]+)" TARGET_ARCH "${TARGET_ARCH}") # Remove "CMAKE_TARGET_ARCH" and leaving only the architecture string(REPLACE "CMAKE_TARGET_ARCH " "" TARGET_ARCH "${TARGET_ARCH}") # Lets see if it is not unknown, otherwise we know we have the correct architecture in TARGET_ARCH if("${TARGET_ARCH}" STREQUAL "unknown") opt_overwrite(${variable} "unknown") else() opt_overwrite(${variable} "${TARGET_ARCH}") endif() else() # If for some reason we didn't get the expected string, set the arch to "unknown" opt_overwrite(${variable} "unknown") endif() # Catching coding errors if("${variable}" STREQUAL "") opt_overwrite(${variable} "unknown") endif() cbmessage("`${variable}` set to \"${${variable}}\"") endmacro() __cxxbasics_define_arch(".c" CXXBASICS_C_COMPILER_TARGET_ARCH) __cxxbasics_define_arch(".cxx" CXXBASICS_CXX_COMPILER_TARGET_ARCH) endif() cmake_policy(POP) ================================================ FILE: cmake/cxxbasics/helpers/FnMktemp.cmake ================================================ ## This module defines helper functions to create temporary files and folders in a system-agnostic way cmake_minimum_required(VERSION 3.0 FATAL_ERROR) opt_ifndef("CXXBasics temporary folder(uses system folder by default)" PATH "" CXXBASICS_TMP_FOLDER) macro(__cxxbasics_mktemp_helper) # Try to catch wrong usage if(NOT "${ARGV0}" STREQUAL "file" AND NOT "${ARGV0}" STREQUAL "directory") cberror("Wrong use of the macro") endif() # If `CXXBASICS_TMP_FOLDER` is not defined or set to an empty string, than we will try to set it to the system TMP if(NOT DEFINED CXXBASICS_TMP_FOLDER OR NOT IS_DIRECTORY "${CXXBASICS_TMP_FOLDER}") if(CMAKE_HOST_WIN32) opt_overwrite(CXXBASICS_TMP_FOLDER "$ENV{TMP}") elseif(CMAKE_HOST_UNIX) opt_overwrite(CXXBASICS_TMP_FOLDER "/tmp") else() cberror("Unsupported OS. Cannot set the temporary folder, please manually modify CXXBASICS_TMP_FOLDER in the cache") endif() endif(NOT DEFINED CXXBASICS_TMP_FOLDER OR NOT IS_DIRECTORY "${CXXBASICS_TMP_FOLDER}") # Lets make sure it's actually a directory if(NOT IS_DIRECTORY "${CXXBASICS_TMP_FOLDER}") cberror("`${CXXBASICS_TMP_FOLDER}` is not a folder. Please manually modify CXXBASICS_TMP_FOLDER in the cache") endif() # We will try to generate different random names until we are sure that it is unique for the path we try to use opt_ifndef("Project prefix to be used when creating files and folders" STRING "cxxbasics" CXXBASICS_PROJECT_PREFIX) string(RANDOM LENGTH 16 random_generated_string) file(TO_NATIVE_PATH "${CXXBASICS_TMP_FOLDER}/${CXXBASICS_PROJECT_PREFIX}_${random_generated_string}" mktemp_result) while(EXISTS "${mktemp_result}") string(RANDOM LENGTH 16 random_generated_string) file(TO_NATIVE_PATH "${CXXBASICS_TMP_FOLDER}/${CXXBASICS_PROJECT_PREFIX}_${random_generated_string}" mktemp_result) endwhile(EXISTS "${mktemp_result}") # Here the behavior between `file` and `directory` splits, so we handle them separately if("${ARGV0}" STREQUAL "file") set(mktemp_result "${mktemp_result}" PARENT_SCOPE) file(WRITE "${mktemp_result}" "") # file(WRITE) should throw an error but we'll check anyway if(NOT EXISTS "${mktemp_result}" OR IS_DIRECTORY "${mktemp_result}") cbnok("Failed to create the temporary file") unset(mktemp_result PARENT_SCOPE) endif() else() set(mktemp_directory_result "${mktemp_result}") set(mktemp_directory_result "${mktemp_directory_result}" PARENT_SCOPE) file(MAKE_DIRECTORY "${mktemp_directory_result}") # file(MAKE_DIRECTORY) should throw an error but we'll check anyway if(NOT IS_DIRECTORY "${mktemp_directory_result}") cbnok("Failed to create the temporary folder") unset(mktemp_directory_result PARENT_SCOPE) endif() endif() endmacro() # @function mktemp # @return mktemp_result - stores the path to the temporary file function(mktemp) __cxxbasics_mktemp_helper("file") endfunction() # @function mktemp_directory # @return mktemp_directory_result - stores the path to the temporary folder function(mktemp_directory) __cxxbasics_mktemp_helper("directory") endfunction() ================================================ FILE: cmake/cxxbasics/helpers/MacroCustomMessages.cmake ================================================ ## This module contains project-wide custom CMake messagging macros. ## Does not adhere to the overall style because MacroCbmessage does not sound very well nor represent all macros... cmake_minimum_required(VERSION 3.0 FATAL_ERROR) # This does not work in Windows CMD(usually also CI) if(CYGWIN OR NOT CMAKE_HOST_WIN32) string(ASCII 27 __cxxbasics_escape) set(__cxxbasics_prefix_color "${__cxxbasics_escape}[36m") # Cyan set(__cxxbasics_success_color "${__cxxbasics_escape}[32m") # Green set(__cxxbasics_failure_color "${__cxxbasics_escape}[31m") # Red set(__cxxbasics_no_color "${__cxxbasics_escape}[m") # Reset color unset(__cxxbasics_escape) endif() set(__cxxbasics_prefix "[${__cxxbasics_prefix_color}cxxbasics${__cxxbasics_no_color}]") set(__cxxbasics_success "[${__cxxbasics_success_color}✓${__cxxbasics_no_color}]") set(__cxxbasics_failure "[${__cxxbasics_failure_color}✗${__cxxbasics_no_color}]") unset(__cxxbasics_prefix_color) unset(__cxxbasics_success_color) unset(__cxxbasics_failure_color) unset(__cxxbasics_no_color) #======================================================== # Use `_cbp` when displaying a simple message. # `cbp` stands for [C]XX[B]asics [P]refix set(_cbp "${__cxxbasics_prefix}") # Use `_cbok` when displaying a notification of success(ex: `cxxbasics` succeded to set up ccache) # `cbok` stands for [C]XX[B]asics [OK] set(_cbok "${_cbp}${__cxxbasics_success}") # Use `_cbnok` when displaying a notification of failure(ex: the user activated `ccache` but it was not found in the system) # `cbnok` stands for [C]XX[B]asics [N]ot [OK] set(_cbnok "${_cbp}${__cxxbasics_failure}") macro(cbmessage) message(STATUS "${_cbp} " ${ARGV}) endmacro(cbmessage) macro(cbok) message(STATUS "${_cbok} " ${ARGV}) endmacro(cbok) macro(cbnok) message(STATUS "${_cbnok} " ${ARGV}) endmacro(cbnok) macro(cberror) message(FATAL_ERROR "${_cbnok} " ${ARGV}) endmacro(cberror) #======================================================== unset(__cxxbasics_prefix) unset(__cxxbasics_success) unset(__cxxbasics_failure) ================================================ FILE: cmake/cxxbasics/helpers/MacroOpt.cmake ================================================ ## This module defines helper macros to set options(cached variables) cmake_minimum_required(VERSION 3.0 FATAL_ERROR) # @macro opt # Macro helper to set a cache value. # Does not overwrite the value if it was already cached. # # `description` - the description that will be displayed in CMake cache editor # `var_type` - the type of the variable(BOOL, FILEPATH, PATH, STRING, INTERNAL) # `var_value` - the value `var_name` will be set to # `var_name` - variable name macro(opt description var_type var_value var_name) set(${var_name} ${var_value} CACHE ${var_type} "${description}") # Stores internally information about this variable's description and type # Will be reused in `opt_overwrite` to make the macro easy to use set(${var_name}_DESCRIPTION "${description}" CACHE INTERNAL "") set(${var_name}_TYPE "${var_type}" CACHE INTERNAL "") endmacro() # @macro opt_ifndef # Macro helper to set a cache value. # Sets the cache value only if the variable(including local variables) was not defined or it is set to an empty string. macro(opt_ifndef description var_type var_value var_name) if(NOT DEFINED ${var_name} OR "${${var_name}}" STREQUAL "") set(${var_name} ${var_value} CACHE ${var_type} "${description}" FORCE) set(${var_name}_DESCRIPTION "${description}" CACHE INTERNAL "") set(${var_name}_TYPE "${var_type}" CACHE INTERNAL "") endif() endmacro() # @macro opt_force # Macro helper to set a cache value. # Sets the cache value or overwrites the value if the variable already exists. macro(opt_force description var_type var_value var_name) set(${var_name} ${var_value} CACHE ${var_type} "${description}" FORCE) set(${var_name}_DESCRIPTION "${description}" CACHE INTERNAL "") set(${var_name}_TYPE "${var_type}" CACHE INTERNAL "") endmacro() # @macro opt_overwrite # Macro helper to set a cache value. # Overwrites the cache value only if the variable already exists in the cache(not local variables). # The variable in the cache has to be registered with one of the `opt` macros macro(opt_overwrite var_name var_value) # we do not check `if(NOT DEFINED ${var_name})` because local variables don't limit us from updating the # correct variable in the cache. We rely on _DESCRIPTION and _TYPE to find if the variable was # previously registered with `opt` if(NOT DEFINED ${var_name}_DESCRIPTION OR NOT DEFINED ${var_name}_TYPE) cberror("user-code logic error: `${var_name}` was not registered with an `opt` macro beforehand") endif() set(${var_name} ${var_value} CACHE ${${var_name}_TYPE} "${${var_name}_DESCRIPTION}" FORCE) endmacro() ================================================ FILE: debian/changelog ================================================ stacer (1.1.0-1) stable; urgency=medium * Snap package uninstaller. * Advanced file search. * Disk chart. * Host manager. -- Oguzhan Inan Sun, 13 May 2018 00:50:10 +0300 ================================================ FILE: debian/compat ================================================ 9 ================================================ FILE: debian/control ================================================ Source: stacer Section: utils Priority: optional Maintainer: Oguzhan INAN Build-Depends: debhelper (>=9) Standards-Version: 3.9.6 Homepage: https://github.com/oguzhaninan/Stacer Vcs-Browser: https://github.com/oguzhaninan/Stacer.git Package: stacer Architecture: all Depends: ${misc:Depends} Recommends: systemd, curl Description: Linux System Optimizer and Monitoring ================================================ FILE: debian/copyright ================================================ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: stacer Source: https://github.com/oguzhaninan/Stacer/ Files: * Copyright: 2017-2019 Oguzhan INAN License: GPL-3.0 Files: debian/* Copyright: 2017-2019 Oguzhan INAN License: GPL-3.0 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 . ================================================ FILE: debian/install ================================================ stacer/* usr/share/stacer/ applications/* usr/share/applications/ icons/* usr/share/icons/ ================================================ FILE: debian/postinst ================================================ #!/bin/sh ln -sf "/usr/share/stacer/stacer" "/usr/bin/stacer" exit 0 ================================================ FILE: debian/postrm ================================================ #!/bin/sh unlink /usr/bin/stacer rm -rf /usr/share/stacer exit 0 ================================================ FILE: debian/rules ================================================ #!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 %: dh $@ --parallel ================================================ FILE: debian/source/format ================================================ 3.0 (quilt) ================================================ FILE: release.sh ================================================ #!/bin/bash VERSION=1.1.0 RELEASE=Release DIR=stacer-$VERSION mkdir $RELEASE mkdir build ; cd build cmake -DCMAKE_BUILD_TYPE=debug -DCMAKE_CXX_COMPILER=g++ -DCMAKE_PREFIX_PATH=$QTDIR/bin .. make -j `nproc` cd .. mkdir $RELEASE/$DIR/stacer -p cp -r icons applications debian $RELEASE/$DIR cp -r build/output/* $RELEASE/$DIR/stacer # translations lupdate stacer/stacer.pro -no-obsolete lrelease stacer/stacer.pro mkdir $RELEASE/$DIR/stacer/translations mv translations/*.qm $RELEASE/$DIR/stacer/translations # linuxdeployqt wget -cO lqt "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" chmod +x lqt unset QTDIR; unset QT_PLUGIN_PATH; unset LD_LIBRARY_PATH ./lqt $RELEASE/$DIR/stacer/stacer -bundle-non-qt-libs -no-translations -unsupported-allow-new-glibc rm lqt if [ $1 = "deb" ]; then cd $RELEASE/$DIR dh_make --createorig -i -c mit debuild --no-lintian -us -uc fi ================================================ FILE: stacer/CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.1 FATAL_ERROR) project(stacer) set(MANAGERS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Managers") set(PAGES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Pages") include_directories( "${PROJECT_ROOT}/stacer-core" "${CMAKE_CURRENT_SOURCE_DIR}" "${MANAGERS_DIR}" "${PAGES_DIR}/Dashboard" "${PAGES_DIR}/Processes" "${PAGES_DIR}/Resources" "${PAGES_DIR}/Services" "${PAGES_DIR}/Settings" "${PAGES_DIR}/StartupApps" "${PAGES_DIR}/SystemCleaner" "${PAGES_DIR}/Uninstaller" "${CMAKE_CURRENT_BINARY_DIR}" # Necessary for CMake 3.7 and older ) # Sources file(GLOB_RECURSE ${PROJECT_NAME}_srcs "${CMAKE_CURRENT_SOURCE_DIR}/**.cpp") file(GLOB_RECURSE ${PROJECT_NAME}_translations "${PROJECT_ROOT}/translations/**.ts") # Translations find_package(Qt5LinguistTools) qt5_create_translation(QM_FILES ${PROJECT_NAME}_translations ${${PROJECT_NAME}_srcs}) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${QM_FILES}") set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_srcs} "${CMAKE_CURRENT_SOURCE_DIR}/static.qrc" ${QM_FILES} ) target_link_libraries(${PROJECT_NAME} stacer-core Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Charts Qt5::Svg Qt5::Concurrent ) # Running LTO in Release builds, if the C++ compiler is GNU GCC if("${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") target_compile_options(${PROJECT_NAME} PRIVATE "-flto") list(APPEND CMAKE_EXE_LINKER_FLAGS "-flto") endif() install( TARGETS ${PROJECT_NAME} CONFIGURATIONS Release RelWithDebInfo MinSizeRel # Not allowing to install an unoptimized build RUNTIME DESTINATION bin ) install( FILES "${PROJECT_ROOT}/applications/stacer.desktop" DESTINATION share/applications CONFIGURATIONS Release RelWithDebInfo MinSizeRel ) install( FILES "${PROJECT_ROOT}/stacer/static/logo.png" DESTINATION share/icons CONFIGURATIONS Release RelWithDebInfo MinSizeRel RENAME stacer.png ) ================================================ FILE: stacer/Managers/app_manager.cpp ================================================ #include "app_manager.h" #include AppManager *AppManager::instance = nullptr; AppManager *AppManager::ins() { if (! instance) { instance = new AppManager; } return instance; } AppManager::AppManager() { mSettingManager = SettingManager::ins(); mTrayIcon = new QSystemTrayIcon(QIcon(":/static/themes/default/img/sidebar-icons/dash.png")); loadLanguageList(); // loadThemeList(); if (mTranslator.load(QString("stacer_%1").arg(mSettingManager->getLanguage()), qApp->applicationDirPath() + "/translations")) { qApp->installTranslator(&mTranslator); (mSettingManager->getLanguage() == "ar") ? qApp->setLayoutDirection(Qt::RightToLeft) : qApp->setLayoutDirection(Qt::LeftToRight); } } QSystemTrayIcon *AppManager::getTrayIcon() { return mTrayIcon; } QSettings *AppManager::getStyleValues() const { return mStyleValues; } void AppManager::loadLanguageList() { QByteArray lanuagesJson = FileUtil::readStringFromFile(":/static/languages.json").toUtf8(); QJsonArray lanuages = QJsonDocument::fromJson(lanuagesJson).array(); for (int i = 0; i < lanuages.count(); ++i) { QJsonObject ob = lanuages.at(i).toObject(); mLanguageList.insert(ob["value"].toString(), ob["text"].toString()); } } QMap AppManager::getLanguageList() const { return mLanguageList; } //void AppManager::loadThemeList() //{ // QByteArray themesJson = FileUtil::readStringFromFile(":/static/themes.json").toUtf8(); // QJsonArray themes = QJsonDocument::fromJson(themesJson).array(); // for (int i = 0; i < themes.count(); ++i) { // QJsonObject ob = themes.at(i).toObject(); // mThemeList.insert(ob["value"].toString(), ob["text"].toString()); // } //} //QMap AppManager::getThemeList() const //{ // return mThemeList; //} void AppManager::updateStylesheet() { QString appThemePath = QString(":/static/themes/%1/style").arg(mSettingManager->getThemeName()); mStyleValues = new QSettings(QString("%1/values.ini").arg(appThemePath), QSettings::IniFormat); mStylesheetFileContent = FileUtil::readStringFromFile(QString("%1/style.qss").arg(appThemePath)); // set values example: @color01 => #fff for (const QString &key : mStyleValues->allKeys()) { mStylesheetFileContent.replace(key, mStyleValues->value(key).toString()); } qApp->setStyleSheet(mStylesheetFileContent); emit SignalMapper::ins()->sigChangedAppTheme(); } QString AppManager::getStylesheetFileContent() const { return mStylesheetFileContent; } ================================================ FILE: stacer/Managers/app_manager.h ================================================ #ifndef APP_MANAGER_H #define APP_MANAGER_H #include #include #include #include #include #include #include #include #include "Utils/file_util.h" #include "Managers/setting_manager.h" #include "signal_mapper.h" class AppManager { public: static AppManager *ins(); QMap getLanguageList() const; void loadLanguageList(); // QMap getThemeList() const; // void loadThemeList(); void updateStylesheet(); QString getStylesheetFileContent() const; QSettings *getStyleValues() const; QSystemTrayIcon *getTrayIcon(); private: static AppManager *instance; AppManager(); private: QTranslator mTranslator; QSystemTrayIcon *mTrayIcon; QSettings *mStyleValues; QMap mLanguageList; // QMap mThemeList; QString mStylesheetFileContent; SettingManager *mSettingManager; }; #endif // APP_MANAGER_H ================================================ FILE: stacer/Managers/info_manager.cpp ================================================ #include "info_manager.h" InfoManager *InfoManager::instance = nullptr; InfoManager *InfoManager::ins() { if(! instance){ instance = new InfoManager; } return instance; } QString InfoManager::getUserName() const { return si.getUsername(); } QStringList InfoManager::getUserList() const { return si.getUserList(); } QStringList InfoManager::getGroupList() const { return si.getGroupList(); } /* * CPU Provider */ int InfoManager::getCpuCoreCount() const { return ci.getCpuCoreCount(); } QList InfoManager::getCpuPercents() const { return ci.getCpuPercents(); } QList InfoManager::getCpuLoadAvgs() const { return ci.getLoadAvgs(); } double InfoManager::getCpuClock() const { return ci.getAvgClock(); } /* * Memory Provider */ void InfoManager::updateMemoryInfo() { mi.updateMemoryInfo(); } quint64 InfoManager::getSwapUsed() const { return mi.getSwapUsed(); } quint64 InfoManager::getSwapTotal() const { return mi.getSwapTotal(); } quint64 InfoManager::getMemUsed() const { return mi.getMemUsed(); } quint64 InfoManager::getMemTotal() const { return mi.getMemTotal(); } /* * Disk Provider */ QList InfoManager::getDisks() const { return di.getDisks(); } void InfoManager::updateDiskInfo() { di.updateDiskInfo(); } QList InfoManager::getDiskIO() { return di.getDiskIO(); } QList InfoManager::getFileSystemTypes() { return di.fileSystemTypes(); } QList InfoManager::getDevices() { return di.devices(); } /******************** * Network Provider *******************/ quint64 InfoManager::getRXbytes() const { return ni.getRXbytes(); } quint64 InfoManager::getTXbytes() const { return ni.getTXbytes(); } /******************** * System Provider *******************/ QFileInfoList InfoManager::getCrashReports() const { return si.getCrashReports(); } QFileInfoList InfoManager::getAppLogs() const { return si.getAppLogs(); } QFileInfoList InfoManager::getAppCaches() const { return si.getAppCaches(); } /******************** * Process Provider *******************/ void InfoManager::updateProcesses() { pi.updateProcesses(); } QList InfoManager::getProcesses() const { return pi.getProcessList(); } ================================================ FILE: stacer/Managers/info_manager.h ================================================ #ifndef INFO_MANAGER_H #define INFO_MANAGER_H #include #include #include #include #include #include #include class InfoManager { public: static InfoManager *ins(); int getCpuCoreCount() const; QList getCpuPercents() const; QList getCpuLoadAvgs() const; double getCpuClock() const; quint64 getSwapUsed() const; quint64 getSwapTotal() const; quint64 getMemUsed() const; quint64 getMemTotal() const; void updateMemoryInfo(); quint64 getRXbytes() const; quint64 getTXbytes() const; QList getDisks() const; QList getDiskIO(); void updateDiskInfo(); QFileInfoList getCrashReports() const; QFileInfoList getAppLogs() const; QFileInfoList getAppCaches() const; void updateProcesses(); QList getProcesses() const; QString getUserName() const; QStringList getUserList() const; QStringList getGroupList() const; QList getDevices(); QList getFileSystemTypes(); private: static InfoManager *instance; private: CpuInfo ci; DiskInfo di; MemoryInfo mi; NetworkInfo ni; SystemInfo si; ProcessInfo pi; }; #endif // INFO_MANAGER_H ================================================ FILE: stacer/Managers/setting_manager.cpp ================================================ #include "setting_manager.h" SettingManager::SettingManager() { mConfigPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); mSettings = new QSettings(QString("%1/settings.ini").arg(mConfigPath), QSettings::IniFormat); } SettingManager *SettingManager::instance = nullptr; SettingManager* SettingManager::ins() { if (! instance) { instance = new SettingManager; } return instance; } QString SettingManager::getConfigPath() const { return mConfigPath; } void SettingManager::setLanguage(const QString &value) { mSettings->setValue(SettingKeys::Language, value); } QString SettingManager::getLanguage() const { return mSettings->value(SettingKeys::Language, "en").toString(); } void SettingManager::setThemeName(const QString &value) { mSettings->setValue(SettingKeys::ThemeName, value); } QString SettingManager::getThemeName() const { return "default"; //mSettings->value(SettingKeys::ThemeName, "default").toString(); } void SettingManager::setDiskName(const QString &value) { mSettings->setValue(SettingKeys::DiskName, value); } QString SettingManager::getDiskName() const { return mSettings->value(SettingKeys::DiskName, "").toString(); } void SettingManager::setStartPage(const QString &value) { mSettings->setValue(SettingKeys::StartPage, value); } QString SettingManager::getStartPage() const { return mSettings->value(SettingKeys::StartPage, QObject::tr("Dashboard")).toString(); } void SettingManager::setCpuAlertPercent(const int value) { mSettings->setValue(SettingKeys::CPUAlertPercent, value); } int SettingManager::getCpuAlertPercent() const { return mSettings->value(SettingKeys::CPUAlertPercent, 0).toInt(); } void SettingManager::setMemoryAlertPercent(const int value) { mSettings->setValue(SettingKeys::MemoryAlertPercent, value); } int SettingManager::getMemoryAlertPercent() const { return mSettings->value(SettingKeys::MemoryAlertPercent, 0).toInt(); } void SettingManager::setDiskAlertPercent(const int value) { mSettings->setValue(SettingKeys::DiskAlertPercent, value); } int SettingManager::getDiskAlertPercent() const { return mSettings->value(SettingKeys::DiskAlertPercent, 0).toInt(); } void SettingManager::setAppQuitDialogDontAsk(const bool value) { mSettings->setValue(SettingKeys::AppQuitDialogDontAsk, value); } bool SettingManager::getAppQuitDialogDontAsk() const { return mSettings->value(SettingKeys::AppQuitDialogDontAsk, false).toBool(); } void SettingManager::setAppQuitDialogChoice(const QString &value) { mSettings->setValue(SettingKeys::AppQuitDialogChoice, value); } QString SettingManager::getAppQuitDialogChoice() const { return mSettings->value(SettingKeys::AppQuitDialogChoice, "close").toString(); } ================================================ FILE: stacer/Managers/setting_manager.h ================================================ #ifndef SETTING_MANAGER_H #define SETTING_MANAGER_H #include #include namespace SettingKeys { const QString ThemeName("ThemeName"); const QString Language("Language"); const QString DiskName("DiskName"); const QString StartPage("StartPage"); const QString CPUAlertPercent("CPUAlertPercent"); const QString MemoryAlertPercent("MemoryAlertPercent"); const QString DiskAlertPercent("DiskAlertPercent"); const QString AppQuitDialogDontAsk("AppQuitDialogDontAsk"); const QString AppQuitDialogChoice("AppQuitDialogChoice"); } class SettingManager { public: static SettingManager *ins(); QString getConfigPath() const; void setLanguage(const QString &value); QString getLanguage() const; void setThemeName(const QString &value); QString getThemeName() const; void setDiskName(const QString &value); QString getDiskName() const; void setStartPage(const QString &value); QString getStartPage() const; void setCpuAlertPercent(const int value); int getCpuAlertPercent() const; void setMemoryAlertPercent(const int value); int getMemoryAlertPercent() const; void setDiskAlertPercent(const int value); int getDiskAlertPercent() const; void setAppQuitDialogDontAsk(const bool value); bool getAppQuitDialogDontAsk() const; void setAppQuitDialogChoice(const QString &value); QString getAppQuitDialogChoice() const; private: static SettingManager *instance; SettingManager(); QSettings *mSettings; QString mConfigPath; }; #endif // SETTING_MANAGER_H ================================================ FILE: stacer/Managers/tool_manager.cpp ================================================ #include "tool_manager.h" ToolManager *ToolManager::instance = NULL; ToolManager *ToolManager::ins() { if(! instance) { instance = new ToolManager; } return instance; } /* * Services */ QList ToolManager::getServices() const { return ServiceTool::getServicesWithSystemctl(); } bool ToolManager::changeServiceStatus(const QString &sname, bool status) const { return ServiceTool::changeServiceStatus(sname, status); } bool ToolManager::changeServiceActive(const QString &sname, bool status) const { return ServiceTool::changeServiceActive(sname, status); } bool ToolManager::serviceIsActive(const QString &sname) const { return ServiceTool::serviceIsActive(sname); } bool ToolManager::serviceIsEnabled(const QString &sname) const { return ServiceTool::serviceIsEnabled(sname); } /* * Packages */ QStringList ToolManager::getPackages() const { switch (PackageTool::currentPackageTool) { case PackageTool::PackageTools::APT: return PackageTool::getDpkgPackages(); break; case PackageTool::PackageTools::YUM: case PackageTool::PackageTools::DNF: return PackageTool::getRpmPackages(); break; case PackageTool::PackageTools::PACMAN: return PackageTool::getPacmanPackages(); break; default: return QStringList(); break; } } QStringList ToolManager::getSnapPackages() const { return PackageTool::getSnapPackages(); } bool ToolManager::uninstallSnapPackages(const QStringList packages) { return PackageTool::snapRemovePackages(packages); } QFileInfoList ToolManager::getPackageCaches() const { switch (PackageTool::currentPackageTool) { case PackageTool::PackageTools::APT: return PackageTool::getDpkgPackageCaches(); break; case PackageTool::PackageTools::YUM: case PackageTool::PackageTools::DNF: return PackageTool::getPacmanPackageCaches(); break; case PackageTool::PackageTools::PACMAN: return PackageTool::getPacmanPackageCaches(); break; default: return QFileInfoList(); break; } } void ToolManager::uninstallPackages(const QStringList &packages) { switch (PackageTool::currentPackageTool) { case PackageTool::PackageTools::APT: PackageTool::dpkgRemovePackages(packages); break; case PackageTool::PackageTools::YUM: PackageTool::yumRemovePackages(packages); break; case PackageTool::PackageTools::DNF: PackageTool::dnfRemovePackages(packages); break; case PackageTool::PackageTools::PACMAN: PackageTool::pacmanRemovePackages(packages); break; default: break; } } /* * APT Source */ bool ToolManager::checkSourceRepository() const { return AptSourceTool::checkSourceRepository(); } QList ToolManager::getSourceList() const { return AptSourceTool::getSourceList(); } void ToolManager::removeAPTSource(const APTSourcePtr source) { AptSourceTool::removeAPTSource(source); } void ToolManager::changeAPTStatus(const APTSourcePtr aptSource, const bool status) { AptSourceTool::changeStatus(aptSource, status); } void ToolManager::changeAPTSource(const APTSourcePtr aptSource, const QString newSource) { AptSourceTool::changeSource(aptSource, newSource); } void ToolManager::addAPTRepository(const QString &repository, const bool isSource) { AptSourceTool::addRepository(repository, isSource); } ================================================ FILE: stacer/Managers/tool_manager.h ================================================ #ifndef TOOL_MANAGER_H #define TOOL_MANAGER_H #include #include #include class ToolManager { public: static ToolManager *ins(); QList getServices() const; QStringList getPackages() const; QStringList getSnapPackages() const; QFileInfoList getPackageCaches() const; bool changeServiceStatus(const QString &sname, bool status) const; bool changeServiceActive(const QString &sname, bool status) const; bool serviceIsActive(const QString &sname) const; bool serviceIsEnabled(const QString &sname) const; void uninstallPackages(const QStringList &packages); bool uninstallSnapPackages(const QStringList packages); bool checkSourceRepository() const; QList getSourceList() const; void removeAPTSource(const APTSourcePtr source); void changeAPTStatus(const APTSourcePtr aptSource, const bool status); void changeAPTSource(const APTSourcePtr aptSource, const QString newSource); void addAPTRepository(const QString &repository, const bool isSource); private: static ToolManager *instance; }; #endif // TOOL_MANAGER_H ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_edit.cpp ================================================ #include "apt_source_edit.h" #include "ui_apt_source_edit.h" #include APTSourceEdit::~APTSourceEdit() { delete ui; } APTSourcePtr APTSourceEdit::selectedAptSource = nullptr; APTSourceEdit::APTSourceEdit(QWidget *parent) : QDialog(parent), ui(new Ui::APTSourceEdit) { ui->setupUi(this); init(); } void APTSourceEdit::init() { ui->lblErrorMsg->hide(); } void APTSourceEdit::show() { clearElements(); // example 'deb [arch=amd64 lang=en] http://packages.microsoft.com/repos/vscode stable main' // set values to elements ui->radioBinary->setChecked(! selectedAptSource->isSource); ui->radioSource->setChecked(selectedAptSource->isSource); ui->txtOptions->setText(selectedAptSource->options); ui->txtUri->setText(selectedAptSource->uri); ui->txtDistribution->setText(selectedAptSource->distribution); ui->txtComponents->setText(selectedAptSource->components); QDialog::show(); } void APTSourceEdit::clearElements() { ui->lblErrorMsg->hide(); ui->txtOptions->clear(); ui->txtUri->clear(); ui->txtDistribution->clear(); ui->txtComponents->clear(); } void APTSourceEdit::on_btnSave_clicked() { if (! ui->txtUri->text().isEmpty() && ! ui->txtDistribution->text().isEmpty()) { QString sourceType = ui->radioBinary->isChecked() ? "deb" : "deb-src"; QString updatedAptSource = QString("%1 %2 %3 %4 %5") .arg(sourceType) .arg(ui->txtOptions->text()) .arg(ui->txtUri->text()) .arg(ui->txtDistribution->text()) .arg(ui->txtComponents->text()); ToolManager::ins()->changeAPTSource(selectedAptSource, updatedAptSource); emit saved(); close(); } else { ui->lblErrorMsg->show(); } } void APTSourceEdit::on_btnCancel_clicked() { close(); } ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_edit.h ================================================ #ifndef APT_SOURCE_EDIT_H #define APT_SOURCE_EDIT_H #include #include "Managers/tool_manager.h" namespace Ui { class APTSourceEdit; } class APTSourceEdit : public QDialog { Q_OBJECT public: explicit APTSourceEdit(QWidget *parent = 0); ~APTSourceEdit(); public: static APTSourcePtr selectedAptSource; void show(); signals: void saved(); private slots: void clearElements(); void on_btnSave_clicked(); void on_btnCancel_clicked(); private: void init(); private: Ui::APTSourceEdit *ui; }; #endif // APT_SOURCE_EDIT_H ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_edit.ui ================================================ APTSourceEdit 0 0 452 295 APT Repository Edit 30 10 30 15 15 dialog-title APT Repository Qt::AlignCenter Components Options PointingHandCursor Qt::NoFocus danger Cancel false 0 0 Fields cannot be left blank. URI PointingHandCursor Qt::NoFocus primary Save false Qt::Vertical 347 4 Distribution 0 0 PointingHandCursor Qt::NoFocus Source true debTypeGroup 0 0 PointingHandCursor Qt::NoFocus Binary debTypeGroup Qt::Horizontal 40 20 txtOptions txtUri txtDistribution txtComponents ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_manager_page.cpp ================================================ #include "apt_source_manager_page.h" #include "ui_apt_source_manager_page.h" #include #include "utilities.h" #include "Managers/tool_manager.h" APTSourceManagerPage::~APTSourceManagerPage() { delete ui; } APTSourcePtr APTSourceManagerPage::selectedAptSource = nullptr; APTSourceManagerPage::APTSourceManagerPage(QWidget *parent) : QWidget(parent), ui(new Ui::APTSourceManagerPage) { ui->setupUi(this); init(); } void APTSourceManagerPage::init() { ui->txtAptSource->setPlaceholderText(tr("example %1") .arg("'deb http://archive.ubuntu.com/ubuntu xenial main'")); loadAptSources(); on_btnCancel_clicked(); QList widgets = { ui->btnAddAPTSourceRepository, ui->btnCancel, ui->btnDeleteAptSource, ui->btnEditAptSource, ui->txtSearchAptSource, ui->txtSearchAptSource }; Utilities::addDropShadow(widgets, 40); } void APTSourceManagerPage::loadAptSources() { ui->listWidgetAptSources->clear(); QList aptSourceList = ToolManager::ins()->getSourceList(); for (APTSourcePtr &aptSource: aptSourceList) { QListWidgetItem *listItem = new QListWidgetItem(ui->listWidgetAptSources); listItem->setData(5, aptSource->source); // for search APTSourceRepositoryItem *aptSourceItem = new APTSourceRepositoryItem(aptSource, ui->listWidgetAptSources); listItem->setSizeHint(aptSourceItem->sizeHint() + QSize(0, 1)); ui->listWidgetAptSources->setItemWidget(listItem, aptSourceItem); } ui->notFoundWidget->setVisible(aptSourceList.isEmpty()); ui->lblAptSourceTitle->setText(tr("APT Repositories (%1)") .arg(aptSourceList.count())); } void APTSourceManagerPage::on_btnAddAPTSourceRepository_clicked(bool checked) { if (checked) { ui->btnAddAPTSourceRepository->setText(tr("Save")); changeElementsVisible(checked); } else { QString aptSourceRepository = ui->txtAptSource->text().trimmed(); if (! aptSourceRepository.isEmpty()) { ToolManager::ins()->addAPTRepository(aptSourceRepository, ui->checkEnableSource->isChecked()); ui->txtAptSource->clear(); ui->checkEnableSource->setChecked(false); on_btnCancel_clicked(); loadAptSources(); } } } void APTSourceManagerPage::on_btnCancel_clicked() { ui->btnAddAPTSourceRepository->setChecked(false); changeElementsVisible(false); ui->btnAddAPTSourceRepository->setText(tr("Add Repository")); } void APTSourceManagerPage::changeElementsVisible(const bool checked) { ui->txtAptSource->setVisible(checked); ui->checkEnableSource->setVisible(checked); ui->btnCancel->setVisible(checked); ui->btnEditAptSource->setVisible(!checked); ui->btnDeleteAptSource->setVisible(!checked); ui->bottomSectionHorizontalSpacer->changeSize(0, 0, checked ? QSizePolicy::Minimum : QSizePolicy::Expanding); } void APTSourceManagerPage::on_listWidgetAptSources_itemClicked(QListWidgetItem *item) { QWidget *widget = ui->listWidgetAptSources->itemWidget(item); if (widget) { APTSourceRepositoryItem *aptSourceItem = dynamic_cast(widget); if (aptSourceItem) { selectedAptSource = aptSourceItem->aptSource(); } } else { selectedAptSource.clear(); } } void APTSourceManagerPage::on_listWidgetAptSources_itemDoubleClicked(QListWidgetItem *item) { on_listWidgetAptSources_itemClicked(item); on_btnEditAptSource_clicked(); } void APTSourceManagerPage::on_btnDeleteAptSource_clicked() { if (! selectedAptSource.isNull()) { ToolManager::ins()->removeAPTSource(selectedAptSource); loadAptSources(); } } void APTSourceManagerPage::on_txtSearchAptSource_textChanged(const QString &val) { for (int i = 0; i < ui->listWidgetAptSources->count(); ++i) { QListWidgetItem *item = ui->listWidgetAptSources->item(i); if (item) { bool isContain = item->data(5).toString().contains(val, Qt::CaseInsensitive); ui->listWidgetAptSources->setItemHidden(item, ! isContain); } } } void APTSourceManagerPage::on_btnEditAptSource_clicked() { if (! selectedAptSource.isNull()) { if (mAptSourceEditDialog.isNull()) { mAptSourceEditDialog = QSharedPointer(new APTSourceEdit(this)); connect(mAptSourceEditDialog.data(), &APTSourceEdit::saved, this, &APTSourceManagerPage::loadAptSources); } APTSourceEdit::selectedAptSource = selectedAptSource; mAptSourceEditDialog->show(); } } ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_manager_page.h ================================================ #ifndef APTSourceManagerPage_PAGE_H #define APTSourceManagerPage_PAGE_H #include #include #include "apt_source_repository_item.h" #include "apt_source_edit.h" #include "Managers/info_manager.h" namespace Ui { class APTSourceManagerPage; } class APTSourceManagerPage : public QWidget { Q_OBJECT public: explicit APTSourceManagerPage(QWidget *parent = 0); ~APTSourceManagerPage(); public: static APTSourcePtr selectedAptSource; private slots: void loadAptSources(); void changeElementsVisible(const bool checked); void on_btnAddAPTSourceRepository_clicked(bool checked); void on_listWidgetAptSources_itemClicked(QListWidgetItem *item); void on_listWidgetAptSources_itemDoubleClicked(QListWidgetItem *item); void on_txtSearchAptSource_textChanged(const QString &val); void on_btnDeleteAptSource_clicked(); void on_btnEditAptSource_clicked(); void on_btnCancel_clicked(); private: void init(); private: Ui::APTSourceManagerPage *ui; QSharedPointer mAptSourceEditDialog; }; #endif ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_manager_page.ui ================================================ APTSourceManagerPage 0 0 836 582 APT Repository Manager 0 0 0 0 0 0 0 ArrowCursor 30 5 30 20 10 5 0 0 0 0 0 0 0 0 200 16777215 200 0 0 0 0 0 Not Found APT Repositories Qt::NoFocus QFrame::NoFrame Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows QListView::Adjust QListView::Batched 4 true Qt::Vertical QSizePolicy::Fixed 20 15 Search... 10 0 0 0 Ubuntu PointingHandCursor Qt::NoFocus primary Edit :/static/themes/default/img/edit.png:/static/themes/default/img/edit.png 16 16 false 0 0 Ubuntu PointingHandCursor Qt::NoFocus danger Delete :/static/themes/default/img/trash.png:/static/themes/default/img/trash.png 16 16 false Qt::Horizontal 0 20 circle Enable Source 0 0 Ubuntu PointingHandCursor Qt::NoFocus primary Add Repository true 0 0 Ubuntu PointingHandCursor Qt::NoFocus danger Cancel 16 16 false Qt::Horizontal 40 20 Ubuntu 11 false Select to delete or edit. ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_repository_item.cpp ================================================ #include "apt_source_repository_item.h" #include "ui_apt_source_repository_item.h" #include "utilities.h" #include "Utils/command_util.h" #include APTSourceRepositoryItem::~APTSourceRepositoryItem() { delete ui; } APTSourceRepositoryItem::APTSourceRepositoryItem(APTSourcePtr aptSource, QWidget *parent) : QWidget(parent), ui(new Ui::APTSourceRepositoryItem), mAptSource(aptSource) { init(); } void APTSourceRepositoryItem::init() { ui->setupUi(this); Utilities::addDropShadow(this, 30, 10); ui->checkAptSource->setChecked(mAptSource->isActive); // example "deb [arch=amd64] http://packages.microsoft.com/repos/vscode stable main" QString source = mAptSource->source; source.remove(QRegExp("\\s[\\[]+.*[\\]]+")); if (mAptSource->isSource) { ui->lblAptSourceName->setText(tr("%1 (Source Code)").arg(source)); } else { ui->lblAptSourceName->setText(source); } ui->lblAptSourceName->setToolTip(ui->lblAptSourceName->text()); } APTSourcePtr APTSourceRepositoryItem::aptSource() const { return mAptSource; } void APTSourceRepositoryItem::on_checkAptSource_clicked(bool checked) { ToolManager::ins()->changeAPTStatus(mAptSource, checked); } ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_repository_item.h ================================================ #ifndef APTSourceRepositoryItem_H #define APTSourceRepositoryItem_H #include #include "Managers/tool_manager.h" namespace Ui { class APTSourceRepositoryItem; } class APTSourceRepositoryItem : public QWidget { Q_OBJECT public: explicit APTSourceRepositoryItem(APTSourcePtr aptSource, QWidget *parent = 0); ~APTSourceRepositoryItem(); public: APTSourcePtr aptSource() const; private slots: void on_checkAptSource_clicked(bool checked); private: void init(); private: Ui::APTSourceRepositoryItem *ui; APTSourcePtr mAptSource; }; #endif ================================================ FILE: stacer/Pages/AptSourceManager/apt_source_repository_item.ui ================================================ APTSourceRepositoryItem 0 0 727 45 0 0 0 45 16777215 45 0 0 0 0 0 0 0 PointingHandCursor 15 15 10 10 10 26 26 26 26 true APT Source Repository Qt::Horizontal 0 20 PointingHandCursor Qt::NoFocus 45 23 ================================================ FILE: stacer/Pages/Dashboard/circlebar.cpp ================================================ #include "circlebar.h" #include "ui_circlebar.h" CircleBar::~CircleBar() { delete ui; delete mChart; } CircleBar::CircleBar(const QString &title, const QStringList &colors, QWidget *parent) : QWidget(parent), ui(new Ui::CircleBar), mColors(colors), mChart(new QChart), mChartView(new QChartView(mChart)), mSeries(new QPieSeries(this)) { ui->setupUi(this); ui->lblCircleChartTitle->setText(title); init(); } void CircleBar::init() { QColor transparent("transparent"); // series settings mSeries->setHoleSize(0.67); mSeries->setPieSize(165); mSeries->setPieStartAngle(-115); mSeries->setPieEndAngle(115); mSeries->setLabelsVisible(false); mSeries->append("Used", 0); mSeries->append("Free", 0); mSeries->slices().first()->setBorderColor(transparent); mSeries->slices().last()->setBorderColor(transparent); QConicalGradient gradient; gradient.setAngle(115); for (int i = 0; i < mColors.count(); ++i) { gradient.setColorAt(i, QColor(mColors.at(i))); } mSeries->slices().first()->setBrush(gradient); // chart settings mChart->setBackgroundBrush(QBrush(transparent)); mChart->setContentsMargins(-20, -20, -20, -65); mChart->addSeries(mSeries); mChart->legend()->hide(); // chartview settings mChartView->setRenderHint(QPainter::Antialiasing); ui->layoutCircleBar->insertWidget(1, mChartView); connect(SignalMapper::ins(), &SignalMapper::sigChangedAppTheme, [=] { QSettings *styleValues = AppManager::ins()->getStyleValues(); mChartView->setBackgroundBrush(QColor(styleValues->value("@circleChartBackgroundColor").toString())); mSeries->slices().last()->setColor(styleValues->value("@pageContent").toString()); // trail color }); } void CircleBar::setValue(const int &value, const QString &valueText) { mSeries->slices().first()->setValue(value); mSeries->slices().last()->setValue(100 - value); ui->lblCircleChartValue->setText(valueText); } ================================================ FILE: stacer/Pages/Dashboard/circlebar.h ================================================ #ifndef CIRCLEBAR_H #define CIRCLEBAR_H #include #include #include "Managers/app_manager.h" #include "signal_mapper.h" namespace Ui { class CircleBar; } class CircleBar : public QWidget { Q_OBJECT public: explicit CircleBar(const QString &title, const QStringList &colors, QWidget *parent = 0); ~CircleBar(); public slots: void setValue(const int &value, const QString &valueText); private slots: void init(); private: Ui::CircleBar *ui; private: QStringList mColors; QChart *mChart; QChartView *mChartView; QPieSeries *mSeries; }; #endif // CIRCLEBAR_H ================================================ FILE: stacer/Pages/Dashboard/circlebar.ui ================================================ CircleBar 0 0 383 317 0 0 0 0 0 0 0 0 0 2 20 10 20 10 Title Qt::AlignCenter Value Qt::AlignCenter ================================================ FILE: stacer/Pages/Dashboard/dashboard_page.cpp ================================================ #include "dashboard_page.h" #include "ui_dashboard_page.h" #include "utilities.h" #include #include #include DashboardPage::~DashboardPage() { delete ui; } DashboardPage::DashboardPage(QWidget *parent) : QWidget(parent), ui(new Ui::DashboardPage), mCpuBar(new CircleBar(tr("CPU"), {"#A8E063", "#56AB2F"}, this)), mMemBar(new CircleBar(tr("MEMORY"), {"#FFB75E", "#ED8F03"}, this)), mDiskBar(new CircleBar(tr("DISK"), {"#DC2430", "#7B4397"}, this)), mDownloadBar(new LineBar(tr("DOWNLOAD"), this)), mUploadBar(new LineBar(tr("UPLOAD"), this)), mTimer(new QTimer(this)), im(InfoManager::ins()), mSettingManager(SettingManager::ins()) { ui->setupUi(this); init(); systemInformationInit(); } void DashboardPage::init() { // Circle bars ui->circleBarsLayout->addWidget(mCpuBar); ui->circleBarsLayout->addWidget(mMemBar); ui->circleBarsLayout->addWidget(mDiskBar); // line bars ui->lineBarsLayout->addWidget(mDownloadBar); ui->lineBarsLayout->addWidget(mUploadBar); // connections connect(mTimer, &QTimer::timeout, this, &DashboardPage::updateCpuBar); connect(mTimer, &QTimer::timeout, this, &DashboardPage::updateMemoryBar); connect(mTimer, &QTimer::timeout, this, &DashboardPage::updateNetworkBar); QTimer *timerDisk = new QTimer(this); connect(timerDisk, &QTimer::timeout, this, &DashboardPage::updateDiskBar); timerDisk->start(5 * 1000); mTimer->start(1 * 1000); // initialization updateCpuBar(); updateMemoryBar(); updateDiskBar(); updateNetworkBar(); ui->widgetUpdateBar->hide(); // check update checkUpdate(); connect(this, &DashboardPage::sigShowUpdateBar, ui->widgetUpdateBar, &QWidget::show); QList widgets = { mCpuBar, mMemBar, mDiskBar, mDownloadBar, mUploadBar }; Utilities::addDropShadow(widgets, 60); } void DashboardPage::checkUpdate() { QNetworkAccessManager * nam = new QNetworkAccessManager(this); const QNetworkRequest updateCheckRequest(QUrl("https://api.github.com/repos/oguzhaninan/Stacer/releases/latest")); connect(nam,&QNetworkAccessManager::finished,this,[this](QNetworkReply * reply){ if(reply->error()==QNetworkReply::NoError) { const QString requestResult= reply->readAll(); const QJsonDocument result = QJsonDocument::fromJson(requestResult.toUtf8()); const QRegExp ex("([0-9].[0-9].[0-9])"); ex.indexIn(result.object().value("tag_name").toString()); if (ex.matchedLength() > 0) { const QString version = ex.cap(); if (qApp->applicationVersion() != version) { emit sigShowUpdateBar(); } } } }); nam->get(updateCheckRequest); } void DashboardPage::on_btnDownloadUpdate_clicked() { QDesktopServices::openUrl(QUrl("https://github.com/oguzhaninan/Stacer/releases/latest")); } void DashboardPage::systemInformationInit() { // get system information SystemInfo sysInfo; QStringList infos; infos << tr("Hostname: %1").arg(sysInfo.getHostname()) << tr("Platform: %1").arg(sysInfo.getPlatform()) << tr("Distribution: %1").arg(sysInfo.getDistribution()) << tr("Kernel Release: %1").arg(sysInfo.getKernel()) << tr("CPU Model: %1").arg(sysInfo.getCpuModel()) << tr("CPU Core: %1").arg(sysInfo.getCpuCore()) << tr("CPU Speed: %1").arg(sysInfo.getCpuSpeed()); QStringListModel *systemInfoModel = new QStringListModel(infos,ui->listViewSystemInfo); const auto oldModel = ui->listViewSystemInfo->selectionModel(); delete oldModel; ui->listViewSystemInfo->setModel(systemInfoModel); } void DashboardPage::updateCpuBar() { int cpuUsedPercent = im->getCpuPercents().at(0); double cpuCurrentClockGHz = im->getCpuClock()/1000.0; // alert message int cpuAlerPercent = mSettingManager->getCpuAlertPercent(); if (cpuAlerPercent > 0) { static bool isShow = true; if (cpuUsedPercent > cpuAlerPercent && isShow) { AppManager::ins()->getTrayIcon()->showMessage(tr("High CPU Usage"), tr("The amount of CPU used is over %1%.").arg(cpuAlerPercent), QSystemTrayIcon::Warning); isShow = false; } else if (cpuUsedPercent < cpuAlerPercent) { isShow = true; } } mCpuBar->setValue(cpuUsedPercent, QString("%1 GHz\n%2%").arg(cpuCurrentClockGHz, 0, 'f', 2).arg(cpuUsedPercent)); } void DashboardPage::updateMemoryBar() { im->updateMemoryInfo(); int memUsedPercent = 0; if (im->getMemTotal()) { memUsedPercent = ((double)im->getMemUsed() / (double)im->getMemTotal()) * 100.0; } QString f_memUsed = FormatUtil::formatBytes(im->getMemUsed()); QString f_memTotal = FormatUtil::formatBytes(im->getMemTotal()); // alert message int memoryAlertPercent = mSettingManager->getMemoryAlertPercent(); if (memoryAlertPercent > 0) { static bool isShow = true; if (memUsedPercent > memoryAlertPercent && isShow) { AppManager::ins()->getTrayIcon()->showMessage(tr("High Memory Usage"), tr("The amount of memory used is over %1%.").arg(memoryAlertPercent), QSystemTrayIcon::Warning); isShow = false; } else if (memUsedPercent < memoryAlertPercent) { isShow = true; } } mMemBar->setValue(memUsedPercent, QString("%1 / %2") .arg(f_memUsed) .arg(f_memTotal)); } void DashboardPage::updateDiskBar() { im->updateDiskInfo(); if(! im->getDisks().isEmpty()) { Disk *disk = nullptr; QString selectedDiskName = mSettingManager->getDiskName(); for (Disk *d: im->getDisks()) { if (d->name.trimmed() == selectedDiskName.trimmed()) disk = d; } if (! disk) { for (Disk *d: im->getDisks()) if (d->name.trimmed() == QStorageInfo::root().displayName().trimmed()) disk = d; if (! disk) disk = im->getDisks().at(0); } int diskPercent = 0; if (disk->size > 0) { diskPercent = ((double) disk->used / (double) disk->size) * 100.0; } // alert message int diskAlertPercent = mSettingManager->getDiskAlertPercent(); if (diskAlertPercent > 0) { static bool isShow = true; if (diskPercent > diskAlertPercent && isShow) { AppManager::ins()->getTrayIcon()->showMessage(tr("High Disk Usage"), tr("The amount of disk used is over %1%.").arg(diskAlertPercent), QSystemTrayIcon::Warning); isShow = false; } else if (diskPercent < diskAlertPercent) { isShow = true; } } QString sizeText = FormatUtil::formatBytes(disk->size); QString usedText = FormatUtil::formatBytes(disk->used); mDiskBar->setValue(diskPercent, QString("%1 / %2") .arg(usedText) .arg(sizeText)); } } void DashboardPage::updateNetworkBar() { static quint64 l_RXbytes = im->getRXbytes(); static quint64 l_TXbytes = im->getTXbytes(); static quint64 max_RXbytes = 1L << 20; // 1 MEBI static quint64 max_TXbytes = 1L << 20; // 1 MEBI quint64 RXbytes = im->getRXbytes(); quint64 TXbytes = im->getTXbytes(); quint64 d_RXbytes = (RXbytes - l_RXbytes); quint64 d_TXbytes = (TXbytes - l_TXbytes); QString downText = FormatUtil::formatBytes(d_RXbytes); QString upText = FormatUtil::formatBytes(d_TXbytes); int downPercent = ((double) d_RXbytes / (double) max_RXbytes) * 100.0; int upPercent = ((double) d_TXbytes / (double) max_TXbytes) * 100.0; mDownloadBar->setValue(downPercent, QString("%1/s").arg(downText), tr("Total: %1").arg(FormatUtil::formatBytes(RXbytes))); mUploadBar->setValue(upPercent, QString("%1/s").arg(upText), tr("Total: %1").arg(FormatUtil::formatBytes(TXbytes))); max_RXbytes = qMax(max_RXbytes, d_RXbytes); max_TXbytes = qMax(max_TXbytes, d_TXbytes); l_RXbytes = RXbytes; l_TXbytes = TXbytes; } ================================================ FILE: stacer/Pages/Dashboard/dashboard_page.h ================================================ #ifndef DASHBOARDPAGE_H #define DASHBOARDPAGE_H #include #include #include #include #include #include #include #include "Managers/info_manager.h" #include "circlebar.h" #include "linebar.h" #include "Managers/setting_manager.h" namespace Ui { class DashboardPage; } class DashboardPage : public QWidget { Q_OBJECT public: explicit DashboardPage(QWidget *parent = 0); ~DashboardPage(); private slots: void init(); void checkUpdate(); void systemInformationInit(); void updateCpuBar(); void updateMemoryBar(); void updateDiskBar(); void updateNetworkBar(); void on_btnDownloadUpdate_clicked(); signals: void sigShowUpdateBar(); private: Ui::DashboardPage *ui; private: CircleBar* mCpuBar; CircleBar* mMemBar; CircleBar* mDiskBar; LineBar *mDownloadBar; LineBar *mUploadBar; QTimer *mTimer; InfoManager *im; SettingManager *mSettingManager; }; #endif // DASHBOARDPAGE_H ================================================ FILE: stacer/Pages/Dashboard/dashboard_page.ui ================================================ DashboardPage 0 0 811 583 0 0 Dashboard 5 5 5 5 0 0 0 0 200 20 10 5 10 5 0 0 150 0 20 10 10 10 10 0 0 200 0 Qt::WheelFocus 5 15 0 10 0 Qt::Vertical QSizePolicy::Fixed 20 15 SYSTEM INFO Qt::NoFocus Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff false QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection QAbstractItemView::SelectRows 5 true 0 0 0 31 0 15 0 5 0 There are update currently available. PointingHandCursor Qt::NoFocus primary Download ================================================ FILE: stacer/Pages/Dashboard/linebar.cpp ================================================ #include "linebar.h" #include "ui_linebar.h" LineBar::~LineBar() { delete ui; } LineBar::LineBar(const QString &title, QWidget *parent) : QWidget(parent), ui(new Ui::LineBar) { ui->setupUi(this); ui->lblLineChartTitle->setText(title); } void LineBar::setValue(const int &value, const QString &text, const QString &totalText) { ui->lineChartProgress->setValue(value); ui->lblLineChartValue->setText(text); ui->lblLineChartTotal->setText(totalText); } ================================================ FILE: stacer/Pages/Dashboard/linebar.h ================================================ #ifndef LINEBAR_H #define LINEBAR_H #include namespace Ui { class LineBar; } class LineBar : public QWidget { Q_OBJECT public: explicit LineBar(const QString &title, QWidget *parent = 0); ~LineBar(); public slots: void setValue(const int &value, const QString &text, const QString &totalText); private: Ui::LineBar *ui; }; #endif // LINEBAR_H ================================================ FILE: stacer/Pages/Dashboard/linebar.ui ================================================ LineBar 0 0 474 114 0 0 0 0 0 25 15 25 15 0 15 Total 0 20 16777215 20 0 false Value Title ================================================ FILE: stacer/Pages/GnomeSettings/appearance_settings.cpp ================================================ #include "appearance_settings.h" #include "ui_appearance_settings.h" #include AppearanceSettings::~AppearanceSettings() { delete ui; } AppearanceSettings::AppearanceSettings(QWidget *parent) : QWidget(parent), ui(new Ui::AppearanceSettings), gsettings(GnomeSettingsTool::ins()) { ui->setupUi(this); loadDatas(); init(); initConnects(); } void AppearanceSettings::init() { bool showDesktopIcons = gsettings.getValueB(GSchemas::Appearance::Background, GSchemaKeys::Appearance::ShowDesktopIcons); bool showHomeIcon = gsettings.getValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowHomeIcon); bool showNetworkIcon = gsettings.getValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowNetworkIcon); bool showTrashIcon = gsettings.getValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowTrashIcon); bool showVolumesIcon = gsettings.getValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowVolumesIcon); QString desktopBackMode = gsettings.getValueS(GSchemas::Appearance::Background, GSchemaKeys::Appearance::PictureOptions).replace("'",""); QString loginBackMode = gsettings.getValueS(GSchemas::Appearance::Screensaver, GSchemaKeys::Appearance::PictureOptions).replace("'",""); bool screenKeyboardEnabled = gsettings.getValueB(GSchemas::Appearance::Applications, GSchemaKeys::Appearance::ScreenKeyboard); bool screenReaderEnabled = gsettings.getValueB(GSchemas::Appearance::Applications, GSchemaKeys::Appearance::ScreenReader); ui->checkShowDesktopIcons->setChecked(showDesktopIcons); ui->checkHomeIcon->setChecked(showHomeIcon); ui->checkNetworkIcon->setChecked(showNetworkIcon); ui->checkTrashIcon->setChecked(showTrashIcon); ui->checkMountedVulmesIcon->setChecked(showVolumesIcon); ui->cmbDesktopBackMode->setCurrentIndex(ui->cmbDesktopBackMode->findData(desktopBackMode)); ui->cmbLoginBackMode->setCurrentIndex(ui->cmbLoginBackMode->findData(loginBackMode)); ui->checkScreenKeyboard->setChecked(screenKeyboardEnabled); ui->checkScreenReader->setChecked(screenReaderEnabled); } void AppearanceSettings::initConnects() { connect(ui->cmbDesktopBackMode, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbDesktopBackMode_currentIndexChanged(int))); connect(ui->cmbLoginBackMode, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbLoginBackMode_currentIndexChanged(int))); } void AppearanceSettings::loadDatas() { QList> backgroundModes = { {tr("None"), "none"}, {tr("Wallpaper"), "wallpaper"}, {tr("Centered"), "centered"}, {tr("Scaled"), "scaled"}, {tr("Stretched"), "stretched"}, {tr("Zoom"), "zoom"}, {tr("Spanned"), "spanned"} }; for (const QPair &mode : backgroundModes) { ui->cmbDesktopBackMode->addItem(mode.first, mode.second); ui->cmbLoginBackMode->addItem(mode.first, mode.second); } } void AppearanceSettings::on_checkShowDesktopIcons_clicked(bool checked) { if (! checked) { ui->checkHomeIcon->setChecked(checked); ui->checkNetworkIcon->setChecked(checked); ui->checkMountedVulmesIcon->setChecked(checked); ui->checkTrashIcon->setChecked(checked); } gsettings.setValueB(GSchemas::Appearance::Background, GSchemaKeys::Appearance::ShowDesktopIcons, checked); } void AppearanceSettings::on_checkHomeIcon_clicked(bool checked) { gsettings.setValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowHomeIcon, checked); } void AppearanceSettings::on_checkTrashIcon_clicked(bool checked) { gsettings.setValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowTrashIcon, checked); } void AppearanceSettings::on_checkMountedVulmesIcon_clicked(bool checked) { gsettings.setValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowVolumesIcon, checked); } void AppearanceSettings::on_checkNetworkIcon_clicked(bool checked) { gsettings.setValueB(GSchemas::Appearance::Desktop, GSchemaKeys::Appearance::ShowNetworkIcon, checked); } void AppearanceSettings::cmbDesktopBackMode_currentIndexChanged(int index) { QString data = ui->cmbDesktopBackMode->itemData(index).toString(); gsettings.setValueS(GSchemas::Appearance::Background, GSchemaKeys::Appearance::PictureOptions, data); } void AppearanceSettings::cmbLoginBackMode_currentIndexChanged(int index) { QString data = ui->cmbLoginBackMode->itemData(index).toString(); gsettings.setValueS(GSchemas::Appearance::Screensaver, GSchemaKeys::Appearance::PictureOptions, data); } void AppearanceSettings::on_checkScreenKeyboard_clicked(bool checked) { gsettings.setValueB(GSchemas::Appearance::Applications, GSchemaKeys::Appearance::ScreenKeyboard, checked); } void AppearanceSettings::on_checkScreenReader_clicked(bool checked) { gsettings.setValueB(GSchemas::Appearance::Applications, GSchemaKeys::Appearance::ScreenReader, checked); } ================================================ FILE: stacer/Pages/GnomeSettings/appearance_settings.h ================================================ #ifndef APPEARANCE_SETTINGS_H #define APPEARANCE_SETTINGS_H #include #include "Tools/gnome_settings_tool.h" namespace Ui { class AppearanceSettings; } class AppearanceSettings : public QWidget { Q_OBJECT public: explicit AppearanceSettings(QWidget *parent = 0); ~AppearanceSettings(); private slots: void on_checkShowDesktopIcons_clicked(bool checked); void on_checkHomeIcon_clicked(bool checked); void on_checkTrashIcon_clicked(bool checked); void on_checkMountedVulmesIcon_clicked(bool checked); void on_checkNetworkIcon_clicked(bool checked); void cmbDesktopBackMode_currentIndexChanged(int index); void cmbLoginBackMode_currentIndexChanged(int index); void on_checkScreenKeyboard_clicked(bool checked); void on_checkScreenReader_clicked(bool checked); private: void init(); void initConnects(); void loadDatas(); private: Ui::AppearanceSettings *ui; GnomeSettingsTool gsettings; }; #endif // APPEARANCE_SETTINGS_H ================================================ FILE: stacer/Pages/GnomeSettings/appearance_settings.ui ================================================ AppearanceSettings 0 0 801 438 0 0 0 0 0 20 10 Screen Applications 5 5 5 5 30 15 0 0 Screen Reader PointingHandCursor Qt::NoFocus 0 0 Screen Keyboard PointingHandCursor Qt::NoFocus Qt::Horizontal 40 20 Background Image Mode 5 5 5 5 30 15 0 0 Desktop Mode 0 0 200 0 300 16777215 QComboBox::AdjustToMinimumContentsLength 0 0 Login Mode 0 0 200 0 300 16777215 QComboBox::AdjustToMinimumContentsLength Qt::Horizontal 40 20 Icons 5 5 5 5 30 15 0 0 Home Icon PointingHandCursor Qt::NoFocus 0 0 Trash Icon 0 0 Mounted Volumes Icon PointingHandCursor Qt::NoFocus 0 0 Show Desktop Icons PointingHandCursor Qt::NoFocus 0 0 Network Icon PointingHandCursor Qt::NoFocus PointingHandCursor Qt::NoFocus Qt::Horizontal 40 20 Qt::Vertical 20 40 ================================================ FILE: stacer/Pages/GnomeSettings/gnome_settings_page.cpp ================================================ #include "gnome_settings_page.h" #include "ui_gnome_settings_page.h" #include "utilities.h" GnomeSettingsPage::~GnomeSettingsPage() { delete ui; } GnomeSettingsPage::GnomeSettingsPage(QWidget *parent) : QWidget(parent), ui(new Ui::GnomeSettingsPage), slidingStackedWidget(new SlidingStackedWidget(this)) { ui->setupUi(this); init(); } void GnomeSettingsPage::init() { ui->contentGridLayout->addWidget(slidingStackedWidget, 1, 0, 1, 1); if (GnomeSettingsTool::ins().checkUnityAvailable()) { unitySettings = new UnitySettings(slidingStackedWidget); slidingStackedWidget->addWidget(unitySettings); } else { ui->btnUnitySettings->hide(); ui->btnWindowManager->setChecked(true); } windowManagerSettings = new WindowManagerSettings(slidingStackedWidget); appearanceSettings = new AppearanceSettings(slidingStackedWidget); slidingStackedWidget->addWidget(windowManagerSettings); slidingStackedWidget->addWidget(appearanceSettings); QList widgets = { ui->btnAppearance, ui->btnUnitySettings, ui->btnWindowManager }; Utilities::addDropShadow(widgets, 40); } void GnomeSettingsPage::on_btnUnitySettings_clicked() { slidingStackedWidget->slideInIdx(slidingStackedWidget->indexOf(unitySettings)); } void GnomeSettingsPage::on_btnWindowManager_clicked() { slidingStackedWidget->slideInIdx(slidingStackedWidget->indexOf(windowManagerSettings)); } void GnomeSettingsPage::on_btnAppearance_clicked() { slidingStackedWidget->slideInIdx(slidingStackedWidget->indexOf(appearanceSettings)); } ================================================ FILE: stacer/Pages/GnomeSettings/gnome_settings_page.h ================================================ #ifndef GNOME_SETTINGS_PAGE_H #define GNOME_SETTINGS_PAGE_H #include #include "sliding_stacked_widget.h" #include "unity_settings.h" #include "window_manager_settings.h" #include "appearance_settings.h" namespace Ui { class GnomeSettingsPage; } class GnomeSettingsPage : public QWidget { Q_OBJECT public: explicit GnomeSettingsPage(QWidget *parent = 0); ~GnomeSettingsPage(); private slots: void on_btnUnitySettings_clicked(); void on_btnWindowManager_clicked(); void on_btnAppearance_clicked(); private: void init(); private: Ui::GnomeSettingsPage *ui; SlidingStackedWidget *slidingStackedWidget; UnitySettings *unitySettings; WindowManagerSettings *windowManagerSettings; AppearanceSettings *appearanceSettings; }; #endif // GNOME_SETTINGS_PAGE_H ================================================ FILE: stacer/Pages/GnomeSettings/gnome_settings_page.ui ================================================ GnomeSettingsPage 0 0 788 601 Gnome Settings 15 10 15 20 20 15 20 PointingHandCursor Qt::NoFocus Unity Settings :/static/themes/common/img/ubuntu.png:/static/themes/common/img/ubuntu.png 20 20 true true settingsTopButtonGroup PointingHandCursor Qt::NoFocus Window Manager :/static/themes/common/img/window.png:/static/themes/common/img/window.png 20 20 true settingsTopButtonGroup PointingHandCursor Qt::NoFocus Appearance :/static/themes/common/img/appearance.png:/static/themes/common/img/appearance.png 20 20 true settingsTopButtonGroup ================================================ FILE: stacer/Pages/GnomeSettings/unity_settings.cpp ================================================ #include "unity_settings.h" #include "ui_unity_settings.h" #include UnitySettings::~UnitySettings() { delete ui; } UnitySettings::UnitySettings(QWidget *parent) : QWidget(parent), ui(new Ui::UnitySettings), gsettings(GnomeSettingsTool::ins()) { ui->setupUi(this); init(); initConnects(); } void UnitySettings::init() { bool launcherAutoHide = gsettings.getValueB(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherHideMode, GSchemaPaths::Unity); GValues::RevealLocation revealLocation = (GValues::RevealLocation) gsettings.getValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::RevealTrigger, GSchemaPaths::Unity); float revealSensitivy = gsettings.getValueF(GSchemas::Unity::Shell, GSchemaKeys::Unity::EdgeResponsiveness, GSchemaPaths::Unity); bool launcherMinimzeApp = gsettings.getValueB(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherMinimizeApp, GSchemaPaths::Unity); float launcherOpacity = gsettings.getValueF(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherOpacity, GSchemaPaths::Unity); int launcherVisibility = gsettings.getValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherVisibility, GSchemaPaths::Unity); QString launcherPosition = gsettings.getValueS(GSchemas::Unity::Launcher, GSchemaKeys::Unity::LauncherPosition); int iconSize = gsettings.getValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherIconSize, GSchemaPaths::Unity); bool dashBlur = gsettings.getValueB(GSchemas::Unity::Shell, GSchemaKeys::Unity::DashBlur, GSchemaPaths::Unity); QString searchOnlineResource = gsettings.getValueS(GSchemas::Unity::Lens, GSchemaKeys::Unity::SearchOnlineResource); bool displayAvailableApps = gsettings.getValueB(GSchemas::Unity::AppLens, GSchemaKeys::Unity::DisplayAvailableApps); bool displayRecentApps = gsettings.getValueB(GSchemas::Unity::AppLens, GSchemaKeys::Unity::DisplayRecentApps); bool enableSearchFiles = gsettings.getValueB(GSchemas::Unity::FileLens, GSchemaKeys::Unity::EnableSearchFile); float panelOpacity = gsettings.getValueF(GSchemas::Unity::Shell, GSchemaKeys::Unity::PanelOpacity, GSchemaPaths::Unity); bool showDateTime = gsettings.getValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowDateTime); QString timeFormat = gsettings.getValueS(GSchemas::Unity::DateTime, GSchemaKeys::Unity::TimeFormat); bool showSeconds = gsettings.getValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowSeconds); bool showDate = gsettings.getValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowDate); bool showDay = gsettings.getValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowDay); bool showCalendar = gsettings.getValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowCalendar); bool showVolume = gsettings.getValueB(GSchemas::Unity::Sound, GSchemaKeys::Unity::ShowVolume); bool showShowMyName = gsettings.getValueB(GSchemas::Unity::Session, GSchemaKeys::Unity::ShowMyName); ui->checkLauncherAutoHide->setChecked(launcherAutoHide); if (revealLocation == GValues::RevealLocation::TopLeft) { ui->radioRevealTopLeft->setChecked(true); } else { ui->radioRevealLeft->setChecked(true); } ui->sliderRevealSensitivy->setValue(revealSensitivy / 0.1); ui->checkMinimizeApps->setChecked(launcherMinimzeApp); ui->sliderLauncherOpacity->setValue(launcherOpacity / 0.1); if (launcherVisibility == GValues::LauncherVisibility::AllDesktop) { ui->radioLauncherVisibleAllDesktop->setChecked(true); } else { ui->radioLauncherVisiblePrimaryDesktop->setChecked(true); } if (launcherPosition.contains(QRegExp("Left", Qt::CaseInsensitive))) { ui->radioLauncherPositionLeft->setChecked(true); } else { ui->radioLauncherPositionBottom->setChecked(true); } ui->spinIconSize->setValue(iconSize); ui->checkBackgroundBlur->setChecked(dashBlur); if (searchOnlineResource.contains(QRegExp("all", Qt::CaseInsensitive))) { ui->checkSearchOnlineResource->setChecked(true); } ui->checkMoreSuggestions->setChecked(displayAvailableApps); ui->checkRecentlyUsed->setChecked(displayRecentApps); ui->checkSearchYourFiles->setChecked(enableSearchFiles); ui->sliderPanelOpacity->setValue(panelOpacity / 0.1); ui->checkDateTime->setChecked(showDateTime); if (timeFormat.contains(QRegExp("24-hour", Qt::CaseInsensitive))) { ui->check24Hour->setChecked(true); } ui->checkSeconds->setChecked(showSeconds); ui->checkDate->setChecked(showDate); ui->checkWeekday->setChecked(showDay); ui->checkCalendar->setChecked(showCalendar); ui->checkVolume->setChecked(showVolume); ui->checkShowMyName->setChecked(showShowMyName); } void UnitySettings::initConnects() { connect(ui->sliderLauncherOpacity, SIGNAL(valueChanged(int)), this, SLOT(sliderLauncherOpacity_valueChanged(int))); connect(ui->sliderPanelOpacity, SIGNAL(valueChanged(int)), this, SLOT(sliderPanelOpacity_valueChanged(int))); connect(ui->sliderRevealSensitivy, SIGNAL(valueChanged(int)), this, SLOT(sliderRevealSensitivy_valueChanged(int))); connect(ui->spinIconSize, SIGNAL(valueChanged(int)), this, SLOT(spinIconSize_valueChanged(int))); } void UnitySettings::on_checkLauncherAutoHide_clicked(bool checked) { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherHideMode, checked, GSchemaPaths::Unity); } void UnitySettings::on_radioRevealLeft_clicked() { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::RevealTrigger, GValues::RevealLocation::Left, GSchemaPaths::Unity); } void UnitySettings::on_radioRevealTopLeft_clicked() { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::RevealTrigger, GValues::RevealLocation::TopLeft, GSchemaPaths::Unity); } void UnitySettings::sliderRevealSensitivy_valueChanged(int value) { gsettings.setValueF(GSchemas::Unity::Shell, GSchemaKeys::Unity::EdgeResponsiveness, (value * 0.1), GSchemaPaths::Unity); } void UnitySettings::on_checkMinimizeApps_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherMinimizeApp, checked, GSchemaPaths::Unity); } void UnitySettings::sliderLauncherOpacity_valueChanged(int value) { gsettings.setValueF(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherOpacity, (value * 0.1), GSchemaPaths::Unity); } void UnitySettings::on_radioLauncherVisibleAllDesktop_clicked() { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherVisibility, GValues::AllDesktop, GSchemaPaths::Unity); } void UnitySettings::on_radioLauncherVisiblePrimaryDesktop_clicked() { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherVisibility, GValues::PrimaryDesktop, GSchemaPaths::Unity); } void UnitySettings::on_radioLauncherPositionLeft_clicked() { gsettings.setValueS(GSchemas::Unity::Launcher, GSchemaKeys::Unity::LauncherPosition, "Left"); } void UnitySettings::on_radioLauncherPositionBottom_clicked() { gsettings.setValueS(GSchemas::Unity::Launcher, GSchemaKeys::Unity::LauncherPosition, "Bottom"); } void UnitySettings::spinIconSize_valueChanged(int value) { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::LauncherIconSize, value, GSchemaPaths::Unity); } void UnitySettings::on_checkBackgroundBlur_clicked(bool checked) { gsettings.setValueI(GSchemas::Unity::Shell, GSchemaKeys::Unity::DashBlur, checked, GSchemaPaths::Unity); } void UnitySettings::on_checkSearchOnlineResource_clicked(bool checked) { gsettings.setValueS(GSchemas::Unity::Lens, GSchemaKeys::Unity::SearchOnlineResource, (checked ? "all" : "none")); } void UnitySettings::on_checkMoreSuggestions_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::AppLens, GSchemaKeys::Unity::DisplayAvailableApps, checked); } void UnitySettings::on_checkRecentlyUsed_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::AppLens, GSchemaKeys::Unity::DisplayRecentApps, checked); } void UnitySettings::on_checkSearchYourFiles_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::FileLens, GSchemaKeys::Unity::EnableSearchFile, checked); } void UnitySettings::sliderPanelOpacity_valueChanged(int value) { gsettings.setValueF(GSchemas::Unity::Shell, GSchemaKeys::Unity::PanelOpacity, (value * 0.1), GSchemaPaths::Unity); } void UnitySettings::on_checkDateTime_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowDateTime, checked); } void UnitySettings::on_check24Hour_clicked(bool checked) { gsettings.setValueS(GSchemas::Unity::DateTime, GSchemaKeys::Unity::TimeFormat, (checked ? "24-hour" : "12-hour")); } void UnitySettings::on_checkSeconds_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowSeconds, checked); } void UnitySettings::on_checkDate_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowDate, checked); } void UnitySettings::on_checkWeekday_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowDay, checked); } void UnitySettings::on_checkCalendar_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::DateTime, GSchemaKeys::Unity::ShowCalendar, checked); } void UnitySettings::on_checkVolume_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::Sound, GSchemaKeys::Unity::ShowVolume, checked); } void UnitySettings::on_checkShowMyName_clicked(bool checked) { gsettings.setValueB(GSchemas::Unity::Session, GSchemaKeys::Unity::ShowMyName, checked); } ================================================ FILE: stacer/Pages/GnomeSettings/unity_settings.h ================================================ #ifndef UNITY_SETTINGS_H #define UNITY_SETTINGS_H #include #include "Tools/gnome_settings_tool.h" namespace Ui { class UnitySettings; } class UnitySettings : public QWidget { Q_OBJECT public: explicit UnitySettings(QWidget *parent = 0); ~UnitySettings(); public: void init(); void initConnects(); private slots: void on_checkLauncherAutoHide_clicked(bool checked); void on_radioRevealLeft_clicked(); void on_radioRevealTopLeft_clicked(); void sliderRevealSensitivy_valueChanged(int value); void on_checkMinimizeApps_clicked(bool checked); void sliderLauncherOpacity_valueChanged(int value); void on_radioLauncherVisibleAllDesktop_clicked(); void on_radioLauncherVisiblePrimaryDesktop_clicked(); void on_radioLauncherPositionLeft_clicked(); void on_radioLauncherPositionBottom_clicked(); void spinIconSize_valueChanged(int value); void on_checkBackgroundBlur_clicked(bool checked); void on_checkSearchOnlineResource_clicked(bool checked); void on_checkMoreSuggestions_clicked(bool checked); void on_checkRecentlyUsed_clicked(bool checked); void on_checkSearchYourFiles_clicked(bool checked); void sliderPanelOpacity_valueChanged(int value); void on_checkDateTime_clicked(bool checked); void on_check24Hour_clicked(bool checked); void on_checkSeconds_clicked(bool checked); void on_checkDate_clicked(bool checked); void on_checkWeekday_clicked(bool checked); void on_checkCalendar_clicked(bool checked); void on_checkVolume_clicked(bool checked); void on_checkShowMyName_clicked(bool checked); private: Ui::UnitySettings *ui; GnomeSettingsTool gsettings; }; #endif // UNITY_SETTINGS_H ================================================ FILE: stacer/Pages/GnomeSettings/unity_settings.ui ================================================ UnitySettings 0 0 809 817 0 0 0 0 0 true 0 0 807 815 0 0 0 0 10 Applications 5 5 5 5 30 10 PointingHandCursor Qt::NoFocus 0 0 Show "Recently Used" applications PointingHandCursor Qt::NoFocus 0 0 Enable search of your files PointingHandCursor Qt::NoFocus 0 0 Show "More Suggestions" Qt::Horizontal 40 20 general-title Search Qt::AlignCenter General 5 5 5 5 30 10 0 0 Transparency Level PointingHandCursor Qt::NoFocus 1 10 2 1 1 Qt::Horizontal Qt::Horizontal 40 20 Behaviour 5 5 5 5 30 15 PointingHandCursor Qt::NoFocus 0 0 Auto Hide 0 0 PointingHandCursor Left Side buttonGroup PointingHandCursor Qt::NoFocus 1 10 1 1 Qt::Horizontal 0 0 Minimize applications with clicking 0 0 PointingHandCursor Top-Left Corner buttonGroup 0 0 Reveal Sensitivity PointingHandCursor Qt::NoFocus 0 0 Reveal Location Qt::Horizontal 40 20 general-title Launcher Qt::AlignCenter Appearance 5 5 5 5 30 10 0 0 PointingHandCursor Left buttonGroup_3 0 0 PointingHandCursor Bottom buttonGroup_3 0 0 Visibility 0 0 PointingHandCursor Primary Desktop buttonGroup_2 8 64 2 PointingHandCursor Qt::NoFocus 1 10 2 1 Qt::Horizontal 0 0 Icon size 0 0 PointingHandCursor All Desktops buttonGroup_2 0 0 Position 0 0 Transparency Level Qt::Horizontal 40 20 General 5 5 5 5 30 10 PointingHandCursor Qt::NoFocus 0 0 Search online sources PointingHandCursor Qt::NoFocus 0 0 Background Blur Qt::Horizontal 40 20 general-title Panel Qt::AlignCenter Qt::Vertical 20 46 Indicators 5 5 5 5 30 10 0 0 PointingHandCursor Qt::NoFocus circle Date 0 0 PointingHandCursor Qt::NoFocus circle Calendar 0 0 Date & Time 0 0 24-Hour Time 0 0 PointingHandCursor Qt::NoFocus circle Weekday 0 0 Include 0 0 PointingHandCursor Qt::NoFocus circle Seconds 0 0 Volume 0 0 Show my name PointingHandCursor Qt::NoFocus PointingHandCursor Qt::NoFocus PointingHandCursor Qt::NoFocus PointingHandCursor Qt::NoFocus Qt::Horizontal 40 20 ================================================ FILE: stacer/Pages/GnomeSettings/window_manager_settings.cpp ================================================ #include "window_manager_settings.h" #include "ui_window_manager_settings.h" #include WindowManagerSettings::~WindowManagerSettings() { delete ui; } WindowManagerSettings::WindowManagerSettings(QWidget *parent) : QWidget(parent), ui(new Ui::WindowManagerSettings), gsettings(GnomeSettingsTool::ins()) { ui->setupUi(this); loadDatas(); init(); initConnects(); } void WindowManagerSettings::init() { int textureFilter = gsettings.getValueI(GSchemas::Window::OpenGL, GSchemaKeys::Window::TextureQuality, GSchemaPaths::OpenGL); int horizontalWorkspaceSize = gsettings.getValueI(GSchemas::Window::Core, GSchemaKeys::Window::HorizontalWorkSize, GSchemaPaths::Core); int verticalWorkspaceSize = gsettings.getValueI(GSchemas::Window::Core, GSchemaKeys::Window::VerticalWorkSize, GSchemaPaths::Core); bool workspaceSwitcher = horizontalWorkspaceSize > 1 || verticalWorkspaceSize > 1; bool raiseOnClick = gsettings.getValueI(GSchemas::Window::Preferences, GSchemaKeys::Window::RaiseOnClick); QString focusMode = gsettings.getValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::FocusMode).replace("'", ""); QString actionDoubleClick = gsettings.getValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::ActionDoubleClick).replace("'", ""); QString actionMiddleClick = gsettings.getValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::ActionMiddleClick).replace("'", ""); QString actionRightClick = gsettings.getValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::ActionRightClick).replace("'", ""); ui->cmbTextQuality->setCurrentIndex(textureFilter); ui->checkWorkspaceSwitcher->setChecked(workspaceSwitcher); ui->spinHorizonWorkspace->setValue(horizontalWorkspaceSize); ui->spinVerticWorkspace->setValue(verticalWorkspaceSize); ui->checkRaiseOnClick->setChecked(raiseOnClick); ui->cmbFocusMode->setCurrentIndex(ui->cmbFocusMode->findData(focusMode)); ui->cmbTitleBarDoubleClick->setCurrentIndex(ui->cmbTitleBarDoubleClick->findData(actionDoubleClick)); ui->cmbTitleBarMiddleClick->setCurrentIndex(ui->cmbTitleBarMiddleClick->findData(actionMiddleClick)); ui->cmbTitleBarRightClick->setCurrentIndex(ui->cmbTitleBarRightClick->findData(actionRightClick)); } void WindowManagerSettings::loadDatas() { QStringList textQualities = { tr("Fast"), tr("Good"), tr("Best") }; QList> textFocusModes = { {tr("Click"), "click"}, {tr("Sloppy") , "sloppy"}, {tr("Mouse"), "mouse"} }; for (const QString &qual : textQualities) { ui->cmbTextQuality->addItem(qual, qual.toLower()); } for (const QPair &mode : textFocusModes) { ui->cmbFocusMode->addItem(mode.first, mode.second); } QList> titleBarClickActions = { {tr("Toggle Shade"), "toggle-shade"}, {tr("Maximize"), "toggle-maximize"}, {tr("Maximize Horizontally"), "toggle-maximize-horizontally"}, {tr("Maximize Vertically"), "toggle-maximize-vertically"}, {tr("Minimize"), "minimize"}, {tr("None"), "none"}, {tr("Lower"), "lower"}, {tr("Menu"), "menu"} }; for (const QPair &action : titleBarClickActions) { ui->cmbTitleBarDoubleClick->addItem(action.first, action.second); ui->cmbTitleBarMiddleClick->addItem(action.first, action.second); ui->cmbTitleBarRightClick-> addItem(action.first, action.second); } } void WindowManagerSettings::initConnects() { connect(ui->cmbTextQuality, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbTextQuality_currentIndexChanged(int))); connect(ui->checkWorkspaceSwitcher, SIGNAL(clicked(bool)), this, SLOT(checkWorkspaceSwitcher_clicked(bool))); connect(ui->spinHorizonWorkspace, SIGNAL(valueChanged(int)), this, SLOT(spinHorizonWorkspace_valueChanged(int))); connect(ui->spinVerticWorkspace, SIGNAL(valueChanged(int)), this, SLOT(spinVerticWorkspace_valueChanged(int))); connect(ui->checkRaiseOnClick, SIGNAL(clicked(bool)), this, SLOT(checkRaiseOnClick_clicked(bool))); connect(ui->cmbFocusMode, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbFocusMode_currentIndexChanged(int))); connect(ui->cmbTitleBarDoubleClick, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbTitleBarDoubleClick_currentIndexChanged(int))); connect(ui->cmbTitleBarMiddleClick, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbTitleBarMiddleClick_currentIndexChanged(int))); connect(ui->cmbTitleBarRightClick, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbTitleBarRightClick_currentIndexChanged(int))); } void WindowManagerSettings::cmbTextQuality_currentIndexChanged(int index) { gsettings.setValueI(GSchemas::Window::OpenGL, GSchemaKeys::Window::TextureQuality, index, GSchemaPaths::OpenGL); } void WindowManagerSettings::checkWorkspaceSwitcher_clicked(bool checked) { int workSize = checked ? 2 : 1; gsettings.setValueI(GSchemas::Window::Core, GSchemaKeys::Window::HorizontalWorkSize, workSize, GSchemaPaths::Core); gsettings.setValueI(GSchemas::Window::Core, GSchemaKeys::Window::VerticalWorkSize, workSize, GSchemaPaths::Core); ui->spinHorizonWorkspace->setValue(workSize); ui->spinVerticWorkspace->setValue(workSize); } void WindowManagerSettings::spinHorizonWorkspace_valueChanged(int value) { gsettings.setValueI(GSchemas::Window::Core, GSchemaKeys::Window::HorizontalWorkSize, value, GSchemaPaths::Core); } void WindowManagerSettings::spinVerticWorkspace_valueChanged(int value) { gsettings.setValueI(GSchemas::Window::Core, GSchemaKeys::Window::VerticalWorkSize, value, GSchemaPaths::Core); } void WindowManagerSettings::checkRaiseOnClick_clicked(bool checked) { gsettings.setValueI(GSchemas::Window::Preferences, GSchemaKeys::Window::RaiseOnClick, checked); } void WindowManagerSettings::cmbFocusMode_currentIndexChanged(int index) { QString data = ui->cmbFocusMode->itemData(index).toString(); gsettings.setValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::FocusMode, data); } void WindowManagerSettings::cmbTitleBarDoubleClick_currentIndexChanged(int index) { QString data = ui->cmbTitleBarDoubleClick->itemData(index).toString(); gsettings.setValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::ActionDoubleClick, data); } void WindowManagerSettings::cmbTitleBarMiddleClick_currentIndexChanged(int index) { QString data = ui->cmbTitleBarMiddleClick->itemData(index).toString(); gsettings.setValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::ActionMiddleClick, data); } void WindowManagerSettings::cmbTitleBarRightClick_currentIndexChanged(int index) { QString data = ui->cmbTitleBarRightClick->itemData(index).toString(); gsettings.setValueS(GSchemas::Window::Preferences, GSchemaKeys::Window::ActionRightClick, data); } ================================================ FILE: stacer/Pages/GnomeSettings/window_manager_settings.h ================================================ #ifndef WINDOW_MANAGER_SETTINGS_H #define WINDOW_MANAGER_SETTINGS_H #include #include "Tools/gnome_settings_tool.h" namespace Ui { class WindowManagerSettings; } class WindowManagerSettings : public QWidget { Q_OBJECT public: explicit WindowManagerSettings(QWidget *parent = 0); ~WindowManagerSettings(); private slots: void cmbTextQuality_currentIndexChanged(int index); void checkWorkspaceSwitcher_clicked(bool checked); void spinHorizonWorkspace_valueChanged(int value); void spinVerticWorkspace_valueChanged(int value); void checkRaiseOnClick_clicked(bool checked); void cmbFocusMode_currentIndexChanged(int index); void cmbTitleBarDoubleClick_currentIndexChanged(int index); void cmbTitleBarMiddleClick_currentIndexChanged(int index); void cmbTitleBarRightClick_currentIndexChanged(int index); private: void init(); void loadDatas(); void initConnects(); private: Ui::WindowManagerSettings *ui; GnomeSettingsTool gsettings; }; #endif // WINDOW_MANAGER_SETTINGS_H ================================================ FILE: stacer/Pages/GnomeSettings/window_manager_settings.ui ================================================ WindowManagerSettings 0 0 933 467 0 0 0 0 0 0 0 true 0 0 931 465 0 0 0 0 15 10 Qt::Vertical 20 46 general-title General Qt::AlignCenter Titlebar Actions 5 5 5 5 30 15 0 0 300 0 16777215 16777215 QComboBox::AdjustToMinimumContentsLength 0 0 Right click 0 0 Double click 0 0 Middle click 0 0 300 0 16777215 16777215 QComboBox::AdjustToMinimumContentsLength 0 0 300 0 16777215 16777215 QComboBox::AdjustToMinimumContentsLength Qt::Horizontal 40 20 general-title Additional Qt::AlignCenter Workspace Settings 5 5 5 5 30 15 PointingHandCursor Qt::NoFocus 0 0 Vertical workspaces 1 25 0 0 Workspace switcher 1 25 0 0 Horizontal workspaces Qt::Horizontal 40 20 Focus Behaviour 5 5 5 5 30 15 0 0 Focus mode PointingHandCursor Qt::NoFocus 0 0 300 0 16777215 16777215 QComboBox::AdjustToMinimumContentsLength 0 0 Raise on click Qt::Horizontal 40 20 Hardware Acceleration 5 5 5 5 30 15 0 0 300 0 16777215 16777215 QComboBox::AdjustToMinimumContentsLength 0 0 Text quality Qt::Horizontal 40 20 ================================================ FILE: stacer/Pages/Helpers/helpers_page.cpp ================================================ #include "helpers_page.h" #include "ui_helpers_page.h" HelpersPage::~HelpersPage() { delete ui; } HelpersPage::HelpersPage(QWidget *parent) : QWidget(parent), widgetHostManage(new HostManage), ui(new Ui::HelpersPage) { ui->setupUi(this); init(); } void HelpersPage::init() { ui->stackedWidget->addWidget(widgetHostManage); //ui->stackedWidget->addWidget(); Utilities::addDropShadow({ ui->btnHostManage }, 40); } void HelpersPage::on_btnHostManage_clicked() { ui->stackedWidget->setCurrentIndex(0); } ================================================ FILE: stacer/Pages/Helpers/helpers_page.h ================================================ #ifndef HELPERS_PAGE_H #define HELPERS_PAGE_H #include #include "host_manage.h" #include "utilities.h" namespace Ui { class HelpersPage; } class HelpersPage : public QWidget { Q_OBJECT public: explicit HelpersPage(QWidget *parent = 0); ~HelpersPage(); private slots: void on_btnHostManage_clicked(); void init(); private: Ui::HelpersPage *ui; HostManage *widgetHostManage; }; #endif // HELPERS_PAGE_H ================================================ FILE: stacer/Pages/Helpers/helpers_page.ui ================================================ HelpersPage 0 0 839 590 Helpers 15 10 15 10 10 12 0 0 0 0 PointingHandCursor Qt::NoFocus Host Manage true true buttonGroup Qt::Horizontal 40 20 ================================================ FILE: stacer/Pages/Helpers/host_manage.cpp ================================================ #include "host_manage.h" #include "ui_host_manage.h" #include HostManage::~HostManage() { delete ui; } HostManage::HostManage(QWidget *parent): QWidget(parent), mItemModel(new QStandardItemModel(this)), mSortFilterModel(new QSortFilterProxyModel(this)), updatedLine(-1), ui(new Ui::HostManage) { ui->setupUi(this); init(); } void HostManage::init() { ui->lblHostTitle->setText(tr("Hosts (%1)").arg(1)); Utilities::addDropShadow({ ui->btnCancel, ui->btnNewHost, ui->btnSave, ui->txtAliases, ui->txtFullyQualified, ui->txtIP, ui->tableViewHosts }, 40); ui->widgetAddEditHost->hide(); ui->lblErrorMsg->hide(); mHeaderList = { tr("IP Address"), tr("Full Qualified"), tr("Aliases") }; mItemModel->setHorizontalHeaderLabels(mHeaderList); mSortFilterModel->setSourceModel(mItemModel); ui->tableViewHosts->setModel(mSortFilterModel); mSortFilterModel->setSortRole(1); mSortFilterModel->setDynamicSortFilter(true); ui->tableViewHosts->horizontalHeader()->setSectionsMovable(true); ui->tableViewHosts->horizontalHeader()->setFixedHeight(32); ui->tableViewHosts->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); ui->tableViewHosts->horizontalHeader()->setCursor(Qt::PointingHandCursor); ui->tableViewHosts->horizontalHeader()->resizeSection(0, 195); ui->tableViewHosts->horizontalHeader()->resizeSection(1, 195); ui->tableViewHosts->setContextMenuPolicy(Qt::CustomContextMenu); loadTableRowMenu(); mHostFileContent = FileUtil::readListFromFile("/etc/hosts"); loadTableData(); } void HostManage::loadHostItems() { mHostItemList.clear(); int i = 0; for (const QString &line: mHostFileContent) { if (! line.trimmed().startsWith("#") && ! line.trimmed().isEmpty()) { QStringList lineItems = line.trimmed().split(QRegExp("\\s+")); if (lineItems.count() > 1) { HostItem hItem; hItem.ip = lineItems.at(0).trimmed(); hItem.fullQualified = lineItems.at(1).trimmed(); hItem.aliases = lineItems.count() > 2 ? lineItems.mid(2).join(" ") : ""; mHostItemList.insert(i, hItem); } } i++; } } void HostManage::loadTableData() { loadHostItems(); mItemModel->removeRows(0, mItemModel->rowCount()); QMapIterator itemIterator(mHostItemList); while (itemIterator.hasNext()) { itemIterator.next(); mItemModel->appendRow(createRow(QPair(itemIterator.key(), itemIterator.value()))); } ui->lblHostTitle->setText(tr("Hosts (%1)").arg(mHostItemList.count())); } QList HostManage::createRow(const QPair &item) { QStandardItem *i_ip = new QStandardItem(item.second.ip); i_ip->setData(item.first, 9); i_ip->setData(item.second.ip, 1); i_ip->setData(item.second.ip, Qt::ToolTipRole); QStandardItem *i_fullQualified = new QStandardItem(item.second.fullQualified); i_fullQualified->setData(item.second.fullQualified, 1); i_fullQualified->setData(item.second.fullQualified, Qt::ToolTipRole); QStandardItem *i_aliases = new QStandardItem(item.second.aliases); i_aliases->setData(item.second.aliases, 1); i_aliases->setData(item.second.aliases, Qt::ToolTipRole); return { i_ip, i_fullQualified, i_aliases }; } void HostManage::on_btnNewHost_clicked() { ui->widgetAddEditHost->show(); ui->lblErrorMsg->hide(); ui->txtIP->clear(); ui->txtFullyQualified->clear(); ui->txtAliases->clear(); updatedLine = -1; } void HostManage::loadTableRowMenu() { QAction *actionOpenFolder = new QAction(QIcon(":/static/themes/common/img/folder.png"), tr("Edit"),&mTableRowMenu); actionOpenFolder->setData("edit"); mTableRowMenu.addAction(actionOpenFolder); QAction *actionDelete = new QAction(QIcon(":/static/themes/common/img/delete.png"), tr("Delete"),&mTableRowMenu); actionDelete->setData("delete"); mTableRowMenu.addAction(actionDelete); } void HostManage::on_btnSave_clicked() { if (ui->txtIP->text().isEmpty() || ui->txtFullyQualified->text().isEmpty()) { ui->lblErrorMsg->setText(tr("The IP and Fully Qualified fields are required.")); ui->lblErrorMsg->show(); } else { QString item = QString("%1 %2 %3") .arg(ui->txtIP->text().trimmed()) .arg(ui->txtFullyQualified->text().trimmed()) .arg(ui->txtAliases->text()); if (updatedLine == -1) { mHostFileContent.append(item); } else { mHostFileContent.replace(updatedLine, item); } updatedLine = -1; loadTableData(); ui->widgetAddEditHost->hide(); } } void HostManage::on_btnCancel_clicked() { ui->widgetAddEditHost->hide(); ui->lblErrorMsg->hide(); updatedLine = -1; } void HostManage::on_btnSaveChanges_clicked() { FileUtil::writeFile("/tmp/stacer_etc_host_new_content", mHostFileContent.join("\n")); try { CommandUtil::sudoExec("mv", {"/tmp/stacer_etc_host_new_content", "/etc/hosts"}); loadTableData(); } catch (QString ex) { qDebug() << ex; } } void HostManage::on_tableViewHosts_customContextMenuRequested(const QPoint &pos) { if (mItemModel->rowCount() > 0) { QPoint globalPos = ui->tableViewHosts->mapToGlobal(pos); QAction *action = mTableRowMenu.exec(globalPos); QModelIndexList selecteds = ui->tableViewHosts->selectionModel()->selectedRows(); QItemSelectionModel *selectionModel = ui->tableViewHosts->selectionModel(); if (action && ! selecteds.isEmpty()) { if (action->data().toString() == "edit") { QModelIndex index = selectionModel->selectedRows().first(); updatedLine = mSortFilterModel->index(index.row(), 0).data(9).toInt(); ui->txtIP->setText(mHostItemList.value(updatedLine).ip); ui->txtFullyQualified->setText(mHostItemList.value(updatedLine).fullQualified); ui->txtAliases->setText(mHostItemList.value(updatedLine).aliases); ui->widgetAddEditHost->show(); selectionModel->clearSelection(); } else if (action->data().toString() == "delete") { while (! selectionModel->selectedRows().isEmpty()) { QModelIndex index = selectionModel->selectedRows().first(); int lineNumber = mSortFilterModel->index(index.row(), 0).data(9).toInt(); mHostFileContent.replace(lineNumber, ""); selectionModel->select(index, QItemSelectionModel::Deselect); } selectionModel->clearSelection(); loadTableData(); } } } } ================================================ FILE: stacer/Pages/Helpers/host_manage.h ================================================ #ifndef HOST_MANAGE_H #define HOST_MANAGE_H #include #include #include #include #include "Utils/file_util.h" #include "Utils/command_util.h" #include "utilities.h" namespace Ui { class HostManage; } class HostItem { public: QString ip; QString fullQualified; QString aliases; }; class HostManage : public QWidget { Q_OBJECT public: explicit HostManage(QWidget *parent = 0); ~HostManage(); private slots: void init(); void on_btnNewHost_clicked(); void on_btnSave_clicked(); void loadHostItems(); void loadTableData(); void on_btnCancel_clicked(); void loadTableRowMenu(); void on_btnSaveChanges_clicked(); QList createRow(const QPair &item); void on_tableViewHosts_customContextMenuRequested(const QPoint &pos); private: Ui::HostManage *ui; bool isAddHost; QList mHeaderList; QStandardItemModel *mItemModel; QSortFilterProxyModel *mSortFilterModel; QMenu mTableRowMenu; QStringList mHostFileContent; QMap mHostItemList; int updatedLine; }; #endif // HOST_MANAGE_H ================================================ FILE: stacer/Pages/Helpers/host_manage.ui ================================================ HostManage 0 0 804 534 Form 5 0 5 10 10 10 PointingHandCursor Qt::NoFocus primary Save Changes 10 0 0 Qt::Horizontal 40 20 PointingHandCursor Qt::NoFocus New Host true true 8 0 0 0 0 Qt::StrongFocus IP Address * Fully Qualified Name * Aliases PointingHandCursor Qt::NoFocus primary Save PointingHandCursor Qt::NoFocus danger Cancel Qt::NoFocus QFrame::NoFrame QAbstractItemView::NoEditTriggers QAbstractItemView::SelectRows Qt::ElideMiddle true true true false ================================================ FILE: stacer/Pages/Processes/processes_page.cpp ================================================ #include "processes_page.h" #include "ui_processes_page.h" #include "utilities.h" ProcessesPage::~ProcessesPage() { delete ui; } ProcessesPage::ProcessesPage(QWidget *parent) : QWidget(parent), ui(new Ui::ProcessesPage), mItemModel(new QStandardItemModel(this)), mSortFilterModel(new QSortFilterProxyModel(this)), im(InfoManager::ins()), mTimer(new QTimer(this)) { ui->setupUi(this); init(); } void ProcessesPage::init() { mHeaders = QStringList { "PID", tr("Resident Memory"), tr("%Memory"), tr("Virtual Memory"), tr("User"), "%CPU", tr("Start Time"), tr("State"), tr("Group"), tr("Nice"), tr("CPU Time"), tr("Session"), tr("Process") }; // slider settings ui->sliderRefresh->setRange(1, 10); ui->sliderRefresh->setPageStep(1); ui->sliderRefresh->setSingleStep(1); // Table settings mSortFilterModel->setSourceModel(mItemModel); mItemModel->setHorizontalHeaderLabels(mHeaders); ui->tableProcess->setModel(mSortFilterModel); mSortFilterModel->setSortRole(1); mSortFilterModel->setDynamicSortFilter(true); mSortFilterModel->sort(5, Qt::SortOrder::DescendingOrder); ui->tableProcess->horizontalHeader()->setSectionsMovable(true); ui->tableProcess->horizontalHeader()->setFixedHeight(36); ui->tableProcess->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); ui->tableProcess->horizontalHeader()->setCursor(Qt::PointingHandCursor); ui->tableProcess->horizontalHeader()->resizeSection(0, 70); loadProcesses(); connect(mTimer, &QTimer::timeout, this, &ProcessesPage::loadProcesses); mTimer->setInterval(1000); mTimer->start(); ui->tableProcess->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tableProcess->horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(on_tableProcess_customContextMenuRequested(const QPoint&))); loadHeaderMenu(); Utilities::addDropShadow(ui->btnEndProcess, 60); Utilities::addDropShadow(ui->tableProcess, 55); } void ProcessesPage::loadHeaderMenu() { int i = 0; QList actionList; actionList.reserve(mHeaders.size()); for (const QString &header : mHeaders) { QAction *action = new QAction(header,&mHeaderMenu); action->setCheckable(true); action->setChecked(true); action->setData(i++); actionList.push_back(action); } mHeaderMenu.addActions(actionList); // exclude headers QList hiddenHeaders = { 3, 6, 7, 8, 9, 10, 11 }; QList actions = mHeaderMenu.actions(); for (const int i : hiddenHeaders) { if (i < mHeaders.count()) { ui->tableProcess->horizontalHeader()->setSectionHidden(i, true); actions.at(i)->setChecked(false); } } } void ProcessesPage::loadProcesses() { QModelIndexList selecteds = ui->tableProcess->selectionModel()->selectedRows(); mItemModel->removeRows(0, mItemModel->rowCount()); im->updateProcesses(); QList processes = im->getProcesses(); QString username = im->getUserName(); if (ui->checkAllProcesses->isChecked()) { for (const Process &proc : processes) { mItemModel->appendRow(createRow(proc)); } } else { for (const Process &proc : processes) { if (username == proc.getUname()) { mItemModel->appendRow(createRow(proc)); } } } ui->lblProcessTitle->setText(tr("Processes (%1)").arg(mItemModel->rowCount())); // selected item if (! selecteds.isEmpty()) { mSeletedRowModel = selecteds.first(); for (int i = 0; i < mSortFilterModel->rowCount(); ++i) { if (mSortFilterModel->index(i, 0).data(1).toInt() == mSeletedRowModel.data(1).toInt()) { ui->tableProcess->selectRow(i); } } } else { mSeletedRowModel = QModelIndex(); } } QList ProcessesPage::createRow(const Process &proc) { QList row; int data = 1; QStandardItem *pid_i = new QStandardItem(QString::number(proc.getPid())); pid_i->setData(proc.getPid(), data); pid_i->setData(proc.getPid(), Qt::ToolTipRole); QStandardItem *rss_i = new QStandardItem(FormatUtil::formatBytes(proc.getRss())); rss_i->setData(proc.getRss(), data); rss_i->setData(FormatUtil::formatBytes(proc.getRss()), Qt::ToolTipRole); QStandardItem *pmem_i = new QStandardItem(QString::number(proc.getPmem())); pmem_i->setData(proc.getPmem(), data); pmem_i->setData(proc.getPmem(), Qt::ToolTipRole); QStandardItem *vsize_i = new QStandardItem(FormatUtil::formatBytes(proc.getVsize())); vsize_i->setData(proc.getVsize(), data); vsize_i->setData(FormatUtil::formatBytes(proc.getVsize()), Qt::ToolTipRole); QStandardItem *uname_i = new QStandardItem(proc.getUname()); uname_i->setData(proc.getUname(), data); uname_i->setData(proc.getUname(), Qt::ToolTipRole); QStandardItem *pcpu_i = new QStandardItem(QString::number(proc.getPcpu())); pcpu_i->setData(proc.getPcpu(), data); pcpu_i->setData(proc.getPcpu(), Qt::ToolTipRole); QStandardItem *starttime_i = new QStandardItem(proc.getStartTime()); starttime_i->setData(proc.getStartTime(), data); starttime_i->setData(proc.getStartTime(), Qt::ToolTipRole); QStandardItem *state_i = new QStandardItem(proc.getState()); state_i->setData(proc.getState(), data); state_i->setData(proc.getState(), Qt::ToolTipRole); QStandardItem *group_i = new QStandardItem(proc.getGroup()); group_i->setData(proc.getGroup(), data); group_i->setData(proc.getGroup(), Qt::ToolTipRole); QStandardItem *nice_i = new QStandardItem(QString::number(proc.getNice())); nice_i->setData(proc.getNice(), data); nice_i->setData(proc.getNice(), Qt::ToolTipRole); QStandardItem *cpuTime_i = new QStandardItem(proc.getCpuTime()); cpuTime_i->setData(proc.getCpuTime(), data); cpuTime_i->setData(proc.getCpuTime(), Qt::ToolTipRole); QStandardItem *session_i = new QStandardItem(proc.getSession()); session_i->setData(proc.getSession(), data); session_i->setData(proc.getSession(), Qt::ToolTipRole); QStandardItem *cmd_i = new QStandardItem(proc.getCmd()); cmd_i->setData(proc.getCmd(), data); cmd_i->setData(QString("

%1

").arg(proc.getCmd()), Qt::ToolTipRole); row << pid_i << rss_i << pmem_i << vsize_i << uname_i << pcpu_i << starttime_i << state_i << group_i << nice_i << cpuTime_i << session_i << cmd_i; return row; } void ProcessesPage::on_txtProcessSearch_textChanged(const QString &val) { QRegExp query(val, Qt::CaseInsensitive, QRegExp::Wildcard); mSortFilterModel->setFilterKeyColumn(mHeaders.count() - 1); // process name mSortFilterModel->setFilterRegExp(query); } void ProcessesPage::on_sliderRefresh_valueChanged(const int &i) { ui->lblRefresh->setText(tr("Refresh (%1)").arg(i)); mTimer->setInterval(i * 1000); } void ProcessesPage::on_btnEndProcess_clicked() { pid_t pid = mSeletedRowModel.data(1).toInt(); if (pid) { QString selectedUname = mSortFilterModel->index(mSeletedRowModel.row(), 4).data(1).toString(); try { if (selectedUname == im->getUserName()) { CommandUtil::exec("kill", { QString::number(pid) }); } else { CommandUtil::sudoExec("kill", { QString::number(pid) }); } } catch (QString &ex) { qCritical() << ex; } } } void ProcessesPage::on_tableProcess_customContextMenuRequested(const QPoint &pos) { QPoint globalPos = ui->tableProcess->mapToGlobal(pos); QAction *action = mHeaderMenu.exec(globalPos); if (action) { ui->tableProcess->horizontalHeader()->setSectionHidden(action->data().toInt(), ! action->isChecked()); } } ================================================ FILE: stacer/Pages/Processes/processes_page.h ================================================ #ifndef PROCESSESPAGE_H #define PROCESSESPAGE_H #include #include #include #include #include #include #include #include #include "Managers/info_manager.h" namespace Ui { class ProcessesPage; } class ProcessesPage : public QWidget { Q_OBJECT public: explicit ProcessesPage(QWidget *parent = 0); ~ProcessesPage(); private slots: void init(); void loadProcesses(); void loadHeaderMenu(); QList createRow(const Process &proc); void on_txtProcessSearch_textChanged(const QString &val); void on_sliderRefresh_valueChanged(const int &i); void on_btnEndProcess_clicked(); void on_tableProcess_customContextMenuRequested(const QPoint &pos); private: Ui::ProcessesPage *ui; QStandardItemModel *mItemModel; QSortFilterProxyModel *mSortFilterModel; QModelIndex mSeletedRowModel; QStringList mHeaders; QMenu mHeaderMenu; QTimer *mTimer; InfoManager *im; }; #endif // PROCESSESPAGE_H ================================================ FILE: stacer/Pages/Processes/processes_page.ui ================================================ ProcessesPage 0 0 835 612 Processes 20 5 20 20 0 5 10 5 0 10 Processes PointingHandCursor Qt::NoFocus circle All Processes Qt::Horizontal 40 20 10 Search... Qt::NoFocus QFrame::NoFrame QFrame::Sunken QAbstractScrollArea::AdjustToContents QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows Qt::ElideMiddle Qt::SolidLine true true true false true false 10 0 5 0 0 Refresh (1) PointingHandCursor Qt::NoFocus Qt::Horizontal Qt::Horizontal 40 20 PointingHandCursor Qt::NoFocus primary End Process ================================================ FILE: stacer/Pages/Resources/history_chart.cpp ================================================ #include "history_chart.h" #include "ui_history_chart.h" HistoryChart::~HistoryChart() { delete ui; } HistoryChart::HistoryChart(const QString &title, const int &seriesCount, QCategoryAxis* categoriAxisY, QWidget *parent) : QWidget(parent), ui(new Ui::HistoryChart), mTitle(title), mSeriesCount(seriesCount), mChartView(new QChartView(this)), mChart(mChartView->chart()) { ui->setupUi(this); init(); if (categoriAxisY) { mAxisY = categoriAxisY; mAxisY->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue); for (int i = 0; i < seriesCount; ++i) { mChart->setAxisY(mAxisY, mSeriesList.at(i)); } } } void HistoryChart::init() { ui->lblHistoryTitle->setText(mTitle); // add series to chart for (int i = 0; i < mSeriesCount; i++) { mSeriesList.append(new QSplineSeries); mChart->addSeries(mSeriesList.at(i)); } mChartView->setRenderHint(QPainter::Antialiasing); QList colors = { 0x2ecc71, 0xe74c3c, 0x3498db, 0xf1c40f, 0xe67e22, 0x1abc9c, 0x9b59b6, 0x34495e, 0xd35400, 0xc0392b, 0x8e44ad, 0xFF8F00, 0xEF6C00, 0x4E342E, 0x424242, 0x5499C7, 0x58D68D, 0xCD6155, 0xF5B041, 0x566573 }; // set colors for (int i = 0; i < mSeriesList.count(); ++i) { dynamic_cast(mChart->series().at(i))->setColor(QColor(colors.at(i))); } // Chart Settings mChart->createDefaultAxes(); mChart->axisX()->setRange(0, 60); mChart->axisX()->setReverse(true); mChart->setContentsMargins(-11, -11, -11, -11); mChart->setMargins(QMargins(20, 0, 10, 10)); ui->layoutHistoryChart->addWidget(mChartView, 1, 0, 1, 3); // theme changed connect(SignalMapper::ins(), &SignalMapper::sigChangedAppTheme, [=] { QString chartLabelColor = AppManager::ins()->getStyleValues()->value("@chartLabelColor").toString(); QString chartGridColor = AppManager::ins()->getStyleValues()->value("@chartGridColor").toString(); QString historyChartBackground = AppManager::ins()->getStyleValues()->value("@historyChartBackgroundColor").toString(); mChart->axisX()->setLabelsColor(chartLabelColor); mChart->axisX()->setGridLineColor(chartGridColor); mChart->axisY()->setLabelsColor(chartLabelColor); mChart->axisY()->setGridLineColor(chartGridColor); mChart->setBackgroundBrush(QColor(historyChartBackground)); mChart->legend()->setLabelColor(chartLabelColor); }); } void HistoryChart::setYMax(const int &value) { mChart->axisY()->setRange(0, value); } QCategoryAxis *HistoryChart::getAxisY() { return mAxisY; } void HistoryChart::setCategoryAxisYLabels() { if (mAxisY) { for (const QString &label : mAxisY->categoriesLabels()){ mAxisY->remove(label); } for (int i = 1; i < 5; ++i) { mAxisY->append(FormatUtil::formatBytes((mAxisY->max()/4)*i), (mAxisY->max()/4)*i); } } } QVector HistoryChart::getSeriesList() const { return mSeriesList; } void HistoryChart::setSeriesList(const QVector &seriesList) { for (int i = 0; i < seriesList.count(); ++i) { mChart->series().replace(0, seriesList.at(i)); } mChartView->repaint(); } void HistoryChart::on_checkHistoryTitle_clicked(bool checked) { QLayout *charts = topLevelWidget()->findChild("charts")->layout(); for (int i = 0; i < charts->count(); ++i) { charts->itemAt(i)->widget()->setVisible(! checked); } show(); } ================================================ FILE: stacer/Pages/Resources/history_chart.h ================================================ #ifndef HISTORYCHART_H #define HISTORYCHART_H #include #include #include #include #include "Managers/app_manager.h" #include "Utils/format_util.h" namespace Ui { class HistoryChart; } class HistoryChart : public QWidget { Q_OBJECT public: explicit HistoryChart(const QString &title, const int &seriesCount, QCategoryAxis* categoriAxisY = nullptr, QWidget *parent = 0); ~HistoryChart(); QVector getSeriesList() const; QCategoryAxis *getAxisY(); void setYMax(const int &value); void setSeriesList(const QVector &seriesList); void setCategoryAxisYLabels(); private slots: void on_checkHistoryTitle_clicked(bool checked); private: void init(); private: Ui::HistoryChart *ui; QString mTitle; int mSeriesCount; QChartView *mChartView; QChart *mChart; QVector mSeriesList; QCategoryAxis *mAxisY; }; #endif // HISTORYCHART_H ================================================ FILE: stacer/Pages/Resources/history_chart.ui ================================================ HistoryChart 0 0 759 275 0 0 0 200 0 0 0 0 10 0 PointingHandCursor Qt::NoFocus Qt::LeftToRight 0 0 Chart Title Qt::Horizontal 40 20 ================================================ FILE: stacer/Pages/Resources/resources_page.cpp ================================================ #include "resources_page.h" #include "ui_resources_page.h" #include "utilities.h" ResourcesPage::~ResourcesPage() { delete ui; } ResourcesPage::ResourcesPage(QWidget *parent) : QWidget(parent), ui(new Ui::ResourcesPage), im(InfoManager::ins()), mChartCpu(new HistoryChart(tr("History of CPU"), im->getCpuCoreCount(), nullptr, this)), mChartCpuLoadAvg(new HistoryChart(tr("History of CPU Load Averages"), 3, nullptr, this)), mChartDiskReadWrite(new HistoryChart(tr("History of Disk Read Write"), 2, new QCategoryAxis, this)), mChartMemory(new HistoryChart(tr("History of Memory"), 2, nullptr, this)), mChartNetwork(new HistoryChart(tr("History of Network"), 2, new QCategoryAxis, this)), mChartDiskPie(new QChart), mTimer(new QTimer(this)) { ui->setupUi(this); init(); } void ResourcesPage::init() { chartColors = { 0x2ecc71, 0xe74c3c, 0x3498db, 0xf1c40f, 0xe67e22, 0x1abc9c, 0x9b59b6, 0x34495e, 0xd35400, 0xc0392b, 0x8e44ad, 0xFF8F00, 0xEF6C00, 0x4E342E, 0x424242, 0x5499C7, 0x58D68D, 0xCD6155, 0xF5B041, 0x566573 }; mChartCpu->setYMax(100); mChartMemory->setYMax(100); QList widgets = { mChartCpu, mChartCpuLoadAvg, mChartDiskReadWrite, mChartMemory, mChartNetwork }; for (QWidget *widget : widgets) { ui->chartsLayout->addWidget(widget); } Utilities::addDropShadow(widgets, 40); connect(mTimer, &QTimer::timeout, this, &ResourcesPage::updateCpuChart); connect(mTimer, &QTimer::timeout, this, &ResourcesPage::updateCpuLoadAvg); connect(mTimer, &QTimer::timeout, this, &ResourcesPage::updateDiskReadWrite); connect(mTimer, &QTimer::timeout, this, &ResourcesPage::updateMemoryChart); connect(mTimer, &QTimer::timeout, this, &ResourcesPage::updateNetworkChart); mTimer->start(1000); initDiskPieChart(); } void ResourcesPage::diskPieSeriesCustomize() { for (int i = 0; i < mDiskPieSeries->count(); ++i) { QPieSlice *slice = mDiskPieSeries->slices().at(i); slice->setBrush(QColor((i < chartColors.count() ? chartColors.at(i) : i - chartColors.count()))); slice->setBorderColor(QColor(Qt::lightGray)); connect(slice, &QPieSlice::hovered, this, [=](bool show) { slice->setExploded(show); mChartDiskPie->setTitle(QString("%1 (%2) (%3)") .arg(slice->label()) .arg(FormatUtil::formatBytes(slice->value())) .arg(QString().sprintf("%1.2f%%", slice->percentage() * 100))); }); } } void ResourcesPage::initDiskPieChart() { mDiskPieSeries = new QPieSeries(); for (const Disk *disk : InfoManager::ins()->getDisks()) { mDiskPieSeries->append(disk->name, disk->size); } diskPieSeriesCustomize(); mChartDiskPie->legend()->hide(); mChartDiskPie->setAnimationOptions(QChart::AllAnimations); mChartDiskPie->addSeries(mDiskPieSeries); mChartDiskPie->setMinimumHeight(500); QChartView *mChartViewDiskPie = new QChartView(mChartDiskPie); mChartViewDiskPie->setRenderHint(QPainter::Antialiasing); mChartDiskPie->setContentsMargins(-11, -11, -11, -11); mChartDiskPie->setMargins(QMargins(20, 10, 10, 10)); gridWidgetDiskPie = new QWidget(this); gridLayoutDiskPie = new QGridLayout(gridWidgetDiskPie); gridWidgetDiskPie->setLayout(gridLayoutDiskPie); gridLayoutDiskPie->setContentsMargins(0,0,0,0); gridLayoutDiskPie->setHorizontalSpacing(10); gridLayoutDiskPie->setVerticalSpacing(5); QLabel *lblChartTitle = new QLabel(gridWidgetDiskPie); lblChartTitle->setObjectName("lblHistoryTitle"); lblChartTitle->setText(tr("File System")); QCheckBox *checkHistoryTitle = new QCheckBox(gridWidgetDiskPie); checkHistoryTitle->setObjectName("checkHistoryTitle"); checkHistoryTitle->setCursor(QCursor(Qt::CursorShape::PointingHandCursor)); connect(checkHistoryTitle, &QCheckBox::clicked, this, [=](bool checked) { QLayout *charts = topLevelWidget()->findChild("charts")->layout(); for (int i = 0; i < charts->count(); ++i) { charts->itemAt(i)->widget()->setVisible(! checked); } gridWidgetDiskPie->show(); }); QComboBox *cmbFileSystemType = new QComboBox(gridWidgetDiskPie); cmbFileSystemType->addItem(tr("File System Type"), -1); cmbFileSystemType->addItems(InfoManager::ins()->getFileSystemTypes()); connect(cmbFileSystemType, &QComboBox::currentTextChanged, this, [=](const QString text) { mChartDiskPie->removeSeries(mDiskPieSeries); mDiskPieSeries = new QPieSeries(); for (const Disk *disk : InfoManager::ins()->getDisks()) { if (cmbFileSystemType->currentIndex() != 0 && disk->fileSystemType == text) { mDiskPieSeries->append(disk->name, disk->size); } else if(cmbFileSystemType->currentIndex() == 0) { mDiskPieSeries->append(disk->name, disk->size); } } diskPieSeriesCustomize(); emit SignalMapper::ins()->sigChangedAppTheme(); mChartDiskPie->addSeries(mDiskPieSeries); }); QComboBox *cmbDevice = new QComboBox(gridWidgetDiskPie); cmbDevice->addItem(tr("Device")); cmbDevice->addItems(InfoManager::ins()->getDevices()); connect(cmbDevice, &QComboBox::currentTextChanged, this, [=](const QString text) { mChartDiskPie->removeSeries(mDiskPieSeries); mDiskPieSeries = new QPieSeries(); for (const Disk *disk : InfoManager::ins()->getDisks()) { if (cmbDevice->currentIndex() != 0 && disk->device == text) { mDiskPieSeries->append(disk->name, disk->size); } else if(cmbDevice->currentIndex() == 0) { mDiskPieSeries->append(disk->name, disk->size); } } diskPieSeriesCustomize(); emit SignalMapper::ins()->sigChangedAppTheme(); mChartDiskPie->addSeries(mDiskPieSeries); }); QSpacerItem *horizontalSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); gridLayoutDiskPie->addWidget(lblChartTitle, 0, 0); gridLayoutDiskPie->addWidget(checkHistoryTitle, 0, 1); gridLayoutDiskPie->addItem(horizontalSpacer, 0, 2); gridLayoutDiskPie->addWidget(cmbDevice, 0, 3); gridLayoutDiskPie->addWidget(cmbFileSystemType, 0, 4); gridLayoutDiskPie->addWidget(mChartViewDiskPie, 1, 0, 1, 5); ui->chartsLayout->addWidget(gridWidgetDiskPie); // theme changed connect(SignalMapper::ins(), &SignalMapper::sigChangedAppTheme, [=] { QString chartLabelColor = AppManager::ins()->getStyleValues()->value("@chartLabelColor").toString(); QString chartGridColor = AppManager::ins()->getStyleValues()->value("@chartGridColor").toString(); QString historyChartBackground = AppManager::ins()->getStyleValues()->value("@historyChartBackgroundColor").toString(); for (int i = 0; i < mDiskPieSeries->count(); ++i) { mDiskPieSeries->slices().at(i)->setLabelBrush(QColor(chartGridColor)); } mChartDiskPie->setBackgroundBrush(QColor(historyChartBackground)); mChartDiskPie->legend()->setLabelColor(chartLabelColor); mChartDiskPie->setTitleBrush(QColor(chartGridColor)); }); } void ResourcesPage::updateDiskReadWrite() { static int second = 0; QList diskReadWrite = im->getDiskIO(); QVector seriesList = mChartDiskReadWrite->getSeriesList(); for (int j = 0; j < seriesList.count(); ++j) { for (int i = 0; i < (second < 61 ? second : 61); ++i) { seriesList.at(j)->replace(i, (i+1), seriesList.at(j)->at(i).y()); } if(second > 61) seriesList.at(j)->removePoints(61, 1); } static quint64 l_readBytes = diskReadWrite.at(0); // last static quint64 l_writeBytes = diskReadWrite.at(1); // last static quint64 maxY = (1L << 10) * 100; // 100 KIBI quint64 readBytes = diskReadWrite.at(0); quint64 writeBytes = diskReadWrite.at(1); quint64 d_readByte = (readBytes - l_readBytes); quint64 d_writeByte = (writeBytes - l_writeBytes); seriesList.at(0)->insert(0, QPointF(0, d_readByte)); seriesList.at(0)->setName(tr("Read: %1/s Total: %2") .arg(FormatUtil::formatBytes(d_readByte)) .arg(FormatUtil::formatBytes(readBytes))); seriesList.at(1)->insert(0, QPointF(0, d_writeByte)); seriesList.at(1)->setName(tr("Write: %1/s Total: %2") .arg(FormatUtil::formatBytes(d_writeByte)) .arg(FormatUtil::formatBytes(writeBytes))); maxY = qMax(qMax(maxY, d_readByte), d_writeByte); l_readBytes = readBytes; l_writeBytes = writeBytes; mChartDiskReadWrite->setYMax(maxY); mChartDiskReadWrite->setSeriesList(seriesList); mChartDiskReadWrite->setCategoryAxisYLabels(); second++; } void ResourcesPage::updateCpuLoadAvg() { static int second, maxAvg = im->getCpuCoreCount(); static int minutes[] = {1, 5, 15}; QList cpuLoadAvgs = im->getCpuLoadAvgs(); QVector seriesList = mChartCpuLoadAvg->getSeriesList(); for (int j = 0; j < seriesList.count(); ++j) { double avg = cpuLoadAvgs.at(j); for (int i = 0; i < (second < 61 ? second : 61); ++i) { seriesList.at(j)->replace(i, (i+1), seriesList.at(j)->at(i).y()); } seriesList.at(j)->insert(0, QPointF(0, avg)); seriesList.at(j)->setName(tr("%1 Minute Average: %2") .arg(minutes[j]) .arg(avg)); if (second > 61) seriesList.at(j)->removePoints(61, 1); maxAvg = qMax((int)ceil(avg), maxAvg); } mChartCpuLoadAvg->setYMax(maxAvg); mChartCpuLoadAvg->setSeriesList(seriesList); second++; } void ResourcesPage::updateNetworkChart() { static int second = 0; QVector seriesList = mChartNetwork->getSeriesList(); // points swap for (int j = 0; j < seriesList.count(); j++) { for (int i = 0; i < (second < 61 ? second : 61); i++) seriesList.at(j)->replace(i, (i+1), seriesList.at(j)->at(i).y()); if(second > 61) seriesList.at(j)->removePoints(61, 1); } quint64 RXbytes = im->getRXbytes(); quint64 TXbytes = im->getTXbytes(); static quint64 l_RXbytes = RXbytes; static quint64 l_TXbytes = TXbytes; static quint64 max_RXbytes = 1L << 20; // 1 MEBI static quint64 max_TXbytes = 1L << 20; // 1 MEBI quint64 d_RXbytes = (RXbytes - l_RXbytes); quint64 d_TXbytes = (TXbytes - l_TXbytes); QString downText = FormatUtil::formatBytes(d_RXbytes); QString upText = FormatUtil::formatBytes(d_TXbytes); // Download seriesList.at(0)->insert(0, QPointF(0, d_RXbytes)); seriesList.at(0)->setName(tr("Download: %1/s Total: %2") .arg(downText) .arg(FormatUtil::formatBytes(RXbytes))); seriesList.at(1)->insert(0, QPointF(0, d_TXbytes)); seriesList.at(1)->setName(tr("Upload: %1/s Total: %2") .arg(upText) .arg(FormatUtil::formatBytes(TXbytes))); max_RXbytes = qMax(max_RXbytes, d_RXbytes); max_TXbytes = qMax(max_TXbytes, d_TXbytes); int max = qMax(max_RXbytes, max_TXbytes); l_RXbytes = RXbytes; l_TXbytes = TXbytes; mChartNetwork->setYMax(max); mChartNetwork->setSeriesList(seriesList); mChartNetwork->setCategoryAxisYLabels(); second++; } void ResourcesPage::updateMemoryChart() { static int second = 0; QVector seriesList = mChartMemory->getSeriesList(); im->updateMemoryInfo(); // points swap for (int j = 0; j < seriesList.count(); j++) { for (int i = 0; i < (second < 61 ? second : 61); i++) seriesList.at(j)->replace(i, (i+1), seriesList.at(j)->at(i).y()); if(second > 61) seriesList.at(j)->removePoints(61, 1); } // Swap double percent = 0; if (im->getSwapTotal()) // arithmetic exception control percent = ((double) im->getSwapUsed() / (double) im->getSwapTotal()) * 100.0; seriesList.at(0)->insert(0, QPointF(0, percent)); seriesList.at(0)->setName(tr("Swap: %1 (%2%) %3") .arg(FormatUtil::formatBytes(im->getSwapUsed())) .arg(QString().sprintf("%.1f",percent)) .arg(FormatUtil::formatBytes(im->getSwapTotal()))); // Memory double percent2 = ((double) im->getMemUsed() / (double) im->getMemTotal()) * 100.0; seriesList.at(1)->insert(0, QPointF(0, percent2)); seriesList.at(1)->setName(tr("Memory: %1 (%2%) %3") .arg(FormatUtil::formatBytes(im->getMemUsed())) .arg(QString().sprintf("%.1f",percent2)) .arg(FormatUtil::formatBytes(im->getMemTotal()))); mChartMemory->setSeriesList(seriesList); second++; } void ResourcesPage::updateCpuChart() { static int second = 0; QList cpuPercents = im->getCpuPercents(); QVector seriesList = mChartCpu->getSeriesList(); for (int j = 0; j < seriesList.count(); j++){ int p = cpuPercents.at(j+1); for (int i = 0; i < (second < 61 ? second : 61); i++) seriesList.at(j)->replace(i, (i+1), seriesList.at(j)->at(i).y()); seriesList.at(j)->insert(0, QPointF(0, p)); seriesList.at(j)->setName(QString("CPU%1: %2%").arg(j+1).arg(p)); if(second > 61) seriesList.at(j)->removePoints(61, 1); } mChartCpu->setSeriesList(seriesList); second++; } ================================================ FILE: stacer/Pages/Resources/resources_page.h ================================================ #ifndef RESOURCESPAGE_H #define RESOURCESPAGE_H #include #include #include "history_chart.h" #include "Managers/info_manager.h" #include #include namespace Ui { class ResourcesPage; } class ResourcesPage : public QWidget { Q_OBJECT public: explicit ResourcesPage(QWidget *parent = 0); ~ResourcesPage(); private slots: void updateCpuChart(); void updateCpuLoadAvg(); void updateDiskReadWrite(); void updateMemoryChart(); void updateNetworkChart(); void initDiskPieChart(); void diskPieSeriesCustomize(); private: void init(); private: Ui::ResourcesPage *ui; InfoManager *im; HistoryChart *mChartCpu; HistoryChart *mChartCpuLoadAvg; HistoryChart *mChartDiskReadWrite; HistoryChart *mChartMemory; HistoryChart *mChartNetwork; QChartView *mChartViewDiskPie; QChart *mChartDiskPie; QWidget *gridWidgetDiskPie; QGridLayout *gridLayoutDiskPie; QPieSeries *mDiskPieSeries; QList chartColors; QTimer *mTimer; }; #endif // RESOURCESPAGE_H ================================================ FILE: stacer/Pages/Resources/resources_page.ui ================================================ ResourcesPage 0 0 890 537 Resources 0 10 0 10 10 true 0 0 868 525 0 0 10 10 5 10 5 ================================================ FILE: stacer/Pages/Search/search_page.cpp ================================================ #include "search_page.h" #include "ui_search_page.h" #include #include SearchPage::SearchPage(QWidget *parent) : QWidget(parent), ui(new Ui::SearchPage), mItemModel(new QStandardItemModel(this)), mSortFilterModel(new QSortFilterProxyModel(this)) { ui->setupUi(this); init(); } SearchPage::~SearchPage() { delete ui; } void SearchPage::init() { mTableHeaders = QStringList { tr("Name"), tr("Path"), tr("Size"), tr("User"), tr("Group"), tr("Creation Time"), tr("Last Access"), tr("Last Modification"), tr("Last Change"), }; // Table settings mItemModel->setHorizontalHeaderLabels(mTableHeaders); mSortFilterModel->setSourceModel(mItemModel); ui->tableFoundResults->setModel(mSortFilterModel); mSortFilterModel->setSortRole(1); mSortFilterModel->setDynamicSortFilter(true); mSortFilterModel->sort(1, Qt::SortOrder::DescendingOrder); ui->tableFoundResults->horizontalHeader()->setSectionsMovable(true); ui->tableFoundResults->horizontalHeader()->setFixedHeight(32); ui->tableFoundResults->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); ui->tableFoundResults->horizontalHeader()->setCursor(Qt::PointingHandCursor); ui->tableFoundResults->horizontalHeader()->resizeSection(0, 150); ui->tableFoundResults->horizontalHeader()->resizeSection(1, 150); ui->tableFoundResults->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); ui->tableFoundResults->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tableFoundResults->horizontalHeader(), &QHeaderView::customContextMenuRequested, this, &SearchPage::tableFoundResults_header_customContextMenuRequested); loadHeaderMenu(); loadTableRowMenu(); rowRole = 1; mSearchResultDateFormat = "dd.MM.yyyy hh:mm:ss"; ui->advanceSearchPane->setHidden(false); on_btnAdvancePaneToggle_clicked(); ui->lblErrorMsg->hide(); QString iconLoading = QString(":/static/themes/%1/img/loading.gif").arg(SettingManager::ins()->getThemeName()); QMovie *loadingMovie = new QMovie(iconLoading, QByteArray(), this); ui->lblLoadingSearching->setMovie(loadingMovie); loadingMovie->start(); ui->lblLoadingSearching->hide(); initComboboxValues(); QList widgets = { ui->btnBrowseSearchDir, ui->btnSearchAdvance, ui->txtSearchInput, ui->cmbGroups, ui->cmbSizeCriteria, ui->cmbSizeUnits, ui->cmbTimeCriteria, ui->cmbTimeType, ui->cmbSearchTypes, ui->tableFoundResults, ui->cmbUsers }; Utilities::addDropShadow(widgets, 30); } void SearchPage::loadTableRowMenu() { QAction *actionOpenFolder = new QAction(QIcon(":/static/themes/common/img/folder.png"), tr("Open Folder")); actionOpenFolder->setData("open-folder"); mTableRowMenu.addAction(actionOpenFolder); QAction *actionMoveTrash = new QAction(QIcon(":/static/themes/common/img/trash_2.png"), tr("Move Trash")); actionMoveTrash->setData("move-trash"); mTableRowMenu.addAction(actionMoveTrash); QAction *actionDelete = new QAction(QIcon(":/static/themes/common/img/delete.png"), tr("Delete")); actionDelete->setData("delete"); mTableRowMenu.addAction(actionDelete); } void SearchPage::loadHeaderMenu() { int i = 0; QList actionList; actionList.reserve(mTableHeaders.size()); for (const QString &header : mTableHeaders) { QAction *action = new QAction(header,&mHeaderMenu); action->setCheckable(true); action->setChecked(true); action->setData(i++); actionList.push_back(action); } mHeaderMenu.addActions(actionList); // exclude headers QList hiddenHeaders = { 4, 6, 7, 8 }; QList actions = mHeaderMenu.actions(); for (const int i : hiddenHeaders) { if (i < mTableHeaders.count()) { ui->tableFoundResults->horizontalHeader()->setSectionHidden(i, true); actions.at(i)->setChecked(false); } } } void SearchPage::initComboboxValues() { ui->cmbUsers->addItem(tr("Choose"), "-1"); ui->cmbUsers->addItems(InfoManager::ins()->getUserList()); ui->cmbGroups->addItem(tr("Choose"), "-1"); ui->cmbGroups->addItems(InfoManager::ins()->getGroupList()); ui->cmbSearchTypes->addItem(tr("All"), "all"); ui->cmbSearchTypes->addItem(tr("File"), "f"); ui->cmbSearchTypes->addItem(tr("Directory"), "d"); ui->cmbSearchTypes->addItem(tr("Symbolic Link"), "l"); ui->cmbTimeType->addItem(tr("Choose"), "-1"); ui->cmbTimeType->addItem(tr("Access"), "-amin"); ui->cmbTimeType->addItem(tr("Modify"), "-mmin"); ui->cmbTimeType->addItem(tr("Change"), "-cmin"); ui->cmbTimeCriteria->addItem(tr("Smaller (<)"), "-"); ui->cmbTimeCriteria->addItem(tr("Equal (=)"), ""); ui->cmbTimeCriteria->addItem(tr("Greater (>)"), "+"); ui->cmbSizeCriteria->addItem(tr("Choose"), "-1"); ui->cmbSizeCriteria->addItem(tr("Smaller (<)"), "-"); ui->cmbSizeCriteria->addItem(tr("Equal (=)"), ""); ui->cmbSizeCriteria->addItem(tr("Greater (>)"), "+"); ui->cmbSizeUnits->addItem("Bytes", "c"); ui->cmbSizeUnits->addItem("Kibibytes", "k"); ui->cmbSizeUnits->addItem("Mebibytes", "M"); ui->cmbSizeUnits->addItem("Gibibytes", "G"); } void SearchPage::on_btnBrowseSearchDir_clicked() { QString selectedDirPath = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "/", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); QDir selectedDir(selectedDirPath); if (! selectedDirPath.isEmpty() && selectedDir.exists()) { ui->lblSearchDir->setText(tr("Directory: %1").arg(selectedDirPath)); mSelectedDirectory = selectedDirPath; } } void SearchPage::on_btnAdvancePaneToggle_clicked() { ui->advanceSearchPane->setHidden(! ui->advanceSearchPane->isHidden()); QString icon = ui->advanceSearchPane->isHidden() ? "▼" : "▲"; ui->btnAdvancePaneToggle->setText(tr("Advanced Search %1").arg(icon)); } void SearchPage::on_btnSearchAdvance_clicked() { QtConcurrent::run(this, &SearchPage::searching); ui->advanceSearchPane->hide(); } void SearchPage::searching() { if (mSelectedDirectory.isEmpty()) { ui->lblErrorMsg->show(); ui->lblErrorMsg->setText(tr("Select the search directory.")); } else { ui->lblErrorMsg->hide(); ui->lblLoadingSearching->show(); ui->btnSearchAdvance->setEnabled(false); QStringList findQuery(mSelectedDirectory); if (! ui->txtSearchInput->text().isEmpty()) { if (ui->checkCaseInsensitive->isChecked()) { if (ui->checkRegEx->isChecked()) { findQuery.append("-iregex"); } else { findQuery.append("-iname"); } } else { if (ui->checkRegEx->isChecked()) { findQuery.append("-regex"); } else { findQuery.append("-name"); } } findQuery.append(QString("%1").arg(ui->txtSearchInput->text())); } if (ui->checkInvert->isChecked()) { findQuery.append("-invert"); } if (ui->checkEmpty->isChecked()) { findQuery.append("-empty"); } if (ui->cmbSearchTypes->currentData().toString() != "all") { findQuery.append("-type"); findQuery.append(ui->cmbSearchTypes->currentData().toString()); } // TIME if (ui->cmbTimeType->currentData().toString() != "-1") { findQuery.append(ui->cmbTimeType->currentData().toString()); findQuery.append(QString("%1%2").arg(ui->cmbTimeCriteria->currentData().toString()).arg(ui->spinTime->value())); } // PERMISSIONS if (ui->checkPermReadable->isChecked()) { findQuery.append("-readable"); } if (ui->checkPermWritable->isChecked()) { findQuery.append("-writable"); } if (ui->checkPermExecutable->isChecked()) { findQuery.append("-executable"); } // SIZE if (ui->cmbSizeCriteria->currentData().toString() != "-1") { QString size = QString("%1%2%3") .arg(ui->cmbSizeCriteria->currentData().toString()) .arg(ui->spinSize->value()) .arg(ui->cmbSizeUnits->currentData().toString()); findQuery.append("-size"); findQuery.append(size); } // OWNER if (ui->cmbUsers->currentData().toString() != "-1") { findQuery.append("-user"); findQuery.append(ui->cmbUsers->currentText()); } if (ui->cmbGroups->currentData().toString() != "-1") { findQuery.append("-group"); findQuery.append(ui->cmbGroups->currentText()); } // searching QString result; try { if (ui->checkSearchAsRoot->isChecked()) { result = CommandUtil::sudoExec("find", findQuery); } else { result = CommandUtil::exec("find", findQuery); } if (result.trimmed().isEmpty()) { mItemModel->removeRows(0, mItemModel->rowCount()); // clear table } else { loadDataToTable(result.split("\n")); } } catch (QString ex) { ui->lblErrorMsg->show(); ui->lblErrorMsg->setText(tr("Somethings went wrong, try again.")); } ui->lblLoadingSearching->hide(); ui->btnSearchAdvance->setEnabled(true); } } void SearchPage::loadDataToTable(const QList &foundFiles) { mItemModel->removeRows(0, mItemModel->rowCount()); for (const QString &file : foundFiles.mid(1, 2000)) { mItemModel->appendRow(createRow(file)); } ui->lblFoundFilesInfo->setText(tr("%1 files found. Showing %2 of them.") .arg(foundFiles.count()-1) .arg(mItemModel->rowCount())); } QList SearchPage::createRow(const QString &filepath) { QFileInfo *fileInfo = new QFileInfo(filepath); QStandardItem *i_name = new QStandardItem(fileInfo->fileName()); i_name->setData(fileInfo->fileName(), rowRole); i_name->setData(fileInfo->fileName(), Qt::ToolTipRole); QStandardItem *i_path = new QStandardItem(fileInfo->path()); i_path->setData(fileInfo->path(), rowRole); i_path->setData(fileInfo->path(), Qt::ToolTipRole); QStandardItem *i_size = new QStandardItem(FormatUtil::formatBytes(fileInfo->size())); i_size->setData(fileInfo->size(), rowRole); i_size->setData(fileInfo->size(), Qt::ToolTipRole); QStandardItem *i_user = new QStandardItem(fileInfo->owner()); i_user->setData(fileInfo->owner(), rowRole); i_user->setData(fileInfo->owner(), Qt::ToolTipRole); QStandardItem *i_group = new QStandardItem(fileInfo->group()); i_group->setData(fileInfo->group(), rowRole); i_group->setData(fileInfo->group(), Qt::ToolTipRole); QStandardItem *i_creationTime = new QStandardItem(fileInfo->created().toString(mSearchResultDateFormat)); i_creationTime->setData(fileInfo->created().toString(mSearchResultDateFormat), rowRole); i_creationTime->setData(fileInfo->created().toString(mSearchResultDateFormat), Qt::ToolTipRole); QStandardItem *i_lastAccess = new QStandardItem(fileInfo->lastRead().toString(mSearchResultDateFormat)); i_lastAccess->setData(fileInfo->lastRead().toString(mSearchResultDateFormat), rowRole); i_lastAccess->setData(fileInfo->lastRead().toString(mSearchResultDateFormat), Qt::ToolTipRole); QStandardItem *i_lastModify = new QStandardItem(fileInfo->lastModified().toString(mSearchResultDateFormat)); i_lastModify->setData(fileInfo->lastModified().toString(mSearchResultDateFormat), rowRole); i_lastModify->setData(fileInfo->lastModified().toString(mSearchResultDateFormat), Qt::ToolTipRole); QStandardItem *i_lastChange = new QStandardItem(fileInfo->metadataChangeTime().toString(mSearchResultDateFormat)); i_lastChange->setData(fileInfo->metadataChangeTime().toString(mSearchResultDateFormat), rowRole); i_lastChange->setData(fileInfo->metadataChangeTime().toString(mSearchResultDateFormat), Qt::ToolTipRole); delete fileInfo; return { i_name, i_path, i_size, i_user, i_group, i_creationTime, i_lastAccess, i_lastModify, i_lastChange }; } void SearchPage::tableFoundResults_header_customContextMenuRequested(const QPoint &pos) { QPoint globalPos = ui->tableFoundResults->mapToGlobal(pos); QAction *action = mHeaderMenu.exec(globalPos); if (action) { ui->tableFoundResults->horizontalHeader()->setSectionHidden(action->data().toInt(), ! action->isChecked()); } } void SearchPage::on_tableFoundResults_customContextMenuRequested(const QPoint &pos) { if (mItemModel->rowCount() > 0) { QPoint globalPos = ui->tableFoundResults->mapToGlobal(pos); QAction *action = mTableRowMenu.exec(globalPos); QModelIndexList selecteds = ui->tableFoundResults->selectionModel()->selectedRows(); QItemSelectionModel *selectionModel = ui->tableFoundResults->selectionModel(); if (action && ! selecteds.isEmpty()) { if (action->data().toString() == "open-folder") { for (QModelIndex &index : selecteds) { QUrl folderPath = mSortFilterModel->index(index.row(), 1).data(rowRole).toUrl(); QDesktopServices::openUrl(folderPath); } } else if (action->data().toString() == "move-trash") { QString trashPath(QDir::homePath() + "/.local/share/Trash"); while (! selectionModel->selectedRows().isEmpty()) { QModelIndex index = selectionModel->selectedRows().first(); QString fileName = mSortFilterModel->index(index.row(), 0).data(rowRole).toString(); QString folderPath = mSortFilterModel->index(index.row(), 1).data(rowRole).toString(); QString filePath = folderPath + "/" + fileName; bool isAnotherUser = QFileInfo(filePath).owner() != InfoManager::ins()->getUserName(); if (isAnotherUser) { CommandUtil::sudoExec("mv", {filePath, trashPath + "/files"}); } else { CommandUtil::exec("mv", {filePath, trashPath + "/files"}); } if (QFile(filePath).exists()) { selectionModel->select(index, QItemSelectionModel::Deselect); } else { QString infoContent = QString("[Trash Info]\n" "Path=%1\n" "DeletionDate=%2") .arg(filePath) .arg(QDateTime::currentDateTime().toString("yyyy-MM-ddThh:mm:ss")); FileUtil::writeFile(trashPath + "/info/" + fileName + ".trashinfo", infoContent); mSortFilterModel->removeRow(index.row()); } } selectionModel->clearSelection(); } else if (action->data().toString() == "delete") { while (! selectionModel->selectedRows().isEmpty()) { QModelIndex index = selectionModel->selectedRows().first(); QString fileName = mSortFilterModel->index(index.row(), 0).data(rowRole).toString(); QString folderPath = mSortFilterModel->index(index.row(), 1).data(rowRole).toString(); QString filePath = folderPath + "/" + fileName; bool isAnotherUser = QFileInfo(filePath).owner() != InfoManager::ins()->getUserName(); if (isAnotherUser) { CommandUtil::sudoExec("rm", {"-rf", filePath }); } else { CommandUtil::exec("rm", {"-rf", filePath }); } if (QFile(filePath).exists()) { selectionModel->select(index, QItemSelectionModel::Deselect); } else { mSortFilterModel->removeRow(index.row()); } } selectionModel->clearSelection(); } } } } void SearchPage::on_tableFoundResults_doubleClicked(const QModelIndex &index) { QUrl folderPath = mSortFilterModel->index(index.row(), 1).data(rowRole).toUrl(); QDesktopServices::openUrl(folderPath); } ================================================ FILE: stacer/Pages/Search/search_page.h ================================================ #ifndef SEARCH_PAGE_H #define SEARCH_PAGE_H #include #include #include "Managers/info_manager.h" #include "utilities.h" #include #include #include #include #include #include "Utils/format_util.h" #include "Managers/setting_manager.h" #include #include #include namespace Ui { class SearchPage; } class SearchPage : public QWidget { Q_OBJECT public: explicit SearchPage(QWidget *parent = 0); ~SearchPage(); private slots: void init(); void on_btnBrowseSearchDir_clicked(); void on_btnAdvancePaneToggle_clicked(); void on_btnSearchAdvance_clicked(); void initComboboxValues(); void on_tableFoundResults_customContextMenuRequested(const QPoint &pos); void tableFoundResults_header_customContextMenuRequested(const QPoint &pos); void loadTableRowMenu(); void loadHeaderMenu(); void loadDataToTable(const QList &results); void searching(); QList createRow(const QString &filepath); void on_tableFoundResults_doubleClicked(const QModelIndex &index); private: Ui::SearchPage *ui; QString mSelectedDirectory; QStringList mTableHeaders; QStandardItemModel *mItemModel; QSortFilterProxyModel *mSortFilterModel; QMenu mHeaderMenu; QMenu mTableRowMenu; QString mSearchResultDateFormat; int rowRole; }; #endif // SEARCH_PAGE_H ================================================ FILE: stacer/Pages/Search/search_page.ui ================================================ SearchPage 0 0 764 596 Search 15 15 15 15 10 Qt::NoFocus QFrame::NoFrame QFrame::Sunken QAbstractScrollArea::AdjustToContents QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows Qt::ElideMiddle Qt::SolidLine true true true false true false 10 0 PointingHandCursor Qt::NoFocus Browse... 10 Search... 0 30 16777215 25 false PointingHandCursor Qt::NoFocus primary :/static/themes/default/img/sidebar-icons/search.png:/static/themes/default/img/sidebar-icons/search.png 24 24 Qt::AlignCenter 0 5 0 2 12 PointingHandCursor Qt::NoFocus circle Case Insensitive Qt::Horizontal 40 20 10 0 4 0 28 16777215 28 false 0 28 16777215 28 false 100 28 50 16777215 true QAbstractSpinBox::NoButtons minute 9999999 10 0 28 16777215 28 false 0 28 16777215 28 false PointingHandCursor Qt::NoFocus circle Search as Root Owner Qt::Horizontal 40 20 PointingHandCursor Qt::NoFocus circle RegEx 10 0 0 28 16777215 28 false 15 28 68 16777215 QAbstractSpinBox::NoButtons 9999999 0 28 16777215 28 false Permissions Size 5 4 PointingHandCursor Qt::NoFocus circle Readable PointingHandCursor Qt::NoFocus circle Writable PointingHandCursor Qt::NoFocus circle Executable Time Qt::Horizontal 40 20 PointingHandCursor Qt::NoFocus circle Empty File or Folder: PointingHandCursor Qt::NoFocus circle Invert 10 0 0 Qt::PlainText true false PointingHandCursor Advanced Search false false 0 Qt::PlainText true false color: rgb(252, 175, 62); 0 BETA version Qt::PlainText true false ================================================ FILE: stacer/Pages/Services/service_item.cpp ================================================ #include "service_item.h" #include "ui_service_item.h" #include "utilities.h" ServiceItem::~ServiceItem() { delete ui; } ServiceItem::ServiceItem(const QString &name, const QString description, const bool status, const bool active, QWidget *parent) : QWidget(parent), ui(new Ui::ServiceItem), tm(ToolManager::ins()) { ui->setupUi(this); ui->lblServiceName->setText(name); ui->lblServiceDescription->setText("- " + description); ui->checkServiceRunning->setChecked(active); ui->checkServiceStartup->setChecked(status); ui->lblServiceName->setToolTip(name); ui->lblServiceDescription->setToolTip(description); Utilities::addDropShadow(this, 30, 10); } void ServiceItem::on_checkServiceStartup_clicked(bool status) { QString name = ui->lblServiceName->text(); tm->changeServiceStatus(name, status); ui->checkServiceStartup->setChecked(tm->serviceIsEnabled(name)); } void ServiceItem::on_checkServiceRunning_clicked(bool status) { QString name = ui->lblServiceName->text(); tm->changeServiceActive(name, status); ui->checkServiceRunning->setChecked(tm->serviceIsActive(name)); } ================================================ FILE: stacer/Pages/Services/service_item.h ================================================ #ifndef SERVICE_ITEM_H #define SERVICE_ITEM_H #include #include #include "Managers/tool_manager.h" namespace Ui { class ServiceItem; } class ServiceItem : public QWidget { Q_OBJECT public: explicit ServiceItem(const QString &name, const QString description, const bool status, const bool active, QWidget *parent = 0); ~ServiceItem(); private slots: void on_checkServiceRunning_clicked(bool status); void on_checkServiceStartup_clicked(bool status); private: Ui::ServiceItem *ui; private: ToolManager *tm; }; #endif // SERVICE_ITEM_H ================================================ FILE: stacer/Pages/Services/service_item.ui ================================================ ServiceItem 0 0 713 45 0 0 0 45 16777215 45 0 0 0 0 0 0 45 16777215 45 15 10 10 0 25 25 25 25 true Service Name Qt::Horizontal QSizePolicy::Fixed 20 0 Qt::Horizontal 0 20 PointingHandCursor Qt::NoFocus PointingHandCursor Qt::NoFocus Description ================================================ FILE: stacer/Pages/Services/services_page.cpp ================================================ #include "services_page.h" #include "ui_services_page.h" #include "service_item.h" #include "utilities.h" #include ServicesPage::~ServicesPage() { delete ui; } ServicesPage::ServicesPage(QWidget *parent) : QWidget(parent), ui(new Ui::ServicesPage) { ui->setupUi(this); init(); } void ServicesPage::init() { connect(this, &ServicesPage::loadServicesS, this, &ServicesPage::loadServices); QtConcurrent::run(this, &ServicesPage::getServices); ui->cmbRunningStatus->addItems({ tr("Running Status"), tr("Running"), tr("Not Running") }); ui->cmbStartupStatus->addItems({ tr("Startup Status"), tr("Enabled"), tr("Disabled") }); Utilities::addDropShadow(ui->cmbRunningStatus, 30); Utilities::addDropShadow(ui->cmbStartupStatus, 30); } void ServicesPage::getServices() { this->mServices = ToolManager::ins()->getServices(); emit loadServicesS(); } void ServicesPage::loadServices() { ui->listWidgetServices->clear(); int runningIndex = ui->cmbRunningStatus->currentIndex(); int startupIndex = ui->cmbStartupStatus->currentIndex(); bool runningStatus = runningIndex == 1; bool startupStatus = startupIndex == 1; for (const Service s : mServices) { bool runningFilter = runningIndex != 0 ? s.active == runningStatus : true; bool startupFilter = startupIndex != 0 ? s.status == startupStatus : true; if (runningFilter && startupFilter) { ServiceItem *service = new ServiceItem(s.name, s.description, s.status, s.active); QListWidgetItem *item = new QListWidgetItem(ui->listWidgetServices); item->setSizeHint(service->sizeHint()); ui->listWidgetServices->setItemWidget(item, service); } } setServiceCount(); bool isListEmpty = ui->listWidgetServices->count() == 0; ui->listWidgetServices->setVisible(! isListEmpty); ui->notFoundWidget->setVisible(isListEmpty); } void ServicesPage::setServiceCount() { ui->lblServicesTitle->setText(tr("System Services (%1)") .arg(ui->listWidgetServices->count())); } void ServicesPage::on_cmbRunningStatus_currentIndexChanged(int index) { Q_UNUSED(index); loadServices(); } void ServicesPage::on_cmbStartupStatus_currentIndexChanged(int index) { Q_UNUSED(index); loadServices(); } ================================================ FILE: stacer/Pages/Services/services_page.h ================================================ #ifndef SERVICESPAGE_H #define SERVICESPAGE_H #include #include "Managers/tool_manager.h" namespace Ui { class ServicesPage; } class ServicesPage : public QWidget { Q_OBJECT public: explicit ServicesPage(QWidget *parent = 0); ~ServicesPage(); signals: void loadServicesS(); private slots: void init(); void getServices(); void loadServices(); void on_cmbRunningStatus_currentIndexChanged(int index); void on_cmbStartupStatus_currentIndexChanged(int index); public slots: void setServiceCount(); private: Ui::ServicesPage *ui; QList mServices; }; #endif // SERVICESPAGE_H ================================================ FILE: stacer/Pages/Services/services_page.ui ================================================ ServicesPage 0 0 882 549 Services 30 0 30 25 0 20 15 5 45 5 Ubuntu 11 System Services 120 0 QComboBox::AdjustToMinimumContentsLength false 120 0 QComboBox::AdjustToMinimumContentsLength false Qt::Horizontal 40 20 0 0 20 20 80 16777215 Ubuntu 10 Startup at boot ? Qt::Horizontal QSizePolicy::Fixed 40 20 0 0 20 20 100 16777215 Ubuntu 10 Running Now ? 0 0 0 200 16777215 9999999 0 0 0 0 0 Not Found System Service Qt::NoFocus QFrame::NoFrame Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection QAbstractItemView::SelectRows QListView::Adjust QListView::Batched 4 true ================================================ FILE: stacer/Pages/Settings/settings_page.cpp ================================================ #include "settings_page.h" #include "ui_settings_page.h" #include "Managers/info_manager.h" #include "utilities.h" #include #include SettingsPage::~SettingsPage() { delete ui; } SettingsPage::SettingsPage(QWidget *parent) : QWidget(parent), ui(new Ui::SettingsPage), apm(AppManager::ins()), mSettingManager(SettingManager::ins()) { ui->setupUi(this); init(); } void SettingsPage::init() { // load languages QMapIterator lang(apm->getLanguageList()); while (lang.hasNext()) { lang.next(); ui->cmbLanguages->addItem(lang.value(), lang.key()); } QString lc = mSettingManager->getLanguage(); ui->cmbLanguages->setCurrentText(apm->getLanguageList().value(lc)); // load themes // QMapIterator theme(apm->getThemeList()); // while (theme.hasNext()) { // theme.next(); // ui->cmbThemes->addItem(theme.value(), theme.key()); // } // QString tn = mSettingManager->getThemeName(); // ui->cmbThemes->setCurrentText(apm->getThemeList().value(tn)); // load disks InfoManager::ins()->updateDiskInfo(); QList disks = InfoManager::ins()->getDisks(); for (const Disk *disk : disks) { ui->cmbDisks->addItem(QString("%1 (%2)").arg(disk->device).arg(disk->name), disk->name); } QString dk = mSettingManager->getDiskName().isEmpty() ? QStorageInfo::root().displayName() : mSettingManager->getDiskName(); if (! dk.isEmpty()) { ui->cmbDisks->setCurrentIndex(ui->cmbDisks->findData(dk)); } // start on boot mStartupAppPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation).append("/autostart"); if (! QDir(mStartupAppPath).exists()) { QDir().mkdir(mStartupAppPath); } mStartupAppPath.append("/stacer.desktop"); QFile startupAppFile(mStartupAppPath); if (startupAppFile.exists()) { QStringList appContent = FileUtil::readListFromFile(mStartupAppPath); QString isHidden = Utilities::getDesktopValue(QRegExp("^Hidden=.*"), appContent).toLower(); ui->checkAutostart->setChecked(isHidden == "false"); } else { ui->checkAutostart->setChecked(false); } // app quit dont ask ui->checkAppQuitDontAsk->setChecked(mSettingManager->getAppQuitDialogDontAsk()); // load pages ui->cmbStartPage->addItems({ tr("Dashboard"), tr("Startup Apps"), tr("System Cleaner"), tr("Search"), tr("Services"), tr("Processes"), tr("Helpers"), tr("Uninstaller"), tr("Resources") }); ui->cmbStartPage->setCurrentText(mSettingManager->getStartPage()); // load resource percents ui->spinCpuPercent->setValue(mSettingManager->getCpuAlertPercent()); ui->spinMemoryPercent->setValue(mSettingManager->getMemoryAlertPercent()); ui->spinDiskPercent->setValue(mSettingManager->getDiskAlertPercent()); // effects QList widgets = { ui->cmbLanguages, /*ui->cmbThemes,*/ ui->cmbDisks, ui->cmbStartPage, ui->btnDonate, ui->spinCpuPercent, ui->spinMemoryPercent, ui->spinDiskPercent }; Utilities::addDropShadow(widgets, 50); // connects connect(ui->cmbLanguages, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbLanguagesChanged(int))); // connect(ui->cmbThemes, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbThemesChanged(int))); connect(ui->cmbDisks, SIGNAL(currentIndexChanged(int)), this, SLOT(cmbDiskChanged(int))); connect(ui->cmbStartPage, SIGNAL(currentIndexChanged(QString)), this, SLOT(cmbStartPageChanged(QString))); } void SettingsPage::cmbLanguagesChanged(const int &index) { QString langCode = ui->cmbLanguages->itemData(index).toString(); mSettingManager->setLanguage(langCode); } //void SettingsPage::cmbThemesChanged(const int &index) //{ // QString themeName = ui->cmbThemes->itemData(index).toString(); // mSettingManager->setThemeName(themeName); // apm->updateStylesheet(); //} void SettingsPage::cmbDiskChanged(const int &index) { QString diskName = ui->cmbDisks->itemData(index).toString(); mSettingManager->setDiskName(diskName); } void SettingsPage::on_checkAutostart_clicked(bool checked) { if (checked) { QString appTemplate = QString("[Desktop Entry]\n" "Name=Stacer\n" "Comment=Linux System Optimizer and Monitoring\n" "Exec=stacer --hide \n" "Type=Application\n" "Terminal=false\n" "Hidden=false\n"); FileUtil::writeFile(mStartupAppPath, appTemplate); } else { QFile::remove(mStartupAppPath); } } void SettingsPage::on_btnDonate_clicked() { QDesktopServices::openUrl(QUrl("https://www.patreon.com/oguzhaninan")); } void SettingsPage::cmbStartPageChanged(const QString text) { mSettingManager->setStartPage(text); } void SettingsPage::on_spinCpuPercent_valueChanged(int value) { mSettingManager->setCpuAlertPercent(value); } void SettingsPage::on_spinMemoryPercent_valueChanged(int value) { mSettingManager->setMemoryAlertPercent(value); } void SettingsPage::on_spinDiskPercent_valueChanged(int value) { mSettingManager->setDiskAlertPercent(value); } void SettingsPage::on_checkAppQuitDontAsk_clicked(bool checked) { mSettingManager->setAppQuitDialogDontAsk(checked); } ================================================ FILE: stacer/Pages/Settings/settings_page.h ================================================ #ifndef SETTINGS_PAGE_H #define SETTINGS_PAGE_H #include #include #include "Managers/app_manager.h" #include "Managers/setting_manager.h" #include "signal_mapper.h" namespace Ui { class SettingsPage; } class SettingsPage : public QWidget { Q_OBJECT public: explicit SettingsPage(QWidget *parent = 0); ~SettingsPage(); private slots: void init(); // void cmbThemesChanged(const int &index); void cmbLanguagesChanged(const int &index); void cmbDiskChanged(const int &index); void on_checkAutostart_clicked(bool checked); void on_btnDonate_clicked(); void cmbStartPageChanged(const QString text); void on_spinCpuPercent_valueChanged(int value); void on_spinMemoryPercent_valueChanged(int value); void on_spinDiskPercent_valueChanged(int value); void on_checkAppQuitDontAsk_clicked(bool checked); private: Ui::SettingsPage *ui; private: AppManager *apm; QString mStartupAppPath; SettingManager *mSettingManager; }; #endif // SETTINGS_PAGE_H ================================================ FILE: stacer/Pages/Settings/settings_page.ui ================================================ SettingsPage 0 0 811 479 0 0 Settings 15 15 15 15 20 10 0 0 150 0 200 16777215 PointingHandCursor Qt::NoFocus QComboBox::AdjustToMinimumContentsLength PointingHandCursor Qt::NoFocus 0 0 Memory Percent Qt::ClickFocus false % 0 100 0 0 Disk Percent Qt::ClickFocus % 0 100 0 0 Language 0 0 Autostart Stacer Qt::Vertical 10 40 Qt::ClickFocus % 0 100 0 0 CPU Percent 0 0 title Alert messages (Show a warning after the specified percentage) <html><head/><body><p>Stacer v1.1.0 <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Qt::RichText Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter true 0 0 PointingHandCursor Qt::NoFocus primary Donate :/static/themes/common/img/donate.png:/static/themes/common/img/donate.png 18 18 Qt::Horizontal 0 20 Qt::Vertical QSizePolicy::Fixed 20 10 Qt::Vertical QSizePolicy::Fixed 20 10 App Quit Don't Ask PointingHandCursor Qt::NoFocus 0 0 150 0 200 16777215 PointingHandCursor Qt::NoFocus QComboBox::AdjustToMinimumContentsLength 0 0 Disks 0 0 Start Page 0 0 150 0 200 16777215 PointingHandCursor Qt::NoFocus QComboBox::AdjustToMinimumContentsLength spinCpuPercent spinMemoryPercent spinDiskPercent ================================================ FILE: stacer/Pages/StartupApps/startup_app.cpp ================================================ #include "startup_app.h" #include "ui_startup_app.h" #include "utilities.h" StartupApp::~StartupApp() { delete ui; } StartupApp::StartupApp(const QString &startupAppName, bool enabled, const QString &filePath, QWidget *parent) : QWidget(parent), ui(new Ui::StartupApp), mStartupAppName(startupAppName), mEnabled(enabled), mFilePath(filePath) { ui->setupUi(this); ui->lblStartupAppName->setText(startupAppName); ui->checkStartup->setChecked(enabled); Utilities::addDropShadow(this, 50); } void StartupApp::on_checkStartup_clicked(bool status) { QStringList lines = FileUtil::readListFromFile(mFilePath); // Hidden=[true|false] int pos = lines.indexOf(HIDDEN_REG); QString _status = status ? "true" : "false"; if (pos != -1) { _status = status ? "false" : "true"; lines.replace(pos, QString("Hidden=%1").arg(_status)); } else { // X-GNOME-Autostart-enabled=[true|false] pos = lines.indexOf(GNOME_ENABLED_REG); if (pos != -1) { lines.replace(pos, QString("X-GNOME-Autostart-enabled=%1").arg(_status)); } } if (pos == -1) { _status = status ? "false" : "true"; lines.append(QString("Hidden=%1").arg(_status)); } FileUtil::writeFile(mFilePath, lines.join('\n').append('\n')); } void StartupApp::on_btnDeleteStartupApp_clicked() { if (QFile::remove(mFilePath)) { emit deleteAppS(); } } void StartupApp::on_btnEditStartupApp_clicked() { emit editStartupAppS(mFilePath); } QString StartupApp::getAppName() const { return mStartupAppName; } void StartupApp::setAppName(const QString &value) { mStartupAppName = value; } bool StartupApp::getEnabled() const { return mEnabled; } void StartupApp::setEnabled(bool value) { mEnabled = value; } QString StartupApp::getFilePath() const { return mFilePath; } void StartupApp::setFilePath(const QString &value) { mFilePath = value; } ================================================ FILE: stacer/Pages/StartupApps/startup_app.h ================================================ #ifndef STARTUP_APP_H #define STARTUP_APP_H #include #include #include #include #include "startup_app_edit.h" namespace Ui { class StartupApp; } class StartupApp : public QWidget { Q_OBJECT public: explicit StartupApp(const QString &startupAppName, bool enabled, const QString &filePath, QWidget *parent = 0); ~StartupApp(); QString getAppName() const; void setAppName(const QString &value); bool getEnabled() const; void setEnabled(bool value); QString getFilePath() const; void setFilePath(const QString &value); private slots: void on_checkStartup_clicked(bool); void on_btnDeleteStartupApp_clicked(); void on_btnEditStartupApp_clicked(); signals: void deleteAppS(); void editStartupAppS(const QString filePath); private: Ui::StartupApp *ui; private: QString mStartupAppName; QString mAppComment; bool mEnabled; QString mFilePath; }; #endif // STARTUP_APP_H ================================================ FILE: stacer/Pages/StartupApps/startup_app.ui ================================================ StartupApp 0 0 661 45 0 0 0 45 16777215 45 0 0 0 0 0 0 0 ArrowCursor 15 15 10 10 10 22 24 22 24 true App Name Qt::Horizontal 0 0 PointingHandCursor Qt::NoFocus Edit App 18 20 PointingHandCursor Qt::NoFocus Delete App 22 22 PointingHandCursor Qt::NoFocus 45 23 ================================================ FILE: stacer/Pages/StartupApps/startup_app_edit.cpp ================================================ #include "startup_app_edit.h" #include "ui_startup_app_edit.h" #include "utilities.h" #include #include StartupAppEdit::~StartupAppEdit() { delete ui; } QString StartupAppEdit::selectedFilePath = ""; StartupAppEdit::StartupAppEdit(QWidget *parent) : QDialog(parent), ui(new Ui::StartupAppEdit), mNewAppTemplate("[Desktop Entry]\n" "Name=%1\n" "Comment=%2\n" "Exec=%3\n" "Type=Application\n" "Terminal=false\n" "Hidden=false\n") { ui->setupUi(this); init(); } void StartupAppEdit::init() { setGeometry( QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, size(), qApp->desktop()->availableGeometry()) ); mAutostartPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/autostart"; ui->lblErrorMsg->hide(); setStyleSheet(AppManager::ins()->getStylesheetFileContent()); } void StartupAppEdit::show() { // clear fields ui->txtStartupAppName->clear(); ui->txtStartupAppComment->clear(); ui->txtStartupAppCommand->clear(); ui->lblErrorMsg->hide(); if(! selectedFilePath.isEmpty()) { QStringList lines = FileUtil::readListFromFile(selectedFilePath); if(! lines.isEmpty()) { ui->txtStartupAppName->setText(Utilities::getDesktopValue(NAME_REG, lines)); ui->txtStartupAppComment->setText(Utilities::getDesktopValue(COMMENT_REG, lines)); ui->txtStartupAppCommand->setText(Utilities::getDesktopValue(EXEC_REG, lines)); } } QDialog::show(); } void StartupAppEdit::changeDesktopValue(QStringList &lines, const QRegExp ®, const QString &text) { int pos = lines.indexOf(reg); if (pos != -1) { lines.replace(pos, text); } else { lines.append(text); } } void StartupAppEdit::on_btnSave_clicked() { if(isValid()) { if(! selectedFilePath.isEmpty()) { QStringList lines = FileUtil::readListFromFile(selectedFilePath); changeDesktopValue(lines, NAME_REG, QString("Name=%1").arg(ui->txtStartupAppName->text())); changeDesktopValue(lines, COMMENT_REG, QString("Comment=%1").arg(ui->txtStartupAppComment->text())); changeDesktopValue(lines, EXEC_REG, QString("Exec=%1").arg(ui->txtStartupAppCommand->text())); FileUtil::writeFile(selectedFilePath, lines.join("\n"), QIODevice::ReadWrite | QIODevice::Truncate); } else { // new file content QString appContent = mNewAppTemplate .arg(ui->txtStartupAppName->text()) .arg(ui->txtStartupAppComment->text()) .arg(ui->txtStartupAppCommand->text()); // file name QString appFileName = ui->txtStartupAppName->text() .simplified() .replace(' ', '-') .toLower(); qDebug() << appFileName; QString path = QString("%1/%2.desktop").arg(mAutostartPath).arg(appFileName); FileUtil::writeFile(path, appContent); } emit startupAppAdded(); // signal close(); } else { ui->lblErrorMsg->show(); } selectedFilePath = ""; } bool StartupAppEdit::isValid() { return ! ui->txtStartupAppName->text().isEmpty() && ! ui->txtStartupAppComment->text().isEmpty() && ! ui->txtStartupAppCommand->text().isEmpty(); } ================================================ FILE: stacer/Pages/StartupApps/startup_app_edit.h ================================================ #ifndef STARTUP_APP_EDIT_H #define STARTUP_APP_EDIT_H #include #include #include "Managers/app_manager.h" #define NAME_REG QRegExp("^Name=.*") #define COMMENT_REG QRegExp("^Comment=.*") #define EXEC_REG QRegExp("^Exec=.*") #define GNOME_ENABLED_REG QRegExp("^X-GNOME-Autostart-enabled=.*") #define HIDDEN_REG QRegExp("^Hidden=.*") namespace Ui { class StartupAppEdit; } class StartupAppEdit : public QDialog { Q_OBJECT public: explicit StartupAppEdit(QWidget *parent = 0); ~StartupAppEdit(); public: static QString selectedFilePath; signals: void startupAppAdded(); public slots: void show(); private slots: void init(); bool isValid(); void on_btnSave_clicked(); void changeDesktopValue(QStringList &lines, const QRegExp ®, const QString &text); private: Ui::StartupAppEdit *ui; private: QString mNewAppTemplate; QString mAutostartPath; }; #endif // STARTUP_APP_EDIT_H ================================================ FILE: stacer/Pages/StartupApps/startup_app_edit.ui ================================================ StartupAppEdit 0 0 380 227 380 0 Startup App true 30 20 30 15 15 Fields cannot be left blank. App Name App Comment PointingHandCursor Qt::NoFocus primary Save true dialog-title Application Qt::AlignCenter Command Qt::Vertical 20 40 txtStartupAppName txtStartupAppComment txtStartupAppCommand btnSave ================================================ FILE: stacer/Pages/StartupApps/startup_apps_page.cpp ================================================ #include "startup_apps_page.h" #include "ui_startup_apps_page.h" #include "utilities.h" StartupAppsPage::~StartupAppsPage() { delete ui; } StartupAppsPage::StartupAppsPage(QWidget *parent) : QWidget(parent), ui(new Ui::StartupAppsPage), mFileSystemWatcher(this) { ui->setupUi(this); init(); } bool StartupAppsPage::checkIfDisabled(const QString& as_path) { const QString disabled_str("X-GNOME-Autostart-enabled=false"); QFile autostart_file(as_path); autostart_file.open(QIODevice::ReadOnly | QIODevice::Text); return autostart_file.readAll().indexOf(disabled_str, 0) != -1; } void StartupAppsPage::init() { mAutostartPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation).append("/autostart"); QFileInfo asfi(mAutostartPath); bool startups_disabled = false; /* original behavior, autostart is a dir and not... * * a pre-exisiting file as is case on my machine. */ if (asfi.isDir() == true) { mAutostartPath.append("/"); } else { /* altered behavior for if a file is at this location instead * * check for disabled string * * * if found, don't add watcher */ startups_disabled = checkIfDisabled(mAutostartPath); } if (!startups_disabled) { if (! QDir(mAutostartPath).exists()) { QDir().mkdir(mAutostartPath); } mFileSystemWatcher.addPath(mAutostartPath); loadApps(); connect(&mFileSystemWatcher, &QFileSystemWatcher::directoryChanged, this, &StartupAppsPage::loadApps); } else { ui->lblNotFound->setText(tr("Startup Apps are disabled.")); ui->btnAddStartupApp->setEnabled(false); } connect(ui->btnAddStartupApp, SIGNAL(clicked()), this, SLOT(openStartupAppEdit())); Utilities::addDropShadow(ui->btnAddStartupApp, 60); } void StartupAppsPage::loadApps() { // clear ui->listWidgetStartup->clear(); QDir autostartFiles(mAutostartPath, "*.desktop"); QLatin1String enabledStr("true"); for (const QFileInfo &f : autostartFiles.entryInfoList()) { QStringList lines = FileUtil::readListFromFile(f.absoluteFilePath()); QString appName = Utilities::getDesktopValue(NAME_REG, lines); // get name if(! appName.isEmpty()) // has a name { bool enabled = false; // Hidden=[true|false] QString hidden = Utilities::getDesktopValue(HIDDEN_REG, lines).toLower(); // X-GNOME-Autostart-enabled=[true|false] QString gnomeEnabled = Utilities::getDesktopValue(GNOME_ENABLED_REG, lines).toLower(); if (! hidden.isEmpty()) { enabled = (hidden != enabledStr); } else { enabled = (gnomeEnabled == enabledStr); } QListWidgetItem *item = new QListWidgetItem(ui->listWidgetStartup); // new app StartupApp *app = new StartupApp(appName, enabled, f.absoluteFilePath(), this); connect(app, &StartupApp::deleteAppS, this, &StartupAppsPage::loadApps); connect(app, &StartupApp::editStartupAppS, this, &StartupAppsPage::openStartupAppEdit); item->setSizeHint(app->sizeHint()); ui->listWidgetStartup->setItemWidget(item, app); } } setAppCount(); } void StartupAppsPage::setAppCount() { int count = ui->listWidgetStartup->count(); ui->lblStartupAppsTitle->setText( tr("Startup Applications (%1)") .arg(QString::number(count))); ui->notFoundWidget->setVisible(! count); ui->listWidgetStartup->setVisible(count); } void StartupAppsPage::openStartupAppEdit(const QString filePath) { StartupAppEdit::selectedFilePath = filePath; if (mStartupAppEdit.isNull()) { mStartupAppEdit = QSharedPointer(new StartupAppEdit(this)); connect(mStartupAppEdit.data(), &StartupAppEdit::startupAppAdded, this, &StartupAppsPage::loadApps); } mStartupAppEdit->show(); } ================================================ FILE: stacer/Pages/StartupApps/startup_apps_page.h ================================================ #ifndef STARTUPAPPSPAGE_H #define STARTUPAPPSPAGE_H #include #include #include #include #include #include "startup_app.h" #include "startup_app_edit.h" #include "Utils/file_util.h" namespace Ui { class StartupAppsPage; } class StartupAppsPage : public QWidget { Q_OBJECT public: explicit StartupAppsPage(QWidget *parent = 0); ~StartupAppsPage(); public slots: void loadApps(); private slots: void init(); void openStartupAppEdit(const QString filePath = QString()); void setAppCount(); private: Ui::StartupAppsPage *ui; private: QSharedPointer mStartupAppEdit; QFileSystemWatcher mFileSystemWatcher; QString mAutostartPath; bool checkIfDisabled(const QString& as_path); }; #endif // STARTUPAPPSPAGE_H ================================================ FILE: stacer/Pages/StartupApps/startup_apps_page.ui ================================================ StartupAppsPage 0 0 892 591 Startup Apps 0 0 0 0 0 0 0 ArrowCursor 60 10 60 20 5 Qt::Horizontal 40 20 0 0 Ubuntu PointingHandCursor Qt::NoFocus primary Add Startup App Ubuntu 11 false System Startup Applications Qt::Vertical QSizePolicy::Fixed 20 10 0 0 0 0 0 0 0 0 200 16777215 200 0 0 0 0 0 Not Found Startup Apps Qt::NoFocus QFrame::NoFrame Qt::ScrollBarAlwaysOff QAbstractItemView::EditKeyPressed QAbstractItemView::NoSelection QAbstractItemView::SelectRows QListView::Adjust QListView::Batched 5 true ================================================ FILE: stacer/Pages/SystemCleaner/byte_tree_widget.cpp ================================================ #include "byte_tree_widget.h" void ByteTreeWidget::setValues(const QString &text, const quint64 &size, const QVariant &data) { this->setText(0, text); this->setText(1, FormatUtil::formatBytes(size)); this->setData(1, 0x0100, size); this->setData(2, 0, data); this->setCheckState(0, Qt::Unchecked); } bool ByteTreeWidget::operator<(const QTreeWidgetItem &other) const { int column = treeWidget()->sortColumn(); // sort by bytes if(column == 1) { return this->data(1, 0x0100) < other.data(1, 0x0100); } // default sorting return text(column).toLower() < other.text(column).toLower(); } ================================================ FILE: stacer/Pages/SystemCleaner/byte_tree_widget.h ================================================ #ifndef BYTE_TREE_WIDGET_H #define BYTE_TREE_WIDGET_H #include #include #include class ByteTreeWidget : public QTreeWidgetItem { public: ByteTreeWidget(QTreeWidget* parent) : QTreeWidgetItem(parent) {} ByteTreeWidget(QTreeWidgetItem* parent) : QTreeWidgetItem(parent) {} void setValues(const QString &text, const quint64 &size, const QVariant &data); virtual bool operator<(const QTreeWidgetItem &other) const; }; #endif // BYTE_TREE_WIDGET_H ================================================ FILE: stacer/Pages/SystemCleaner/system_cleaner_page.cpp ================================================ #include "system_cleaner_page.h" #include "ui_system_cleaner_page.h" #include "byte_tree_widget.h" SystemCleanerPage::~SystemCleanerPage() { delete ui; } SystemCleanerPage::SystemCleanerPage(QWidget *parent) : QWidget(parent), ui(new Ui::SystemCleanerPage), im(InfoManager::ins()), tmr(ToolManager::ins()), mDefaultIcon(QIcon::fromTheme("application-x-executable")), mLoadingMovie(nullptr), mLoadingMovie_2(nullptr) { ui->setupUi(this); init(); ui->stackedWidget->setCurrentIndex(0); } void SystemCleanerPage::init() { // treview settings ui->treeWidgetScanResult->setColumnCount(2); ui->treeWidgetScanResult->setColumnWidth(0, 600); ui->treeWidgetScanResult->header()->setFixedHeight(30); ui->treeWidgetScanResult->setHeaderLabels({ tr("File Name"), tr("Size") }); // loaders connect(SignalMapper::ins(), &SignalMapper::sigChangedAppTheme, [=] { QString themeName = SettingManager::ins()->getThemeName(); mLoadingMovie = new QMovie(QString(":/static/themes/%1/img/scanLoading.gif").arg(themeName),{},this); ui->lblLoadingScanner->setMovie(mLoadingMovie); mLoadingMovie->start(); ui->lblLoadingScanner->hide(); mLoadingMovie_2 = new QMovie(QString(":/static/themes/%1/img/loading.gif").arg(themeName),{},this); ui->lblLoadingCleaner->setMovie(mLoadingMovie_2); mLoadingMovie_2->start(); ui->lblLoadingCleaner->hide(); }); // needed to suppress qt warnings (signal/slot <> threads) qRegisterMetaType>(); qRegisterMetaType(); qRegisterMetaType(); } quint64 SystemCleanerPage::addTreeRoot(const CleanCategories &cat, const QString &title, const QFileInfoList &infos, bool noChild) { QTreeWidgetItem *root = new QTreeWidgetItem(ui->treeWidgetScanResult); root->setData(2, 0, cat); root->setData(2, 1, title); if (! infos.isEmpty()) root->setData(3, 0, infos.at(0).absoluteDir().path()); root->setCheckState(0, Qt::Unchecked); // add children quint64 totalSize = 0; if(! noChild) { for (const QFileInfo &i : infos) { QString path = i.absoluteFilePath(); quint64 size = FileUtil::getFileSize(path); addTreeChild(path, i.fileName(), size, root); totalSize += size; } root->setText(0, QString("%1 (%2)") .arg(title) .arg(infos.count())); } else { if (! infos.isEmpty()) totalSize += FileUtil::getFileSize(infos.first().absoluteFilePath()); root->setText(0, QString("%1") .arg(title)); } root->setText(1, QString("%1").arg(FormatUtil::formatBytes(totalSize))); return totalSize; } void SystemCleanerPage::addTreeChild(const QString &data, const QString &text, const quint64 &size, QTreeWidgetItem *parent) { ByteTreeWidget *item = new ByteTreeWidget(parent); item->setValues(text, size, data); item->setIcon(0, QIcon::fromTheme(text, mDefaultIcon)); } void SystemCleanerPage::addTreeChild(const CleanCategories &cat, const QString &text, const quint64 &size) { ByteTreeWidget *item = new ByteTreeWidget(ui->treeWidgetScanResult); item->setValues(text, size, cat); } void SystemCleanerPage::on_treeWidgetScanResult_itemClicked(QTreeWidgetItem *item, const int &column) { if(column == 0) { // new check state Qt::CheckState cs = (item->checkState(column) == Qt::Checked ? Qt::Checked : Qt::Unchecked); // update check state //item->setCheckState(column, cs); // change check state if has children for (int i = 0; i < item->childCount(); ++i) item->child(i)->setCheckState(column, cs); } } void SystemCleanerPage::systemScan() { if (ui->checkPackageCache->isChecked() || ui->checkCrashReports->isChecked() || ui->checkAppLog->isChecked() || ui->checkAppCache->isChecked() || ui->checkTrash->isChecked() ){ ui->btnScan->hide(); ui->lblLoadingScanner->show(); ui->checkPackageCache->setEnabled(false); ui->checkCrashReports->setEnabled(false); ui->checkAppLog->setEnabled(false); ui->checkAppCache->setEnabled(false); ui->checkTrash->setEnabled(false); ui->checkSelectAllSystemScan->setEnabled(false); ui->treeWidgetScanResult->setSortingEnabled(false); ui->treeWidgetScanResult->clear(); quint64 totalSize = 0; // Package Caches if (ui->checkPackageCache->isChecked()) { totalSize += addTreeRoot(PACKAGE_CACHE, ui->lblPackageCache->text(), tmr->getPackageCaches()); } // Crash Reports if (ui->checkCrashReports->isChecked()) { totalSize += addTreeRoot(CRASH_REPORTS, ui->lblCrashReports->text(), im->getCrashReports()); } // Application Logs if (ui->checkAppLog->isChecked()) { totalSize += addTreeRoot(APPLICATION_LOGS, ui->lblAppLog->text(), im->getAppLogs()); } // Application Cache if (ui->checkAppCache->isChecked()) { totalSize += addTreeRoot(APPLICATION_CACHES, ui->lblAppCache->text(), im->getAppCaches()); } // Trash if(ui->checkTrash->isChecked()) { totalSize += addTreeRoot(TRASH, ui->lblTrash->text(), { QFileInfo(QDir::homePath() + "/.local/share/Trash/") }, true); } ui->lblTotalBytes->setText(tr("Total size: %1").arg(FormatUtil::formatBytes(totalSize))); ui->treeWidgetScanResult->setSortingEnabled(true); on_cbSortBy_currentIndexChanged(ui->cbSortBy->currentIndex()); // scan results page ui->stackedWidget->setCurrentIndex(1); ui->checkPackageCache->setChecked(false); ui->checkCrashReports->setChecked(false); ui->checkAppLog->setChecked(false); ui->checkAppCache->setChecked(false); ui->checkTrash->setChecked(false); } } bool SystemCleanerPage::cleanValid() { for (int i = 0; i < ui->treeWidgetScanResult->topLevelItemCount(); ++i) { QTreeWidgetItem *it = ui->treeWidgetScanResult->topLevelItem(i); if (it->checkState(0) == Qt::Checked) return true; for (int j = 0; j < it->childCount(); ++j) if (it->child(j)->checkState(0) == Qt::Checked) return true; } return false; } void SystemCleanerPage::systemClean() { if (cleanValid()) { ui->btnClean->hide(); ui->lblLoadingCleaner->show(); ui->treeWidgetScanResult->setEnabled(false); quint64 totalCleanedSize = 0; QTreeWidget *tree = ui->treeWidgetScanResult; QStringList filesToDelete; QList children; for (int i = 0; i < tree->topLevelItemCount(); ++i) { QTreeWidgetItem *it = tree->topLevelItem(i); CleanCategories cat = (CleanCategories) it->data(2, 0).toInt(); // Package Caches | Crash Reports | Application Logs | Application Caches if (cat != CleanCategories::TRASH) { for (int j = 0; j < it->childCount(); ++j) { // files if(it->child(j)->checkState(0) == Qt::Checked) { // if checked QString filePath = it->child(j)->data(2, 0).toString(); filesToDelete << filePath; children.append(it->child(j)); } } } // Trash else if (cat == CleanCategories::TRASH) { if (it->checkState(0) == Qt::Checked) { QString trashPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation).append("/.local/share/Trash"); QDir(trashPath + "/files").removeRecursively(); QDir(trashPath + "/info").removeRecursively(); } } } // get removed files total size for (const QString &file : filesToDelete) { totalCleanedSize += FileUtil::getFileSize(file); } // remove selected files if(! filesToDelete.isEmpty()) { CommandUtil::sudoExec("rm", QStringList() << "-rf" << filesToDelete); } for (int i = 0; i < tree->topLevelItemCount(); ++i) { // clear removed childs for (QTreeWidgetItem *item : children) { tree->topLevelItem(i)->removeChild(item); } } // update titles for (int i = 0; i < tree->topLevelItemCount(); ++i) { QTreeWidgetItem *it = tree->topLevelItem(i); it->setText(0, QString("%1 (%2)") .arg(it->data(2, 1).toString()) .arg(it->childCount())); it->setText(1, QString("%1") .arg(FormatUtil::formatBytes(FileUtil::getFileSize(it->data(3, 0).toString())))); } ui->lblRemovedTotalSize->setText(tr("%1 size files cleaned.") .arg(FormatUtil::formatBytes(totalCleanedSize))); ui->btnClean->show(); ui->lblLoadingCleaner->hide(); ui->treeWidgetScanResult->setEnabled(true); } } void SystemCleanerPage::on_btnScan_clicked() { QtConcurrent::run(this, &SystemCleanerPage::systemScan); } void SystemCleanerPage::on_btnClean_clicked() { QtConcurrent::run(this, &SystemCleanerPage::systemClean); } void SystemCleanerPage::on_btnBackToCategories_clicked() { ui->btnScan->show(); ui->lblRemovedTotalSize->clear(); ui->lblLoadingScanner->hide(); ui->checkPackageCache->setEnabled(true); ui->checkCrashReports->setEnabled(true); ui->checkAppLog->setEnabled(true); ui->checkAppCache->setEnabled(true); ui->checkTrash->setEnabled(true); ui->treeWidgetScanResult->clear(); ui->stackedWidget->setCurrentIndex(0); ui->checkSelectAllSystemScan->setEnabled(true); ui->checkSelectAllSystemScan->setChecked(false); } void SystemCleanerPage::on_checkSelectAllSystemScan_clicked(bool checked) { ui->checkAppCache->setChecked(checked); ui->checkAppLog->setChecked(checked); ui->checkCrashReports->setChecked(checked); ui->checkPackageCache->setChecked(checked); ui->checkTrash->setChecked(checked); } void SystemCleanerPage::on_checkSelectAll_clicked(bool checked) { for (int i = 0; i < ui->treeWidgetScanResult->topLevelItemCount(); ++i) { QTreeWidgetItem *it = ui->treeWidgetScanResult->topLevelItem(i); it->setCheckState(0, (checked ? Qt::Checked : Qt::Unchecked)); for (int j = 0; j < it->childCount(); ++j) it->child(j)->setCheckState(0, (checked ? Qt::Checked : Qt::Unchecked)); } } void SystemCleanerPage::on_cbSortBy_currentIndexChanged(int idx) { switch (idx) { case 0: ui->treeWidgetScanResult->sortItems(0, Qt::AscendingOrder); break; case 1: ui->treeWidgetScanResult->sortItems(0, Qt::DescendingOrder); break; case 2: ui->treeWidgetScanResult->sortItems(1, Qt::AscendingOrder); break; case 3: ui->treeWidgetScanResult->sortItems(1, Qt::DescendingOrder); break; } } ================================================ FILE: stacer/Pages/SystemCleaner/system_cleaner_page.h ================================================ #ifndef SYSTEMCLEANERPAGE_H #define SYSTEMCLEANERPAGE_H #include #include #include #include #include #include #include #include #include "Managers/app_manager.h" #include #include namespace Ui { class SystemCleanerPage; } class SystemCleanerPage : public QWidget { Q_OBJECT public: enum CleanCategories { PACKAGE_CACHE, CRASH_REPORTS, APPLICATION_LOGS, APPLICATION_CACHES, TRASH }; public: explicit SystemCleanerPage(QWidget *parent = nullptr); ~SystemCleanerPage(); private slots: quint64 addTreeRoot(const CleanCategories &cat, const QString &title, const QFileInfoList &infos, bool noChild = false); void addTreeChild(const CleanCategories &cat, const QString &text, const quint64 &size); void addTreeChild(const QString &data, const QString &text, const quint64 &size, QTreeWidgetItem *parent); void on_treeWidgetScanResult_itemClicked(QTreeWidgetItem *item, const int &column); void on_btnClean_clicked(); void on_btnScan_clicked(); void on_btnBackToCategories_clicked(); void systemScan(); void systemClean(); bool cleanValid(); void on_checkSelectAllSystemScan_clicked(bool checked); void on_checkSelectAll_clicked(bool check); void on_cbSortBy_currentIndexChanged(int idx); private: void init(); private: Ui::SystemCleanerPage *ui; InfoManager *im; ToolManager *tmr; QIcon mDefaultIcon; QMovie *mLoadingMovie; QMovie *mLoadingMovie_2; }; #endif // SYSTEMCLEANERPAGE_H ================================================ FILE: stacer/Pages/SystemCleaner/system_cleaner_page.ui ================================================ SystemCleanerPage 0 0 1025 736 System Cleaner 0 15 0 15 15 1 0 0 0 0 40 20 Crash Reports Qt::AlignCenter true 90 90 90 90 :/static/themes/default/img/c_crash.png false Qt::AlignCenter 0 0 PointingHandCursor Qt::NoFocus circle Qt::Vertical 20 0 Qt::Horizontal 40 20 90 90 90 90 :/static/themes/default/img/c_cache.png Qt::AlignCenter Application Logs Qt::AlignCenter true 90 90 90 90 :/static/themes/default/img/c_trash.png Qt::AlignCenter Application Caches Qt::AlignCenter true 90 90 90 90 Qt::AutoText :/static/themes/default/img/c_package.png false Qt::AlignCenter 0 0 PointingHandCursor Qt::NoFocus circle 0 0 PointingHandCursor Qt::NoFocus circle 100 100 PointingHandCursor Qt::NoFocus 100 100 Qt::Vertical QSizePolicy::Fixed 20 30 0 0 PointingHandCursor Qt::NoFocus circle Trash Qt::AlignCenter true 90 90 90 90 :/static/themes/default/img/c_logs.png Qt::AlignCenter Package Caches Qt::AlignCenter true 0 0 PointingHandCursor Qt::NoFocus circle Qt::Horizontal 40 20 Qt::Vertical 20 100 100 100 0 0 PointingHandCursor Qt::NoFocus circle Select All 30 30 0 0 5 0 0 0 0 0 0 0 10 20 0 100 20 16777215 20 circle 0 0 100 100 100 100 PointingHandCursor Qt::NoFocus 16777215 16777215 10 PointingHandCursor Qt::NoFocus circle Select All PointingHandCursor Qt::NoFocus Back :/static/themes/default/img/back.png:/static/themes/default/img/back.png 20 20 Qt::Horizontal 40 20 0 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Horizontal 40 20 PreferAntialias ArrowCursor Qt::NoFocus QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection Qt::ElideMiddle QAbstractItemView::ScrollPerItem true true true true 1 Sort by: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 3 Name :/static/themes/default/img/asc.png:/static/themes/default/img/asc.png Name :/static/themes/default/img/dsc.png:/static/themes/default/img/dsc.png Size :/static/themes/default/img/asc.png:/static/themes/default/img/asc.png Size :/static/themes/default/img/dsc.png:/static/themes/default/img/dsc.png ================================================ FILE: stacer/Pages/Uninstaller/uninstaller_page.cpp ================================================ #include "uninstaller_page.h" #include "ui_uninstallerpage.h" #include #include "utilities.h" UninstallerPage::~UninstallerPage() { delete ui; } UninstallerPage::UninstallerPage(QWidget *parent) : QWidget(parent), ui(new Ui::UninstallerPage), tm(ToolManager::ins()) { ui->setupUi(this); init(); } void UninstallerPage::init() { QString iconLoading = QString(":/static/themes/%1/img/loading.gif").arg(SettingManager::ins()->getThemeName()); QMovie *loadingMovie = new QMovie(iconLoading, QByteArray(), this); ui->lblLoadingUninstaller->setMovie(loadingMovie); loadingMovie->start(); ui->lblLoadingUninstaller->hide(); ui->stackedWidget->setCurrentIndex(0); QList widgets = { ui->txtPackageSearch, ui->btnUninstall, ui->btnSystemPackages, ui->btnSnapPackages }; Utilities::addDropShadow(widgets, 40); QtConcurrent::run(this, &UninstallerPage::loadPackages); QtConcurrent::run(this, &UninstallerPage::loadSnapPackages); connect(SignalMapper::ins(), &SignalMapper::sigUninstallStarted, this, &UninstallerPage::uninstallStarted); connect(SignalMapper::ins(), &SignalMapper::sigUninstallFinished, this, &UninstallerPage::loadPackages); connect(SignalMapper::ins(), &SignalMapper::sigUninstallFinished, this, &UninstallerPage::loadSnapPackages); } void UninstallerPage::loadPackages() { emit uninstallStarted(); // clear items ui->listWidgetPackages->clear(); QIcon icon(":/static/themes/common/img/package.png"); QStringList packages = tm->getPackages(); for (const QString &package : packages) { QListWidgetItem *item = new QListWidgetItem(QIcon::fromTheme(package, icon), QString(" %1").arg(package)); item->setCheckState(Qt::Unchecked); ui->listWidgetPackages->addItem(item); } setAppCount(); ui->listWidgetPackages->setEnabled(true); ui->txtPackageSearch->setEnabled(true); ui->txtPackageSearch->clear(); ui->lblLoadingUninstaller->hide(); } void UninstallerPage::loadSnapPackages() { // clear items ui->listWidgetSnapPackages->clear(); QIcon icon(":/static/themes/common/img/package.png"); QStringList packages = tm->getSnapPackages(); for (const QString &package : packages) { QListWidgetItem *item = new QListWidgetItem(QIcon::fromTheme(package, icon), QString(" %1").arg(package)); item->setCheckState(Qt::Unchecked); ui->listWidgetSnapPackages->addItem(item); } setAppCount(); ui->listWidgetSnapPackages->setEnabled(true); ui->txtPackageSearch->setEnabled(true); ui->txtPackageSearch->clear(); ui->lblLoadingUninstaller->hide(); } void UninstallerPage::setAppCount() { int count = ui->listWidgetPackages->count(); ui->btnSystemPackages->setText(tr("Packages (%1)").arg(count)); ui->notFoundWidget->setVisible(! count); ui->listWidgetPackages->setVisible(count); int snapCount = ui->listWidgetSnapPackages->count(); ui->btnSnapPackages->setText(tr("Snap Packages (%1)").arg(snapCount)); ui->notFoundWidget_2->setVisible(! snapCount); ui->listWidgetSnapPackages->setVisible(snapCount); ui->btnSnapPackages->setVisible(CommandUtil::isExecutable("snap")); ui->btnUninstall->setVisible(count || snapCount); } QStringList UninstallerPage::getSelectedPackages() { QStringList selectedPackages = {}; for (int i = 0; i < ui->listWidgetPackages->count(); ++i) { QListWidgetItem *item = ui->listWidgetPackages->item(i); if(item->checkState() == Qt::Checked) selectedPackages << item->text().trimmed(); } return selectedPackages; } QStringList UninstallerPage::getSelectedSnapPackages() { QStringList selectedPackages = {}; for (int i = 0; i < ui->listWidgetSnapPackages->count(); ++i) { QListWidgetItem *item = ui->listWidgetSnapPackages->item(i); if(item->checkState() == Qt::Checked) selectedPackages << item->text().trimmed(); } return selectedPackages; } void UninstallerPage::on_btnUninstall_clicked() { QStringList selectedPackages = getSelectedPackages(); QStringList selectedSnapPackages = getSelectedSnapPackages(); if (!selectedPackages.isEmpty() || !selectedSnapPackages.isEmpty()) { QtConcurrent::run([=] { emit SignalMapper::ins()->sigUninstallStarted(); ToolManager::ins()->uninstallPackages(selectedPackages); ToolManager::ins()->uninstallSnapPackages(selectedSnapPackages); emit SignalMapper::ins()->sigUninstallFinished(); }); } } void UninstallerPage::uninstallStarted() { ui->listWidgetPackages->setEnabled(false); ui->listWidgetSnapPackages->setEnabled(false); ui->txtPackageSearch->setEnabled(false); ui->btnUninstall->hide(); ui->lblLoadingUninstaller->show(); } void UninstallerPage::on_txtPackageSearch_textChanged(const QString &val) { QListWidget *listWidgetPackages = nullptr; switch (ui->stackedWidget->currentIndex()) { case 0: listWidgetPackages = ui->listWidgetPackages; break; case 1: listWidgetPackages = ui->listWidgetSnapPackages; break; } // Get matches items QList matches = listWidgetPackages->findItems(val, Qt::MatchFlag::MatchContains); // All items hide for (int i = 0; i < listWidgetPackages->count(); ++i) listWidgetPackages->item(i)->setHidden(true); // Matches items show for (QListWidgetItem* item : matches) item->setHidden(false); } void UninstallerPage::on_btnSystemPackages_clicked() { ui->stackedWidget->setCurrentIndex(0); } void UninstallerPage::on_btnSnapPackages_clicked() { ui->stackedWidget->setCurrentIndex(1); } void UninstallerPage::on_listWidgetSnapPackages_itemClicked(QListWidgetItem *item) { //item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked); ui->btnUninstall->setText(tr("Uninstall Selected (%1)") .arg(getSelectedSnapPackages().count() + getSelectedPackages().count())); } void UninstallerPage::on_listWidgetPackages_itemClicked(QListWidgetItem *item) { //item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked); ui->btnUninstall->setText(tr("Uninstall Selected (%1)") .arg(getSelectedSnapPackages().count() + getSelectedPackages().count())); } ================================================ FILE: stacer/Pages/Uninstaller/uninstaller_page.h ================================================ #ifndef UNINSTALLERPAGE_H #define UNINSTALLERPAGE_H #include #include #include #include "Managers/tool_manager.h" #include "Managers/app_manager.h" #include "signal_mapper.h" namespace Ui { class UninstallerPage; } class UninstallerPage : public QWidget { Q_OBJECT public: explicit UninstallerPage(QWidget *parent = 0); ~UninstallerPage(); public slots: void uninstallStarted(); private: void init(); private slots: void setAppCount(); void on_txtPackageSearch_textChanged(const QString &val); void on_btnUninstall_clicked(); QStringList getSelectedPackages(); QStringList getSelectedSnapPackages(); void loadPackages(); void loadSnapPackages(); void on_btnSystemPackages_clicked(); void on_btnSnapPackages_clicked(); void on_listWidgetSnapPackages_itemClicked(QListWidgetItem *item); void on_listWidgetPackages_itemClicked(QListWidgetItem *item); private: Ui::UninstallerPage *ui; ToolManager *tm; }; #endif // UNINSTALLERPAGE_H ================================================ FILE: stacer/Pages/Uninstaller/uninstallerpage.ui ================================================ UninstallerPage 0 0 844 635 Uninstaller 30 5 30 20 0 2 0 0 0 0 0 0 0 0 0 200 16777215 200 notFoundWidget 0 0 0 0 0 0 0 Not Found Installed Packages Qt::AlignBottom|Qt::AlignHCenter Ubuntu 10 Qt::NoFocus 10 QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection QAbstractItemView::SelectRows 20 20 Qt::ElideMiddle 4 false 0 0 0 0 0 0 0 0 200 16777215 200 notFoundWidget 0 0 0 0 0 0 0 Not Found Installed Packages Qt::AlignBottom|Qt::AlignHCenter Ubuntu 10 Qt::NoFocus 10 QAbstractItemView::NoEditTriggers QAbstractItemView::NoSelection QAbstractItemView::SelectRows 20 20 Qt::ElideMiddle 4 false 0 0 Qt::Vertical QSizePolicy::Fixed 0 10 true Ubuntu PointingHandCursor Qt::NoFocus primary Uninstall Selected 10 4 5 4 5 PointingHandCursor Qt::NoFocus System Packages true true navBtnGroup PointingHandCursor Qt::NoFocus Snap Packages true navBtnGroup Qt::Horizontal 40 20 170 0 170 16777215 10 Qt::StrongFocus Search... ================================================ FILE: stacer/app.cpp ================================================ #include "app.h" #include "ui_app.h" #include "utilities.h" #include #include App::~App() { delete ui; } App::App(QWidget *parent) : QMainWindow(parent), ui(new Ui::App), mSlidingStacked(new SlidingStackedWidget(this)), mTrayIcon(AppManager::ins()->getTrayIcon()), mTrayMenu(new QMenu(this)) { ui->setupUi(this); init(); } void App::init() { setGeometry( QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, size(), qApp->desktop()->availableGeometry()) ); // form settings ui->horizontalLayout->setContentsMargins(0,0,0,0); ui->horizontalLayout->setSpacing(0); dashboardPage = new DashboardPage(mSlidingStacked); startupAppsPage = new StartupAppsPage(mSlidingStacked); searchPage = new SearchPage(mSlidingStacked); systemCleanerPage = new SystemCleanerPage(mSlidingStacked); servicesPage = new ServicesPage(mSlidingStacked); processPage = new ProcessesPage(mSlidingStacked); helpersPage = new HelpersPage(mSlidingStacked); uninstallerPage = new UninstallerPage(mSlidingStacked); resourcesPage = new ResourcesPage(mSlidingStacked); settingsPage = new SettingsPage(mSlidingStacked); ui->pageContentLayout->addWidget(mSlidingStacked); mListPages = { dashboardPage, startupAppsPage, systemCleanerPage, searchPage, servicesPage, processPage, uninstallerPage, resourcesPage, helpersPage, settingsPage }; mListSidebarButtons = { ui->btnDash, ui->btnStartupApps, ui->btnSystemCleaner, ui->btnSearch, ui->btnServices, ui->btnProcesses, ui->btnHelpers, ui->btnUninstaller, ui->btnResources, ui->btnSettings }; // APT SOURCE MANAGER if (ToolManager::ins()->checkSourceRepository()) { aptSourceManagerPage = new APTSourceManagerPage(mSlidingStacked); mListPages.insert(7, aptSourceManagerPage); mListSidebarButtons.insert(7, ui->btnAptSourceManager); } else { ui->btnAptSourceManager->hide(); } // GNOME SETTINGS bool checkDesktopSession = QString(qgetenv("DESKTOP_SESSION")).contains(QRegExp("ubuntu", Qt::CaseInsensitive)); bool checkDistribution = SystemInfo().getDistribution().contains(QRegExp("ubuntu", Qt::CaseInsensitive));; if (checkDesktopSession || checkDistribution) { gnomeSettingsPage = new GnomeSettingsPage(mSlidingStacked); mListPages.insert(8, gnomeSettingsPage); mListSidebarButtons.insert(8, ui->btnGnomeSettings); } else { ui->btnGnomeSettings->hide(); } // add pages for (QWidget *page: mListPages) { mSlidingStacked->addWidget(page); } AppManager::ins()->updateStylesheet(); Utilities::addDropShadow(ui->sidebar, 60); // set start page clickSidebarButton(SettingManager::ins()->getStartPage()); createTrayActions(); mTrayIcon->show(); createQuitMessageBox(); } void App::createQuitMessageBox() { mBtnQuit = new QPushButton(tr("Quit"), this); mBtnQuit->setAccessibleName("danger"); mBtnContinue = new QPushButton(tr("Continue"), this); mBtnContinue->setAccessibleName("primary"); mQuitMsgBox = new QMessageBox(this); QCheckBox *check = new QCheckBox("Don't ask again."); check->setAccessibleName("circle"); mQuitMsgBox->setWindowTitle(tr("Quit")); mQuitMsgBox->setText(tr("Will the program continue to work in the system tray?")); mQuitMsgBox->addButton(mBtnQuit, QMessageBox::YesRole); mQuitMsgBox->addButton(mBtnContinue, QMessageBox::NoRole); mQuitMsgBox->setCheckBox(check); connect(check, &QCheckBox::toggled, [this](bool checked) { SettingManager::ins()->setAppQuitDialogDontAsk(checked); }); } void App::closeEvent(QCloseEvent *event) { if (SettingManager::ins()->getAppQuitDialogDontAsk()) { if (SettingManager::ins()->getAppQuitDialogChoice() == "close") { event->accept(); } else { event->ignore(); hide(); } } else { mQuitMsgBox->exec(); if (mQuitMsgBox->clickedButton() == mBtnContinue) { SettingManager::ins()->setAppQuitDialogChoice("hide"); event->ignore(); hide(); } else if (mQuitMsgBox->clickedButton() == mBtnQuit) { SettingManager::ins()->setAppQuitDialogChoice("close"); event->accept(); } else { event->ignore(); } } } void App::createTrayActions() { for (QPushButton *button: mListSidebarButtons) { QString toolTip = button->toolTip(); QAction *action = new QAction(toolTip, this); connect(action, &QAction::triggered, [=] { clickSidebarButton(toolTip, true); }); connect(mTrayIcon, &QSystemTrayIcon::activated, this, [=](QSystemTrayIcon::ActivationReason){ setVisible(true); activateWindow(); }); mTrayMenu->addAction(action); } mTrayMenu->addSeparator(); QAction *quitAction = new QAction(tr("Quit"), this); connect(quitAction, &QAction::triggered, [=] {qApp->quit();}); mTrayMenu->addAction(quitAction); mTrayIcon->setContextMenu(mTrayMenu); } void App::clickSidebarButton(QString pageTitle, bool isShow) { QWidget *selectedWidget = getPageByTitle(pageTitle); if (selectedWidget) { pageClick(selectedWidget, !isShow); checkSidebarButtonByTooltip(pageTitle); } else { pageClick(mListPages.first()); } setVisible(isShow); if (isShow) activateWindow(); } void App::checkSidebarButtonByTooltip(const QString &text) { for (QPushButton *button: mListSidebarButtons) { if (button->toolTip() == text) { button->setChecked(true); } } } QWidget* App::getPageByTitle(const QString &title) { for (QWidget *page: mListPages) { if (page->windowTitle() == title) { return page; } } return nullptr; } void App::pageClick(QWidget *widget, bool slide) { if (widget) { ui->pageTitle->setText(widget->windowTitle()); if (slide) { mSlidingStacked->slideInIdx(mSlidingStacked->indexOf(widget)); } else { mSlidingStacked->setCurrentWidget(widget); } } } void App::on_btnDash_clicked() { pageClick(dashboardPage); } void App::on_btnStartupApps_clicked() { pageClick(startupAppsPage); } void App::on_btnSystemCleaner_clicked() { pageClick(systemCleanerPage); } void App::on_btnSearch_clicked() { pageClick(searchPage); } void App::on_btnServices_clicked() { pageClick(servicesPage); } void App::on_btnUninstaller_clicked() { pageClick(uninstallerPage); } void App::on_btnProcesses_clicked() { pageClick(processPage); } void App::on_btnResources_clicked() { pageClick(resourcesPage); } void App::on_btnHelpers_clicked() { pageClick(helpersPage); } void App::on_btnAptSourceManager_clicked() { pageClick(aptSourceManagerPage); } void App::on_btnGnomeSettings_clicked() { pageClick(gnomeSettingsPage); } void App::on_btnSettings_clicked() { pageClick(settingsPage); } void App::on_btnFeedback_clicked() { if (feedback.isNull()) { feedback = QSharedPointer(new Feedback(this)); } feedback->show(); } ================================================ FILE: stacer/app.h ================================================ #ifndef APP_H #define APP_H #include #include "sliding_stacked_widget.h" #include "Managers/app_manager.h" #include "Managers/setting_manager.h" // Pages #include "Pages/Dashboard/dashboard_page.h" #include "Pages/StartupApps/startup_apps_page.h" #include "Pages/SystemCleaner/system_cleaner_page.h" #include "Pages/Services/services_page.h" #include "Pages/Processes/processes_page.h" #include "Pages/Uninstaller/uninstaller_page.h" #include "Pages/Resources/resources_page.h" #include "Pages/Settings/settings_page.h" #include "Pages/AptSourceManager/apt_source_manager_page.h" #include "Pages/GnomeSettings/gnome_settings_page.h" #include "Pages/Search/search_page.h" #include "Pages/Helpers/helpers_page.h" #include "feedback.h" namespace Ui { class App; } class App : public QMainWindow { Q_OBJECT public: explicit App(QWidget *parent = 0); ~App(); protected: void closeEvent(QCloseEvent *event) override; private slots: void init(); void pageClick(QWidget *widget, bool slide = true); void clickSidebarButton(QString pageTitle, bool isShow = false); void on_btnDash_clicked(); void on_btnSystemCleaner_clicked(); void on_btnStartupApps_clicked(); void on_btnServices_clicked(); void on_btnSearch_clicked(); void on_btnUninstaller_clicked(); void on_btnHelpers_clicked(); void on_btnResources_clicked(); void on_btnProcesses_clicked(); void on_btnSettings_clicked(); void on_btnGnomeSettings_clicked(); void on_btnAptSourceManager_clicked(); void on_btnFeedback_clicked(); private: QWidget *getPageByTitle(const QString &title); void checkSidebarButtonByTooltip(const QString &text); void createTrayActions(); void createQuitMessageBox(); private: Ui::App *ui; // Pages QList mListPages; QList mListSidebarButtons; SlidingStackedWidget *mSlidingStacked; DashboardPage *dashboardPage; StartupAppsPage *startupAppsPage; SystemCleanerPage *systemCleanerPage; SearchPage *searchPage; ServicesPage *servicesPage; ProcessesPage *processPage; UninstallerPage *uninstallerPage; ResourcesPage *resourcesPage; APTSourceManagerPage *aptSourceManagerPage; GnomeSettingsPage *gnomeSettingsPage; SettingsPage *settingsPage; HelpersPage *helpersPage; QSharedPointer feedback; QSystemTrayIcon *mTrayIcon; QMenu *mTrayMenu; QPushButton *mBtnQuit, *mBtnContinue; QMessageBox *mQuitMsgBox; }; #endif // APP_H ================================================ FILE: stacer/app.ui ================================================ App Qt::NonModal 0 0 850 570 Stacer :/static/icons/icon256x256.png:/static/icons/icon256x256.png 0 0 0 0 0 0 0 60 0 60 16777215 0 0 5 0 5 Qt::Vertical 20 40 PointingHandCursor Qt::NoFocus Dashboard 28 28 true true sidebarBtnGroup PointingHandCursor Qt::NoFocus Startup Apps 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus System Cleaner 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Search 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Services 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Processes 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Uninstaller 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Resources 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Helpers 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus APT Repository Manager 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Gnome Settings 28 28 true sidebarBtnGroup PointingHandCursor Qt::NoFocus Settings 28 28 true sidebarBtnGroup Qt::Vertical 20 40 PointingHandCursor Qt::NoFocus Feedback 28 28 false btnDash btnServices btnUninstaller btnStartupApps btnResources verticalSpacer_2 btnSystemCleaner btnProcesses btnSettings btnFeedback btnGnomeSettings btnAptSourceManager btnSearch btnHelpers 0 0 0 0 0 0 0 0 0 Ubuntu 12 Title Qt::AlignCenter pageContent sidebar ================================================ FILE: stacer/feedback.cpp ================================================ #include "feedback.h" #include "ui_feedback.h" #include "Utils/command_util.h" #include #include #include #include Feedback::~Feedback() { delete ui; } Feedback::Feedback(QWidget *parent) : QDialog(parent), ui(new Ui::Feedback), mHeader("Content-Type: application/json"), mFeedbackUrl("https://stacer-web-api.herokuapp.com/feedback"), mMailRegex("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b") { ui->setupUi(this); init(); } void Feedback::init() { mMailRegex.setCaseSensitivity(Qt::CaseInsensitive); mMailRegex.setPatternSyntax(QRegExp::RegExp); connect(this, &Feedback::clearInputsS, this, &Feedback::clearInputs); connect(this, &Feedback::setErrorMessageS, this, &Feedback::setErrorMessage); connect(this, &Feedback::disableElementsS, this, &Feedback::disableElements); } void Feedback::on_btnSend_clicked() { QString name = ui->txtName->text(); QString email = ui->txtEmail->text(); QString message = ui->txtMessage->toPlainText(); bool isEmailValid = mMailRegex.exactMatch(email); if (! isEmailValid) { emit setErrorMessageS(tr("Email address is not valid !")); return; } if (message.length() < 5) { emit setErrorMessageS(tr("Your message must be at least 5 characters !")); return; } if (! name.isEmpty() && ! email.isEmpty() && isEmailValid) { QtConcurrent::run([=] { emit disableElementsS(true); ui->btnSend->setText(tr("Sending..")); QStringList args; QJsonObject postData; postData["name"] = name; postData["email"] = email; postData["message"] = message; QJsonDocument json(postData); args << "-d" << json.toJson() << "-H" << mHeader << "-X" << "POST" << mFeedbackUrl; try { QString result = CommandUtil::exec("curl", args); QJsonObject response = QJsonDocument::fromJson(result.toUtf8()).object(); if (response.value("success").toBool()) { emit clearInputs(); emit setErrorMessageS(tr("Your Feedback has been successfully sended.")); } else { emit setErrorMessageS(tr("Something went wrong, try again !")); } } catch(QString &ex) { qCritical() << ex; emit setErrorMessageS(tr("Something went wrong, try again !")); } ui->btnSend->setText(tr("Save")); emit disableElementsS(false); }); } else { emit setErrorMessageS(tr("Fields cannot be left blank !")); } } void Feedback::setErrorMessage(const QString &msg) { ui->lblErrorMsg->setText(msg); } void Feedback::disableElements(const bool status) { ui->txtName->setDisabled(status); ui->txtEmail->setDisabled(status); ui->txtMessage->setDisabled(status); ui->btnSend->setDisabled(status); } void Feedback::clearInputs() { ui->txtName->clear(); ui->txtEmail->clear(); ui->txtMessage->clear(); ui->txtName->setFocus(); } void Feedback::on_btnClose_clicked() { this->close(); } ================================================ FILE: stacer/feedback.h ================================================ #ifndef FEEDBACK_H #define FEEDBACK_H #include namespace Ui { class Feedback; } class Feedback : public QDialog { Q_OBJECT public: explicit Feedback(QWidget *parent = 0); ~Feedback(); signals: void setErrorMessageS(const QString &msg); void clearInputsS(); void disableElementsS(const bool status); private slots: void setErrorMessage(const QString &msg); void on_btnSend_clicked(); void clearInputs(); void disableElements(const bool status); void on_btnClose_clicked(); private: void init(); private: Ui::Feedback *ui; QString mHeader; QString mFeedbackUrl; QRegExp mMailRegex; }; #endif // FEEDBACK_H ================================================ FILE: stacer/feedback.ui ================================================ Feedback 0 0 476 350 Feedback true 30 20 30 20 15 Qt::Vertical QSizePolicy::Maximum 359 2 Message Name Email Address dialog-title Send a Feedback Qt::AlignCenter PointingHandCursor Qt::NoFocus primary Send true PointingHandCursor danger Close txtName txtEmail txtMessage ================================================ FILE: stacer/main.cpp ================================================ #include #include #include #include #include "app.h" void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message) { Q_UNUSED(context) QString level; switch (type) { case QtDebugMsg: level = "DEBUG"; break; case QtInfoMsg: level = "INFO"; break; case QtWarningMsg: level = "WARNING"; break; case QtCriticalMsg: level = "CRITICAL"; break; case QtFatalMsg: level = "FATAL"; break; default: level = "UNDEFIEND"; break; } if (type != QtWarningMsg) { QString text = QString("[%1] [%2] %3") .arg(QDateTime::currentDateTime().toString("dd-MM-yyyy hh:mm:ss")) .arg(level) .arg(message); static QString logPath = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); QFile file(logPath + "/stacer.log"); QIODevice::OpenMode openMode = file.size() > (1L << 20) ? QIODevice::Truncate : QIODevice::Append; if (file.open(QIODevice::WriteOnly | openMode)) { QTextStream stream(&file); stream << text << endl; file.close(); } } } int main(int argc, char *argv[]) { QApplication app(argc, argv); qApp->setApplicationName("stacer"); qApp->setApplicationDisplayName("Stacer"); qApp->setApplicationVersion("1.1.0"); qApp->setWindowIcon(QIcon(":/static/logo.png")); { QCommandLineOption hideOption("hide", "Hide Stacer while launching."); QCommandLineOption noSplashOption("nosplash", "Hide splash screen while launching."); QCommandLineParser parser; parser.addVersionOption(); parser.addHelpOption(); parser.addOption(hideOption); parser.addOption(noSplashOption); parser.process(app); } bool isHide = false; bool isNoSplash = false; QLatin1String hideOption("--hide"); QLatin1String noSplashOption("--nosplash"); for (size_t i = 1; i < argc; ++i) { if (QString(argv[i]) == hideOption) isHide = true; else if (QString(argv[i]) == noSplashOption) isNoSplash = true; } QFontDatabase::addApplicationFont(":/static/font/Ubuntu-R.ttf"); QPixmap pixSplash(":/static/splashscreen.png"); QSplashScreen *splash = new QSplashScreen(pixSplash); if (!isNoSplash) splash->show(); app.processEvents(); App w; if (argc < 2 || !isHide) { w.show(); } splash->finish(&w); delete splash; return app.exec(); } ================================================ FILE: stacer/signal_mapper.cpp ================================================ #include "signal_mapper.h" SignalMapper *SignalMapper::instance = nullptr; SignalMapper* SignalMapper::ins() { if (! instance) { instance = new SignalMapper; } return instance; } ================================================ FILE: stacer/signal_mapper.h ================================================ #ifndef SIGNAL_MAPPER_H #define SIGNAL_MAPPER_H #include class SignalMapper : public QObject { Q_OBJECT public: static SignalMapper *ins(); signals: void sigChangedAppTheme(); void sigUninstallStarted(); void sigUninstallFinished(); private: static SignalMapper *instance; }; #endif // SIGNAL_MAPPER_H ================================================ FILE: stacer/sliding_stacked_widget.cpp ================================================ #include "sliding_stacked_widget.h" SlidingStackedWidget::SlidingStackedWidget(QWidget *parent) : QStackedWidget(parent) { vertical = false; speed = 150; animationtype = QEasingCurve::Type::Linear; now = 0; next = 0; pnow = QPoint(0,0); active = false; } void SlidingStackedWidget::setVerticalMode(bool vertical) { this->vertical = vertical; } void SlidingStackedWidget::setSpeed(int speed) { this->speed = speed; } void SlidingStackedWidget::setAnimation(const QEasingCurve::Type animationtype) { this->animationtype = animationtype; } void SlidingStackedWidget::slideInNext() { int now = currentIndex(); if (now < count() - 1) slideInIdx(now + 1); } void SlidingStackedWidget::slideInPrev() { int now = currentIndex(); if (now > 0) slideInIdx(now - 1); } void SlidingStackedWidget::slideInIdx(int idx, t_direction direction) { // int idx, t_direction direction=AUTOMATIC if (idx > count() - 1) { direction = vertical ? TOP2BOTTOM : RIGHT2LEFT; idx = (idx) % count(); } else if (idx < 0) { direction = vertical ? BOTTOM2TOP : LEFT2RIGHT; idx = (idx + count()) % count(); } slideInWgt(widget(idx), direction); } void SlidingStackedWidget::slideInWgt(QWidget * newwidget, t_direction direction) { // do not allow re-entrance before an animation is completed. if (active) return ; else active = true; enum t_direction directionhint; int now = currentIndex(); int next = indexOf(newwidget); if (now == next) { active = false; return; } else if (now < next) { directionhint = vertical ? TOP2BOTTOM : RIGHT2LEFT; } else { directionhint = vertical ? BOTTOM2TOP : LEFT2RIGHT; } if (direction == AUTOMATIC) { direction = directionhint; } // calculate the shifts int offsetx = frameRect().width(); int offsety = frameRect().height(); widget(next)->setGeometry(0, 0, offsetx, offsety); if (direction == BOTTOM2TOP) { offsetx = 0; offsety = -offsety; } else if (direction == TOP2BOTTOM) { offsetx = 0; } else if (direction == RIGHT2LEFT) { offsetx = -offsetx; offsety = 0; } else if (direction == LEFT2RIGHT) { offsety = 0; } // re-position the next widget outside/aside of the display area QPoint pnext = widget(next)->pos(); QPoint pnow = widget(now)->pos(); this->pnow = pnow; widget(next)->move(pnext.x() - offsetx, pnext.y() - offsety); // make it visible/show widget(next)->show(); widget(next)->raise(); // animate both, the now and next widget to the side, using animation framework QPropertyAnimation *animnow = new QPropertyAnimation(widget(now), "pos"); animnow->setDuration(speed); animnow->setEasingCurve(animationtype); animnow->setStartValue(QPoint(pnow.x(), pnow.y())); animnow->setEndValue(QPoint(offsetx + pnow.x(), offsety + pnow.y())); QPropertyAnimation *animnext = new QPropertyAnimation(widget(next), "pos"); animnext->setDuration(speed); animnext->setEasingCurve(animationtype); animnext->setStartValue(QPoint(-offsetx + pnext.x(), offsety + pnext.y())); animnext->setEndValue(QPoint(pnext.x(), pnext.y())); QParallelAnimationGroup *animgroup = new QParallelAnimationGroup(this); animgroup->addAnimation(animnow); animgroup->addAnimation(animnext); connect(animgroup, &QParallelAnimationGroup::finished, this, &SlidingStackedWidget::animationDoneSlot); this->next = next; this->now = now; active = true; animgroup->start(); } void SlidingStackedWidget::animationDoneSlot() { setCurrentIndex(next); // this function is inherited from QStackedWidget widget(now)->hide(); widget(now)->move(pnow); active = false; emit animationFinished(); } ================================================ FILE: stacer/sliding_stacked_widget.h ================================================ #ifndef SLIDINGSTACKEDWIDGET_H #define SLIDINGSTACKEDWIDGET_H #include #include #include #include #include class SlidingStackedWidget : public QStackedWidget { Q_OBJECT public: // This enumeration is used to define the animation direction enum t_direction { LEFT2RIGHT, RIGHT2LEFT, TOP2BOTTOM, BOTTOM2TOP, AUTOMATIC }; SlidingStackedWidget(QWidget *parent); public slots: void setSpeed(int speed); // animation duration in milliseconds void setAnimation(const QEasingCurve::Type animationtype); // check out the QEasingCurve documentation for different styles void setVerticalMode(bool vertical = true); void slideInNext(); void slideInPrev(); void slideInIdx(int idx, t_direction direction = AUTOMATIC); signals: void animationFinished(); private slots: void animationDoneSlot(); private: void slideInWgt(QWidget *widget, t_direction direction = AUTOMATIC); enum QEasingCurve::Type animationtype; int speed; bool vertical; int now; int next; QPoint pnow; bool active; }; #endif // SLIDINGSTACKEDWIDGET_H ================================================ FILE: stacer/stacer.pro ================================================ QT += core gui charts svg concurrent greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = stacer TEMPLATE = app CONFIG += c++11 QMAKE_CXXFLAGS += -O2 # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ app.cpp \ Pages/Dashboard/circlebar.cpp \ Pages/Dashboard/linebar.cpp \ Pages/StartupApps/startup_app.cpp \ Pages/StartupApps/startup_app_edit.cpp \ Pages/StartupApps/startup_apps_page.cpp \ Pages/Services/service_item.cpp \ Managers/app_manager.cpp \ Managers/tool_manager.cpp \ Managers/info_manager.cpp \ Pages/Resources/history_chart.cpp \ Pages/SystemCleaner/system_cleaner_page.cpp \ Pages/SystemCleaner/byte_tree_widget.cpp \ Pages/Uninstaller/uninstaller_page.cpp \ Pages/Services/services_page.cpp \ Pages/Resources/resources_page.cpp \ Pages/Dashboard/dashboard_page.cpp \ Pages/Processes/processes_page.cpp \ Pages/Settings/settings_page.cpp \ Pages/AptSourceManager/apt_source_manager_page.cpp \ Pages/AptSourceManager/apt_source_repository_item.cpp \ Pages/GnomeSettings/gnome_settings_page.cpp \ Pages/GnomeSettings/unity_settings.cpp \ Pages/GnomeSettings/window_manager_settings.cpp \ Pages/GnomeSettings/appearance_settings.cpp \ feedback.cpp \ Pages/AptSourceManager/apt_source_edit.cpp \ Managers/setting_manager.cpp \ sliding_stacked_widget.cpp \ signal_mapper.cpp \ Pages/Search/search_page.cpp \ Pages/Helpers/helpers_page.cpp \ Pages/Helpers/host_manage.cpp HEADERS += \ app.h \ Pages/Dashboard/circlebar.h \ Pages/Dashboard/linebar.h \ Pages/StartupApps/startup_app.h \ Pages/StartupApps/startup_app_edit.h \ Pages/StartupApps/startup_apps_page.h \ Pages/Services/service_item.h \ Managers/app_manager.h \ Managers/tool_manager.h \ Managers/info_manager.h \ Pages/Resources/history_chart.h \ Pages/SystemCleaner/system_cleaner_page.h \ Pages/SystemCleaner/byte_tree_widget.h \ Pages/Uninstaller/uninstaller_page.h \ Pages/Resources/resources_page.h \ Pages/Processes/processes_page.h \ Pages/Dashboard/dashboard_page.h \ Pages/Services/services_page.h \ Pages/Settings/settings_page.h \ Pages/AptSourceManager/apt_source_manager_page.h \ Pages/AptSourceManager/apt_source_repository_item.h \ Pages/GnomeSettings/gnome_settings_page.h \ Pages/GnomeSettings/unity_settings.h \ Pages/GnomeSettings/window_manager_settings.h \ Pages/GnomeSettings/appearance_settings.h \ sliding_stacked_widget.h \ utilities.h \ feedback.h \ Pages/AptSourceManager/apt_source_edit.h \ Managers/setting_manager.h \ signal_mapper.h \ Pages/Search/search_page.h \ Pages/Helpers/helpers_page.h \ Pages/Helpers/host_manage.h FORMS += \ app.ui \ Pages/Uninstaller/uninstallerpage.ui \ Pages/Dashboard/circlebar.ui \ Pages/Dashboard/linebar.ui \ Pages/StartupApps/startup_app.ui \ Pages/StartupApps/startup_app_edit.ui \ Pages/StartupApps/startup_apps_page.ui \ Pages/Services/service_item.ui \ Pages/Resources/history_chart.ui \ Pages/SystemCleaner/system_cleaner_page.ui \ Pages/Dashboard/dashboard_page.ui \ Pages/Processes/processes_page.ui \ Pages/Resources/resources_page.ui \ Pages/Services/services_page.ui \ Pages/Settings/settings_page.ui \ Pages/AptSourceManager/apt_source_manager_page.ui \ Pages/AptSourceManager/apt_source_repository_item.ui \ Pages/GnomeSettings/gnome_settings_page.ui \ Pages/GnomeSettings/unity_settings.ui \ Pages/GnomeSettings/window_manager_settings.ui \ Pages/GnomeSettings/appearance_settings.ui \ Pages/AptSourceManager/apt_source_edit.ui \ Pages/Search/search_page.ui \ Pages/Helpers/helpers_page.ui \ feedback.ui \ Pages/Helpers/host_manage.ui TRANSLATIONS += \ ../translations/stacer_ar.ts \ ../translations/stacer_ca-es.ts \ ../translations/stacer_de.ts \ ../translations/stacer_en.ts \ ../translations/stacer_es.ts \ ../translations/stacer_fr.ts \ ../translations/stacer_hi.ts \ ../translations/stacer_it.ts \ ../translations/stacer_kn.ts \ ../translations/stacer_ko.ts \ ../translations/stacer_ml.ts \ ../translations/stacer_nl.ts \ ../translations/stacer_oc.ts \ ../translations/stacer_pl.ts \ ../translations/stacer_pt.ts \ ../translations/stacer_ru.ts \ ../translations/stacer_sv.ts \ ../translations/stacer_tr.ts \ ../translations/stacer_ua.ts \ ../translations/stacer_vn.ts \ ../translations/stacer_zh-cn.ts \ ../translations/stacer_zh-tw.ts RESOURCES += \ static.qrc unix:!macx: LIBS += -L$$OUT_PWD/../stacer-core/ -lstacer-core INCLUDEPATH += $$PWD/../stacer-core DEPENDPATH += $$PWD/../stacer-core ================================================ FILE: stacer/static/languages.json ================================================ [ {"value" : "ar", "text": "العربية"}, {"value" : "ca-es", "text": "Català"}, {"value" : "cs", "text": "Čeština"}, {"value" : "de", "text": "Deutsch"}, {"value" : "en", "text": "English"}, {"value" : "ko", "text": "한국어"}, {"value" : "es", "text": "Español"}, {"value" : "fr", "text": "Français"}, {"value" : "hi", "text": "हिंदी"}, {"value" : "hu", "text": "Magyar"}, {"value" : "it", "text": "Italiano"}, {"value" : "kn", "text": "ಕನ್ನಡ"}, {"value" : "ml", "text": "മലയാളം"}, {"value" : "nl", "text": "Nederlands"}, {"value" : "oc", "text": "Occitan"}, {"value" : "pl", "text": "Polski"}, {"value" : "pt", "text": "Português - Brasil"}, {"value" : "ru", "text": "Русский"}, {"value" : "sv", "text": "Svenska"}, {"value" : "tr", "text": "Türkçe"}, {"value" : "ua", "text": "Українська"}, {"value" : "vn", "text": "Tiếng việt"}, {"value" : "zh-cn", "text": "简体中文"}, {"value" : "zh-tw", "text": "正體中文"} ] ================================================ FILE: stacer/static/themes/default/style/style.qss ================================================ /****** DEFAULT THEME ******/ /***************** QScrollArea ******************/ QScrollArea { border: 0; } QScrollBar:vertical { width: 12; margin: 0 0 0 2; border-radius: 2; background-color: transparent; } QScrollBar::handle:vertical { background-color: @color01; min-height: 20px; border-radius: 2; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { border-bottom-right-radius: 2; border-bottom-left-radius: 2; background-color: transparent; } QScrollBar:horizontal { height: 12; margin: 2 0 0 0; border-radius: 2; background-color: transparent; } QScrollBar::handle:horizontal { background-color: @color01; min-width: 20px; border-radius: 2; } QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { height: 0; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { border-bottom-right-radius: 2; border-bottom-left-radius: 2; background-color: transparent; } QAbstractScrollArea::corner { background: transparent; } /************* QMessageBox **************/ QMessageBox { background-color: #212f3c; } QMessageBox QLabel { color: #fefefe; } /************* QMenu **************/ QMenu { background-color: @color02; border-radius: 2; margin: 3px 5px; } QMenu::item { padding: 2px 30px; color: @color05; font-size: 10pt; } QMenu::item:selected { background-color: @color03; } QMenu::indicator { width: 14px; height: 14px; } QMenu::indicator:non-exclusive:unchecked { image: url(:/static/themes/common/img/un-check.png); } QMenu::indicator:non-exclusive:checked { image: url(:/static/themes/common/img/check.png); } /***************** QRadioButton ******************/ QRadioButton { color: @color12; font-size: 11pt; } QRadioButton::indicator { width: 16; height: 16; } QRadioButton::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } QRadioButton::indicator:checked { image: url(:/static/themes/common/img/check.png); } /***************** QCheckBox ******************/ QCheckBox::indicator { width: 44px; height: 24px; } QCheckBox::indicator:checked { image: url(:/static/themes/common/img/checkbox.png); } QCheckBox::indicator:unchecked { image: url(:/static/themes/common/img/un-checkbox.png); } QCheckBox[accessibleName="circle"] { font-size: 10pt; color: @color06; } QCheckBox[accessibleName="circle"]::indicator { width: 18px; height: 18px; } QCheckBox[accessibleName="circle"]::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } QCheckBox[accessibleName="circle"]::indicator:checked { image: url(:/static/themes/common/img/check.png); } /***************** QToolTip ******************/ QToolTip { color: @color05; padding: 2; background-color: @sidebar; border-radius: 3; } /*************** Not Found ***************/ #notFoundWidget, QWidget[accessibleName="notFoundWidget"] { background: url(:/static/themes/common/img/not-found.png) no-repeat top center; } #notFoundWidget QLabel, QWidget[accessibleName="notFoundWidget"] { color: @color06; font-size: 13pt; } /*************** QSpinBox ***************/ QSpinBox::up-button { subcontrol-origin: border; subcontrol-position: top right; width: 16px; border-image: url(:/static/themes/common/img/spinup.png) 1; border-width: 1px; } QSpinBox::down-button { subcontrol-origin: border; subcontrol-position: bottom right; width: 16px; border-image: url(:/static/themes/common/img/spindown.png) 1; border-width: 1px; border-top-width: 0; } /*************** QSlider ***************/ QSlider::groove:horizontal { height: 2px; background: @color12; margin: 2px 0; } QSlider::handle:horizontal { background-color: @color03; width: 14px; height: 14px; margin: -6px 0; border-radius: 7px; } /*************** QComboBox ***************/ QComboBox { border: 0; border-radius: 2; background-color: @color01; padding: 4 0 4 10; font-size: 11pt; color: @color05; min-width: 100; } QComboBox::drop-down { background-color: @color01; subcontrol-position: top right; width: 14; padding: 0 5; color: @color05; border-left-width: 1px; border-left-color: @color01; border-left-style: solid; image: url(:/static/themes/default/img/down-arrow.png); border-top-right-radius: 2; border-bottom-right-radius: 2; } QComboBox::down-arrow:on { background-color: @color01; color: @color05; } QComboBox QAbstractItemView { background-color: @color01; border: 0; } /*************** QGroupBox ***************/ QGroupBox::title { font-size: 11pt; font-weight: bold; color: @color06; } /*************** QTableView ***************/ QTableView { background-color: transparent; selection-color: @color05; color: @color05; font-size: 10pt; gridline-color: @color08; border-radius: 2; } QTableView::item { font-size: 11pt; color: @color05; padding: 6 0 6 -10; background-color: @color01; } QTableView::item:selected { background-color: @color02; } QHeaderView::section { background-color: @color02; border-width: 1 1 1 0; border-style: solid; border-color: @color08; font-size: 11pt; color: @color16; padding-left:10; } QHeaderView::up-arrow { image: url(:/static/themes/default/img/asc.png); } QHeaderView::down-arrow { image: url(:/static/themes/default/img/dsc.png); } /****************** QMainWindow *******************/ QMainWindow * { font-family: "Ubuntu"; } QLineEdit, QPlainTextEdit, QSpinBox { border-radius: 2; padding: 6; background-color: @color01; font-size: 10pt; color: @color05; } QPushButton { border-radius: 2; font-size: 11pt; } QPushButton[accessibleName="danger"] { padding: 6 16; background-color: @color09; color: @color07; } QPushButton[accessibleName="danger"]:hover { background-color: #c0392b; } QPushButton[accessibleName="primary"] { padding: 6 16; background-color: @color03; color: @color07; } QPushButton[accessibleName="primary"]:hover { background-color: @color10; } QLabel[accessibleName="dialog-title"] { color: @color06; font-size: 11pt; padding-bottom: 8; border: 0; border-bottom: 1 solid @color06; } #lblErrorMsg { color: @color09; } /************** Sidebar ***************/ #sidebar { background-color: @sidebar; min-width: 60; } #sidebar QPushButton { border: 0px; height: 42; border-style: solid; color: @color07; margin: 0 0; border-radius: 0; } #sidebar QPushButton:checked, #sidebar QPushButton:hover { background-color: @color03; } #pageTitle { color: @color04; padding: 5 0 8 0; margin: 5 10; border: 0; border-bottom: 1 solid @color04; } #pageContent { background-color: @color08; } #btnDash { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/dash.png); } #btnSystemCleaner { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/cleaner.png); } #btnStartupApps { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/startup-apps.png); } #btnSearch { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/search.png); } #btnServices { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/services.png); } #btnProcesses { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/process.png); } #btnUninstaller { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/uninstaller.png); } #btnResources { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/resources.png); } #btnHelpers { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/helpers.png); } #btnAptSourceManager { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/ppa-manager.png); } #btnGnomeSettings { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/gnome.png); } #btnSettings { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/settings.png); } #btnFirewall { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/firewall.png); } #btnFeedback { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/feedback.png); } /******************** DASHBOARD PAGE *********************/ /* - Circle Bar - */ #widgetCircleBar { background-color: @color01; border-radius: 1; } #lblCircleChartTitle, #lblCircleChartValue { color: @color05; font-size: 13pt; margin: 0; } /* - Line Bar - */ #lineChartWidget { background-color: @color01; border-radius: 1; } #lblLineChartTitle { color: @color05; font-size: 13pt; } #lblLineChartValue { color: @color05; font-size: 13pt; } #lblLineChartTotal { color: @color06; font-size: 11pt; } #lineChartProgress { background-color: @color08; border: 0; border-radius: 0; } #lineChartProgress::chunk { background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #3498db, stop:1 #2980b9); } /* - System Info - */ #lblSystemInfoTitle { color: @color05; font-size: 13pt; padding-left: 5; } #listViewSystemInfo { border: 0; background-color: transparent; font-size: 12pt; color: @color06; } /************************** SYSTEM CLEANER PAGE ***************************/ #cleanerCategories QCheckBox[accessibleName=circle]::indicator { width: 26; height: 26; } #cleanerCategories QLabel, #checkSelectAllSystemScan { font-size: 11pt; color: @color05; } /* - System Scan Button - */ #SystemCleanerPage #btnScan { border: 0; background: url(:/static/themes/default/img/scan.png) no-repeat center; } #SystemCleanerPage #btnScan:hover { background: url(:/static/themes/default/img/scan-active.png) no-repeat center; } /* - System Clean Button - */ #SystemCleanerPage #btnClean { border: 0; background: url(:/static/themes/default/img/clean.png) no-repeat center; } #SystemCleanerPage #btnClean:hover { background: url(:/static/themes/default/img/clean-active.png) no-repeat center; } /* - System Scan Results - */ #btnBackToCategories { border: 0; font-size: 11pt; color: @color03; } #treeWidgetScanResult { border: 1 solid @color13; background-color: transparent; border-radius: 2; } #treeWidgetScanResult QHeaderView::section { border-top: 1; } #treeWidgetScanResult::item { border-bottom: 1 solid @color14; padding: 7 3; font-size: 11pt; color: @color11; } #treeWidgetScanResult::indicator { width: 14; height: 14; } #treeWidgetScanResult::indicator:checked { image: url(:/static/themes/common/img/check.png); } #treeWidgetScanResult::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } #treeWidgetScanResult::branch:has-children:!has-siblings:closed, #treeWidgetScanResult::branch:closed:has-children:has-siblings { image: url(:/static/themes/default/img/right-arrow.png); border-image: none; padding: 4; } #treeWidgetScanResult::branch:open:has-children:!has-siblings, #treeWidgetScanResult::branch:open:has-children:has-siblings { image: url(:/static/themes/default/img/down-arrow.png); border-image: none; padding: 4; } #treeWidgetScanResult::branch { border-bottom: 1 solid @color14; } #lblRemovedTotalSize { font-size: 11pt; color: @color15; } /************************ STARTUP APPS PAGE *************************/ #listWidgetStartup { background-color: transparent; } #lblStartupAppsTitle { color: @color11; padding: 10 0 10 20; } /* - Startup App - */ #widgetStartupApp { border-radius: 2; background-color: @color01; } #lblStartupAppIcon { image: url(:/static/themes/default/img/app.png); } #widgetStartupApp:hover { background-color: @color02; } #widgetStartupApp #lblStartupAppName { font-size: 11pt; color: @color05; } #checkStartup { margin-top: 3; } #widgetStartupApp #btnDeleteStartupApp { qproperty-icon: url(:/static/themes/default/img/trash.png); border: 0; } #widgetStartupApp #btnEditStartupApp { qproperty-icon: url(:/static/themes/default/img/edit.png); border: 0; margin-bottom: 2; } /* - Startup App Edit - */ #StartupAppEdit { background-color: @color08; } /************************** SERVICES PAGE ***************************/ #ServicesPage QListWidget { background-color: transparent; } #lblServicesTitle { font-size: 11pt; color: @color11; padding: 10 0; } /* - Service Item - */ #serviceItemWidget { border-radius: 2; background-color: @color01; } #serviceItemWidget:hover { background-color: @color02; } #lblServiceIcon { image: url(:/static/themes/default/img/service.png); } #ServiceItem #lblServiceName { font-size: 11pt; color: @color05; } #ServiceItem #lblServiceDescription { font-size: 10pt; color: @color06; } #lblServiceStartupImg { image: url(:/static/themes/default/img/power.png); } #lblSystemRunningImg { image: url(:/static/themes/default/img/run.png); } /********************** PROCESSES PAGE ***********************/ #lblProcessTitle { color: @color11; padding: 10 0; font-size: 11pt; } #checkAllProcesses { margin-top: 2; color: @color12; font-size: 10pt; } #checkAllProcesses::indicator { width: 14; height: 14; } #txtProcessSearch { width: 150; padding: 4 12; border-radius: 12; background: @color01 url(:/static/themes/default/img/search.png) no-repeat right center; border: 1px solid @color02; color: @color12; } #lblRefresh { color: @color12; font-size: 10pt; } #sliderRefresh { margin-top: 3; } /************************ UNINSTALLER PAGE *************************/ #nav QPushButton { border-radius: 3; padding: 5 10; font-size: 10pt; background-color: @circleChartBackgroundColor; color: @color07; } #nav QPushButton:hover, #nav QPushButton:checked { background-color: @color03; } #lblPackagesTitle { color: @color11; padding: 10 0; font-size: 11pt; } #txtPackageSearch, #txtSearchAptSource { padding: 4 12; border-radius: 12; background: @color01 url(:/static/themes/default/img/search.png) no-repeat right center; border: 1px solid @color02; color: @color12; } #listWidgetPackages, #listWidgetSnapPackages { border: 0; background-color: transparent; font-size: 11pt; } #listWidgetPackages::indicator, #listWidgetSnapPackages::indicator { width: 16; height: 16; } #listWidgetPackages::indicator:unchecked, #listWidgetSnapPackages::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } #listWidgetPackages::indicator:checked, #listWidgetSnapPackages::indicator:checked { image: url(:/static/themes/common/img/check.png); } #listWidgetPackages::item, #listWidgetSnapPackages::item { border-radius: 2; min-height: 45; background-color: @color01; } #listWidgetPackages::item:text, #listWidgetSnapPackages::item:text { color: @color05; padding-left: 15; } #listWidgetPackages::item:selected, #listWidgetSnapPackages::item:selected { background-color: @color02; border: 0; } #listWidgetPackages::item:hover, #listWidgetSnapPackages::item:hover { background-color: @color02; } /**************** HISTORIES *****************/ #charts { background-color: @pageContent; } #lblHistoryTitle { font-size: 11pt; margin: 6 0 10 0; color: @color12; } #checkHistoryTitle::indicator { width: 16; height: 16; } #checkHistoryTitle::indicator:unchecked { image: url(:/static/themes/default/img/fit.png); } #checkHistoryTitle::indicator:checked { image: url(:/static/themes/default/img/collapse.png); } /*************** SETTINGS ****************/ #SettingsPage QLabel { font-size: 11pt; color: @color12; } #lblCreatedBy { font-size: 9pt; color: @color06; } /***************** UPDATE BAR ******************/ #widgetUpdateBar { background-color: @color03; border-radius: 2; } #lblUpdateBarText { font-size: 10pt; color: @color05; } #btnDownloadUpdate { background-color: @color01; padding: 4 10; } /**************** FEEDBACK *****************/ #Feedback { background-color: @pageContent; } /************************** APT SOURCE MANAGER PAGE ***************************/ #listWidgetAptSources { background-color: transparent; } #lblAptSourceTitle { color: @color11; padding: 10 0 5 20; } #txtAptSource { padding: 7; } #lblAptSourceSelectInfo { margin-top: 5; font-size: 10pt; color: @color05; } #listWidgetAptSources { selection-background-color: @color03; } /* - APT Source Repository Item - */ #aptSourceRepositoryItemWidget { border-radius: 2; background-color: @color01; } #lblAptSourceIcon { image: url(:/static/themes/default/img/ppa-repository.png); } #aptSourceRepositoryItemWidget:hover { background-color: @color02; } #lblAptSourceName { font-size: 11pt; color: @color05; } #checkAptSource { margin-top: 3; } /* - APT Source Repository Item Edit - */ #APTSourceEdit { background-color: @pageContent; } /************************** GNOME SETTINGS PAGE ***************************/ #GnomeSettingsPage QLabel { font-size: 11pt; color: @color12; } #GnomeSettingsPage QMenu { background-color: @color01; } #GnomeSettingsPage QLabel[accessibleName="general-title"] { font-size: 12pt; font-weight: bold; color: @color03; border: 0; border-bottom: 1 solid @color03; padding-bottom: 5; } #GnomeSettingsPage QLabel[accessibleName="title"] { font-size: 11pt; font-weight: bold; color: @color06; border: 0; border-bottom: 1 dashed @color06; padding-bottom: 10; } #GnomeSettingsPage QPushButton { border-radius: 3; padding: 7 25; font-size: 11pt; background-color: @circleChartBackgroundColor; color: @color07; } #GnomeSettingsPage QPushButton:hover, #GnomeSettingsPage QPushButton:checked { background-color: @color03; } /* --- Unity Settings --- */ #scrollAreaUnityContents { background-color: @pageContent; } /******************************* SEARCH *******************************/ #txtSearchInput { padding: 5 12 5 24; border-radius: 12; background: @color01 url(:/static/themes/default/img/search.png) no-repeat left center; border: 1px solid @color02; color: @color12; } #btnSearchAdvance { padding: 3; background-color: @color03; color: @color07; } #lblFoundFilesInfo { color: @color15; } #lblSearchDir { font-size: 10pt; color: @color06; } #btnBrowseSearchDir { background-color: @color01; padding: 6 8; color: @color05; } #advanceSearchPane QSpinBox { padding: 4 6; } #advanceSearchPane QCheckBox[accessibleName="circle"]::indicator { width: 15px; height: 15px; } #advanceSearchPane QLabel { color: @color06; } #advanceSearchPane QLineEdit { padding: 4 6; } #btnAdvancePaneToggle, #btnNewHost { font-size: 10pt; text-decoration: underline; color: @color03; } #lblHostTitle { font-size: 11pt; color: @color12; } ================================================ FILE: stacer/static/themes/default/style/values.ini ================================================ @pageContent=#1b252f @sidebar=#15191c @circleChartBackgroundColor=#212f3c @historyChartBackgroundColor=#212f3c @chartLabelColor=#7d8ea0 @chartGridColor=#7d8ea0 @color01=#212f3c @color02=#263848 @color03=#075ffe @color04=#8394a6 @color05=#eeeeee @color06=#7d8ea0 @color07=#ffffff @color08=#1b252f @color09=#f44336 @color10=#075fbb @color11=#dddddd @color12=#aeb5bf @color13=#293945 @color14=#314452 @color15=#00eb55 @color16=#00d4ff ================================================ FILE: stacer/static/themes/light/style/style.qss ================================================ /****** LIGHT THEME ******/ /**************** SCROLL BAR *****************/ QScrollArea { border: 0; } QScrollBar:vertical { width: 12; margin: 0 0 0 2; border-radius: 2; background-color: transparent; } QScrollBar::handle:vertical { background-color: @color01; min-height: 20px; border-radius: 2; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { border-bottom-right-radius: 2; border-bottom-left-radius: 2; background-color: transparent; } QScrollBar:horizontal { height: 12; margin: 2 0 0 0; border-radius: 2; background-color: transparent; } QScrollBar::handle:horizontal { background-color: @color01; min-width: 20px; border-radius: 2; } QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { height: 0; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { border-bottom-right-radius: 2; border-bottom-left-radius: 2; background-color: transparent; } QAbstractScrollArea::corner { background: transparent; } /************* QMessageBox **************/ QMessageBox { background-color: #212f3c; } QMessageBox QLabel { color: #fefefe; } /************* QMenu **************/ QMenu { background-color: @color07; border-radius: 2; margin: 3px 5px; } QMenu::item { padding: 2px 30px; color: @color02; font-size: 10pt; } QMenu::item:selected { background-color: @color01; } QMenu::indicator { width: 14px; height: 14px; } QMenu::indicator:non-exclusive:unchecked { image: url(:/static/themes/common/img/un-check.png); } QMenu::indicator:non-exclusive:checked { image: url(:/static/themes/common/img/check.png); } /***************** QRadioButton ******************/ QRadioButton { color: @color02; font-size: 11pt; } QRadioButton::indicator { width: 16; height: 16; } QRadioButton::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } QRadioButton::indicator:checked { image: url(:/static/themes/common/img/check.png); } /*************** QCheckBox ****************/ QCheckBox::indicator { width: 44px; height: 24px; } QCheckBox::indicator:checked { image: url(:/static/themes/common/img/checkbox.png); } QCheckBox::indicator:unchecked { image: url(:/static/themes/common/img/un-checkbox.png); } QCheckBox[accessibleName="circle"] { font-size: 10pt; color: @color02; } QCheckBox[accessibleName="circle"]::indicator { width: 18px; height: 18px; } QCheckBox[accessibleName="circle"]::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } QCheckBox[accessibleName="circle"]::indicator:checked { image: url(:/static/themes/common/img/check.png); } /***************** QToolTip ******************/ QToolTip { color: @color01; background-color: #8394a6; border: 1px solid #8394a6; border-radius: 2; } /*************** Not Found ***************/ #notFoundWidget, QWidget[accessibleName="notFoundWidget"] { background: url(:/static/themes/common/img/not-found.png) no-repeat top center; } #notFoundWidget QLabel, QWidget[accessibleName="notFoundWidget"] { color: @color02; font-size: 13pt; } /*************** QSpinBox ***************/ QSpinBox::up-button { subcontrol-origin: border; subcontrol-position: top right; width: 16px; border-image: url(:/static/themes/common/img/spinup.png) 1; border-width: 1px; } QSpinBox::down-button { subcontrol-origin: border; subcontrol-position: bottom right; width: 16px; border-image: url(:/static/themes/common/img/spindown.png) 1; border-width: 1px; border-top-width: 0; } /*************** QSlider ***************/ QSlider::groove:horizontal { height: 2px; background: @color08; margin: 2px 0; } QSlider::handle:horizontal { background-color: @color03; width: 14px; height: 14px; margin: -6px 0; border-radius: 7px; } /*************** QComboBox ***************/ QComboBox { border: 0; border-radius: 2; background-color: @color01; padding: 4 0 4 10; font-size: 11pt; color: @color02; min-width: 100; } QComboBox::drop-down { background-color: @color01; subcontrol-position: top right; width: 14; padding: 0 5; color: @color02; border-left-width: 1px; border-left-color: @color01; border-left-style: solid; image: url(:/static/themes/light/img/down-arrow.png); border-top-right-radius: 2; border-bottom-right-radius: 2; } QComboBox::down-arrow:on { background-color: @color01; color: @color05; } QComboBox QAbstractItemView { background-color: @color01; border: 0; } /*************** QGroupBox ***************/ QGroupBox::title { font-size: 11pt; font-weight: bold; color: @color02; } /*************** QTableView ***************/ QTableView { background-color: transparent; selection-color: @color02; color: @color02; font-size: 10pt; gridline-color: @pageContent; border-radius: 2; } QTableView::item { font-size: 11pt; color: @color02; padding: 6 0 6 -10; background-color: @color01; } QTableView::item:selected { background-color: @color07; } QHeaderView::section { background-color: @color07; border-width: 1 1 1 0; border-style: solid; border-color: @pageContent; font-size: 11pt; color: @color06; padding-left:10; } QHeaderView::up-arrow { image: url(:/static/themes/default/img/asc.png); } QHeaderView::down-arrow { image: url(:/static/themes/default/img/dsc.png); } /****************** QMainWindow *******************/ QMainWindow * { font-family: "Ubuntu"; } QLineEdit, QPlainTextEdit, QSpinBox { border-radius: 2; padding: 6; background-color: @color01; font-size: 10pt; color: @color02; } QPushButton { border-radius: 2; font-size: 11pt; } QPushButton[accessibleName="danger"] { padding: 6 16; background-color: @color11; color: @color05; } QPushButton[accessibleName="danger"]:hover { background-color: #c0392b; } QPushButton[accessibleName="primary"] { padding: 6 16; background-color: @color03; color: @color05; } QPushButton[accessibleName="primary"]:hover { background-color: @color10; } QLabel[accessibleName="dialog-title"] { color: @color02; font-size: 11pt; padding-bottom: 8; border: 0; border-bottom: 1 solid @color02; } #lblErrorMsg { color: @color11; } /************** Sidebar ***************/ #sidebar { background-color: @sidebar; min-width: 60; } #sidebar QPushButton { border: 0px; height: 42; border-style: solid; color: @color01; margin: 0 0; border-radius: 0; } #sidebar QPushButton:checked, #sidebar QPushButton:hover { background-color: @color03; } #pageTitle { color: @color02; padding: 5 0 8 0; margin: 5 10; border: 0; border-bottom: 1 solid @color09; } #pageContent { background-color: @pageContent; } #btnDash { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/dash.png); } #btnSystemCleaner { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/cleaner.png); } #btnStartupApps { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/startup-apps.png); } #btnSearch { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/search.png); } #btnServices { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/services.png); } #btnProcesses { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/process.png); } #btnUninstaller { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/uninstaller.png); } #btnResources { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/resources.png); } #btnHelpers { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/helpers.png); } #btnAptSourceManager { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/ppa-manager.png); } #btnGnomeSettings { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/gnome.png); } #btnSettings { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/settings.png); } #btnFirewall { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/firewall.png); } #btnFeedback { qproperty-icon: url(:/static/themes/default/img/sidebar-icons/feedback.png); } /********************* DASHBOARD PAGE **********************/ /* - Circle Bar - */ #widgetCircleBar { background-color: @color01; border-radius: 1; } #lblCircleChartTitle, #lblCircleChartValue { color: @color02; font-size: 13pt; margin: 0; } /* - Line Bar - */ #lineChartWidget { background-color: @color01; border-radius: 1; } #lblLineChartTitle { color: @color02; font-size: 13pt; } #lblLineChartValue { color: @color02; font-size: 13pt; } #lblLineChartTotal { color: @color02; font-size: 11pt; } #lineChartProgress { background-color: @pageContent; border: 0; border-radius: 0; } #lineChartProgress::chunk { background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #3498db, stop:1 #2980b9); } /* - System Info - */ #lblSystemInfoTitle { color: @color02; font-size: 13pt; padding-left: 5; } #listViewSystemInfo { border: 0; background-color: transparent; font-size: 12pt; color: @color02; } /************************** SYSTEM CLEANER PAGE ***************************/ #SystemCleanerPage QCheckBox[accessibleName=circle]::indicator { width: 26; height: 26; } #cleanerCategories QLabel, #checkSelectAllSystemScan { font-size: 11pt; color: @color02; } /* - System Scan Button - */ #SystemCleanerPage #btnScan { border: 0; background: url(:/static/themes/light/img/scan.png) no-repeat center; } #SystemCleanerPage #btnScan:hover { background: url(:/static/themes/light/img/scan-active.png) no-repeat center; } /* - System Clean Button - */ #SystemCleanerPage #btnClean { border: 0; background: url(:/static/themes/light/img/clean.png) no-repeat center; } #SystemCleanerPage #btnClean:hover { background: url(:/static/themes/light/img/clean-active.png) no-repeat center; } /* - System Scan Results - */ #btnBackToCategories { border: 0; font-size: 11pt; color: @color03; } #treeWidgetScanResult { border: 1 solid @color01; background-color: @color01; border-radius: 2; } #treeWidgetScanResult QHeaderView::section { border-top: 1; } #treeWidgetScanResult::item { border-bottom: 1 solid @pageContent; padding: 7 3; font-size: 11pt; color: @color02; } #treeWidgetScanResult::indicator { width: 14; height: 14; } #treeWidgetScanResult::indicator:checked { image: url(:/static/themes/common/img/check.png); } #treeWidgetScanResult::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } #treeWidgetScanResult::branch:has-children:!has-siblings:closed, #treeWidgetScanResult::branch:closed:has-children:has-siblings { border-image: none; image: url(:/static/themes/light/img/right-arrow.png); padding: 4; } #treeWidgetScanResult::branch:open:has-ch ildren:!has-siblings, #treeWidgetScanResult::branch:open:has-children:has-siblings { border-image: none; image: url(:/static/themes/light/img/down-arrow.png); padding: 4; } #treeWidgetScanResult::branch { border-bottom: 1 solid @pageContent; } #lblRemovedTotalSize { font-size: 11pt; color: @color04; } /************************** STARTUP APPS PAGE ***************************/ #listWidgetStartup { background-color: transparent; } #lblStartupAppsTitle { color: @color03; padding: 10 0 10 20; } /* - Startup App - */ #widgetStartupApp { border-radius: 2; background-color: @color01; } #lblStartupAppIcon { image: url(:/static/themes/light/img/app.png); } #widgetStartupApp:hover { background-color: @color07; } #widgetStartupApp #lblStartupAppName { font-size: 11pt; color: @color02; } #checkStartup { margin-top: 3; } #widgetStartupApp #btnDeleteStartupApp { qproperty-icon: url(:/static/themes/light/img/trash.png); border: 0; } #widgetStartupApp #btnEditStartupApp { qproperty-icon: url(:/static/themes/light/img/edit.png); border: 0; margin-bottom: 2; } /* - Startup App Edit - */ #StartupAppEdit { background-color: @pageContent; } /********************* SERVICES PAGE **********************/ #ServicesPage QListWidget { background-color: transparent; } #lblServicesTitle { font-size: 11pt; color: @color03; padding: 10 0; } /* - Service Item - */ #serviceItemWidget { border-radius: 2; background-color: @color01; } #serviceItemWidget:hover { background-color: @color07; } #lblServiceIcon { image: url(:/static/themes/default/img/service.png); } #ServiceItem #lblServiceName { font-size: 11pt; color: @color02; } #ServiceItem #lblServiceDescription { font-size: 10pt; color: @color06; } #lblServiceStartupImg { image: url(:/static/themes/default/img/power.png); } #lblSystemRunningImg { image: url(:/static/themes/default/img/run.png); } /********************* PROCESSES PAGE **********************/ #lblProcessTitle { color: @color03; padding: 10 0; font-size: 11pt; } #checkAllProcesses { margin-top: 2; color: @color02; font-size: 10pt; } #checkAllProcesses::indicator { width: 14; height: 14; } #txtProcessSearch { width: 150; padding: 4 12; border-radius: 12; background: @color01 url(:/static/themes/default/img/search.png) no-repeat right center; border: 1px solid @color07; color: @color02; } #lblRefresh { color: @color02; font-size: 10pt; } #sliderRefresh { margin-top: 3; } /*********************** UNINSTALLER PAGE ************************/ #UninstallerPage #nav QPushButton { border-radius: 3; padding: 5 12; font-size: 10pt; background-color: @color02; color: @color07; } #UninstallerPage #nav QPushButton:hover, #UninstallerPage #nav QPushButton:checked { background-color: @color03; } #lblPackagesTitle { color: @color03; padding: 10 0; font-size: 11pt; } #txtPackageSearch, #txtSearchAptSource { padding: 4 12; border-radius: 12; background: @color01 url(:/static/themes/default/img/search.png) no-repeat right center; border: 1px solid @color07; color: @color08; } #listWidgetPackages, #listWidgetSnapPackages border:0; background-color: transparent; font-size:11pt; } #listWidgetPackages::indicator, #listWidgetSnapPackages::indicator { min-width: 16; min-height: 16; } #listWidgetPackages::indicator:unchecked, #listWidgetSnapPackages::indicator:unchecked { image: url(:/static/themes/common/img/un-check.png); } #listWidgetPackages::indicator:checked, #listWidgetSnapPackages::indicator:checked { image: url(:/static/themes/default/img/check.png); } #listWidgetPackages::item, #listWidgetSnapPackages::item { border-radius: 2; min-height: 40; max-height: 40; background-color: @color01; } #listWidgetPackages::item:text, #listWidgetSnapPackages::item:text { color: @color02; padding-left: 15; } #listWidgetPackages::item:selected, #listWidgetSnapPackages::item:selected { background-color: @color07; border: 0; } #listWidgetPackages::item:hover, #listWidgetSnapPackages::item:hover { background-color: @color07; } /*************** HISTORIES ****************/ #charts { background-color: @pageContent; } #lblHistoryTitle { font-size: 11pt; margin: 6 0 10 0; color: @color02; } #checkHistoryTitle::indicator { width: 16; height: 16; } #checkHistoryTitle::indicator:unchecked { image: url(:/static/themes/light/img/fit.png); } #checkHistoryTitle::indicator:checked { image: url(:/static/themes/light/img/collapse.png); } /**************** SETTINGS *****************/ #SettingsPage QLabel { font-size: 11pt; color: @color02; } #lblCreatedBy { font-size: 9pt; color: @color06; } /***************** UPDATE BAR ******************/ #widgetUpdateBar { background-color: @color03; border-radius: 2; } #lblUpdateBarText { font-size: 10pt; color: @color05; } #btnDownloadUpdate { background-color: @sidebar; padding: 4 10; } /************************** FEEDBACK ***************************/ #Feedback { background-color: @pageContent; } /************************** APT SOURCE MANAGER PAGE ***************************/ #listWidgetAptSources { background-color: transparent; } #lblAptSourceTitle { font-size: 11pt; color: @color03; padding: 10 0 5 20; } #txtAptSource { padding: 7; } #lblAptSourceSelectInfo { margin-top: 5; font-size: 10pt; color: @color05; } #listWidgetAptSources { selection-background-color: @color03; } /* - APT Source Repository Item - */ #aptSourceRepositoryItemWidget { border-radius: 2; background-color: @color01; } #aptSourceRepositoryItemWidget:hover { background-color: @color07; } #lblAptSourceIcon { image: url(:/static/themes/light/img/ppa-repository.png); } #lblAptSourceName { font-size: 11pt; color: @color02; } #checkAptSource { margin-top: 3; } /* - APT Source Repository Item Edit - */ #APTSourceEdit { background-color: @pageContent; } /************************** GNOME SETTINGS PAGE ***************************/ #GnomeSettingsPage QLabel { font-size: 11pt; color: @color02; } #GnomeSettingsPage QMenu { background-color: @color01; } #GnomeSettingsPage QLabel[accessibleName="general-title"] { font-size: 12pt; font-weight: bold; color: @color03; border: 0; border-bottom: 1 solid @color03; padding-bottom: 5; } #GnomeSettingsPage QLabel[accessibleName="title"] { font-size: 11pt; font-weight: bold; color: @color02; border: 0; border-bottom: 1 dashed @color02; padding-bottom: 10; } #GnomeSettingsPage QPushButton { border-radius: 3; padding: 7 25; font-size: 11pt; background-color: @color02; color: @color07; } #GnomeSettingsPage QPushButton:hover, #GnomeSettingsPage QPushButton:checked { background-color: @color03; } /* --- Unity Settings --- */ #scrollAreaUnityContents { background-color: @pageContent; } /******************************* SEARCH *******************************/ #txtSearchInput { padding: 5 12 5 24; border-radius: 12; background: @color01 url(:/static/themes/default/img/search.png) no-repeat left center; border: 1px solid @color02; color: @color12; } #btnSearchAdvance { padding: 3; background-color: @color03; color: @color07; } ================================================ FILE: stacer/static/themes/light/style/values.ini ================================================ @pageContent=#ecf0f1 @sidebar=#15191c @circleChartBackgroundColor=#ffffff @historyChartBackgroundColor=#ffffff @chartLabelColor=#7d8ea0 @chartGridColor=#8394a6 @color01=#fdfdfd @color02=#7d8ea0 @color03=#075ffe @color04=#00eb55 @color05=#eeeeee @color06=#00d4ff @color07=#f6fafd @color08=#aeb5bf @color09=#8394a6 @color10=#075fbb @color11=#f44336 ================================================ FILE: stacer/static/themes.json ================================================ [ {"value" : "default", "text": "Default"}, {"value" : "light", "text": "Light"} ] ================================================ FILE: stacer/static.qrc ================================================ static/themes/default/style/style.qss static/themes/default/img/sidebar-icons/dash.png static/themes/default/img/sidebar-icons/cleaner.png static/themes/default/img/sidebar-icons/process.png static/themes/default/img/sidebar-icons/resources.png static/themes/default/img/sidebar-icons/services.png static/themes/default/img/sidebar-icons/startup-apps.png static/themes/default/img/sidebar-icons/uninstaller.png static/themes/common/img/checkbox.png static/themes/common/img/un-checkbox.png static/themes/default/img/app.png static/themes/default/img/trash.png static/themes/common/img/not-found.png static/themes/default/img/edit.png static/themes/default/img/service.png static/themes/default/img/search.png static/themes/common/img/check.png static/themes/common/img/un-check.png static/themes/default/img/loading.gif static/themes/default/img/scanLoading.gif static/themes/default/img/refresh.png static/themes/default/img/asc.png static/themes/default/img/dsc.png static/themes/default/img/c_package.png static/themes/default/img/c_crash.png static/themes/default/img/c_logs.png static/themes/default/img/c_cache.png static/themes/default/img/c_trash.png static/themes/default/img/fit.png static/themes/default/img/collapse.png static/themes/default/img/scan.png static/themes/default/img/scan-active.png static/themes/default/img/clean.png static/themes/default/img/clean-active.png static/themes/default/img/down-arrow.png static/themes/default/img/right-arrow.png static/themes/default/img/back.png static/font/Ubuntu-R.ttf static/themes/default/img/sidebar-icons/settings.png static/languages.json static/themes.json static/themes/light/style/style.qss static/themes/light/img/app.png static/themes/light/img/clean-active.png static/themes/light/img/clean.png static/themes/light/img/down-arrow.png static/themes/light/img/edit.png static/themes/light/img/right-arrow.png static/themes/light/img/scan-active.png static/themes/light/img/scan.png static/themes/light/img/scanLoading.gif static/themes/light/img/loading.gif static/themes/light/style/values.ini static/themes/default/style/values.ini static/logo.png static/themes/default/img/run.png static/themes/default/img/power.png static/themes/default/img/sidebar-icons/feedback.png static/themes/default/img/sidebar-icons/gnome.png static/themes/common/img/appearance.png static/themes/common/img/ubuntu.png static/themes/common/img/window.png static/themes/default/img/sidebar-icons/ppa-manager.png static/themes/default/img/ppa-repository.png static/splashscreen.png static/themes/common/img/donate.png static/themes/common/img/spinup.png static/themes/common/img/spindown.png static/themes/light/img/ppa-repository.png static/themes/light/img/collapse.png static/themes/light/img/fit.png static/themes/light/img/trash.png static/themes/common/img/package.png static/themes/default/img/sidebar-icons/search.png static/themes/common/img/folder.png static/themes/common/img/trash_2.png static/themes/common/img/delete.png static/themes/default/img/sidebar-icons/helpers.png ================================================ FILE: stacer/utilities.h ================================================ #ifndef UTILITIES_H #define UTILITIES_H #include #include class Utilities { public: static void addDropShadow(QWidget *widget, const int alpha, const int blur = 15) { addDropShadow(QList() << widget, alpha, blur); } static void addDropShadow(QList widgets, const int alpha, const int blur = 15) { for (QWidget *widget: widgets) { QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(widget); effect->setBlurRadius(blur); effect->setColor(QColor(0, 0, 0, alpha)); effect->setOffset(0); widget->setGraphicsEffect(effect); } } static QString getDesktopValue(const QRegExp &val, const QStringList &lines) { QStringList filteredList = lines.filter(val); if (filteredList.count() > 0) { QStringList directive = filteredList.first().trimmed().split("="); if (directive.count() > 1) { return directive.last().trimmed(); } } return QString(""); } }; #endif // UTILITIES_H ================================================ FILE: stacer-core/CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.1 FATAL_ERROR) project(stacer-core) include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/Info" "${CMAKE_CURRENT_SOURCE_DIR}/Tools" "${CMAKE_CURRENT_SOURCE_DIR}/Utils" ) file(GLOB_RECURSE ${PROJECT_NAME}_srcs "${CMAKE_CURRENT_SOURCE_DIR}/**.cpp") add_definitions(-DSTACERCORE_LIBRARY) find_package(Qt5 COMPONENTS Core Network REQUIRED) add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_srcs}) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Network) ================================================ FILE: stacer-core/Info/cpu_info.cpp ================================================ #include "cpu_info.h" #include "command_util.h" int CpuInfo::getCpuPhysicalCoreCount() const { static int count = 0; if (! count) { QStringList cpuinfo = FileUtil::readListFromFile(PROC_CPUINFO); if (! cpuinfo.isEmpty()) { QSet > physicalCoreSet; int physical = 0; int core = 0; for (int i = 0; i < cpuinfo.size(); ++i) { const QString& line = cpuinfo[i]; if (line.startsWith("physical id")) { QStringList fields = line.split(": "); if (fields.size() > 1) physical = fields[1].toInt(); } if (line.startsWith("core id")) { QStringList fields = line.split(": "); if (fields.size() > 1) core = fields[1].toInt(); // We assume core id appears after physical id. physicalCoreSet.insert(qMakePair(physical, core)); } } count = physicalCoreSet.size(); } } return count; } int CpuInfo::getCpuCoreCount() const { static quint8 count = 0; if (! count) { QStringList cpuinfo = FileUtil::readListFromFile(PROC_CPUINFO); if (! cpuinfo.isEmpty()) count = cpuinfo.filter(QRegExp("^processor")).count(); } return count; } QList CpuInfo::getLoadAvgs() const { QList avgs = {0, 0, 0}; QStringList strListAvgs = FileUtil::readStringFromFile(PROC_LOADAVG).split(QRegExp("\\s+")); if (strListAvgs.count() > 2) { avgs.clear(); avgs << strListAvgs.takeFirst().toDouble(); avgs << strListAvgs.takeFirst().toDouble(); avgs << strListAvgs.takeFirst().toDouble(); } return avgs; } double CpuInfo::getAvgClock() const { const QStringList lines = CommandUtil::exec("bash",{"-c", LSCPU_COMMAND}).split('\n'); const QString clockMHz = lines.filter(QRegExp("^CPU MHz")).first().split(":").last(); return clockMHz.toDouble(); } QList CpuInfo::getClocks() const { QStringList lines = FileUtil::readListFromFile(PROC_CPUINFO) .filter(QRegExp("^cpu MHz")); QList clocks; for(auto line: lines){ clocks.push_back(line.split(":").last().toDouble()); } return clocks; } QList CpuInfo::getCpuPercents() const { QList cpuTimes; QList cpuPercents; QStringList times = FileUtil::readListFromFile(PROC_STAT); if (! times.isEmpty()) { /* user nice system idle iowait irq softirq steal guest guest_nice cpu 4705 356 584 3699 23 23 0 0 0 0 . cpuN 4705 356 584 3699 23 23 0 0 0 0 The meanings of the columns are as follows, from left to right: - user: normal processes executing in user mode - nice: niced processes executing in user mode - system: processes executing in kernel mode - idle: twiddling thumbs - iowait: waiting for I/O to complete - irq: servicing interrupts - softirq: servicing softirqs - steal: involuntary wait - guest: running a normal guest - guest_nice: running a niced guest */ QRegExp sep("\\s+"); int count = CpuInfo::getCpuCoreCount() + 1; for (int i = 0; i < count; ++i) { QStringList n_times = times.at(i).split(sep); n_times.removeFirst(); for (const QString &t : n_times) cpuTimes << t.toDouble(); cpuPercents << getCpuPercent(cpuTimes, i); cpuTimes.clear(); } } return cpuPercents; } int CpuInfo::getCpuPercent(const QList &cpuTimes, const int &processor) const { const int N = getCpuCoreCount()+1; static QVector l_idles(N); static QVector l_totals(N); int utilisation = 0; if (cpuTimes.count() > 0) { double idle = cpuTimes.at(3) + cpuTimes.at(4); // get (idle + iowait) double total = 0.0; for (const double &t : cpuTimes) total += t; // get total time double idle_delta = idle - l_idles[processor]; double total_delta = total - l_totals[processor]; if (total_delta) utilisation = 100 * ((total_delta - idle_delta) / total_delta); l_idles[processor] = idle; l_totals[processor] = total; } if (utilisation > 100) utilisation = 100; else if (utilisation < 0) utilisation = 0; return utilisation; } ================================================ FILE: stacer-core/Info/cpu_info.h ================================================ #ifndef CPUINFO_H #define CPUINFO_H #include #include #include "Utils/file_util.h" #define PROC_CPUINFO "/proc/cpuinfo" #define LSCPU_COMMAND "LANG=nl_NL.UTF-8 lscpu" #define PROC_LOADAVG "/proc/loadavg" #define PROC_STAT "/proc/stat" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT CpuInfo { public: int getCpuPhysicalCoreCount() const; int getCpuCoreCount() const; QList getCpuPercents() const; QList getLoadAvgs() const; double getAvgClock() const; QList getClocks() const; private: int getCpuPercent(const QList &cpuTimes, const int &processor = 0) const; }; #endif // CPUINFO_H ================================================ FILE: stacer-core/Info/disk_info.cpp ================================================ #include "disk_info.h" #include QList DiskInfo::getDisks() const { return disks; } void DiskInfo::updateDiskInfo() { qDeleteAll(disks); disks.clear(); QList storageInfoList = QStorageInfo::mountedVolumes(); for(const QStorageInfo &info: storageInfoList) { if (info.isValid()) { Disk *disk = new Disk(); disk->name = info.displayName(); disk->device = info.device(); disk->size = info.bytesTotal(); disk->used = info.bytesTotal() - info.bytesFree(); disk->free = info.bytesFree(); disk->fileSystemType = info.fileSystemType(); disks << disk; } } } QList DiskInfo::devices() { QSet set; for(const QStorageInfo &info: QStorageInfo::mountedVolumes()) { if (info.isValid()) set.insert(info.device()); } return set.toList(); } DiskInfo::~DiskInfo() { qDeleteAll(disks); } QList DiskInfo::fileSystemTypes() { QSet set; for(const QStorageInfo &info: QStorageInfo::mountedVolumes()) { if (info.isValid()) set.insert(info.fileSystemType()); } return set.toList(); } QList DiskInfo::getDiskIO() const { static QStringList diskNames = getDiskNames(); QList diskReadWrite; quint64 totalRead = 0; quint64 totalWrite = 0; for (const QString diskName : diskNames) { QStringList diskStat = FileUtil::readStringFromFile(QString("/sys/block/%1/stat").arg(diskName)) .trimmed() .split(QRegExp("\\s+")); if (diskStat.count() > 7) { totalRead = totalRead + (diskStat.at(2).toLongLong() * 512); totalWrite = totalWrite + (diskStat.at(6).toLongLong() * 512); } } diskReadWrite.append(totalRead); diskReadWrite.append(totalWrite); return diskReadWrite; } QStringList DiskInfo::getDiskNames() const { QDir blocks("/sys/block"); QStringList disks; for (const QFileInfo entryInfo : blocks.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)) { if (QFile::exists(QString("%1/device").arg(entryInfo.absoluteFilePath()))) { disks.append(entryInfo.baseName()); } } return disks; } ================================================ FILE: stacer-core/Info/disk_info.h ================================================ #ifndef DISKINFO_H #define DISKINFO_H #include "Utils/command_util.h" #include "Utils/file_util.h" #include #include #include "stacer-core_global.h" #define PROC_MOUNTS "/proc/mounts" class Disk; class STACERCORESHARED_EXPORT DiskInfo { public: QList getDisks() const; void updateDiskInfo(); QList getDiskIO() const; QStringList getDiskNames() const; QList fileSystemTypes(); QList devices(); ~DiskInfo(); private: QList disks; }; struct Disk { QString name; QString device; QString fileSystemType; quint64 size; quint64 free; quint64 used; }; #endif // DISKINFO_H ================================================ FILE: stacer-core/Info/memory_info.cpp ================================================ #include "memory_info.h" #include MemoryInfo::MemoryInfo(): memTotal(0), memFree(0), memUsed(0) { } /* https://access.redhat.com/solutions/406773 * * https://stackoverflow.com/questions/41224738/ * Total used memory = MemTotal - MemFree * Non cache/buffer memory (green) = Total used memory - (Buffers + Cached memory) * Buffers (blue) = Buffers * Cached memory (yellow) = Cached + SReclaimable - Shmem * Swap = SwapTotal - SwapFree */ void MemoryInfo::updateMemoryInfo() { QStringList lines = FileUtil::readListFromFile(PROC_MEMINFO) .filter(QRegExp("^MemTotal|^MemFree|^Buffers|^Cached|^SwapTotal|^SwapFree|^Shmem|^SReclaimable")); QRegExp sep("\\s+"); #define getValue(l) lines.at(l).split(sep).at(1).toLong() << 10; memTotal = getValue(0); memFree = getValue(1); buffers = getValue(2); cached = getValue(3); swapTotal = getValue(4); swapFree = getValue(5); sreclaimable = getValue(6); shmem = getValue(7); #undef getValue cached = (cached + sreclaimable - shmem); memUsed = (memTotal - (memFree + buffers + cached)); swapUsed = (swapTotal - swapFree); } quint64 MemoryInfo::getSwapUsed() const { return swapUsed; } quint64 MemoryInfo::getSwapFree() const { return swapFree; } quint64 MemoryInfo::getSwapTotal() const { return swapTotal; } quint64 MemoryInfo::getMemUsed() const { return memUsed; } quint64 MemoryInfo::getMemFree() const { return memFree; } quint64 MemoryInfo::getMemTotal() const { return memTotal; } ================================================ FILE: stacer-core/Info/memory_info.h ================================================ #ifndef MEMORYINFO_H #define MEMORYINFO_H #include "Utils/file_util.h" #define PROC_MEMINFO "/proc/meminfo" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT MemoryInfo { public: MemoryInfo(); void updateMemoryInfo(); quint64 getMemTotal() const; quint64 getMemFree() const; quint64 getMemUsed() const; quint64 getSwapTotal() const; quint64 getSwapFree() const; quint64 getSwapUsed() const; private: // memory quint64 memTotal; quint64 memFree; quint64 memUsed; quint64 buffers; quint64 cached; quint64 sreclaimable; quint64 shmem; // swap quint64 swapTotal; quint64 swapFree; quint64 swapUsed; }; #endif // MEMORYINFO_H ================================================ FILE: stacer-core/Info/network_info.cpp ================================================ #include "network_info.h" #include NetworkInfo::NetworkInfo() { for (const QNetworkInterface &net: QNetworkInterface::allInterfaces()) { if ((net.flags() & QNetworkInterface::IsUp) && (net.flags() & QNetworkInterface::IsRunning) && !(net.flags() & QNetworkInterface::IsLoopBack)) { defaultNetworkInterface = net.name(); break; } } rxPath = QString("/sys/class/net/%1/statistics/rx_bytes") .arg(defaultNetworkInterface); txPath = QString("/sys/class/net/%1/statistics/tx_bytes") .arg(defaultNetworkInterface); } QList NetworkInfo::getAllInterfaces() { return QNetworkInterface::allInterfaces(); } QString NetworkInfo::getDefaultNetworkInterface() const { return defaultNetworkInterface; } quint64 NetworkInfo::getRXbytes() const { quint64 rx = FileUtil::readStringFromFile(rxPath) .trimmed() .toLong(); return rx; } quint64 NetworkInfo::getTXbytes() const { quint64 tx = FileUtil::readStringFromFile(txPath) .trimmed() .toLong(); return tx; } ================================================ FILE: stacer-core/Info/network_info.h ================================================ #ifndef NETWORK_INFO_H #define NETWORK_INFO_H #include #include "Utils/file_util.h" #include "Utils/command_util.h" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT NetworkInfo { public: NetworkInfo(); QString getDefaultNetworkInterface() const; QList getAllInterfaces(); quint64 getRXbytes() const; quint64 getTXbytes() const; private: QString defaultNetworkInterface; QString rxPath; QString txPath; }; #endif // NETWORK_INFO_H ================================================ FILE: stacer-core/Info/process.cpp ================================================ #include "process.h" pid_t Process::getPid() const { return pid; } void Process::setPid(const pid_t &value) { pid = value; } quint64 Process::getRss() const { return rss; } void Process::setRss(const quint64 &value) { rss = value; } double Process::getPmem() const { return pmem; } void Process::setPmem(const double &value) { pmem = value; } quint64 Process::getVsize() const { return vsize; } void Process::setVsize(const quint64 &value) { vsize = value; } QString Process::getUname() const { return uname; } void Process::setUname(const QString &value) { uname = value; } double Process::getPcpu() const { return pcpu; } void Process::setPcpu(const double &value) { pcpu = value; } QString Process::getCmd() const { return cmd; } void Process::setCmd(const QString &value) { cmd = value; } QString Process::getStartTime() const { return startTime; } void Process::setStartTime(const QString &value) { startTime = value; } QString Process::getState() const { return state; } void Process::setState(const QString &value) { state = value; } QString Process::getGroup() const { return group; } void Process::setGroup(const QString &value) { group = value; } int Process::getNice() const { return nice; } void Process::setNice(const int &value) { nice = value; } QString Process::getCpuTime() const { return cpuTime; } void Process::setCpuTime(const QString &value) { cpuTime = value; } QString Process::getSession() const { return session; } void Process::setSession(const QString &value) { session = value; } ================================================ FILE: stacer-core/Info/process.h ================================================ #ifndef PROCESS_H #define PROCESS_H #include "Utils/file_util.h" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT Process { public: pid_t getPid() const; void setPid(const pid_t &value); quint64 getRss() const; void setRss(const quint64 &value); double getPmem() const; void setPmem(const double &value); quint64 getVsize() const; void setVsize(const quint64 &value); QString getUname() const; void setUname(const QString &value); double getPcpu() const; void setPcpu(const double &value); QString getStartTime() const; void setStartTime(const QString &value); QString getState() const; void setState(const QString &value); QString getGroup() const; void setGroup(const QString &value); int getNice() const; void setNice(const int &value); QString getCpuTime() const; void setCpuTime(const QString &value); QString getSession() const; void setSession(const QString &value); QString getCmd() const; void setCmd(const QString &value); private: pid_t pid; quint64 rss; double pmem; quint64 vsize; QString uname; double pcpu; QString startTime; QString state; QString group; int nice; QString cpuTime; QString session; QString cmd; }; #endif // PROCESS_H ================================================ FILE: stacer-core/Info/process_info.cpp ================================================ #include "process_info.h" #include void ProcessInfo::updateProcesses() { processList.clear(); try { QStringList columns = { "pid", "rss", "pmem", "vsize", "uname:50", "pcpu", "start_time", "state", "group", "nice", "cputime", "session", "cmd"}; QStringList lines = CommandUtil::exec("ps", {"ax", "-weo", columns.join(","), "--no-headings"}) .trimmed() .split(QChar('\n')); if (! lines.isEmpty()) { QRegExp sep("\\s+"); for (const QString &line : lines) { QStringList procLine = line.trimmed().split(sep); if (procLine.count() >= columns.count()) { Process proc; proc.setPid(procLine.takeFirst().toLong()); proc.setRss(procLine.takeFirst().toLong() << 10); proc.setPmem(procLine.takeFirst().toDouble()); proc.setVsize(procLine.takeFirst().toLong() << 10); proc.setUname(procLine.takeFirst()); proc.setPcpu(procLine.takeFirst().toDouble()); proc.setStartTime(procLine.takeFirst()); proc.setState(procLine.takeFirst()); proc.setGroup(procLine.takeFirst()); proc.setNice(procLine.takeFirst().toInt()); proc.setCpuTime(procLine.takeFirst()); proc.setSession(procLine.takeFirst()); proc.setCmd(procLine.join(" ")); processList << proc; } } } } catch (QString &ex) { qCritical() << ex; } } QList ProcessInfo::getProcessList() const { return processList; } ================================================ FILE: stacer-core/Info/process_info.h ================================================ #ifndef PROCESS_INFO_H #define PROCESS_INFO_H #include #include #include #include "process.h" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT ProcessInfo : public QObject { Q_OBJECT public: QList getProcessList() const; public slots: void updateProcesses(); private: QList processList; }; #endif // PROCESS_INFO_H ================================================ FILE: stacer-core/Info/system_info.cpp ================================================ #include "system_info.h" #include #include SystemInfo::SystemInfo() { QString unknown(QObject::tr("Unknown")); QString model = nullptr; QString speed = nullptr; try{ QStringList lines = CommandUtil::exec("bash",{"-c", LSCPU_COMMAND}).split('\n'); //run command in English language (guaratee same behaviour across languages) QRegExp regexp("\\s+"); QString space(" "); auto filterModel = lines.filter(QRegExp("^Model name")); QString modelLine = filterModel.isEmpty() ? "error missing model:error missing model" : filterModel.first(); auto filterSpeed = lines.filter(QRegExp("^CPU max MHz")); QString speedLine = "error:0.0"; if (filterSpeed.isEmpty()) { // fallback to CPU MHz filterSpeed = lines.filter(QRegExp("^CPU MHz")); speedLine = filterSpeed.isEmpty() ? speedLine : filterSpeed.first(); } model = modelLine.split(":").last(); speed = speedLine.split(":").last(); model = model.contains('@') ? model.split("@").first() : model; // intel : AMD speed = QString::number(speed.toDouble()/1000.0) + "GHz"; this->cpuModel = model.trimmed().replace(regexp, space); this->cpuSpeed = speed.trimmed().replace(regexp, space); } catch(QString &ex) { this->cpuModel = unknown; this->cpuSpeed = unknown; } CpuInfo ci; this->cpuCore = QString::number(ci.getCpuPhysicalCoreCount()); // get username QString name = qgetenv("USER"); if (name.isEmpty()) name = qgetenv("USERNAME"); try { if (name.isEmpty()) name = CommandUtil::exec("whoami").trimmed(); } catch (const QString &ex) { qCritical() << ex; } this->username = name; } QString SystemInfo::getUsername() const { return username; } QString SystemInfo::getHostname() const { return QSysInfo::machineHostName(); } QStringList SystemInfo::getUserList() const { QStringList passwdUsers = FileUtil::readListFromFile("/etc/passwd"); QStringList users; for(QString &row: passwdUsers) { users.append(row.split(":").at(0)); } return users; } QStringList SystemInfo::getGroupList() const { QStringList groupFile = FileUtil::readListFromFile("/etc/group"); QStringList groups; for(QString &row: groupFile) { groups.append(row.split(":").at(0)); } return groups; } QString SystemInfo::getPlatform() const { return QString("%1 %2") .arg(QSysInfo::kernelType()) .arg(QSysInfo::currentCpuArchitecture()); } QString SystemInfo::getDistribution() const { return QSysInfo::prettyProductName(); } QString SystemInfo::getKernel() const { return QSysInfo::kernelVersion(); } QString SystemInfo::getCpuModel() const { return this->cpuModel; } QString SystemInfo::getCpuSpeed() const { return this->cpuSpeed; } QString SystemInfo::getCpuCore() const { return this->cpuCore; } QFileInfoList SystemInfo::getCrashReports() const { QDir reports("/var/crash"); return reports.entryInfoList(QDir::Files); } QFileInfoList SystemInfo::getAppLogs() const { QDir logs("/var/log"); //remove only files not directory ex. apache2 (log directory) return logs.entryInfoList(QDir::Files | QDir::NoDotAndDotDot); } QFileInfoList SystemInfo::getAppCaches() const { QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); QDir caches(homePath + "/.cache"); return caches.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); } ================================================ FILE: stacer-core/Info/system_info.h ================================================ #ifndef SYSTEMINFO_H #define SYSTEMINFO_H #include "Utils/file_util.h" #include "Utils/format_util.h" #include "Utils/command_util.h" #include "Info/cpu_info.h" #define LSCPU_COMMAND "LANG=nl_NL.UTF-8 lscpu" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT SystemInfo { public: SystemInfo(); QString getHostname() const; QString getPlatform() const; QString getDistribution() const; QString getKernel() const; QString getCpuModel() const; QString getCpuSpeed() const; QString getCpuCore() const; QString getUsername() const; QFileInfoList getCrashReports() const; QFileInfoList getAppLogs() const; QFileInfoList getAppCaches() const; QStringList getUserList() const; QStringList getGroupList() const; private slots: private: QString cpuCore; QString cpuModel; QString cpuSpeed; QString username; }; #endif // SYSTEMINFO_H ================================================ FILE: stacer-core/Tools/apt_source_tool.cpp ================================================ #include "apt_source_tool.h" #include "Utils/command_util.h" #include "Utils/file_util.h" #include bool AptSourceTool::checkSourceRepository() { QDir sourceList(APT_SOURCES_LIST_D_PATH); bool isExists = sourceList.exists(); return isExists; } void AptSourceTool::removeAPTSource(const APTSourcePtr aptSource) { changeSource(aptSource, ""); } void AptSourceTool::addRepository(const QString &repository, const bool isSource) { if (! repository.isEmpty()) { QStringList args = { "-y", repository }; if (isSource) { args << "-s"; } CommandUtil::sudoExec("add-apt-repository", args); } } void AptSourceTool::changeSource(const APTSourcePtr aptSource, const QString newSource) { QStringList sourceFileContent = FileUtil::readListFromFile(aptSource->filePath); // find line index int pos = -1; for (int i = 0; i < sourceFileContent.count(); ++i) { int _pos = sourceFileContent[i].indexOf(aptSource->source); if (_pos != -1) { pos = i; break; } } if (pos != -1) { if (newSource.isEmpty()) { sourceFileContent.removeAt(pos); } else { sourceFileContent.replace(pos, newSource); } QStringList args = { aptSource->filePath }; QByteArray data = sourceFileContent.join('\n').append('\n').toUtf8(); CommandUtil::sudoExec("tee", args, data); } } void AptSourceTool::changeStatus(const APTSourcePtr aptSource, const bool status) { QString newSource = aptSource->source; newSource.replace("#", ""); if (! status) { // if is deactive newSource = "# " + newSource.trimmed(); } changeSource(aptSource, newSource); } QList AptSourceTool::getSourceList() { QList aptSourceList; QFileInfoList infoList = QDir(APT_SOURCES_LIST_D_PATH).entryInfoList({"*.list"}, QDir::Files, QDir::Time); infoList.append(QFileInfo(APT_SOURCES_LIST_PATH)); // sources.list // example "deb [arch=amd64] http://packages.microsoft.com/repos/vscode stable main" for (const QFileInfo &info : infoList) { QStringList fileContent = FileUtil::readListFromFile(info.absoluteFilePath()).filter(QRegExp("^\\s{0,}#{0,}\\s{0,}deb")); for (const QString &line : fileContent) { QString _line = line.trimmed(); APTSourcePtr aptSource(new APTSource); aptSource->filePath = info.absoluteFilePath(); aptSource->isActive = ! _line.startsWith(QChar('#')); _line.remove('#'); // remove comment // if has options QRegExp regexOption("(\\s[\\[]+.*[\\]]+)"); regexOption.indexIn(_line); if (regexOption.matchedLength() > 0) { aptSource->options = regexOption.cap().trimmed(); } // remove options _line.remove(regexOption); QStringList sourceColumns = _line.trimmed().split(QRegExp("\\s+")); bool isBinary = sourceColumns.first() == "deb"; bool isSource = sourceColumns.first() == "deb-src"; if ((isBinary || isSource) && sourceColumns.count() > 2) { aptSource->isSource = isSource; aptSource->uri = sourceColumns.at(1); aptSource->distribution = sourceColumns.at(2); aptSource->components = sourceColumns.mid(3).join(' '); aptSource->source = line.trimmed().remove('#').trimmed(); aptSourceList.append(aptSource); } } } return aptSourceList; } ================================================ FILE: stacer-core/Tools/apt_source_tool.h ================================================ #ifndef AptSourceTool_H #define AptSourceTool_H #include "Utils/command_util.h" #include "Utils/file_util.h" #include #define APT_SOURCES_LIST_D_PATH "/etc/apt/sources.list.d" #define APT_SOURCES_LIST_PATH "/etc/apt/sources.list" // isSource options uri distribution componentes // example "deb [arch=amd64] http://packages.microsoft.com/repos/vscode stable main" class APTSource { public: QString filePath; bool isSource; QString options; QString uri; QString distribution; QString components; QString source; bool isActive; }; typedef QSharedPointer APTSourcePtr; class AptSourceTool { public: static bool checkSourceRepository(); static QList getSourceList(); static void removeAPTSource(const APTSourcePtr aptSource); static void changeStatus(const APTSourcePtr aptSource, const bool status); static void changeSource(const APTSourcePtr aptSource, const QString newSource); static void addRepository(const QString &repository, const bool isSource); }; #endif // AptSourceTool_H ================================================ FILE: stacer-core/Tools/gnome_schema.h ================================================ #ifndef GNOMESCHEMA_H #define GNOMESCHEMA_H namespace GSchemaPaths { const QString Unity = "/org/compiz/profiles/unity/plugins/unityshell/"; const QString UnityLauncher = "/com/canonical/unity/launcher/"; const QString OpenGL = "/org/compiz/profiles/unity/plugins/opengl/"; const QString Core = "/org/compiz/profiles/unity/plugins/core/"; } namespace GSchemas { namespace Unity { const QString Shell = "org.compiz.unityshell"; const QString Launcher = "com.canonical.Unity.Launcher"; const QString Lens = "com.canonical.Unity.Lenses"; const QString AppLens = "com.canonical.Unity.ApplicationsLens"; const QString FileLens = "com.canonical.Unity.FilesLens"; const QString DateTime = "com.canonical.indicator.datetime"; const QString Sound = "com.canonical.indicator.sound"; const QString Session = "com.canonical.indicator.session"; } namespace Window { const QString OpenGL = "org.compiz.opengl"; const QString Core = "org.compiz.core"; const QString Preferences = "org.gnome.desktop.wm.preferences"; } namespace Appearance { const QString Desktop = "org.gnome.nautilus.desktop"; const QString Background = "org.gnome.desktop.background"; const QString Screensaver = "org.gnome.desktop.screensaver"; const QString Applications = "org.gnome.desktop.a11y.applications"; } } namespace GSchemaKeys { namespace Unity { const QString LauncherHideMode = "launcher-hide-mode"; const QString RevealTrigger = "reveal-trigger"; const QString EdgeResponsiveness = "edge-responsiveness"; const QString LauncherMinimizeApp = "launcher-minimize-window"; const QString LauncherOpacity = "launcher-opacity"; const QString LauncherVisibility = "num-launchers"; const QString LauncherPosition = "launcher-position"; const QString LauncherIconSize = "icon-size"; const QString DashBlur = "dash-blur-experimental"; const QString SearchOnlineResource = "remote-content-search"; const QString DisplayAvailableApps = "display-available-apps"; const QString DisplayRecentApps = "display-recent-apps"; const QString EnableSearchFile = "use-locate"; const QString PanelOpacity = "panel-opacity"; const QString ShowDateTime = "show-clock"; const QString TimeFormat = "time-format"; const QString ShowSeconds = "show-seconds"; const QString ShowDate = "show-date"; const QString ShowDay = "show-day"; const QString ShowCalendar = "show-calendar"; const QString ShowVolume = "visible"; const QString ShowMyName = "show-real-name-on-panel"; } namespace Window { const QString TextureQuality = "texture-filter"; const QString HorizontalWorkSize = "hsize"; const QString VerticalWorkSize = "vsize"; const QString RaiseOnClick = "raise-on-click"; const QString FocusMode = "focus-mode"; const QString ActionDoubleClick = "action-double-click-titlebar"; const QString ActionMiddleClick = "action-middle-click-titlebar"; const QString ActionRightClick = "action-right-click-titlebar"; } namespace Appearance { const QString ShowDesktopIcons = "show-desktop-icons"; const QString ShowHomeIcon = "home-icon-visible"; const QString ShowNetworkIcon = "network-icon-visible"; const QString ShowTrashIcon = "trash-icon-visible"; const QString ShowVolumesIcon = "volumes-visible"; const QString PictureOptions = "picture-options"; const QString ScreenKeyboard = "screen-keyboard-enabled"; const QString ScreenReader = "screen-reader-enabled"; } } namespace GValues { enum RevealLocation { Left, TopLeft }; enum LauncherVisibility { AllDesktop, PrimaryDesktop }; } #endif // GNOMESCHEMA_H ================================================ FILE: stacer-core/Tools/gnome_settings_tool.cpp ================================================ #include "gnome_settings_tool.h" #include "Utils/command_util.h" #include bool GnomeSettingsTool::checkGSettings() { return CommandUtil::isExecutable("gsettings"); } bool GnomeSettingsTool::checkUnityAvailable() { QStringList args = { "list-relocatable-schemas" }; try { QString result = CommandUtil::exec("gsettings", args); QStringList schemas = result.split('\n'); //.filter(QRegExp(GSchemas::Unity::Shell)); QStringList keys = { GSchemas::Unity::Shell, GSchemas::Unity::Launcher, GSchemas::Unity::Lens, GSchemas::Unity::AppLens, GSchemas::Unity::FileLens, GSchemas::Unity::DateTime, GSchemas::Unity::Sound, GSchemas::Unity::Session }; for (const QString schema: schemas) { if (! keys.contains(schema.trimmed())) { return false; } } } catch(const QString &ex) { qWarning() << ex; } return true; } QVariant GnomeSettingsTool::getValue(const QString schema, const QString key, const QString schemaPath) { QStringList args = { "get" }; if (schemaPath.isEmpty()) { args << schema; } else { args << QString("%1:%2").arg(schema).arg(schemaPath); } args << key; QString result; try { result = CommandUtil::exec("gsettings", args); } catch (const QString &ex) { qDebug() << ex; } return QVariant(result.trimmed()); } QString GnomeSettingsTool::getValueS(const QString schema, const QString key, const QString schemaPath) { return getValue(schema, key, schemaPath).toString(); } bool GnomeSettingsTool::getValueB(const QString schema, const QString key, const QString schemaPath) { return getValue(schema, key, schemaPath).toBool(); } int GnomeSettingsTool::getValueI(const QString schema, const QString key, const QString schemaPath) { return getValue(schema, key, schemaPath).toInt(); } float GnomeSettingsTool::getValueF(const QString schema, const QString key, const QString schemaPath) { return getValue(schema, key, schemaPath).toFloat(); } void GnomeSettingsTool::setValue(const QString schema, const QString key, const QVariant value, const QString schemaPath) { QStringList args = { "set" }; if (schemaPath.isEmpty()) { args << schema; } else { args << QString("%1:%2").arg(schema).arg(schemaPath); } args << key << value.toString(); try { CommandUtil::exec("gsettings", args); } catch (const QString &ex) { qDebug() << ex; } } void GnomeSettingsTool::setValueS(const QString schema, const QString key, const QString value, const QString schemaPath) { setValue(schema, key, QVariant(value), schemaPath); } void GnomeSettingsTool::setValueB(const QString schema, const QString key, const bool value, const QString schemaPath) { setValue(schema, key, QVariant(value), schemaPath); } void GnomeSettingsTool::setValueI(const QString schema, const QString key, const int value, const QString schemaPath) { setValue(schema, key, QVariant(value), schemaPath); } void GnomeSettingsTool::setValueF(const QString schema, const QString key, const float value, const QString schemaPath) { setValue(schema, key, QVariant(value), schemaPath); } ================================================ FILE: stacer-core/Tools/gnome_settings_tool.h ================================================ #ifndef GNOME_SETTINGS_TOOL_H #define GNOME_SETTINGS_TOOL_H #include #include "gnome_schema.h" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT GnomeSettingsTool { public: static GnomeSettingsTool& ins() { static GnomeSettingsTool instance; return instance; } bool checkGSettings(); bool checkUnityAvailable(); QVariant getValue(const QString schema, const QString key, const QString schemaPath = QString()); void setValue(const QString schema, const QString key, const QVariant value, const QString schemaPath = QString()); QString getValueS(const QString schema, const QString key, const QString schemaPath = QString()); bool getValueB(const QString schema, const QString key, const QString schemaPath = QString()); int getValueI(const QString schema, const QString key, const QString schemaPath = QString()); float getValueF(const QString schema, const QString key, const QString schemaPath = QString()); void setValueS(const QString schema, const QString key, const QString value, const QString schemaPath = QString()); void setValueB(const QString schema, const QString key, const bool value, const QString schemaPath = QString()); void setValueI(const QString schema, const QString key, const int value, const QString schemaPath = QString()); void setValueF(const QString schema, const QString key, const float value, const QString schemaPath = QString()); }; #endif // GNOME_SETTINGS_TOOL_H ================================================ FILE: stacer-core/Tools/package_tool.cpp ================================================ #include "package_tool.h" #include const PackageTool::PackageTools PackageTool::currentPackageTool = CommandUtil::isExecutable("apt-get") ? PackageTool::APT : CommandUtil::isExecutable("dnf") ? PackageTool::DNF : CommandUtil::isExecutable("yum") ? PackageTool::YUM : CommandUtil::isExecutable("pacman") ? PackageTool::PACMAN : CommandUtil::isExecutable("zypper") ? PackageTool::ZYPPER : PackageTool::UNKNOWN; /*********** * DPKG ***********/ QFileInfoList PackageTool::getDpkgPackageCaches() { QDir caches("/var/cache/apt/archives/"); return caches.entryInfoList(QDir::Files); } QStringList PackageTool::getDpkgPackages() { QStringList packageList = {}; try { packageList = CommandUtil::exec("bash", {"-c", "dpkg --get-selections 2> /dev/null"}) .trimmed() .split('\n') .filter(QRegExp("\\s+install$")); for (int i = 0; i < packageList.count(); ++i) packageList[i] = packageList.at(i).split(QRegExp("\\s+")).first(); } catch(QString &ex) { qCritical() << ex; } return packageList; } bool PackageTool::dpkgRemovePackages(QStringList packages) { try { packages.insert(0, "remove"); packages.insert(1, "-y"); CommandUtil::sudoExec("apt-get", packages); return true; } catch(QString &ex) { qCritical() << ex; } return false; } /********** * RPM **********/ QStringList PackageTool::getRpmPackages() { QStringList packageList = {}; try { packageList = CommandUtil::exec("bash", {"-c", "rpm -qa 2> /dev/null"}) .trimmed() .split('\n'); } catch(QString &ex) { qCritical() << ex; } return packageList; } bool PackageTool::dnfRemovePackages(QStringList packages) { try { packages.insert(0, "remove"); packages.insert(1, "-y"); CommandUtil::sudoExec("dnf", packages); return true; } catch(QString &ex) { qCritical() << ex; } return false; } bool PackageTool::yumRemovePackages(QStringList packages) { try { packages.insert(0, "remove"); packages.insert(1, "-y"); CommandUtil::sudoExec("yum", packages); return true; } catch(QString &ex) { qCritical() << ex; } return false; } /********** * PACMAN **********/ QFileInfoList PackageTool::getPacmanPackageCaches() { QDir caches("/var/cache/pacman/pkg/"); return caches.entryInfoList(QDir::Files); } QStringList PackageTool::getPacmanPackages() { QStringList packageList = {}; try { packageList = CommandUtil::exec("bash", {"-c", "pacman -Q 2> /dev/null"}) .trimmed() .split('\n'); for (int i = 0; i < packageList.count(); ++i) packageList[i] = packageList.at(i).split(QRegExp("\\s+")).first(); } catch(QString &ex) { qCritical() << ex; } return packageList; } bool PackageTool::pacmanRemovePackages(QStringList packages) { try { packages.push_back("--noconfirm"); packages.push_back("-R"); CommandUtil::sudoExec("pacman", packages); return true; } catch(QString &ex) { qCritical() << ex; } return false; } /********** * SNAP **********/ QStringList PackageTool::getSnapPackages() { QStringList packageList = {}; if (CommandUtil::isExecutable("snap")) { try { packageList = CommandUtil::exec("snap", {"list"}) .trimmed() .split('\n'); packageList.removeFirst(); // remove titles e.g name, version for (int i = 0; i < packageList.count(); ++i) packageList[i] = packageList.at(i).split(QRegExp("\\s+")).first(); } catch (QString &ex) { qCritical() << ex; } } return packageList; } bool PackageTool::snapRemovePackages(QStringList packages) { try { packages.insert(0, "remove"); qDebug() << packages; CommandUtil::sudoExec("snap", packages); return true; } catch(QString &ex) { qCritical() << ex; } return false; } ================================================ FILE: stacer-core/Tools/package_tool.h ================================================ #ifndef PACKAGE_TOOL_H #define PACKAGE_TOOL_H #include #include "Utils/command_util.h" #include "Utils/file_util.h" #include "stacer-core_global.h" class STACERCORESHARED_EXPORT PackageTool { public: enum PackageTools { APT, // debian DNF, // fedora YUM, // fedora PACMAN, // arch ZYPPER, // opensuse UNKNOWN }; public: // APT static QFileInfoList getDpkgPackageCaches(); static QStringList getDpkgPackages(); static bool dpkgRemovePackages(QStringList packages); // DNF - YUM static QStringList getRpmPackages(); static bool dnfRemovePackages(QStringList packages); static bool yumRemovePackages(QStringList packages); // Arch static QFileInfoList getPacmanPackageCaches(); static QStringList getPacmanPackages(); static bool pacmanRemovePackages(QStringList packages); // Snap static QStringList getSnapPackages(); static bool snapRemovePackages(QStringList packages); static const PackageTools currentPackageTool; }; #endif // PACKAGE_TOOL_H ================================================ FILE: stacer-core/Tools/service_tool.cpp ================================================ #include "service_tool.h" #include Service::Service(const QString &name, const QString description, const bool status, const bool active) : name(name), description(description), status(status), active(active) { } QList ServiceTool::getServicesWithSystemctl() { QList services = {}; try { QStringList args = { "list-unit-files", "-t", "service", "-a", "--state=enabled,disabled" }; QStringList lines = CommandUtil::exec("systemctl", args) .split(QChar('\n')) .filter(QRegExp("[^@].service")); QRegExp sep("\\s+"); services.reserve(lines.size()); for (const QString &line : lines) { // e.g apache2.service [enabled|disabled] QStringList s = line.trimmed().split(sep); QString name = s.first().trimmed().replace(".service", ""); QString description = getServiceDescription(s.first().trimmed()); bool status = ! s.last().trimmed().compare("enabled"); bool active = serviceIsActive(s.first().trimmed()); services.push_back({name, description, status, active}); } } catch(QString &ex) { qCritical() << ex; } return services; } QString ServiceTool::getServiceDescription(const QString &serviceName) { QStringList args = { "cat", serviceName }; QString result("Unknown"); try { QStringList content = CommandUtil::exec("systemctl", args) .split(QChar('\n')) .filter(QRegExp("^Description")); if (content.length() > 0) { QStringList desc = content.first().split(QChar('=')); if (desc.length() > 0) result = desc.last(); } } catch (QString &ex) { qCritical() << ex; } return result; } bool ServiceTool::serviceIsActive(const QString &serviceName) { QStringList args = { "is-active", serviceName }; QString result(""); try { result = CommandUtil::exec("systemctl", args); } catch(QString &ex) { qCritical() << ex; } return ! result.trimmed().compare("active"); } bool ServiceTool::serviceIsEnabled(const QString &serviceName) { QStringList args = { "is-enabled", serviceName }; QString result(""); try { result = CommandUtil::exec("systemctl", args); } catch(QString &ex) { qCritical() << ex; } return ! result.trimmed().compare("enabled"); } bool ServiceTool::changeServiceStatus(const QString &sname, bool status) { try { QStringList args = { (status ? "enable" : "disable") , sname }; CommandUtil::sudoExec("systemctl", args); return true; } catch(QString &ex) { qCritical() << ex; } return false; } bool ServiceTool::changeServiceActive(const QString &sname, bool status) { try { QStringList args = { (status ? "start" : "stop") , sname }; CommandUtil::sudoExec("systemctl", args); return true; } catch(QString &ex) { qCritical() << ex; } return false; } ================================================ FILE: stacer-core/Tools/service_tool.h ================================================ #ifndef SERVICE_TOOL_H #define SERVICE_TOOL_H #include #include "stacer-core_global.h" class STACERCORESHARED_EXPORT Service { public: Service(const QString &name, const QString description, const bool status, const bool active); QString name; QString description; bool status; bool active; }; class STACERCORESHARED_EXPORT ServiceTool { public: static QList getServicesWithSystemctl(); static bool serviceIsActive(const QString &serviceName); static bool changeServiceStatus(const QString &sname, bool status); static bool changeServiceActive(const QString &sname, bool status); static bool serviceIsEnabled(const QString &serviceName); static QString getServiceDescription(const QString &serviceName); }; #endif // SERVICE_TOOL_H ================================================ FILE: stacer-core/Utils/command_util.cpp ================================================ #include "command_util.h" #include #include #include #include #include QString CommandUtil::sudoExec(const QString &cmd, QStringList args, QByteArray data) { args.push_front(cmd); QString result(""); try { result = CommandUtil::exec("pkexec", args, data); } catch (QString &ex) { qCritical() << ex; } return result; } QString CommandUtil::exec(const QString &cmd, QStringList args, QByteArray data) { std::unique_ptr process(new QProcess()); process->start(cmd, args); if (! data.isEmpty()) { process->write(data); process->waitForBytesWritten(); process->closeWriteChannel(); } // 10 minutes process->waitForFinished(600*1000); QTextStream stdOut(process->readAllStandardOutput()); QString err = process->errorString(); process->kill(); process->close(); if (process->error() != QProcess::UnknownError) throw err; return stdOut.readAll().trimmed(); } bool CommandUtil::isExecutable(const QString &cmd) { return !QStandardPaths::findExecutable(cmd).isEmpty(); } ================================================ FILE: stacer-core/Utils/command_util.h ================================================ #ifndef COMMAND_UTIL_H #define COMMAND_UTIL_H #include #include "stacer-core_global.h" class STACERCORESHARED_EXPORT CommandUtil { public: static QString sudoExec(const QString &cmd, QStringList args = QStringList(), QByteArray data = QByteArray()); static QString exec(const QString &cmd, QStringList args = QStringList(), QByteArray data = QByteArray()); static bool isExecutable(const QString &cmd); }; #endif // COMMAND_UTIL_H ================================================ FILE: stacer-core/Utils/file_util.cpp ================================================ #include "file_util.h" FileUtil::FileUtil() { } QString FileUtil::readStringFromFile(const QString &path, const QIODevice::OpenMode &mode) { QSharedPointer file(new QFile(path)); QString data; if(file->open(mode)) { data = file->readAll(); file->close(); } return data; } QStringList FileUtil::readListFromFile(const QString &path, const QIODevice::OpenMode &mode) { QStringList list = FileUtil::readStringFromFile(path, mode).trimmed().split("\n"); return list; } bool FileUtil::writeFile(const QString &path, const QString &content, const QIODevice::OpenMode &mode) { QFile file(path); if(file.open(mode)) { QTextStream stream(&file); stream << content.toUtf8() << endl; file.close(); return true; } return false; } QStringList FileUtil::directoryList(const QString &path) { QDir dir(path); QStringList list; for (const QFileInfo &info : dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files)) list << info.fileName(); return list; } quint64 FileUtil::getFileSize(const QString &path) { quint64 totalSize = 0; QFileInfo info(path); if (info.exists()) { if (info.isFile()) { totalSize += info.size(); } else if (info.isDir()) { QDir dir(path); for (const QFileInfo &i : dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs)) { totalSize += getFileSize(i.absoluteFilePath()); } } } return totalSize; } ================================================ FILE: stacer-core/Utils/file_util.h ================================================ #ifndef FILEUTIL_H #define FILEUTIL_H #include #include #include #include #include #include #include #include "stacer-core_global.h" class STACERCORESHARED_EXPORT FileUtil { public: static QString readStringFromFile(const QString &path, const QIODevice::OpenMode &mode = QIODevice::ReadOnly); static QStringList readListFromFile(const QString &path, const QIODevice::OpenMode &mode = QIODevice::ReadOnly); static bool writeFile(const QString &path, const QString &content, const QIODevice::OpenMode &mode = QIODevice::WriteOnly | QIODevice::Truncate); static QStringList directoryList(const QString &path); static quint64 getFileSize(const QString &path); private: FileUtil(); }; #endif // FILEUTIL_H ================================================ FILE: stacer-core/Utils/format_util.cpp ================================================ #include "format_util.h" #include QString FormatUtil::formatBytes(const quint64 &bytes) { #define formatUnit(v, u, t) QString().sprintf("%.1f %s", \ ((double) v / (double) u), t) if (bytes == 1L) // bytes return QString("%1 byte").arg(bytes); else if (bytes < KIBI) // bytes return QString("%1 bytes").arg(bytes); else if (bytes < MEBI) // KiB return formatUnit(bytes, KIBI, "KiB"); else if (bytes < GIBI) // MiB return formatUnit(bytes, MEBI, "MiB"); else if (bytes < TEBI) // GiB return formatUnit(bytes, GIBI, "GiB"); else // TiB return formatUnit(bytes, TEBI, "TiB"); #undef formatUnit } ================================================ FILE: stacer-core/Utils/format_util.h ================================================ #ifndef FORMAT_UTIL_H #define FORMAT_UTIL_H #include "stacer-core_global.h" class STACERCORESHARED_EXPORT FormatUtil { public: static QString formatBytes(const quint64 &bytes); public: static const quint64 KIBI = 1024; static const quint64 MEBI = 1048576; static const quint64 GIBI = 1073741824; static const quint64 TEBI = 1099511627776; }; #endif // FORMAT_UTIL_H ================================================ FILE: stacer-core/stacer-core.pro ================================================ #------------------------------------------------- # # Project created by QtCreator 2017-07-02T15:48:51 # #------------------------------------------------- QT -= gui QT += core network CONFIG += c++11 TARGET = stacer-core TEMPLATE = lib DEFINES += STACERCORE_LIBRARY # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ Utils/command_util.cpp \ Utils/file_util.cpp \ Info/network_info.cpp \ Info/cpu_info.cpp \ Info/disk_info.cpp \ Info/memory_info.cpp \ Info/system_info.cpp \ Utils/format_util.cpp \ Tools/service_tool.cpp \ Tools/package_tool.cpp \ Info/process_info.cpp \ Info/process.cpp \ Tools/apt_source_tool.cpp \ Tools/gnome_settings_tool.cpp HEADERS += \ stacer-core_global.h \ Utils/command_util.h \ Info/network_info.h \ Info/cpu_info.h \ Info/disk_info.h \ Info/memory_info.h \ Info/system_info.h \ Utils/format_util.h \ Utils/file_util.h \ Tools/service_tool.h \ Tools/package_tool.h \ Info/process_info.h \ Info/process.h \ Tools/apt_source_tool.h \ Tools/gnome_settings_tool.h \ Tools/gnome_schema.h unix { target.path = /usr/lib INSTALLS += target } ================================================ FILE: stacer-core/stacer-core_global.h ================================================ #ifndef STACERCORE_GLOBAL_H #define STACERCORE_GLOBAL_H #include #if defined(STACERCORE_LIBRARY) # define STACERCORESHARED_EXPORT Q_DECL_EXPORT #else # define STACERCORESHARED_EXPORT Q_DECL_IMPORT #endif #endif // STACERCORE_GLOBAL_H ================================================ FILE: translations/stacer_ar.ts ================================================ APTSourceEdit APT Repository Edit APT Repository Components Options الخيارات Cancel إلغاء Fields cannot be left blank. الحقول لا يمكن تركها فارغة. URI Save حفظ Distribution التوزيعة Source المصدر Binary الحزمة APTSourceManagerPage Search... بحث... Edit تعديل APT Repository Manager Not Found APT Repositories لم يتم العثور على مستودعات الAPT. Delete حذف Enable Source Add Repository إضافة مستودع Cancel إلغاء Select to delete or edit. حدد للحذف أو التعديل. example %1 APT Repositories (%1) Save حفظ APTSourceRepositoryItem %1 (Source Code) App Dashboard لوحة التحكم Startup Apps تطبيقات بدء التشغيل System Cleaner منظف النظام APT Repository Manager Uninstaller ملغي التثبيتات Resources الموارد Processes العمليات Services الخدمات Gnome Settings Settings الإعدادات Feedback المراجعة Quit خروج AppearanceSettings Screen Applications التطبيقات Screen Reader Screen Keyboard Background Image Mode Desktop Mode Login Mode Icons الأيقونات Home Icon Trash Icon Mounted Volumes Icon Show Desktop Icons Network Icon None لا شيء Wallpaper Centered Scaled Stretched Zoom Spanned DashboardPage Dashboard >لوحة التحكم SYSTEM INFO معلومات النظام There are update currently available. هنالك تحديثات موجودة حالياً. Download تنزيل CPU المعالج MEMORY الذاكرة DISK القرص DOWNLOAD تحميل UPLOAD رفع Hostname: %1 اسم المضيف: %1 Platform: %1 نظام التشغيل: %1 Distribution: %1 التوزيعة: %1 Kernel Release: %1 إصدار النواة: %1 CPU Model: %1 طراز المعالج: %1 CPU Speed: %1 سرعة المعالج: %1 CPU Core: %1 نواة المعالج: %1 High CPU Usage The amount of CPU used is over %1%. High Memory Usage The amount of memory used is over %1%. High Disk Usage The amount of disk used is over %1%. Total: %1 المجموع: %1 Feedback Feedback Name Email Address عنوان البريد الإلكتروني Send إرسال Message الرسالة Send a Feedback إرسال المراجعة Email address is not valid ! البريد الإلكتروني غير صالح! Your message must be at least 25 characters ! يجب أن تتكون رسالتك من 25 حرفًا على الأقل! Sending.. إرسال.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>تم إرسال مراجعتك بنجاح.</font> Something went wrong, try again ! حدث خطأ ما حاول مرة أخرى ! Save حفظ Fields cannot be left blank ! الحقول لا يمكن تركها فارغة ! GnomeSettingsPage Gnome Settings Unity Settings Window Manager Appearance ProcessesPage Processes العمليات All Processes كل العمليات Search... بحث... End Process إنهاء عملية Resident Memory الذاكرة المحجوزة %Memory %ذاكرة Virtual Memory الذاكرة الافتراضية User المستخدم Start Time وقت البدء State الحالة Group المجموعة Nice Nice CPU Time زمن المعالج Session الجلسة Process العملية Processes (%1) عمليات (%1) Refresh (%1) إنعاش (%1) QObject Dashboard لوحة التحكم ResourcesPage History of CPU History of CPU Load Averages History of Disk Read Write History of Memory History of Network Read: %1/s Total: %2 Write: %1/s Total: %2 %1 Minute Average: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Resources الموارد ServicesPage Services Startup at boot ? بدء التشغيل عند الإقلاع ؟ Running Now ? جاري التشغيل الآن ؟ Not Found System Service خدمة نظام غير موجودة Running Status Running Not Running Startup Status Enabled Disabled System Services (%1) خدمات نظام (%1) SettingsPage Settings الإعدادات Memory Percent Disk Percent Disks Language لغة Autostart Stacer Alert messages (Show a warning after the specified percentage) Start Page CPU Percent <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Theme سمة Dashboard لوحة التحكم Startup Apps تطبيقات بدء التشغيل System Cleaner منظف النظام Services Processes العمليات Uninstaller ملغي التثبيتات Resources الموارد StartupApp Edit App Delete App StartupAppEdit Startup App تطبيق بدء التشغيل Save حفظ Fields cannot be left blank. الحقول لا يمكن تركها فارغة. App Comment تعليق التطبيق App Name اسم التطبيق Command الأمر Application التطبيق StartupAppsPage Startup Apps تطبيقات بدء التشغيل Add Startup App إضافة تطبيق بدء التشغيل Not Found Startup Apps لا توجد تطبيقات بدء التشغيل Startup Applications (%1) SystemCleanerPage System Cleaner منظف النظام Crash Reports تقارير الإنهيار Application Logs سجلات التطبيق Application Caches الذاكرة المخبئية للتطبيق Trash سلهة المهملات Package Caches الذاكرة المخبئية للحزمة Back للخلف File Name اسم الملف Size الحجم %1 size files cleaned. %1 حجم الملفات التي تم تنظيفها. UninstallerPage Uninstall Selected إلغاء تثبيت المحدّد Not Found Installed Packages لا توجد حزم مثبتة Uninstaller ملغي التثبيتات Search... بحث... System Installed Packages (%1) حزم النظام المثبتة (%1) UnitySettings Applications Show "Recently Used" applications Enable search of your files Show "More Suggestions" Search General Transparency Level Behaviour Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher Appearance Left Bottom Visibility Primary Desktop Icon size All Desktops Position Search online sources Background Blur Panel Indicators Date Calendar Date & Time 24-Hour Time Weekday Include Seconds Volume Show my name أظهر إسمي WindowManagerSettings General Titlebar Actions Right click Double click Middle click Additional Workspace Settings Vertical workspaces Workspace switcher Horizontal workspaces Focus Behaviour Focus mode Raise on click Hardware Acceleration Text quality Fast Good Best Click Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu ================================================ FILE: translations/stacer_ca-es.ts ================================================ APTSourceEdit APT Repository Edit Edita els repositoris APT APT Repository Repositori APT Components Components Options Opcions Cancel Cancel·la Fields cannot be left blank. Els camps no es poden deixar en blanc. URI URI Save Desa Distribution Distribució Source Origen Binary Binari APTSourceManagerPage Search... Cerca... Edit Edita APT Repository Manager Administrador de repositoris APT Not Found APT Repositories No s'ha trobat repositoris APT Delete Esborra Enable Source Activa l'origen Add Repository Afegeix un repositori Cancel Cancel·la Select to delete or edit. Seleccioneu per suprimir-lo o editar-lo example %1 exemple %1 APT Repositories (%1) Repositoris APT (%1) Save Desa APTSourceRepositoryItem %1 (Source Code) %1 (Codi font) App Dashboard Panell de control Startup Apps Aplicacions d'inici System Cleaner Netejador del sistema APT Repository Manager Administrador de repositoris APT Uninstaller Desinstal·lador Resources Recursos Processes Processos Services Serveis Gnome Settings Configuració del Gnome Settings Configuració Feedback Comentaris Quit Surt AppearanceSettings Screen Applications Aplicacions de pantalla Screen Reader Lector de pantalla Screen Keyboard Teclat en pantalla Background Image Mode Mode d'imatge de fons Desktop Mode Mode d'escriptori Login Mode Mode d'inici de sessió Icons Icones Home Icon Icona d'inici Trash Icon Icona de la paperera Mounted Volumes Icon Icona dels volums muntats Show Desktop Icons Mostra les icones de l'escriptori Network Icon Icona de la xarxa None Cap Wallpaper Fons de pantalla Centered Centrat Scaled Escalat Stretched Estirat Zoom Augmentat Spanned Expandit DashboardPage Dashboard Panell de control SYSTEM INFO INFORMACIÓ DEL SISTEMA There are update currently available. Hi ha actualitzacions disponibles. Download Baixa CPU CPU MEMORY MEMÒRIA DISK DISC DOWNLOAD BAIXADA UPLOAD PUJADA Hostname: %1 Nom de l'amfitrió: %1 Platform: %1 Plataforma: %1 Distribution: %1 Distribució: %1 Kernel Release: %1 Versió del nucli: %1 CPU Model: %1 Model de la CPU: %1 CPU Speed: %1 Velocitat de la CPU: %1 CPU Core: %1 Nuclis de la CPU: %1 High CPU Usage Ús alt de CPU The amount of CPU used is over %1%. La quantitat de CPU utilitzada és superior al %1%. High Memory Usage Ús alt de memòria The amount of memory used is over %1%. La quantitat de memòria utilitzada és superior al %1%. High Disk Usage Ús alt de disc The amount of disk used is over %1%. La quantitat de disc utilitzat és superior al %1%. Total: %1 Total: %1 Feedback Feedback Comentaris Name Nom Email Address Adreça de correu Send Envia Message Missatge Send a Feedback Envia comentaris Email address is not valid ! L'adreça de correu no es vàlida Your message must be at least 25 characters ! El vostre missatge ha de tenir com a mínim 25 caràcters! Sending.. S'està enviant... <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Els vostres comentaris s'han enviat amb èxit.</font> Something went wrong, try again ! S'ha produït un error, torneu-ho a provar. Save Desa Fields cannot be left blank ! Els camps no es poden deixar en blanc! GnomeSettingsPage Gnome Settings Configuració del Gnome Unity Settings Configuració del Unity Window Manager Administrador de finestres Appearance Aparença ProcessesPage Processes Processos All Processes Tots els processos Search... Cerca... End Process Finalitza el procés User Usuari Resident Memory Memòria resident %Memory %Memòria Virtual Memory Memòria virtual Start Time Hora d'inici State Estat Group Grup Nice Bonic CPU Time Temps de la CPU Session Sessió Process Procés Processes (%1) Processos (%1) Refresh (%1) Refresca (%1) QObject Dashboard Panell de control ResourcesPage History of CPU Històric de la CPU History of CPU Load Averages Històric de mitjanes de càrrega de la CPU History of Disk Read Write Històric de lectura i escriptura del disc History of Memory Històric de la memòria History of Network Històric de la xarxa Read: %1/s Total: %2 Lectura: %1/s Total: %2 Write: %1/s Total: %2 Escriptura: %1/s Total: %2 %1 Minute Average: %2 %1 minut mitjana: %2 Download: %1/s Total: %2 Baixada: %1/s Total: %2 Upload: %1/s Total: %2 Pujada: %1/s Total: %2 Swap: %1 (%2%) %3 Intercanvi: %1 (%2%) %3 Memory: %1 (%2%) %3 Memòria: %1 (%2%) %3 Resources Recursos ServicesPage Services Serveis Startup at boot ? Carrega a l'inici? Running Now ? S'està executant ara? Not Found System Service Servei del sistema no trobat Running Status Estat d'execució Running S'està executant Not Running No s'està executant Startup Status Estat d'inici Enabled Activat Disabled Desactivat System Services (%1) Serveis del sistema (%1) SettingsPage Settings Configuració Memory Percent Percentatge de memòria Disk Percent Percentatge del disc Disks Discs Language Idioma Autostart Stacer Inicia automàticament l'Stacer Alert messages (Show a warning after the specified percentage) Missatges d'alerta (mostra un avís després del percentatge especificat) Start Page Pàgina d'inici CPU Percent Percentatge de CPU <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Creat per <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Donació Theme Tema Dashboard Panell de control Startup Apps Aplicacions d'inici System Cleaner Netejador del sistema Services Serveis Processes Processos Uninstaller Desinstal·lador Resources Recursos StartupApp Edit App Edita l'aplicació Delete App Suprimeix l'aplicació StartupAppEdit Startup App Aplicació d'inici Fields cannot be left blank. Els camps no es poden deixar en blanc Save Desa App Comment Comentari de l'aplicació App Name Nom de l'aplicació Command Ordre Application Aplicació StartupAppsPage Not Found Startup Apps No s'han trobat aplicacions d'inici Startup Apps Aplicacions d'inici Add Startup App Afegeix una aplicació d'inici Startup Applications (%1) Aplicacions d'inici (%1) SystemCleanerPage System Cleaner Netejador del sistema Crash Reports Informes de fallida Application Logs Registres d'aplicacions Application Caches Memòria cau d'aplicacions Trash Paperera Package Caches Memòria cau dels paquets Back Enrere File Name Nom del fitxer Size Mida %1 size files cleaned. S'ha netejat fitxers de mida %1 UninstallerPage Uninstaller Desinstal·lador Search... Cerca... Not Found Installed Packages No s'han trobat paquets instal·lats Uninstall Selected Desinstal·la els seleccionats System Installed Packages (%1) Paquets instal·lats del sistema (%1) UnitySettings Applications Aplicacions Show "Recently Used" applications Mostra les aplicacions «usades recentment» Enable search of your files Activa la cerca dels vostres fitxers Show "More Suggestions" Mostra «més suggeriments» Search Cerca General General Transparency Level Nivell de transparència Behaviour Comportament Auto Hide Amaga automàticament Left Side Costat esquerre Minimize applications with clicking Minimitza les aplicacions fent clic Top-Left Corner Vora superior esquerra Reveal Sensitivity Revela la sensibilitat Reveal Location Revela la ubicació Launcher Llançador Appearance Aparença Left Esquerra Bottom Inferior Visibility Visibilitat Visibilitat Primary Desktop Escriptori primari Icon size Mida de la icona All Desktops Tots els escriptoris Position Posició Search online sources Cerca orígens en línia Background Blur Fons borrós Panel Panell Indicators Indicadors Date Data Calendar Calendari Date & Time Data i hora 24-Hour Time 24 hores Weekday Dia de la setmana Include Inclou Seconds Segons Volume Volum Show my name Mostra el meu nom WindowManagerSettings General General Titlebar Actions Accions de la barra de títol Right click Clic dret Double click Doble clic Middle click Clic mig Additional Addicional Workspace Settings Configuració de l'espai de treball Vertical workspaces Espais de treball verticals Workspace switcher Commutador d'espais de treball Horizontal workspaces Espais de treball horitzontals Focus Behaviour Comportament de l'enfocament Focus mode Mode d'enfocament Raise on click Augmenta en fer clic Hardware Acceleration Acceleració del maquinari Text quality Qualitat del text Fast Ràpid Good Bo Best El millor Click Clic Sloppy Descuidat Mouse Ratolí Toggle Shade Commuta l'ombra Maximize Maximitza Maximize Horizontally Maximitza horitzontalment Maximize Vertically Maximitza verticalment Minimize Minimitza None Cap Lower Inferior Menu Menú ================================================ FILE: translations/stacer_cs.ts ================================================ APTSourceEdit APT Repository Edit Upravit repozitář APT APT Repository Repozitář APT Components Komponenty Options Parametry Cancel Zrušit Fields cannot be left blank. Musíte vyplnit všechna pole. URI URI Save Uložit Distribution Distribuce Source Zdroje Binary Binární APTSourceManagerPage Search... Hledat... Edit Upravit APT Repository Manager Správce repozitářů APT Not Found APT Repositories Nebyly nalezeny žádne repozitáře APT Delete Smazat Enable Source Povolit zdroje Add Repository Přidat repozitář Cancel Zrušit Select to delete or edit. Vybat pro smazání nebo úpravu example %1 příklad %1 APT Repositories (%1) Repozitáře APT (%1) Save Uložit APTSourceRepositoryItem %1 (Source Code) %1 (Zdroje) App Dashboard Nástěnka Startup Apps Automatické spuštění aplikací System Cleaner Čistič systému APT Repository Manager Správce repozitářů APT Uninstaller Odinstalovávač Resources Prostředky Processes Procesy Services Služby Gnome Settings Nastavení Gnome Settings Nastavení Feedback Zpětná vazba Quit Zavřít Continue Pokračovat Will the program continue to work in the system tray? Má program pokračovat v práci na systémové liště? AppearanceSettings Screen Applications Aplikace na obrazovce Screen Reader Předčítač obrazovky Screen Keyboard Klávesnice na obrazovce Background Image Mode Režim tapety Desktop Mode Režim plochy Login Mode Režim přihlášení Icons Ikony Home Icon Ikona domů Trash Icon Ikona koše Mounted Volumes Icon Ikona připojených disků Show Desktop Icons Zobrazit ikony na ploše Network Icon Ikona sítě None Žádný Wallpaper Pozadí Centered Vycentrované Scaled Škálované Stretched Roztažené Zoom Přiblížené Spanned Rozložené DashboardPage Dashboard Nástěnka SYSTEM INFO INFORMACE O SYSTÉMU There are update currently available. K disposici je aktualizace Download Stáhnout CPU PROCESOR Hostname: %1 Jméno počítače: %1 Platform: %1 Systém: %1 Distribution: %1 Distribuce: %1 Kernel Release: %1 Verze jádra: %1 CPU Model: %1 Model procesoru: %1 CPU Speed: %1 Frekvence procesoru: %1 CPU Core: %1 Jádra procesoru: %1 MEMORY PAMĚŤ DISK DISK DOWNLOAD STAHOVÁNÍ UPLOAD NAHRÁVÁNÍ High CPU Usage Vysoké využití procesoru The amount of CPU used is over %1%. Využití procesoru je vyšší než %1%. High Memory Usage Vysoké využití paměti The amount of memory used is over %1%. Využití paměti je vyšší než %1%. High Disk Usage Vysoké využití disku The amount of disk used is over %1%. Využití disku je vyšší než %1%. Total: %1 Celkem: %1 Feedback Feedback Zpětná vazba Name Jméno Email Address Emailová adresa Send Odeslat Message Zpráva Send a Feedback Odeslat zpětnou vazbu Email address is not valid ! Emailová adresa je neplatná! Your message must be at least 25 characters ! Vaše zpráva musí být delší než 25 znaků! Sending.. Odesílání.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Vaše zpětná vazba byla úspěšně odeslána.</font> Something went wrong, try again ! Něco se pokazilo, zkuste to znovu! Save Uložit Fields cannot be left blank ! Musíte vyplnit všechna pole! GnomeSettingsPage Gnome Settings Nastavení Gnome Unity Settings Nastavení Unity Window Manager Správce oken Appearance Vzhled ProcessesPage Processes Procesy All Processes Všechny procesy Search... Hledat... End Process Ukončit proces User Uživatel Resident Memory Rezidentní paměť %Memory %Paměť Virtual Memory Virtuální paměť Start Time Čas spuštění State Stav Group Skupina Nice CPU Time Session Sezení Process Proces Processes (%1) Procesy (%1) Refresh (%1) Obnovit (%1) QObject Dashboard Nástěnka ResourcesPage History of CPU Historie procesoru History of CPU Load Averages Historie průměrů zatížení procesoru History of Disk Read Write Historie čtení/zápisu z disku History of Memory Historie paměti History of Network Historie sítě Read: %1/s Total: %2 Gelesen: %1/s Gesamt: %2 Write: %1/s Total: %2 Čtení: %1/s Celkem: %2 %1 Minute Average: %2 Průměr za %1 minut(y): %2 Download: %1/s Total: %2 Stahování: %1/s Celkem: %2 Upload: %1/s Total: %2 Nahrávání: %1/s Celkem: %2 Swap: %1 (%2%) %3 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Paměť: %1 (%2%) %3 Resources Prostředky ServicesPage Services Služby Startup at boot ? Spustit po zapnutí počítače? Running Now ? Běží? Not Found System Service Systémová služba nebyla nalezena Running Status Stav Running Běžící Not Running Neběžící Startup Status Počáteční stav Enabled Povoleno Disabled Zakázáno System Services (%1) Systémové služby (%1) SettingsPage Settings Nastavení Memory Percent Procenta paměti Disk Percent Procenta disku Disks Disky Language Jazyk Autostart Stacer Automaticky spustit Stacer Alert messages (Show a warning after the specified percentage) Varování (Zobrazovat varování po nastaveném procentu) Start Page Úvodní stránka CPU Percent Procenta procesoru Donate Přispět Theme Téma Dashboard Nástěnka Startup Apps Automatické spuštění aplikací System Cleaner Čistič systému Services Služby Processes Procesy Uninstaller Odinstalovávač Resources Prostředky StartupApp Edit App Upravit aplikaci Delete App Odstranit aplikaci StartupAppEdit Startup App Automatické spuštění aplikace Save Uložit Fields cannot be left blank. Musíte vyplnit všechna pole. App Comment Přidat komentář App Name Jméno aplikace Command Příkaz Application Aplikace StartupAppsPage Not Found Startup Apps Nebyly nalezeny automaticky se spouštějící aplikace Startup Apps Automatické spuštění aplikací Add Startup App Přidat automatické spouštění aplikace Startup Applications (%1) Automatické spuštění aplikací (%1) SystemCleanerPage System Cleaner Čistič systému Crash Reports Nahlášení pádu Application Logs Logy aplikací Application Caches Cache aplikací Trash Koš Package Caches Cache balíčků Select All Vybrat vše Back Zpět File Name Jméno souboru Size Velikost %1 size files cleaned. Vyčištěno %1 souborů. UninstallerPage Uninstaller Odinstalovávač Search... Hledat... Not Found Installed Packages Nenalezeny žádné nainstalované balíčky Uninstall Selected Odinstalovat vybrané System Installed Packages (%1) Nainstalované balíčky (%1) UnitySettings Applications Aplikace Show "Recently Used" applications Zobrazit "naposledy použité" aplikace Enable search of your files Povolit vyhledávání vašich souborů Show "More Suggestions" Zobrazit "další návrhy" Search Hledat General Obecné Transparency Level Úroveň průhlednosti Behaviour Chování Auto Hide Automatické skrývání Left Side Levá strana Minimize applications with clicking Minimalizovat aplikace kliknutím Top-Left Corner Levý horní roh Reveal Sensitivity Citlivost odhalení Reveal Location Umístění odhalení Launcher Spouštěč Appearance Vzhled Left Vlevo Bottom Dolů Visibility Viditelnost Primary Desktop Hlavní plocha Icon size Velikost ikon All Desktops Všechny plochy Position Pozice Search online sources Hledat online zdroje Background Blur Rozostření pozadí Panel Panel Indicators Indikátory Date Datum Calendar Kalendář Date & Time Datum & Čas 24-Hour Time 24-hodinový čas Weekday Den týdne Include Zahrnout Seconds Sekundy Volume Hlasitost Show my name Zobrazit mé jméno WindowManagerSettings General Obecné Titlebar Actions Akce záhlaví Right click Kliknutí pravým tlačítkem Double click Dvojklik Middle click Kliknutí prostředním tlačítkem Additional Dodatečné Workspace Settings Nastavení pracovních ploch Vertical workspaces Vertikální pracovní plochy Workspace switcher Přepínač pracovních ploch Horizontal workspaces Horizontální pracovní plochy Focus Behaviour Chování zaměření Focus mode Režim zaměření Raise on click Zaměřit po kliknutí Hardware Acceleration Hardwarová akcelerace Text quality Kvalita textu Fast Rychlá Good Dobrá Best Nejlepší Click Kliknutí Sloppy Neupravený Mouse Myš Toggle Shade Přepnout stín Maximize Maximalizovat Maximize Horizontally Horizontálně maximalizovat Maximize Vertically Vertikálně maximalizovat Minimize Minimalizovat None Žádný Lower Nejnižší Menu Menu ================================================ FILE: translations/stacer_de.ts ================================================ APTSourceEdit APT Repository Edit APT Paketquelle bearbeiten APT Repository APT Paketquelle Components Komponenten Options Parameter Cancel Abbrechen Fields cannot be left blank. Felder dürfen nicht leer gelassen werden. URI URI Save Speichern Distribution Distribution Source Quelle Binary Binary APTSourceManagerPage Search... Suchen... Edit Bearbeiten APT Repository Manager APT Paketquellen-Verwaltung Not Found APT Repositories Keine gefundenen APT Paketquellen Delete Entfernen Enable Source Quelle aktivieren Add Repository Paketquelle hinzufügen Cancel Abbrechen Select to delete or edit. Zum Entfernen oder Bearbeiten auswählen. example %1 bspw. %1 APT Repositories (%1) APT Paketquellen (%1) Save Speichern APTSourceRepositoryItem %1 (Source Code) Sourcecode App Dashboard Übersicht Startup Apps Startprogramme System Cleaner System-Reinigung APT Repository Manager APT Paketquellen-Verwaltung Uninstaller Paket-Deinstallation Resources Ressourcen Processes Systemressourcen Services Dienste Gnome Settings Gnome Einstellungen Settings Einstellungen Feedback Feedback Quit Beenden Continue Fortsetzen Will the program continue to work in the system tray? Soll das Programm im System-Tray weiterarbeiten? AppearanceSettings Screen Applications Bildschirmanwendungen Screen Reader Screenreader Screen Keyboard Bildschirmtastatur Background Image Mode Hintergrundbild Modus Desktop Mode Desktop Modus Login Mode Login Modus Icons Symbole Home Icon Home-Icon Trash Icon Papierkorb-Symbol Mounted Volumes Icon Laufwerke-Icon Show Desktop Icons Desktop-Anzeigen-Icon Network Icon Netzwerk-Symbol None Keiner Wallpaper Hintergrundbild Centered Zentrieren Scaled Skalieren Stretched Strecken Zoom Vergrößern Spanned Spannen DashboardPage Dashboard Übersicht SYSTEM INFO SYSTEM-INFORMATIONEN There are update currently available. Es stehen Aktualisierungen zur Verfügung. Download Herunterladen CPU CPU Hostname: %1 Hostname: %1 Platform: %1 Plattform: %1 Distribution: %1 Distribution: %1 Kernel Release: %1 Kernel-Version: %1 CPU Model: %1 CPU Modell: %1 CPU Speed: %1 CPU Frequenz: %1 CPU Core: %1 CPU Kerne: %1 MEMORY ARBEITSSPEICHER DISK FESTPLATTE DOWNLOAD DOWNLOAD UPLOAD UPLOAD High CPU Usage Hohe CPU Auslastung The amount of CPU used is over %1%. Die CPU Auslastung ist über %1%. High Memory Usage Hohe Arbeitsspeicher Nutzung The amount of memory used is over %1%. Die Nutzung des Arbeitsspeichers ist über %1%. High Disk Usage Hohe Festplatten Nutzung The amount of disk used is over %1%. Die Festplatten Nutzung ist über %1%. Total: %1 Gesamt: %1 Feedback Feedback Feedback Name Name Email Address E-Mail Adresse Send Senden Message Nachricht Send a Feedback Feedback senden Email address is not valid ! Keine gültige E-Mail Adresse Your message must be at least 25 characters ! Ihre Nachricht muss mindestens 25 Zeichen betragen! Sending.. Senden.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Dein Feedback wurde erfolgreich versandt.</font> Something went wrong, try again ! Etwas ist schief gelaufen, bitte erneut versuchen ! Save Speichern Fields cannot be left blank ! Felder dürfen nicht leer gelassen werden GnomeSettingsPage Gnome Settings Gnome Einstellungen Unity Settings Unity Einstellungen Window Manager Fenstermanager Appearance Erscheinung ProcessesPage Processes Prozesse All Processes Alle Prozesse Search... Suchen... End Process Prozess beenden User Benutzer Resident Memory Genutzer Speicher %Memory %Speicher Virtual Memory Virtueller Speicher Start Time Startzeit State Status Group Gruppe Nice Nice CPU Time CPU Zeit Session Session Process Prozess Processes (%1) Prozesse (%1) Refresh (%1) Aktualisierung (%1) QObject Dashboard Übersicht ResourcesPage History of CPU CPU Auslastung Verlauf History of CPU Load Averages CPU Load-Durschnittswerte Verlauf History of Disk Read Write Lese- / Schreib-Operationen Verlauf History of Memory Arbeitsspeicher Verlauf History of Network Netzwerkauslastung Verlauf Read: %1/s Total: %2 Gelesen: %1/s Gesamt: %2 Write: %1/s Total: %2 Geschrieben: %1/s Gesamt: %2 %1 Minute Average: %2 %1 Minute(n) Durchschnitt: %2 Download: %1/s Total: %2 Download: %1/s Gesamt: %2 Upload: %1/s Total: %2 Upload: %1/s Gesamt: %2 Swap: %1 (%2%) %3 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Speicher: %1 (%2%) %3 Resources Ressourcen ServicesPage Services Dienste Startup at boot ? Ausführung beim Systemstart ? Running Now ? Wird ausgeführt ? Not Found System Service System-Dienst nicht gefunden Running Status Status Running Ausgeführt Not Running Nicht ausgeführt Startup Status Start-Status Enabled Aktiviert Disabled Deaktiviert System Services (%1) System-Dienste (%1) SettingsPage Settings Einstellungen Memory Percent Arbeitsspeicher Prozent Disk Percent Festplatte Prozent Disks Festplatten Language Sprache Autostart Stacer Stacer mit Systemstart ausführen Alert messages (Show a warning after the specified percentage) Warnmeldungen (Zeige eine Warnmeldung bei Überschreitung der angegebenen Prozentwerte) Start Page Startseite CPU Percent CPU Prozent Donate Spenden Theme Thema Dashboard Übersicht Startup Apps Startprogramme System Cleaner System-Reinigung Services Dienste Processes Prozesse Uninstaller Paket-Deinstallation Resources Ressourcen StartupApp Edit App Programm bearbeiten Delete App Programm entfernen StartupAppEdit Startup App Startprogramm Save Speichern Fields cannot be left blank. Feld darf nicht leer gelassen werden. App Comment Anwendungs-Kommentar App Name Anwendungs-Name Command Befehl Application Anwendung StartupAppsPage Not Found Startup Apps Startprogramm nicht gefunden Startup Apps Startprogramme Add Startup App Startprogramm hinzufügen Startup Applications (%1) Startprogramme (%1) SystemCleanerPage System Cleaner System-Reinigung Crash Reports Absturzberichte Application Logs Anwendungs-Logs Application Caches Anwendungs-Cache Trash Papierkorb Package Caches Paket-Cache Select All Alle auswählen Back Zurück File Name Dateiname Size Größe %1 size files cleaned. %1 Dateien bereinigt. UninstallerPage Uninstaller Paket-Deinstallation Search... Suchen... Not Found Installed Packages Systempaket nicht gefunden Uninstall Selected Ausgewähltes deinstallieren System Installed Packages (%1) Systempakete (%1) UnitySettings Applications Anwendungen Show "Recently Used" applications Zeige "zuletzt benutze" Programme Enable search of your files Dateisuche aktivieren Show "More Suggestions" Zeige "Mehr Empfehlungen" Search Suchen General Allgemein Transparency Level Transparenz-Level Behaviour Verhalten Auto Hide Automatisches Ausblenden Left Side Linke Seite Minimize applications with clicking Anwendungen durch Klicken minimieren Top-Left Corner Obere linke Ecke Reveal Sensitivity Einblend-Empfindlichkeit Reveal Location Einblend-Position Launcher Launcher Appearance Erscheinung Left Links Bottom Unten Visibility Sichtbarkeit Primary Desktop Primärer Desktop Icon size Symbolgröße All Desktops Alle Arbeitsflächen Position Position Search online sources Online-Quellen durchsuchen Background Blur Blur Panel Panel Indicators Indikatoren Date Datum Calendar Kalender Date & Time Datum & Zeit 24-Hour Time 24-Stunden Zeit Weekday Wochentag Include Anzeigen Seconds Sekunden Volume Lautstärke Show my name Meinen Namen anzeigen WindowManagerSettings General Allgemein Titlebar Actions Titelleisten-Aktionen Right click Rechtsklick Double click Doppelklick Middle click Mittelklick Additional Zusätzliches Workspace Settings Arbeitsflächen Einstellungen Vertical workspaces Vertikale Arbeitsflächen Workspace switcher Arbeitsflächen Umschalter Horizontal workspaces Horizontale Arbeitsflächen Focus Behaviour Fokus-Verhalten Focus mode Fokus-Modus Raise on click Hervorbringen auf Klick Hardware Acceleration Hardwarebeschleunigung Text quality Textqualität Fast Schnell Good Gut Best Beste Click Klick Sloppy Sloppy Mouse Maus Toggle Shade Shade umschalten Maximize Maximieren Maximize Horizontally Horizontal maximieren Maximize Vertically Vertikal maximieren Minimize Minimieren None Keine Lower Herabsetzen Menu Menü ================================================ FILE: translations/stacer_en.ts ================================================ APTSourceEdit APT Repository Edit APT Repository Components Options Cancel Fields cannot be left blank. URI Save Distribution Source Binary APTSourceManagerPage Search... Edit APT Repository Manager Not Found APT Repositories Delete Enable Source Add Repository Cancel Select to delete or edit. example %1 APT Repositories (%1) Save APTSourceRepositoryItem %1 (Source Code) App Dashboard Startup Apps System Cleaner Uninstaller Resources APT Repository Manager Processes Services Gnome Settings Settings Feedback Quit AppearanceSettings Screen Applications Screen Reader Screen Keyboard Background Image Mode Desktop Mode Login Mode Icons Home Icon Trash Icon Mounted Volumes Icon Show Desktop Icons Network Icon None Wallpaper Centered Scaled Stretched Zoom Spanned DashboardPage Dashboard SYSTEM INFO There are update currently available. Download CPU MEMORY DISK DOWNLOAD UPLOAD Hostname: %1 Platform: %1 Distribution: %1 Kernel Release: %1 CPU Model: %1 CPU Speed: %1 CPU Cores: %1 High CPU Usage The amount of CPU used is over %1%. High Memory Usage The amount of memory used is over %1%. High Disk Usage The amount of disk used is over %1%. Total: %1 Feedback Feedback Name Email Address Send Message Send a Feedback Email address is not valid ! Your message must be at least 25 characters ! Sending.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> Something went wrong, try again ! Save Fields cannot be left blank ! GnomeSettingsPage Gnome Settings Unity Settings Window Manager Appearance ProcessesPage Processes All Processes Search... End Process User Resident Memory %Memory Virtual Memory Start Time State Group Nice CPU Time Session Process Processes (%1) Refresh (%1) QObject Dashboard ResourcesPage History of CPU History of CPU Load Averages History of Disk Read Write History of Memory History of Network Read: %1/s Total: %2 Write: %1/s Total: %2 %1 Minute Average: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Resources ServicesPage Services Startup at boot ? Running Now ? Not Found System Service Running Status Running Not Running Startup Status Enabled Disabled System Services (%1) SettingsPage Settings Memory Percent Disk Percent Disks Language Autostart Stacer Alert messages (Show a warning after the specified percentage) Start Page CPU Percent <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Theme Dashboard Startup Apps System Cleaner Services Processes Uninstaller Resources StartupApp Edit App Delete App StartupAppEdit Startup App Save Fields cannot be left blank. App Comment App Name Command Application StartupAppsPage Not Found Startup Apps Startup Apps Add Startup App Startup Applications (%1) SystemCleanerPage System Cleaner Crash Reports Application Logs Application Caches Trash Package Caches Back File Name Size %1 size files cleaned. UninstallerPage Uninstaller Search... Not Found Installed Packages Uninstall Selected System Installed Packages (%1) UnitySettings Applications Show "Recently Used" applications Enable search of your files Show "More Suggestions" Search General Transparency Level Behaviour Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher Appearance Left Bottom Visibility Primary Desktop Icon size All Desktops Position Search online sources Background Blur Panel Indicators Date Calendar Date & Time 24-Hour Time Weekday Include Seconds Volume Show my name WindowManagerSettings General Titlebar Actions Right click Double click Middle click Additional Workspace Settings Vertical workspaces Workspace switcher Horizontal workspaces Focus Behaviour Focus mode Raise on click Hardware Acceleration Text quality Fast Good Best Click Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu ================================================ FILE: translations/stacer_es.ts ================================================ APTSourceEdit APT Repository Edit Editar repositorio APT APT Repository Repositorio APT Components Componentes Options Opciones Cancel Cancelar Fields cannot be left blank. Los campos no se pueden dejar en blanco. URI URI Save Guardar Distribution Distribución Source Fuente Binary Binario APTSourceManagerPage Search... Buscar... Edit Editar APT Repository Manager Administrador de repositorios APT Not Found APT Repositories Repositorios APT no encontrados Delete Borrar Enable Source Habilitar fuente Add Repository Agregar repositorio Cancel Cancelar Select to delete or edit. Selecciona para eliminar o editar example %1 ejemplo %1 APT Repositories (%1) Repositorios APT (1) Save Guardar APTSourceRepositoryItem %1 (Source Code) %1 (Código fuente) App Dashboard Tablero Startup Apps Aplicaciones de inicio System Cleaner Limpiador del Sistema APT Repository Manager Administrador de repositorios APT Uninstaller Desinstalador Resources Recursos Processes Procesos Services Servicios Gnome Settings Ajustes de Gnome Settings Ajustes Feedback Comentarios Quit Salir AppearanceSettings Screen Applications Aplicaciones de pantalla Screen Reader Lector de pantalla Screen Keyboard Teclado de pantalla Background Image Mode Modo de fondo de pantalla Desktop Mode Modo de escritorio Login Mode Modo de inicio de sesión Icons Íconos Home Icon Ícono de inicio Trash Icon Ícono de papelera Mounted Volumes Icon Ícono de volúmenes montados Show Desktop Icons Mostrar los íconos del escritorio Network Icon Ícono de red None Ninguno Wallpaper Fondo de pantalla Centered Centrado Scaled Escalado Stretched Alargado Zoom Ampliado Spanned Extendido DashboardPage Dashboard Tablero SYSTEM INFO INFORMACIÓN DEL SISTEMA There are update currently available. Actualmente hay actualizaciones disponibles. Download Descargar CPU CPU MEMORY MEMORIA DISK DISCO DOWNLOAD DESCARGAR UPLOAD SUBIR Hostname: %1 Nombre de host: %1 Platform: %1 Plataforma: %1 Distribution: %1 Distribución: %1 Kernel Release: %1 Versión del kernel: %1 CPU Model: %1 Modelo de CPU: %1 CPU Speed: %1 Velocidad de la CPU: %1 CPU Core: %1 Núcleo de la CPU:%1 High CPU Usage Uso elevado de CPU The amount of CPU used is over %1%. La cantidad de CPU usada está sobre el %1%. High Memory Usage Uso elevado de memoria The amount of memory used is over %1%. La cantidad de memoria usada está sobre el %1%. High Disk Usage Uso elevado del disco The amount of disk used is over %1%. La cantidad de disco usado está sobre el %1%. Total: %1 Total: %1 Feedback Feedback Comentarios Name Nombre Email Address Dirección de correo electrónico Send Enviar Message Mensaje Send a Feedback Envía un comentario Email address is not valid ! ¡La dirección de correo electrónico no es válida! Your message must be at least 25 characters ! ¡Tu mensaje debe de tener al menos 25 caracteres! Sending.. Enviando... <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Tu comentario ha sido enviado correctamente.</font> Something went wrong, try again ! ¡Algo salió mal, intenta de nuevo! Save Guardar Fields cannot be left blank ! ¡Los campos no se pueden dejar en blanco! GnomeSettingsPage Gnome Settings Ajustes de Gnome Unity Settings Ajustes de Unity Window Manager Administrador de ventanas Appearance Apariencia ProcessesPage Processes Procesos All Processes Todos los procesos Search... Buscar... End Process Proceso final User Usuario Resident Memory Memoria residente %Memory %Memoria Virtual Memory Memoria virtual Start Time Hora de inicio State Estado Group Grupo Nice Prioridad CPU Time Tiempo de CPU Session Sesión Process Proceso Processes (%1) Procesos (%1) Refresh (%1) Refrescar (%1) QObject Dashboard Tablero ResourcesPage History of CPU Historial de la CPU History of CPU Load Averages Historial de los proceso de carga de la CPU History of Disk Read Write Historial de lectura y escritura en disco History of Memory Historial de memoria History of Network Historial de red Read: %1/s Total: %2 Lectura: %1/s Total: %2 Write: %1/s Total: %2 Escritura: %1/s Total: %2 %1 Minute Average: %2 %1 promedio por minuto Download: %1/s Total: %2 Descarga: %1/s Total: %2 Upload: %1/s Total: %2 Subida: %1/s Total: %2 Swap: %1 (%2%) %3 Intercambio: %1 (%2%) %3 Memory: %1 (%2%) %3 Memoria: %1 (%2%) %3 Resources Recursos ServicesPage Services Servicios Startup at boot ? Inicio en el arranque ? Running Now ? Ejecutado ahora ? Not Found System Service Servicio del sistema no encontrado Running Status Estado de ejecución Running Ejecutado Not Running No ejecutado Startup Status Estado de inicio Enabled Habilitado Disabled Deshabilitado System Services (%1) Servicios del Sistema (%1) SettingsPage Settings Ajustes Memory Percent Porcentaje de memoria Disk Percent Porcentaje de disco Disks Discos Language Idioma Autostart Stacer Iniciar Stacer automáticamente Alert messages (Show a warning after the specified percentage) Mensajes de alerta (mostrar una advertencia después del porcentaje especificado) Start Page Página de inicio CPU Percent Porcentaje de CPU <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Creado por <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Donar Theme Tema Dashboard Tablero Startup Apps Aplicaciones de inicio System Cleaner Limpiador del Sistema Services Servicios Processes Procesos Uninstaller Desinstalador Resources Recursos StartupApp Edit App Editar aplicación Delete App Eliminar aplicación StartupAppEdit Startup App Aplicación de inicio Save Guardar Fields cannot be left blank. Los campos no se pueden dejar en blanco. App Comment Comentario de la aplicación App Name Nombre de la aplicación Command Órden Application Aplicación StartupAppsPage Not Found Startup Apps Aplicaciones de inicio no encontradas Startup Apps Aplicaciones de inicio Add Startup App Añadir aplicación de inicio Startup Applications (%1) Aplicaciones de inicio (%1) SystemCleanerPage System Cleaner Limpiador del Sistema Crash Reports Informes de fallos Application Logs Registros de aplicaciones Application Caches Cachés de aplicaciones Trash Papelera Package Caches Cachés de paquetes Back Volver File Name Nombre del archivo Size Tamaño %1 size files cleaned. %1 del tamaño de los archivos limpiado. UninstallerPage Uninstaller Desinstalador Search... Buscar... Not Found Installed Packages Paquetes instalados no encontrados Uninstall Selected Desinstalar seleccionados System Installed Packages (%1) Paquetes instalados del Sistema (%1) UnitySettings Applications Aplicaciones Show "Recently Used" applications Mostrar "aplicaciones" usadas recientemente Enable search of your files Habilitar la búsqueda de archivos Show "More Suggestions" Mostrar "más sugerencias" Search Buscar General General Transparency Level Nivel de transparencia Behaviour Comportamiento Auto Hide Ocultar automáticamente Left Side Lado izquierdo Minimize applications with clicking Minimizar aplicaciones al clicar Top-Left Corner Esquina superior izquierda Reveal Sensitivity Revelar sensibilidad Reveal Location Revelar localización Launcher Lanzador Appearance Apariencia Left Izquierda Bottom Abajo Visibility Visibilidad Primary Desktop Escritorio primario Icon size Tamaño del ícono All Desktops Todos los escritorios Position Posición Search online sources Buscar fuentes en línea Background Blur Desenfoque de fondo Panel Panel Indicators Indicadores Date Fecha Calendar Calendario Date & Time Fecha & hora 24-Hour Time 24 horas Weekday Día laboral Include Incluir Seconds Segundos Volume Volúmen Show my name Mostrar mi nombre WindowManagerSettings General General Titlebar Actions Acciones de la barra de titulo Right click Botón derecho del raton Double click Doble clic Middle click Botón central del ratón Additional Adicional Workspace Settings Ajustes del espacio de trabajo Vertical workspaces Espacios de trabajo verticales Workspace switcher Interruptor de espacio de trabajo Horizontal workspaces Espacios de trabajo horizontales Focus Behaviour Comportamiento de enfoque Focus mode Modo de enfoque Raise on click Levantar al clicar Hardware Acceleration Aceleración de hardware Text quality Calidad del texto Fast Rápido Good Bueno Best Mejor Click Clic Sloppy Sloppy Mouse Ratón Toggle Shade Alternar sombra Maximize Maximizar Maximize Horizontally Maximizar horizontalmente Maximize Vertically Maximizar verticalmente Minimize Minimizar None Ninguno Lower Abajo Menu Menú ================================================ FILE: translations/stacer_fr.ts ================================================ APTSourceEdit APT Repository Edit Modifier le dépôt APT APT Repository Dépôt APT Components Composants Options Options Cancel Annuler Fields cannot be left blank. Les champs ne peuvent pas être laissés vides. URI URI (identifiant uniforme de ressource) Save Sauvegarder Distribution Distribution Source Source Binary Binaire APTSourceManagerPage Search... Recherche... Edit Modifier APT Repository Manager Gestionnaire de dépôt APT Not Found APT Repositories Dépôts APT non trouvé Delete Supprimer Enable Source Activer la source Add Repository Ajouter un dépôt Cancel Annuler Select to delete or edit. Sélectionnez pour supprimer ou modifier. example %1 exemple %1 APT Repositories (%1) Dépôt APT (%1) Save Sauvegarder APTSourceRepositoryItem %1 (Source Code) %1 (Code Source) App Dashboard Tableau de bord Startup Apps Applications de démarrage System Cleaner Nettoyage du système APT Repository Manager Gestionnaire de dépôt APT Uninstaller Désinstaller Resources Ressources Processes Processus Services Services Gnome Settings Options de Gnome Settings Options Feedback Commentaires Quit Quitter AppearanceSettings Screen Applications Screen Reader Lecteur d’écran Screen Keyboard Clavier à écran Background Image Mode Mode Image d’arrière-plan Desktop Mode Mode Bureau Login Mode Mode Nom d’utilisateur Icons Icônes Home Icon Icône Accueil Trash Icon Icône Corbeille Mounted Volumes Icon Icône des volumes montés Show Desktop Icons Afficher les icônes du bureau Network Icon Icône Réseau None Aucun Wallpaper Fond d’écran Centered Centrer Scaled Mise à l’échelle Stretched Étiré Zoom Zoom Spanned Étendue de la portée DashboardPage Dashboard Tableau de bord SYSTEM INFO INFORMATIONS SYSTÈME There are update currently available. Il existe actuellement des mises à jour disponibles. Download Télécharger CPU CPU MEMORY MÉMOIRE DISK DISQUE DOWNLOAD TÉLÉCHARGER UPLOAD TÉLÉVERSEMENT Hostname: %1 Nom d’Hôte : %1 Platform: %1 Plateforme : %1 Distribution: %1 Distribution : %1 Kernel Release: %1 Version du Noyau : %1 CPU Model: %1 Modèle du CPU : %1 CPU Speed: %1 Vitesse du CPU : %1 CPU Core: %1 CPU Cœur : %1 High CPU Usage Utilisation élevée du CPU The amount of CPU used is over %1%. La quantité de CPU utilisée est terminée %1%. High Memory Usage Utilisation élevée de la mémoire The amount of memory used is over %1%. La quantité de mémoire utilisée est supérieure à %1%. High Disk Usage Utilisation élevée du disque The amount of disk used is over %1%. La quantité de disque utilisée est supérieure à %1%. Total: %1 Total : %1 Feedback Feedback Commentaires Name Nom Email Address Adresse de courriel Send Envoyer Message Message Send a Feedback Envoyer un commentaire Email address is not valid ! L’adresse de courriel est invalide. Your message must be at least 25 characters ! Votre message doit comporter au moins 25 caractères ! Sending.. Envoie... <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Votre commentaire a été envoyé avec succès.</font> Something went wrong, try again ! Quelque chose a mal fonctionné, réessayez ! Save Sauvegarder Fields cannot be left blank ! Les champs ne peuvent pas être laissés vides ! GnomeSettingsPage Gnome Settings Options de Gnome Unity Settings Options d’Unity Window Manager Gestionnaire de fenêtres Appearance Apparence ProcessesPage Processes Processus All Processes Tous les processus Search... Recherche... End Process Processus de fin User Utilisateur Resident Memory Mémoire utilisée %Memory %Mémoire Virtual Memory Mémoire Virtuelle Start Time Heure de début State État Group Groupe Nice Agréable CPU Time Temps CPU Session Session Process Processus Processes (%1) Processus (%1) Refresh (%1) Rafraîchir (%1) QObject Dashboard Tableau de bord ResourcesPage History of CPU Historique du CPU History of CPU Load Averages Historique des moyennes de charge du CPU History of Disk Read Write Historique de l’écriture de lecture de disque History of Memory Historique de la Mémoire History of Network Historique du Réseau Read: %1/s Total: %2 Lecture : %1/s Total : %2 Write: %1/s Total: %2 Écriture : %1/s Total : %2 %1 Minute Average: %2 %1 moyenne par minute : %2 Download: %1/s Total: %2 Téléchargement : %1/s Total : %2 Upload: %1/s Total: %2 Téléversement : %1/s Total : %2 Swap: %1 (%2%) %3 Swap : %1 (%2%) %3 Memory: %1 (%2%) %3 Mémoire : %1 (%2%) %3 Resources Ressources ServicesPage Services Services Startup at boot ? Lancer au démarrage ? Running Now ? Lancez le maintenant ? Not Found System Service Service système non trouvé Running Status Statut de fonctionnement Running Fonctionnement Not Running N’est pas en cours d’exécution Startup Status Statut de démarrage Enabled Activer Disabled Désactiver System Services (%1) Services Système (%1) SettingsPage Settings Options Memory Percent Pourcentage de mémoire Disk Percent Pourcentage de disque Disks Disques Language Langage Autostart Stacer Démarrage automatique de Stacer Alert messages (Show a warning after the specified percentage) Messages d’alerte (affiche un avertissement après le pourcentage spécifié) Start Page Page de démarrage CPU Percent Pourcentage du CPU <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Créer par <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Dons Theme Thème Dashboard Tableau de bord Startup Apps Applications de démarrage System Cleaner Nettoyage du système Services Services Processes Processus Uninstaller Paquets Installés sur le Système Resources Ressources StartupApp Edit App Modifier une application Delete App Supprimer une application StartupAppEdit Startup App Application de démarrage Save Sauvegarder Fields cannot be left blank. Les champs ne peuvent pas être laissés vides . App Comment Commentaire de l’application App Name Nom de l’application Command Commande Application Application StartupAppsPage Not Found Startup Apps Applications de démarrage introuvables Startup Apps Applications de démarrage Add Startup App Ajouter une application de démarrage Startup Applications (%1) Applications de démarrage (%1) SystemCleanerPage System Cleaner Nettoyage Système Crash Reports Rapport d’erreurs Application Logs Journaux des applications Application Caches Caches des applications Trash Poubelle Package Caches Caches des paquets Back Retour File Name Nom de fichier Size Taille %1 size files cleaned. %1 fichier(s) de taille nettoyés. UninstallerPage Uninstaller Désinstallateur Search... Recherche... Not Found Installed Packages Paquets installés introuvables Uninstall Selected Désinstallation sélectionnée System Installed Packages (%1) Paquets installés par le système (%1) UnitySettings Applications Applications Show "Recently Used" applications Afficher les application "récemment utilisées" Enable search of your files Activer la recherche de vos fichiers Show "More Suggestions" Afficher "plus de suggestions" Search Recherche General Général Transparency Level Niveau de transparence Behaviour Comportement Auto Hide Masquer automatiquement Left Side Côté gauche Minimize applications with clicking Minimiser les applications en cliquant dessus Top-Left Corner Coin en haut à gauche Reveal Sensitivity Révéler la sensibilité Reveal Location Révéler l’emplacement Launcher Lanceur Appearance Apparence Left Gauche Bottom Bas Visibility Visibilité Primary Desktop Premier bureau Icon size Taille de l’icône All Desktops Tous les bureaux Position Position Search online sources Rechercher des sources en ligne Background Blur Flou d’arrière-plan Panel Panneau Indicators Indicateurs Date Date Calendar Calendrier Date & Time Date & Temps 24-Hour Time Format 24h Weekday Jour de la semaine Include Inclure Seconds Secondes Volume Volume Show my name Afficher par nom WindowManagerSettings General Général Titlebar Actions Actions de la barre de titre Clic droit Double click Double clic Middle click Clic du milieu Additional Supplémentaire Workspace Settings Paramètres de l’espace de travail Vertical workspaces Espaces de travail verticaux Workspace switcher Sélecteur d’espace de travail Horizontal workspaces Espaces de travail horizontaux Focus Behaviour Comportement de la mise au point Focus mode Mode de mise au point Raise on click Lever sur clic Hardware Acceleration Accélération matérielle Text quality Qualité du texte Fast Rapide Good Bon Best Meilleur Click Clic Sloppy Négligé Mouse Souris Toggle Shade Maximize Maximiser Maximize Horizontally Maximiser horizontalement Maximize Vertically Maximiser verticalement Minimize Minimiser None Auucn Lower Inférieur Menu Menu ================================================ FILE: translations/stacer_gl.ts ================================================ APTSourceEdit APT Repository Edit Editar repositorio de APT APT Repository Repositorio de APT Components Compoñentes Options Opcións Cancel Cancelar Fields cannot be left blank. Non se poden deixar campos en branco URI URI Save Gardar Distribution Distribución Source Fonte Binary Binarios APTSourceManagerPage Search... Buscar... Edit Editar APT Repository Manager Xestor de repositorios de APT Not Found APT Repositories Non se atoparon repositorios de APT Delete Eliminar Enable Source Activar fonte Add Repository Engadir repositorio Cancel Cancelar Select to delete or edit. Seleccionar para eliminar ou editar. example %1 exemplo %1 APT Repositories (%1) Repositorios de APT (%1) Save Gardar APTSourceRepositoryItem %1 (Source Code) %1 (Código fonte) App Dashboard Panel Startup Apps Aplicacións de inicio System Cleaner Limpador do sistema Uninstaller Desinstalador Resources Recursos APT Repository Manager Xestor de repositorios de APT Processes Procesos Services Servizos Gnome Settings Configuración de Gnome Settings Configuración Feedback Opinión Quit Saír AppearanceSettings Screen Applications Aplicacións de pantalla Screen Reader Lector de pantalla Screen Keyboard Teclado na pantalla Background Image Mode Modo de imaxe do fondo Desktop Mode Modo de escritorio Login Mode Modo de acceso Icons Iconas Home Icon Icona de inicio Trash Icon Icona do lixo Mounted Volumes Icon Iconas de volumes montados Show Desktop Icons Mostrar iconas no escritorio Network Icon Icona de rede None Ningunha Wallpaper Fondo de escritorio Centered Centrado Scaled Escalado Stretched Estirado Zoom Ampliado Spanned Estendido DashboardPage Dashboard Panel SYSTEM INFO INFORMACIÓN DO SISTEMA There are update currently available. Existen actualizacións dispoñíbeis. Download Descargar CPU CPU MEMORY MEMORIA DISK DISCO DOWNLOAD DESCARGA UPLOAD ENVÍO Hostname: %1 Nome da máquina Platform: %1 Plataforma: %1 Distribution: %1 Distribución: %1 Kernel Release: %1 Versión do kernel: %1 CPU Model: %1 Modelo da CPU: %1 CPU Speed: %1 Velocidade da CPU: %1 CPU Core: %1 Núcelos de CPU: %1 High CPU Usage Uso da CPU elevado The amount of CPU used is over %1%. A cantidade de CPU usada sobrepasa %1%. High Memory Usage Uso de memoria elevado The amount of memory used is over %1%. A cantidade de memoria usada sobrepasa o %1%. High Disk Usage Uso de disco elevado The amount of disk used is over %1%. A cantidade de disco usada sobrepasa o %1%. Total: %1 Total: %1 Feedback Feedback Opinión Name Nome Email Address Enderezo de correo electrónico Send Enviar Message Mensaxe Send a Feedback Enviar unha opinión Email address is not valid ! O enderezo de correo non é válido! Your message must be at least 25 characters ! A mensaxe debe ter un mínimo de 25 caracteres! Sending.. A enviar... <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>A súa opinión foi enviada correctamente.</font> Algo foi mal .Ténteo de novo. Save Gardar Non pode haber campos en branco! GnomeSettingsPage Gnome Settings Configuración de Gnome Unity Settings Configuración de Unity Window Manager Xestor de xanelas Aparencia ProcessesPage Processes Procesos All Processes Todos os procesos Search... Buscar... End Process Rematar proceso User Usuario Resident Memory Memoria residente %Memory %Memoria Virtual Memory Memoria virtual Start Time Momento de inicio State Estado Group Grupo Nice Nice CPU Time Tempo de CPU Session Sesión Process Proceso Processes (%1) Procesos (%1) Refresh (%1) Refrescar (%1) QObject Dashboard Panel ResourcesPage History of CPU Historial da CPU History of CPU Load Averages Historial das medias de carga da CPU History of Disk Read Write Historial de lecturas e escritas no disco History of Memory Historial da memoria History of Network Historial da rede Read: %1/s Total: %2 Lectura: %1/s Total: %2 Write: %1/s Total: %2 Escrita: %1/s Total: %2 %1 Minute Average: %2 %1 Media por minuto Download: %1/s Total: %2 Descarga: %1/s Total: %2 Upload: %1/s Total: %2 Envío: %1/s Total: %2 Swap: %1 (%2%) %3 Memoria de intercambio: %1 (%2%) %3 Memory: %1 (%2%) %3 Memoria: %1 (%2%) %3 Resources Recursos ServicesPage Services Servizos Startup at boot ? Iniciar durante o arranque? Running Now ? En execución agora? Not Found System Service Servizo de sistema non atopado Running Status Estado de execución Running En execución Not Running Non se está a executar Startup Status Estado no arranque Enabled Activado Disabled Desactivado System Services (%1) Servizos de sistema (%1) SettingsPage Settings Configuración Memory Percent Porcentaxe de memoria Disk Percent Porcentaxe de disco Disks Discos Language Idioma Autostart Stacer Iniciar Stacer automaticamente Alert messages (Show a warning after the specified percentage) Mensaxes de alerta (Mostrar unha advertencia despois da percentaxe indicada) Start Page Páxina de inicio CPU Percent Porcentaxe de CPU <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Creado por <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Doe Theme Tema Dashboard Panel Startup Apps Aplicacións de inicio System Cleaner Limpador do sistema Services Servizos Processes Procesos Uninstaller Desinstalador Resources Recursos StartupApp Edit App Editar aplicación Delete App Eliminar aplicación StartupAppEdit Startup App Aplicación de inicio Save Gardar Fields cannot be left blank. Os campos non poden estar en branco. App Comment Comentario sobre a aplicación App Name Nome da aplicación Command Orde Application Aplicación StartupAppsPage Not Found Startup Apps Non se atoparon aplicacións de inicio Startup Apps Aplicacións de inicio Add Startup App Engadir aplicación de inicio Startup Applications (%1) Aplicacións de inicio SystemCleanerPage System Cleaner Limpador do sistema Crash Reports Informes de fallo Application Logs Rexistros de aplicacións Application Caches Quebras de aplicacións Trash Lixo Package Caches Cachés de paquetes Back Atrás File Name Nome de ficheiro Size Tamaño %1 size files cleaned. Ficheiros de tamaño %1 limpos. UninstallerPage Uninstaller Deinstalador Search... Buscar... Not Found Installed Packages Non se atoparon paquetes instalados Uninstall Selected Desinstalar seleccionados System Installed Packages (%1) Paquetes instalados do sisetma (%1) UnitySettings Applications Aplicacións Show "Recently Used" applications Mostrar aplicacións «recentes» Enable search of your files Activar a busca dos seus ficheiros Show "More Suggestions" Mostrar «Máis suxestións» Search Buscar General Xeral Transparency Level Nivel de transparecia Behaviour Comportamento Auto Hide Agochar automaticamente Left Side Lado esquerdo Minimize applications with clicking Minimizar as aplicacións ao premelas Top-Left Corner Recanto superior esquerdo Reveal Sensitivity Revelar sensibilidade Reveal Location Revelar situación Launcher Iniciador Appearance Aparencia Left Esquerda Bottom Abaixo Visibility Visibilidade Primary Desktop Escritorio primario Icon size Tamaño das iconas All Desktops Todos os escritorios Position Posición Search online sources Buscar recursos na rede Background Blur Desenfoque do fondo Panel Panel Indicators Indicadores Date Data Calendar Calendario Date & Time Data e hora 24-Hour Time Reloxio de 24 horas Weekday Día da semana laboral Include Incluír Seconds Segundos Volume Volume Show my name Mostrar o meu nome WindowManagerSettings General Xeral Titlebar Actions Accións da barra de título Right click Clic dereito Double click Clic duplo Middle click Clic medio Additional Adicional Workspace Settings Configuración do espazo de traballo Vertical workspaces Espazos de traballo verticais Workspace switcher Conmutador de espazos de traballo Horizontal workspaces Espazos de traballo horizontais Focus Behaviour Comportamento do foco Focus mode Modo de enfoque Raise on click Elevar ao premer Hardware Acceleration Aceleración por hardware Text quality Calidade do text Fast Rápida Good Boa Best Mellor Click Clic Sloppy Lento Mouse Rato Toggle Shade Conmutar redución Maximize Maximizar Maximize Horizontally Maximizar horizontalmente Maximize Vertically Maximizar verticalmente Minimize Minimizar None Nada Lower Baixar Menu Menú ================================================ FILE: translations/stacer_hi.ts ================================================ APTSourceEdit APT Repository Edit APT Repository Components Options Cancel Fields cannot be left blank. फ़ील्ड को रिक्त नहीं छोड़ा जा सकता. URI Save बचाना Distribution Source Binary APTSourceManagerPage Search... खोज... Edit संपादित करें APT Repository Manager Not Found APT Repositories Delete हटाना Enable Source Add Repository Cancel Select to delete or edit. example %1 APT Repositories (%1) Save बचाना APTSourceRepositoryItem %1 (Source Code) App Dashboard डैशबोर्ड Startup Apps System Cleaner सिस्टम क्लीनर APT Repository Manager Uninstaller अनइंस्टॉलर Resources साधन Processes प्रक्रियाओं Services Gnome Settings Settings सेटिंग्स Feedback Quit AppearanceSettings Screen Applications Screen Reader Screen Keyboard Background Image Mode Desktop Mode Login Mode Icons Home Icon Trash Icon Mounted Volumes Icon Show Desktop Icons Network Icon None Wallpaper Centered Scaled Stretched Zoom Spanned DashboardPage Dashboard डैशबोर्ड SYSTEM INFO व्यवस्था की सूचना There are update currently available. वर्तमान में उपलब्ध अपडेट उपलब्ध हैं. Download डाउनलोड CPU CPU MEMORY याद DISK डिस्क DOWNLOAD डाउनलोड UPLOAD अपलोड Hostname: %1 होस्ट का नाम: %1 Platform: %1 मंच: %1 Distribution: %1 वितरण: %1 Kernel Release: %1 कर्नेल रिलीज: %1 CPU Model: %1 CPU आदर्श: %1 CPU Speed: %1 CPU गति: %1 CPU Core: %1 CPU कोर: %1 High CPU Usage The amount of CPU used is over %1%. High Memory Usage The amount of memory used is over %1%. High Disk Usage The amount of disk used is over %1%. Total: %1 कुल: %1 Feedback Feedback Name Email Address Send Message Send a Feedback Email address is not valid ! Your message must be at least 25 characters ! Sending.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> Something went wrong, try again ! Save बचाना Fields cannot be left blank ! GnomeSettingsPage Gnome Settings Unity Settings Window Manager Appearance ProcessesPage Processes प्रक्रियाओं All Processes सभी प्रक्रियाएं Search... खोज... End Process प्रक्रिया समाप्त Resident Memory निवासी मेमोरी %Memory %याद Virtual Memory अप्रत्यक्ष स्मृति User उपयोगकर्ता Start Time समय शुरू State राज्य Group समूह Nice अच्छा CPU Time CPU पहर Session अधिवेशन Process प्रक्रिया Processes (%1) प्रक्रियाओं (%1) Refresh (%1) ताज़ा करना (%1) QObject Dashboard डैशबोर्ड ResourcesPage History of CPU History of CPU Load Averages History of Disk Read Write History of Memory History of Network Read: %1/s Total: %2 Write: %1/s Total: %2 %1 Minute Average: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Resources साधन ServicesPage Services Startup at boot ? बूट पर स्टार्टअप? Running Now ? अब चल रहा है? Not Found System Service सिस्टम सर्विस नहीं मिला Running Status Running Not Running Startup Status Enabled Disabled System Services (%1) सिस्टम सेवाएं (%1) SettingsPage Settings सेटिंग्स Memory Percent Disk Percent Disks Language भाषा Autostart Stacer Alert messages (Show a warning after the specified percentage) Start Page CPU Percent <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Theme विषय Dashboard डैशबोर्ड Startup Apps System Cleaner सिस्टम क्लीनर Services Processes प्रक्रियाओं Uninstaller अनइंस्टॉलर Resources साधन StartupApp Edit App Delete App StartupAppEdit Startup App स्टार्टअप ऐप Save बचाना Fields cannot be left blank. फ़ील्ड को रिक्त नहीं छोड़ा जा सकता. App Comment ऐप टिप्पणी App Name एप्लिकेशन का नाम Command आदेश Application आवेदन StartupAppsPage Startup Apps Add Startup App स्टार्टअप ऐप जोड़ें Not Found Startup Apps स्टार्टअप ऐप्स नहीं मिला Startup Applications (%1) SystemCleanerPage System Cleaner सिस्टम क्लीनर Crash Reports क्रैश रिपोर्ट Application Logs एप्लिकेशन लॉग Application Caches आवेदन कैश Trash कचरा Package Caches पैकेज कैश Back वापस File Name फ़ाइल का नाम Size आकार %1 size files cleaned. %1 आकार की फ़ाइलों को साफ किया गया. UninstallerPage Uninstall Selected स्थापना रद्द करें चयनित Not Found Installed Packages स्थापित नहीं मिला संकुल Uninstaller अनइंस्टॉलर Search... खोज... System Installed Packages (%1) सिस्टम स्थापित संकुल (%1) UnitySettings Applications Show "Recently Used" applications Enable search of your files Show "More Suggestions" Search General Transparency Level Behaviour Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher Appearance Left Bottom Visibility Primary Desktop Icon size All Desktops Position Search online sources Background Blur Panel Indicators Date Calendar Date & Time 24-Hour Time Weekday Include Seconds Volume Show my name WindowManagerSettings General Titlebar Actions Right click Double click Middle click Additional Workspace Settings Vertical workspaces Workspace switcher Horizontal workspaces Focus Behaviour Focus mode Raise on click Hardware Acceleration Text quality Fast Good Best Click Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu ================================================ FILE: translations/stacer_hu.ts ================================================ APTSourceEdit APT Repository Edit APT Csomagtárolók Szerkesztése APT Repository APT Csomagtárolók Components Komponensek Options Beállítások Cancel Mégse Fields cannot be left blank. Mezőket nem lehet üresen hagyni. URI URI Save Mentés Distribution Disztribúció Source Forrás Binary Bináris APTSourceManagerPage Search... Keresés... Edit Szerkeszt APT Repository Manager APT Csomagtároló Kezelő Not Found APT Repositories Nem Találhatóak APT Csomagtárolók Delete Töröl Enable Source Forrás Engedélyezése Add Repository Csomagtárolót Hozzáad Cancel Mégse Select to delete or edit. Kiválasztás törléshez vagy szerkesztéshez. example %1 például %1 APT Repositories (%1) APT Csomagtárolók (%1) Save Mentés APTSourceRepositoryItem %1 (Source Code) %1 (Forráskód) App Dashboard Vezérlőpult Startup Apps lkalmazások Indítópult System Cleaner Rendszertisztító Uninstaller Program Eltávolító Resources Erőforrások APT Repository Manager APT Csomagtároló Kezelő Processes Folyamatok Services Szolgáltatások Gnome Settings Gnome Beállítások Settings Beállítások Feedback Visszajelzés Quit Kilépés AppearanceSettings Screen Applications Képernyőalkalmazások Screen Reader Képernyőolvasó Screen Keyboard Képernyő Billentyűzet Background Image Mode Háttérkép Mód Desktop Mode Asztali Mód Login Mode Bejelentkezés Mód Icons Ikonok Home Icon Kezdőoldal Ikon Trash Icon Lomtár Ikon Mounted Volumes Icon Csatolt Kötetek Ikon Show Desktop Icons Asztali Ikonok Mutatása Network Icon Hálózat Ikon None Semmi Wallpaper Háttérkép Centered Középre Scaled Mozaik Stretched Kiterjesztett Zoom Nagyítás Spanned Nyújtott DashboardPage Dashboard Vezérlőpult SYSTEM INFO RENDSZER INFORMÁCIÓK There are update currently available. Új frissítés érhető el. Download Letöltés CPU CPU MEMORY MEMÓRIA DISK LEMEZ DOWNLOAD LETÖLTÉS UPLOAD FELTÖLTÉS Hostname: %1 Gazdagépnév: %1 Platform: %1 Platform: %1 Distribution: %1 Disztribúció: %1 Kernel Release: %1 Kernel Kiadás: %1 CPU Model: %1 CPU Modell: %1 CPU Speed: %1 CPU Sebessége: %1 CPU Core: %1 CPU Magok száma: %1 High CPU Usage Magas Processzorhasználat The amount of CPU used is over %1%. A felhasznált processzorteljesítmény meghaladja a %1%-ot. High Memory Usage Magas Memóriahasználat The amount of memory used is over %1%. A felhasznált memória mennyiség meghaladja a %1%-ot. High Disk Usage Magas Lemez Felhasználás The amount of disk used is over %1%. A felhasznált lemez mennyisége meghaladja a %1%-ot. Total: %1 Összesen: %1 Feedback Feedback Visszajelzés Name Név Email Address Email Cím Send Küldés Message Üzenet Send a Feedback Visszajelzés Küldése Email address is not valid ! Az Email cím érvénytelen ! Your message must be at least 25 characters ! Az üzenetnek legalább 25 karakterből kell állnia ! Sending.. Küldés.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>A visszajelzést sikeresen elküldte.</font> Something went wrong, try again ! Valami hiba történt, kérjük próbálja újra ! Save Mentés Fields cannot be left blank ! A mezőket nem lehet üresen hagyni ! GnomeSettingsPage Gnome Settings Gnome Beállítások Unity Settings Unity Beállításai Window Manager Ablakkezelő Appearance Megjelenés ProcessesPage Processes Folyamatok All Processes Minden Folyamat Search... Keresés... End Process Folyamat Befejezése User Felhasználó Resident Memory Rezidens memória %Memory Memória % Virtual Memory Virtuális Memória Start Time Kezdési idő State Állapot Group Csoport Nice Szép CPU Time CPU idő Session Munkamenet Process Folyamat Processes (%1) Folyamat (%1) Refresh (%1) Frissítés (%1) QObject Dashboard Vezérlőpult ResourcesPage History of CPU CPU Használatának Előzményei History of CPU Load Averages CPU Terhelésátlagainak Előzményei History of Disk Read Write Lemez Olvasásának és Írásának Előzményei History of Memory Memóriahasználat Előzményei History of Network Hálózat Előzményei Read: %1/s Total: %2 Olvasás: %1/s Összesen: %2 Write: %1/s Total: %2 Írás: %1/s Összesen: %2 %1 Minute Average: %2 %1 Perc Átlaga: %2 Download: %1/s Total: %2 Letöltés: %1/s Összesen: %2 Upload: %1/s Total: %2 Feltöltés: %1/s Összesen: %2 Swap: %1 (%2%) %3 Cserehely: %1 (%2%) %3 Memory: %1 (%2%) %3 Memória: %1 (%2%) %3 Resources Erőforrások ServicesPage Services Szolgáltatások Startup at boot ? Rendszerindításkor induljon ? Running Now ? Most induljon ? Not Found System Service Nem Található Rendszerszolgáltatás Running Status Futtatási Állapot Running Futó Not Running Nem Futó Startup Status Indítási Állapot Enabled Engedélyezve Disabled Tiltva System Services (%1) Rendszerszolgáltatások (%1) SettingsPage Settings Beállítások Memory Percent Memória Százaléka Disk Percent Lemez Százaléka Disks Lemezek Language Nyelv Autostart Stacer Rendszerindításkor Automatikus Indítás Alert messages (Show a warning after the specified percentage) Riasztási üzenetek (Figyelmeztetés megjelenítése a megadott százalék után) Start Page Kezdőoldal CPU Percent CPU Százaléka <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Készítette <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Adományozás Theme Sablon Dashboard Vezérlőpult Startup Apps Alkalmazások Indítópult System Cleaner Rendszertisztító Services Szolgáltatások Processes Folyamatok Uninstaller Program Eltávolító Resources Erőforrások StartupApp Edit App Alkalmazás Szerkesztése Delete App Alkalmazás Törlése StartupAppEdit Startup App Alkalmazás Indítópult Save Mentés Fields cannot be left blank. Mezőket nem szabad üresen hagyni. App Comment Megjegyzés az Alkalmazáshoz App Name Alkalmazás Neve Command Parancs Application Alkalmazás StartupAppsPage Not Found Startup Apps Alkalmazások Indítópult Nem Található Startup Apps Alkalmazások Indítópult Add Startup App Alkalmazás Hozzáadása Startup Applications (%1) Alkalmazások Indítópult (%1) alkalmazása SystemCleanerPage System Cleaner Rendszertisztító Crash Reports Összeomlás Jelentések Application Logs Alkalmazásnaplók Application Caches Alkalmazás Gyorsítótárak Trash Lomtár Package Caches Csomag Gyorsítótárak Back Vissza File Name Fájl Név Size Méret %1 size files cleaned. %1 kitisztítva. UninstallerPage Uninstaller Program Eltávolító Search... Keresés... Not Found Installed Packages Nem Találhatóak Telepített Csomagok Uninstall Selected Kiválasztott Program Eltávolítása System Installed Packages (%1) Rendszer Által Telepített Csomagok (%1) UnitySettings Applications Alkalmazások Show "Recently Used" applications "Legutóbb Használt" Alkalmazások Mutatása Enable search of your files Fájlok keresésének engedélyezése Show "More Suggestions" "További Javaslatok" Mutatása Search Keresés General Általános Transparency Level Átláthatósági Szint Behaviour Viselkedés Auto Hide Automatikus Elrejtés Left Side Bal Oldal Minimize applications with clicking Kattintással minimalizálja az alkalmazásokat Top-Left Corner Bal Felső Sarok Reveal Sensitivity Érzékenység Felfedése Reveal Location Érzékenység Helye Launcher Indító Appearance Megjelenés Left Balra Bottom Lent Visibility Láthatóság Primary Desktop Elsődleges Asztal Icon size Ikon Méret All Desktops Minden Asztal Position Pozíció Search online sources Keresés online forrásokban Background Blur Elmosódott Háttér Panel Panel Indicators Elválasztók Date Dátum Calendar Naptár Date & Time Dátum és Idő 24-Hour Time 24 órás idő Weekday Hétköznap Include Tartalmazza Seconds Másodperc Volume Hangerő Show my name Név mutatása WindowManagerSettings General Általános Titlebar Actions Egér Műveletek Right click Jobb kattintás Double click Dupla kattintás Middle click Középső kattintás Additional További beállítások Workspace Settings Munkaterület beállításai Vertical workspaces Függőleges munkaterületek száma Workspace switcher Munkaterület-váltó Horizontal workspaces Vízszintes munkaterületek száma Focus Behaviour Fókusz Viselkedés Focus mode Fókusz mód Raise on click Kattintással felemel Hardware Acceleration Hardveres Gyorsítás Text quality Szövegminőség Fast Gyors Good Best Legjobb Click Kattintás Sloppy Hanyag Mouse Egér Toggle Shade Rögzített Árnyék Maximize Maximalizálás Maximize Horizontally Vízszintes Maximalizállás Maximize Vertically Függőleges Maximalizállás Minimize Minimalizálás None Semmi Lower Alsó Menu Menü ================================================ FILE: translations/stacer_it.ts ================================================ APTSourceEdit APT Repository Edit Modifica Repository APT APT Repository Repository APT Components Componenti Options Opzioni Cancel Annulla Fields cannot be left blank. I campi non possono essere lasciati vuoti. URI URI Save Salva Distribution Distribuzione Source Sorgente Binary Binario APTSourceManagerPage Search... Cerca... Edit Modifica APT Repository Manager Gestore Repository APT Not Found APT Repositories Repository APT Non Trovati Delete Cancella Enable Source Abilita Sorgente Add Repository Aggiungi Repository Cancel Annulla Select to delete or edit. Seleziona per eliminare o modificare. example %1 esempio %1 APT Repositories (%1) Repository APT (%1) Save Salva APTSourceRepositoryItem %1 (Source Code) %1 (Codice Sorgente) App Dashboard Dashboard Startup Apps App d'Avvio System Cleaner Pulizia Sistema Uninstaller Uninstaller Resources Risorse APT Repository Manager Gestore Repository APT Processes Processi Services Servizi Gnome Settings Impostazioni di Gnome Settings Impostazioni Feedback Feedback Quit Esci AppearanceSettings Screen Applications Tecnologie Assistive Screen Reader Lettore Schermo Screen Keyboard Tastiera a Schermo Background Image Mode Stile Immagine di Sfondo Desktop Mode Scrivania Login Mode Schermata di Accesso Icons Icone Home Icon Home Trash Icon Cestino Mounted Volumes Icon Volumi Montati Show Desktop Icons Mostra Icone sul Desktop Network Icon Rete None Nessuno Wallpaper Sfondo Centered Centrato Scaled Scalato Stretched Stirato Zoom Ingrandito Spanned Esteso DashboardPage Dashboard Dashboard SYSTEM INFO INFO SISTEMA There are update currently available. Ci sono aggiornamenti attualmente disponibili. Download Scarica CPU CPU MEMORY MEMORIA DISK DISCO DOWNLOAD DOWNLOAD UPLOAD UPLOAD Hostname: %1 Hostname: %1 Platform: %1 Piattaforma: %1 Distribution: %1 Distribuzione: %1 Kernel Release: %1 Versione Kernel: %1 CPU Model: %1 Modello CPU: %1 CPU Speed: %1 Velocità CPU: %1 CPU Core: %1 Core CPU: %1 High CPU Usage Utilizzo elevato della CPU The amount of CPU used is over %1%. La quantità di CPU utilizzata è superiore al %1%. High Memory Usage Utilizzo elevato della Memoria The amount of memory used is over %1%. La quantità di memoria utilizzata è superiore al %1%. High Disk Usage Utilizzo elevato del Disco The amount of disk used is over %1%. Lo spazio sul disco utilizzato è superiore al %1%. Total: %1 Totale: %1 Feedback Feedback Feedback Name Nome Email Address Indirizzo e-mail Send Invia Message Messaggio Send a Feedback Invia un Feedback Email address is not valid ! L'indirizzo e-mail non è valido ! Your message must be at least 25 characters ! Il tuo messaggio deve contenere almeno 25 caratteri ! Sending.. Invio.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Il tuo Feedback è stato inviato con successo.</font> Something went wrong, try again ! Qualcosa è andato storto, prova ancora ! Save Salva Fields cannot be left blank ! I campi non possono essere lasciati vuoti ! GnomeSettingsPage Gnome Settings Impostazioni Gnome Unity Settings Impostazioni Unity Window Manager Gestore delle Finestre Appearance Aspetto ProcessesPage Processes Processi All Processes Tutti i Processi Search... Cerca... End Process Termina Processo User Utente Resident Memory Memoria Fisica %Memory %Memoria Virtual Memory Memoria Virtuale Start Time Tempo di Avvio State Stato Group Gruppo Nice Nice CPU Time Tempo CPU Session Sessione Process Processo Processes (%1) Processi (%1) Refresh (%1) Aggiorna (%1) QObject Dashboard Dashboard ResourcesPage History of CPU Cronologia CPU History of CPU Load Averages Cronologia Carico Medio della CPU History of Disk Read Write Cronologia Lettura/Scrittura del Disco History of Memory Cronologia Memoria History of Network Cronologia Rete Read: %1/s Total: %2 Lettura: %1/s Totale: %2 Write: %1/s Total: %2 Scrittura: %1/s Totale: %2 %1 Minute Average: %2 Media su %1 Minuto/i: %2 Download: %1/s Total: %2 Download: %1/s Totale: %2 Upload: %1/s Total: %2 Upload: %1/s Totale: %2 Swap: %1 (%2%) %3 Swap: %1 (%2) %3 Memory: %1 (%2%) %3 Memoria: %1 (%2%) %3 Resources Risorse ServicesPage Services Servizi Startup at boot ? Avviare all'Avvio ? Running Now ? Eseguire Adesso ? Not Found System Service Nessun Servizio di Sistema Trovato Running Status Stato Esecuzione Running In Esecuzione Not Running Non in Esecuzione Startup Status Stato Avvio Enabled Abilitato Disabled Disabilitato System Services (%1) Servizi di Sistema (%1) SettingsPage Settings Impostazioni Memory Percent Percentuale Memoria Disk Percent Percentuale Disco Disks Dischi Language Lingua Autostart Stacer Avvio Automatico di Stacer Alert messages (Show a warning after the specified percentage) Messaggi di avviso (mostra un avviso dopo la percentuale specificata) Start Page Pagina Iniziale CPU Percent Percentuale CPU <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Creato da <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Fai una Donazione Theme Tema Dashboard Dashboard Startup Apps App d'Avvio System Cleaner Pulizia di Sistema Services Servizi Processes Processi Uninstaller Uninstaller Resources Risorse StartupApp Edit App Modifica App Delete App Cancella App StartupAppEdit Startup App App d'Avvio Save Salva Fields cannot be left blank. I campi non possono essere lasciati vuoti. App Comment Commento App Name Nome Command Comando Application Applicazione StartupAppsPage Not Found Startup Apps Nessuna App d'Avvio Trovata Startup Apps App d'Avvio Add Startup App Aggiungi App d'Avvio Startup Applications (%1) Applicazioni d'Avvio (%1) SystemCleanerPage System Cleaner Pulizia di Sistema Crash Reports Rapporti sui Crash Application Logs Registri delle Applicazioni Application Caches Cache delle Applicationi Trash Cestino Package Caches Cache dei Pacchetti Select All Seleziona Tutto Back Indietro File Name Nome File Size Dimensione %1 size files cleaned. Dimensione file puliti %1. UninstallerPage Uninstaller Uninstaller Search... Cerca... Not Found Installed Packages Pacchetti Installati Non Trovati Uninstall Selected Disinstalla Selezionati System Installed Packages (%1) Pacchetti Installati nel Sistema (%1) UnitySettings Applications Applicazioni Show "Recently Used" applications Visualizza applicazioni "Usate di Recente" Enable search of your files Abilita la ricerca dei tuoi file Show "More Suggestions" Visualizza "Maggiori Suggerimenti" Search Ricerca General Generale Transparency Level Livello di Trasparenza Behaviour Comportamento Auto Hide Nascondi Automaticamente Left Side Lato Sinistro Minimize applications with clicking Minimizza le applicazioni cliccando Top-Left Corner Angolo in Alto a Sinistra Reveal Sensitivity Sensibilità Reveal Location Posizione Launcher Launcher Appearance Aspetto Left Sinistra Bottom In basso Visibility Visibilità Primary Desktop Desktop Primario Icon size Dimensione icone All Desktops Tutti i Desktop Position Posizione Search online sources Ricerca da fonti online Background Blur Sfocatura dello Sfondo Panel Pannello Indicators Indicatori Date Data Calendar Calendario Date & Time Data e Ora 24-Hour Time Usa formato 24 Ore Weekday Giorno Lavorativo Include Includi Seconds Secondi Volume Volume Show my name Visualizza il mio nome WindowManagerSettings General Generale Titlebar Actions Azioni Barra del Titolo Right click Click tasto destro Double click Doppio click Middle click Click tasto centrale Additional Aggiuntivo Workspace Settings Impostazioni Spazio di Lavoro Vertical workspaces Spazi di Lavoro Verticali Workspace switcher Commutatore Spazio di Lavoro Horizontal workspaces Spazi di Lavoro Orizzontali Focus Behaviour Comportamento Focalizzazione Focus mode Modalità Focalizzazione Raise on click Solleva al click Hardware Acceleration Accelerazione Hardware Text quality Qualità del testo Fast Veloce Good Buono Best Migliore Click Click Sloppy Scadente Mouse Mouse Toggle Shade Alterna Tonalità Maximize Massimizza Maximize Horizontally Massimizza Orizzontalmente Maximize Vertically Massimizza Verticalmente Minimize Minimizza None Nessuna Lower Riduci Menu Menu ================================================ FILE: translations/stacer_kn.ts ================================================ APTSourceEdit APT Repository Edit APT Repository Components Options Cancel Fields cannot be left blank. ಕ್ಷೇತ್ರಗಳನ್ನು ಖಾಲಿ ಬಿಡಲಾಗುವುದಿಲ್ಲ. URI Save ಉಳಿಸಿ Distribution Source Binary APTSourceManagerPage Search... ಹುಡುಕು... Edit ತಿದ್ದು APT Repository Manager Not Found APT Repositories Delete ಅಳಿಸಿ Enable Source Add Repository Cancel Select to delete or edit. example %1 APT Repositories (%1) Save ಉಳಿಸಿ APTSourceRepositoryItem %1 (Source Code) App Dashboard ಡ್ಯಾಶ್ಬೋರ್ಡ್ Startup Apps System Cleaner ಸಿಸ್ಟಮ್ ಕ್ಲೀನರ್ APT Repository Manager Uninstaller ಅಸ್ಥಾಪನೆಗಾರ Resources ಸಂಪನ್ಮೂಲಗಳು Processes ಪ್ರಕ್ರಿಯೆಗಳು Services Gnome Settings Settings ಸೆಟ್ಟಿಂಗ್ಗಳು Feedback Quit AppearanceSettings Screen Applications Screen Reader Screen Keyboard Background Image Mode Desktop Mode Login Mode Icons Home Icon Trash Icon Mounted Volumes Icon Show Desktop Icons Network Icon None Wallpaper Centered Scaled Stretched Zoom Spanned DashboardPage Dashboard ಡ್ಯಾಶ್ಬೋರ್ಡ್ SYSTEM INFO ಸಿಸ್ಟಮ್ ಮಾಹಿತಿ There are update currently available. ನವೀಕರಣಗಳು ಲಭ್ಯವಿವೆ. Download ಡೌನ್‌ಲೋಡ್ CPU ಕೇಂದ್ರ ಸಂಸ್ಕರಣ ಘಟಕ MEMORY ಸ್ಮೃತಿ DISK ಡಿಸ್ಕ್ DOWNLOAD ಡೌನ್‌ಲೋಡ್ UPLOAD ಅಪ್‌ಲೋಡ್ Hostname: %1 ಹೋಸ್ಟ್ ಹೆಸರು: %1 Platform: %1 ವೇದಿಕೆ: %1 Distribution: %1 ವಿತರಣೆ: %1 Kernel Release: %1 ಕರ್ನಲ್ ಬಿಡುಗಡೆ: %1 CPU Model: %1 ಸಿಪಿಯು ಮಾದರಿ: %1 CPU Speed: %1 ಸಿಪಿಯು ವೇಗ: %1 CPU Core: %1 ಸಿಪಿಯು ಕೋರ್ಗಳು: %1 High CPU Usage The amount of CPU used is over %1%. High Memory Usage The amount of memory used is over %1%. High Disk Usage The amount of disk used is over %1%. Total: %1 ಒಟ್ಟು: %1 Feedback Feedback Name Email Address Send Message Send a Feedback Email address is not valid ! Your message must be at least 25 characters ! Sending.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> Something went wrong, try again ! Save ಉಳಿಸಿ Fields cannot be left blank ! GnomeSettingsPage Gnome Settings Unity Settings Window Manager Appearance ProcessesPage Processes ಪ್ರಕ್ರಿಯೆಗಳು All Processes ಎಲ್ಲಾ ಪ್ರಕ್ರಿಯೆಗಳು Search... ಹುಡುಕು... End Process ಪ್ರಕ್ರಿಯೆ ಕೊನೆಗೊಳಿಸಿ Resident Memory ನಿವಾಸ ಸ್ಮರಣೆ %Memory %ಸ್ಮೃತಿ Virtual Memory ವರ್ಚುವಲ್ ಸ್ಮೃತಿ User ಬಳಕೆದಾರ Start Time ಪ್ರಾರಂಭ ಸಮಯ State ಸ್ಥಿತಿ Group ಗುಂಪು Nice ನೈಸ್ CPU Time ಸಿಪಿಯು ಸಮಯ Session ಅವಧಿ Process ಪ್ರಕ್ರಿಯೆ Processes (%1) ಪ್ರಕ್ರಿಯೆಗಳು (%1) Refresh (%1) ರಿಫ್ರೆಶ್ (%1) QObject Dashboard ಡ್ಯಾಶ್ಬೋರ್ಡ್ ResourcesPage History of CPU History of CPU Load Averages History of Disk Read Write History of Memory History of Network Read: %1/s Total: %2 Write: %1/s Total: %2 %1 Minute Average: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Resources ಸಂಪನ್ಮೂಲಗಳು ServicesPage Services Startup at boot ? ಬೂಟ್ ಸಮಯದಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವುದೇ?? Running Now ? ಈಗ ಚಾಲನೆಯಲ್ಲಿದೆಯೆ? Not Found System Service ಯಾವುದೇ ಸಿಸ್ಟಮ್ ಸೇವೆ ಕಂಡುಬಂದಿಲ್ಲ Running Status Running Not Running Startup Status Enabled Disabled System Services (%1) ಸಿಸ್ಟಮ್ ಸೇವೆಗಳು (%1) SettingsPage Settings ಸೆಟ್ಟಿಂಗ್ಗಳು Memory Percent Disk Percent Disks Language ಭಾಷೆ Autostart Stacer Alert messages (Show a warning after the specified percentage) Start Page CPU Percent <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Theme ಥೀಮ್ Dashboard ಡ್ಯಾಶ್ಬೋರ್ಡ್ Startup Apps System Cleaner ಸಿಸ್ಟಮ್ ಕ್ಲೀನರ್ Services Processes ಪ್ರಕ್ರಿಯೆಗಳು Uninstaller ಅಸ್ಥಾಪನೆಗಾರ Resources ಸಂಪನ್ಮೂಲಗಳು StartupApp Edit App Delete App StartupAppEdit Startup App ಸಿಸ್ಟಮ್ ಆರಂಭಿಕ ಅಪ್ಲಿಕೇಶನ್ Save ಉಳಿಸಿ Fields cannot be left blank. ಕ್ಷೇತ್ರಗಳನ್ನು ಖಾಲಿ ಬಿಡಲಾಗುವುದಿಲ್ಲ. App Comment ಅಪ್ಲಿಕೇಶನ್ ಕಾಮೆಂಟ್ App Name ಅಪ್ಲಿಕೇಶನ್ ಹೆಸರು Command ಆದೇಶ Application ಅಪ್ಲಿಕೇಶನ್ StartupAppsPage Startup Apps Add Startup App ಆರಂಭಿಕ ಅಪ್ಲಿಕೇಶನ್ ಸೇರಿಸಿ Not Found Startup Apps ಆರಂಭಿಕ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ Startup Applications (%1) SystemCleanerPage System Cleaner ಸಿಸ್ಟಮ್ ಕ್ಲೀನರ್ Crash Reports ಕ್ರ್ಯಾಶ್ ವರದಿಗಳು Application Logs ಅಪ್ಲಿಕೇಶನ್ ದಾಖಲೆಗಳು Application Caches ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹ Trash ಅನುಪಯುಕ್ತ Package Caches ಪ್ಯಾಕೇಜ್ ಸಂಗ್ರಹ Back ಹಿಂದೆ File Name ಫೈಲ್ ಹೆಸರು Size ಗಾತ್ರ %1 size files cleaned. %1 ಗಾತ್ರದ ಫೈಲ್ಗಳನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಲಾಗಿದೆ. UninstallerPage Uninstall Selected ಆಯ್ಕೆಮಾಡಿದನ್ನು ಅಸ್ಥಾಪಿಸು Not Found Installed Packages ಸ್ಥಾಪಿಸಲಾದ ಪ್ಯಾಕೇಜುಗಳು ಕಂಡುಬಂದಿಲ್ಲ Uninstaller ಅಸ್ಥಾಪನೆಗಾರ Search... ಹುಡುಕು... System Installed Packages (%1) ಸಿಸ್ಟಮ್ ಅನುಸ್ಥಾಪಿಸಲಾದ ಪ್ಯಾಕೇಜುಗಳು (%1) UnitySettings Applications Show "Recently Used" applications Enable search of your files Show "More Suggestions" Search General Transparency Level Behaviour Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher Appearance Left Bottom Visibility Primary Desktop Icon size All Desktops Position Search online sources Background Blur Panel Indicators Date Calendar Date & Time 24-Hour Time Weekday Include Seconds Volume Show my name WindowManagerSettings General Titlebar Actions Right click Double click Middle click Additional Workspace Settings Vertical workspaces Workspace switcher Horizontal workspaces Focus Behaviour Focus mode Raise on click Hardware Acceleration Text quality Fast Good Best Click Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu ================================================ FILE: translations/stacer_ko.ts ================================================ APTSourceEdit APT Repository Edit APT 저장소 수정 APT Repository APT 저장소 Components Options Cancel 취소 Fields cannot be left blank. 공백은 허용되지 않습니다. URI Save 저장 Distribution Source Binary APTSourceManagerPage Search... 검색... Edit 수정 APT Repository Manager APT 저장소 관리 Not Found APT Repositories APT 저장소를 찾을 수 없습니다. Delete 삭제 Enable Source Add Repository 저장소 추가 Cancel 취소 Select to delete or edit. 수정 또는 삭제를 선택하세요. example %1 예 %1 APT Repositories (%1) APT 저장소 (%1) Save 저장 APTSourceRepositoryItem %1 (Source Code) App Dashboard 대시보드 Startup Apps 시작 프로그램 System Cleaner 시스템 클리너 Uninstaller 프로그램 제거 Resources 시스템 자원 APT Repository Manager APT 저장소 관리 Processes 프로세스 Services 서비스 Gnome Settings Settings 프로그램 설정 Feedback 피드백 Quit 종료 AppearanceSettings Screen Applications Screen Reader Screen Keyboard Background Image Mode Desktop Mode Login Mode Icons Home Icon Trash Icon Mounted Volumes Icon Show Desktop Icons Network Icon None Wallpaper Centered Scaled Stretched Zoom Spanned DashboardPage Dashboard 대시보드 SYSTEM INFO 시스템 정보 There are update currently available. 프로그램의 최신 업데이트가 있습니다. Download 다운로드 CPU CPU MEMORY 메모리 DISK 디스크 DOWNLOAD 다운로드 속도 UPLOAD 업로드 속도 Hostname: %1 호스트명: %1 Platform: %1 플랫폼: %1 Distribution: %1 운영체제: %1 Kernel Release: %1 커널 버전: %1 CPU Model: %1 CPU Speed: %1 CPU Core: %1 High CPU Usage 높은 CPU 사용율 The amount of CPU used is over %1%. %1% 이상의 CPU를 사용 중입니다. High Memory Usage 높은 메모리 사용율 The amount of memory used is over %1%. %1% 이상의 메모리를 사용 중입니다. High Disk Usage 높은 디스크 사용율 The amount of disk used is over %1%. %1% 이상의 디스크를 사용 중입니다. Total: %1 전체: %1 Feedback Feedback 피드백 Name 이름 Email Address 이메일 Send 보내기 Message 메세지 Send a Feedback 피드백 보내기 Email address is not valid ! 잘못된 이메일 형식입니다 ! Your message must be at least 25 characters ! 25자 이상의 메세지를 작성하세요 ! Sending.. 전송중.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>피드백 메세지가 성공적으로 전달되었습니다.</font> Something went wrong, try again ! 알 수 없는 오류입니다. 다시 시도해 주세요 ! Save 저장 Fields cannot be left blank ! 공백이 허용되지 않습니다 ! GnomeSettingsPage Gnome Settings Unity Settings Window Manager Appearance ProcessesPage Processes 프로세스 목록 All Processes 전체 프로세스 Search... End Process 프로세스 종료 User 사용자 Resident Memory 사용중인 메모리 %Memory 메모리 사용율 % Virtual Memory 가상 메모리 Start Time 시작 시간 State 상태 Group 그룹 Nice 실행시간 CPU Time Session 세션 Process 프로세스 Processes (%1) Refresh (%1) 새로고침 (%1) QObject Dashboard 대시보드 ResourcesPage History of CPU History of CPU Load Averages History of Disk Read Write History of Memory History of Network Read: %1/s Total: %2 읽기: %1/s 전체: %2 Write: %1/s Total: %2 쓰기: %1/s 전체: %2 %1 Minute Average: %2 %1 분 평균: %2 Download: %1/s Total: %2 다운로드: %1/s 전체: %2 Upload: %1/s Total: %2 업로드: %1/s 전체: %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Resources 시스템 자원 ServicesPage Services 서비스 목록 Startup at boot ? 시스템 시작 시 실행 여부 Running Now ? 현재 구동 중 여부 Not Found System Service 서비스를 찾을 수 없습니다. Running Status 구동 중인 상태 Running 구동 중 Not Running 사용안함 Startup Status 부팅 시 상태 Enabled 시작됨 Disabled 사용안함 System Services (%1) 시스템 서비스 (%1) SettingsPage Settings 설정 Memory Percent 메모리 사용율 Disk Percent 디스크 사용율 Disks 디스크 Language 언어설정 Autostart Stacer 부팅 시 프로그램 자동 시작 Alert messages (Show a warning after the specified percentage) 알림 설정 (아래 값을 설정하면 알림 메세지를 보여줍니다.) Start Page 프로그램 시작 페이지 CPU Percent CPU 사용율 <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate 후원하기 Theme 테마 Dashboard 대시보드 Startup Apps 시작 프로그램 System Cleaner 시스템 클리너 Services 서비스 Processes 프로세스 Uninstaller 프로그램 제거 Resources 시스템 자원 StartupApp Edit App 프로그램 수정 Delete App 프로그램 삭제 StartupAppEdit Startup App 시작 프로그램 Save 저장 Fields cannot be left blank. 공백은 허용되지 않습니다. App Comment 프로그램 설명 App Name 프로그램 이름 Command 실행명령 Application 프로그램 StartupAppsPage Not Found Startup Apps 시작 프로그램이 없습니다 Startup Apps 시작 프로그램 목록 Add Startup App 시작 프로그램 추가 Startup Applications (%1) 시작 프로그램 목록 (%1) SystemCleanerPage System Cleaner 시스템 클리너 Crash Reports 시스템 오류 기록 Application Logs 프로그램 로그 Application Caches 프로그램 캐시 Trash 휴지통 Package Caches 패키지 캐시 Back 뒤로가기 File Name 파일명 Size 크기 %1 size files cleaned. %1 크기의 파일이 제거됨. UninstallerPage Uninstaller 프로그램 제거 Search... Not Found Installed Packages 설치된 프로그램을 찾을 수 없습니다. Uninstall Selected 선택된 프로그램 제거 System Installed Packages (%1) 설치된 프로그램 목록 (%1) UnitySettings Applications Show "Recently Used" applications Enable search of your files Show "More Suggestions" Search General Transparency Level Behaviour Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher Appearance Left Bottom Visibility Primary Desktop Icon size All Desktops Position Search online sources Background Blur Panel Indicators Date Calendar Date & Time 24-Hour Time Weekday Include Seconds Volume Show my name WindowManagerSettings General Titlebar Actions Right click Double click Middle click Additional Workspace Settings Vertical workspaces Workspace switcher Horizontal workspaces Focus Behaviour Focus mode Raise on click Hardware Acceleration Text quality Fast Good Best Click Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu ================================================ FILE: translations/stacer_ml.ts ================================================ APTSourceEdit APT Repository Edit APT ശേഖരം തിരുത്തൽ APT Repository APT ശേഖരം Components ഘടകങ്ങള്‍ Options ഉപാധികള്‍ Cancel റദ്ദാക്കുക Fields cannot be left blank. നിർബന്ധമായും പൂരിപ്പിക്കേണ്ടവ. URI URI Save സൂക്ഷിക്കുക Distribution വിതരണം Source ഉറവിടം Binary ബൈനറി APTSourceManagerPage Search... തിരയുക... Edit തിരുത്തുക APT Repository Manager APT റപ്പോസിറ്ററി മാനേജർ Not Found APT Repositories APT ശേഖരങ്ങൾ ഒന്നും കണ്ടെത്താനായില്ല Delete നീക്കം ചെയ്യുക Enable Source ഉറവിടം പ്രാപ്തമാക്കുക Add Repository ശേഖരം ചേർക്കുക Cancel റദ്ദാക്കുക Select to delete or edit. തിരുത്താനോ ഇല്ലാതാക്കാനോ തിരഞ്ഞെടുക്കുക. example %1 ഉദാഹരണം %1 APT Repositories (%1) APT ശേഖരങ്ങൾ (%1) Save സൂക്ഷിക്കുക APTSourceRepositoryItem %1 (Source Code) %1 സോഴ്സ് കോഡ് App Dashboard അവലോകനം Startup Apps സ്റ്റാർട്ടപ്പ് പ്രയോഗങ്ങൾ System Cleaner സിസ്റ്റം ക്ലീനർ Uninstaller പ്രയോഗങ്ങൾ ഒഴിവാക്കൽ Resources വിഭവങ്ങൾ APT Repository Manager APT റപ്പോസിറ്ററി മാനേജർ Processes പ്രക്രിയകൾ Services സര്‍വീസുകള്‍ Gnome Settings ഗ്നോം ക്രമീകരണങ്ങൾ Settings ക്രമീകരണങ്ങൾ Feedback പ്രതികരണം Quit പുറത്ത് കടക്കുക Continue തുടരുക Will the program continue to work in the system tray? സിസ്റ്റം ട്രേയിൽ പ്രോഗ്രാം തുടർന്നും പ്രവർത്തിക്കണോ? AppearanceSettings Screen Applications സ്ക്രീൻ പ്രയോഗങ്ങൾ Screen Reader സ്ക്രീൻ റീഡർ Screen Keyboard സ്ക്രീൻ കീബോർഡ് Background Image Mode പശ്ചാത്തല ചിത്ര രീതി Desktop Mode പണിയിട രീതി Login Mode പ്രവേശന രീതി Icons പ്രതിരൂപങ്ങൾ Home Icon ഹോം പ്രതിരൂപം Trash Icon ചവറ്റുകുട്ട പ്രതിരൂപം Mounted Volumes Icon Show Desktop Icons പണിയിടത്തിലെ പ്രതിരൂപങ്ങൾ കാണിക്കുക Network Icon ശൃംഖല പ്രതിരൂപം None ഒന്നുമില്ല Wallpaper പശ്ചാത്തല ചിത്രം Centered നടുക്ക് Scaled തോതാക്കിയത് Stretched വലിച്ചു നീട്ടിയത് Zoom വലുതാക്കിയത് Spanned DashboardPage Dashboard അവലോകനം SYSTEM INFO സിസ്റ്റം വിവരങ്ങൾ There are update currently available. നിലവിൽ അപ്ഡേറ്റുകൾ ലഭ്യമാണ്. Download ഡൌൺലോഡ് CPU സി പി യു MEMORY മെമ്മറി DISK ഡിസ്ക് DOWNLOAD ഡൌൺലോഡ് UPLOAD അപ്‌ലോഡ് Hostname: %1 ഹോസ്റ്റ് നെയിം: %1 Platform: %1 പ്ലാറ്റഫോം: %1 Distribution: %1 വിതരണം: %1 Kernel Release: %1 കേർണൽ റിലീസ്: %1 CPU Model: %1 സിപിയു: %1 CPU Speed: %1 സിപിയു വേഗത: %1 CPU Core: %1 സിപിയു കോർ: %1 High CPU Usage ഉയർന്ന സിപിയു ഉപയോഗം The amount of CPU used is over %1%. ഉപയോഗിച്ച സിപിയു അളവ് %1% -ത്തിലധികമാണ്. High Memory Usage ഉയർന്ന മെമ്മറി ഉപയോഗം The amount of memory used is over %1%. ഉപയോഗിച്ച മെമ്മറി %1%.-ത്തിലധികമാണ്. High Disk Usage ഉയർന്ന ഡിസ്ക് ഉപയോഗം The amount of disk used is over %1%. ഉപയോഗിച്ചിരിക്കുന്ന ഡിസ്കിന്റെ അളവ് %1% -ത്തിലധികമാണ്. Total: %1 മൊത്തം: %1 Feedback Feedback പ്രതികരണം Name പേര് Email Address ഇമെയിൽ വിലാസം Send അയക്കുക Message സന്ദേശം Send a Feedback പ്രതികരണം അയക്കുക Email address is not valid ! ഇമെയിൽ വിലാസം ശരിയല്ല ! Your message must be at least 25 characters ! നിങ്ങളുടെ സന്ദേശത്തിൽ കുറഞ്ഞത് 25 പ്രതീകങ്ങൾ ഉണ്ടായിരിക്കണം ! Sending.. അയയ്ക്കുന്നു.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>നിങ്ങളുടെ പ്രതികരണം വിജയകരമായി അയച്ചു.</font> Something went wrong, try again ! എന്തോ കുഴപ്പം സംഭവിച്ചു, വീണ്ടും ശ്രമിക്കുക! Save സൂക്ഷിക്കുക Fields cannot be left blank ! നിർബന്ധമായും പൂരിപ്പിക്കേണ്ടവ ! GnomeSettingsPage Gnome Settings ഗ്നോം ക്രമീകരണങ്ങൾ Unity Settings യൂണിറ്റി ക്രമീകരണം Window Manager ജാലകപാലകൻ Appearance കാഴ്ച ProcessesPage Processes പ്രക്രിയകൾ All Processes എല്ലാ പ്രക്രിയകളും Search... തിരയുക... End Process പ്രക്രിയ നിർത്തുക User ഉപയോക്താവ് Resident Memory റസിഡന്റ് മെമ്മറി %Memory %മെമ്മറി Virtual Memory വിർച്ച്വൽ മെമ്മറി Start Time State അവസ്ഥ Group കൂട്ടം Nice CPU Time Session Process പ്രക്രിയ Processes (%1) പ്രക്രിയകൾ (%1) Refresh (%1) പുതുക്കുക (%1) QObject Dashboard അവലോകനം ResourcesPage History of CPU സിപിയു ചരിത്രം History of CPU Load Averages സിപിയു ലോഡ് ശരാശരികളുടെ ചരിത്രം History of Disk Read Write ഡിസ്ക് റീഡ് റൈറ്റിന്റെ ചരിത്രം History of Memory മെമ്മറി ചരിത്രം History of Network ശൃംഖല ചരിത്രം Read: %1/s Total: %2 Write: %1/s Total: %2 %1 Minute Average: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 അപ്‌ലോഡ് : %1/s മൊത്തം : %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 മെമ്മറി: %1 (%2%) %3 Resources വിഭവങ്ങൾ ServicesPage Services സര്‍വീസുകള്‍ Startup at boot ? ബൂട്ടിങ് സമയത്ത് ആരംഭിക്കുന്നു ? Running Now ? ഇപ്പോൾ പ്രവർത്തിക്കുന്നുണ്ടോ ? Not Found System Service സിസ്റ്റം സർവീസുകൾ കണ്ടെത്താനായില്ല Running Status പ്രവർത്തിക്കുന്ന നില Running പ്രവർത്തിക്കുന്നു Not Running പ്രവർത്തിക്കുന്നില്ല Startup Status ആരംഭിക്കുന്ന നില Enabled പ്രാപ്തമാക്കി Disabled അപ്രാപ്തമാക്കി System Services (%1) സിസ്റ്റം സര്‍വീസുകള്‍ (%1) SettingsPage Settings ക്രമീകരണങ്ങൾ Memory Percent മെമ്മറി ശതമാനം Disk Percent ഡിസ്ക് ശതമാനം Disks ഡിസ്ക്കുകൾ Language ഭാഷ Autostart Stacer സ്റ്റേസർ സ്വയം ആരംഭിക്കുക Alert messages (Show a warning after the specified percentage) ജാഗ്രത സന്ദേശങ്ങൾ (നിർദ്ദിഷ്ട ശതമാനത്തിനുശേഷം ഒരു മുന്നറിയിപ്പ് കാണിക്കുക) Start Page ആരംഭ പേജ് CPU Percent സിപിയു ശതമാനം <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>ഉണ്ടാക്കിയത് <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate സംഭാവന Theme തീം Dashboard അവലോകനം Startup Apps ആരംഭ പ്രയോഗങ്ങൾ System Cleaner സിസ്റ്റം ക്ലീനർ Services സര്‍വീസുകള്‍ Processes പ്രക്രിയകൾ Uninstaller പ്രയോഗങ്ങൾ ഒഴിവാക്കൽ Resources വിഭവങ്ങൾ StartupApp Edit App പ്രയോഗം തിരുത്തുക Delete App പ്രയോഗം നീക്കം ചെയ്യുക StartupAppEdit Startup App സ്റ്റാർട്ടപ്പ് പ്രയോഗം Save വരുത്തിയ മാറ്റങ്ങൾ സ്ഥിരമായി സൂക്ഷിച്ചു വെക്കാൻ സൂക്ഷിക്കുക Fields cannot be left blank. ഈ ഭാഗങ്ങൾ പൂരിപ്പിക്കാതെ മുന്നോട്ടു പോകാൻ കഴിയില്ല നിർബന്ധമായും പൂരിപ്പിക്കേണ്ടവ. App Comment ചെറു വിവരണം App Name ചേർക്കാനുദ്ദേശിക്കുന്ന അപ്ലിക്കേഷന്റെ പേര് പ്രയോഗത്തിന്റെ പേര് Command ആജ്ഞ Application അപ്ലിക്കേഷൻ പ്രയോഗം StartupAppsPage Not Found Startup Apps ഇത് വരെ പ്രയോഗങ്ങളൊന്നും ചേർക്കപ്പെട്ടിട്ടില്ല ഒന്നും തന്നെ കാണുന്നില്ല Startup Apps സ്റ്റാർട്ടപ്പ് പ്രയോഗങ്ങൾ Add Startup App സ്റ്റാർട്ടപ്പ് പ്രയോഗം ചേർക്കുക Startup Applications (%1) സ്റ്റാർട്ടപ്പ് പ്രയോഗങ്ങൾ (%1) SystemCleanerPage System Cleaner സിസ്റ്റം ക്ലീനർ Crash Reports ക്രാഷ് റിപ്പോർട്ടുകൾ Application Logs അപ്ലിക്കേഷൻ ലോഗുകൾ Application Caches അപ്ലിക്കേഷൻ കാഷെകൾ Trash ചവറ്റുകുട്ട Package Caches പാക്കേജ് കാഷെകൾ Back മടങ്ങിപ്പോവുക File Name ഫയലിന്റെ പേര് Size വലിപ്പം %1 size files cleaned. %1 വലിപ്പമുള്ള ഫയലുകൾ വൃത്തിയാക്കി. UninstallerPage Uninstaller പ്രയോഗങ്ങൾ ഒഴിവാക്കൽ Search... തിരയുക... Not Found Installed Packages ചേർത്തിട്ടുള്ള പ്രയോഗങ്ങളൊന്നും കണ്ടെത്താനായില്ല Uninstall Selected തെരഞ്ഞെടുത്തവ ഒഴിവാക്കാകുക System Installed Packages (%1) സിസ്റ്റം ചേർത്തിട്ടുള്ള പ്രയോഗങ്ങൾ (%1) UnitySettings Applications പ്രയോഗങ്ങൾ Show "Recently Used" applications അടുത്തിടെ ഉപയോഗിച്ച പ്രയോഗങ്ങൾ കാണിക്കുക Enable search of your files ഫയലുകൾ തിരയുന്നത് പ്രാപ്തമാക്കുക Show "More Suggestions" "കൂടുതൽ നിർദ്ദേശങ്ങൾ" കാണിക്കുക Search തിരയുക General പൊതുവായത് Transparency Level സുതാര്യത നില Behaviour പെരുമാറ്റം Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher ലോഞ്ചർ Appearance Left Bottom Visibility Primary Desktop Icon size ഐക്കൺ വലിപ്പം All Desktops Position Search online sources Background Blur Panel Indicators സൂചകങ്ങൾ Date Calendar Date & Time 24-Hour Time Weekday Include ഉൾപെടുത്തുക Seconds Volume Show my name WindowManagerSettings General പൊതുവായവ Titlebar Actions Right click Double click ഇരട്ട ക്ലിക്ക് Middle click Additional അധിക ക്രമീകരണങ്ങൾ Workspace Settings പണിയിടം - ക്രമീകരണങ്ങൾ Vertical workspaces ലംബമായ പണിയിടങ്ങൾ Workspace switcher പണിയിടം മാറ്റുക Horizontal workspaces തിരശ്ചീന പണിയിടങ്ങൾ Focus Behaviour Focus mode Raise on click Hardware Acceleration ഹാർഡ് വെയർ ത്വരിതപ്പെടുത്തൽ Text quality ടെക്സ്റ്റിന്റെ ഗുണനിലവാരം Fast വേഗം Good നല്ലത് Best മികച്ചത് Click ക്ലിക്ക് Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu മെനു ================================================ FILE: translations/stacer_nl.ts ================================================ APTSourceEdit APT Repository Edit APT-pakketbronbewerking APT Repository APT-pakketbron Components Onderdelen Options Opties Cancel Annuleren Fields cannot be left blank. De velden mogen niet leeg zijn. URI URI Save Opslaan Distribution Distributie Source Bron Binary Binary APTSourceManagerPage Search... Zoeken... Edit Bewerken APT Repository Manager APT-pakketbronbeheer Not Found APT Repositories Er zijn geen APT-pakketbronnen gevonden. Delete Verwijderen Enable Source Broncode Add Repository Pakketbron toevoegen Cancel Annuleren Select to delete or edit. Selecteer om te verwijderen of te bewerken. example %1 voorbeeld %1 APT Repositories (%1) APT-pakketbronnen (%1) Save Opslaan APTSourceRepositoryItem %1 (Source Code) %1 (broncode) App Dashboard Overzicht Startup Apps Opstartapplicaties System Cleaner Systeemopschoning APT Repository Manager APT-pakketbronbeheer Uninstaller Pakketverwijdering Resources Bronnen Processes Processen Services Diensten Gnome Settings GNOME-instellingen Settings Instellingen Feedback Feedback Quit Afsluiten AppearanceSettings Screen Applications Schermtoepassingen Screen Reader Schermlezer Screen Keyboard Schermtoetsenbord Background Image Mode Achtergrondafbeeldingsmodus Desktop Mode Bureaubladmodus Login Mode Inlogmodus Icons Pictogrammen Home Icon Persoonlijke map Trash Icon Prullenbak Mounted Volumes Icon Aangekoppelde volumes Show Desktop Icons Bureaubladpictogrammen weergeven Network Icon Netwerk None Geen Wallpaper Achtergrond Centered Centreren Scaled Schalen Stretched Uitrekken Zoom Vergroten Spanned Opvullen DashboardPage Dashboard Overzicht SYSTEM INFO SYSTEEMINFORMATIE There are update currently available. Er zijn updates beschikbaar. Download Downloaden CPU CPU (processor) MEMORY GEHEUGEN DISK SCHIJF DOWNLOAD DOWNLOAD UPLOAD UPLOAD Hostname: %1 Hostnaam: %1 Platform: %1 Platform: %1 Distribution: %1 Distributie: %1 Kernel Release: %1 Kernelversie: %1 CPU Model: %1 CPU-model: %1 CPU Speed: %1 CPU-frequentie: %1 CPU Core: %1 CPU-kern: %1 High CPU Usage Hoog CPU-gebruik The amount of CPU used is over %1%. Het CPU-gebruik is meer dan %1%. High Memory Usage Hoog geheugengebruik The amount of memory used is over %1%. Het geheugengebruik is meer dan %1%. High Disk Usage Veel schijfruimtegebruik The amount of disk used is over %1%. De gebruikte schijfruimte is meer dan %1%. Total: %1 Totaal: %1 Feedback Feedback Feedback Name Naam Email Address E-mailadres Send Versturen Message Bericht Send a Feedback Feedback versturen Email address is not valid ! Het e-mailadres is ongeldig! Your message must be at least 25 characters ! Uw bericht moet minimaal 25 tekens bevatten! Sending.. Bezig met versturen... <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Uw feedback is succesvol verstuurd.</font> Something went wrong, try again ! Er is iets misgegaan; probeer het opnieuw! Save Opslaan Fields cannot be left blank ! De velden mogen niet leeg zijn! GnomeSettingsPage Gnome Settings GNOME-instellingen Unity Settings Unity-instellingen Window Manager Vensterbeheerder Appearance Uiterlijk ProcessesPage Processes Processen All Processes Alle processen Search... Zoeken... End Process Proces beëindigen User Gebruiker Resident Memory Gebruikersgeheugen %Memory %Geheugen Virtual Memory Virtueel geheugen Start Time Starttijd State Status Group Groep Nice Nice CPU Time CPU-tijd Session Sessie Process Proces Processes (%1) Processen (%1) Refresh (%1) Ververstijd (%1) QObject Dashboard Overzicht ResourcesPage History of CPU CPU-geschiedenis History of CPU Load Averages Geschiedenis van gemiddelde CPU-laadtijden History of Disk Read Write Geschiedenis van schijf - lezen en schrijven History of Memory Geschiedenis van geheugen History of Network Geschiedenis van netwerk Read: %1/s Total: %2 Gelezen: %1/s Totaal: %2 Write: %1/s Total: %2 Geschreven: %1/s Totaal: %2 %1 Minute Average: %2 %1 gemiddeld aantal minuten: %2 Download: %1/s Total: %2 Download: %1/s Totaal: %2 Upload: %1/s Total: %2 Upload: %1/s Totaal: %2 Swap: %1 (%2%) %3 Wisselgeheugen: %1 (%2%) %3 Memory: %1 (%2%) %3 Geheugen: %1 (%2%) %3 Resources Systeemgebruik ServicesPage Services Diensten Startup at boot ? Uitvoeren bij systeemopstart? Running Now ? Wordt nu uitgevoerd? Not Found System Service De systeemdienst kan niet worden gevonden. Running Status Uitvoerstatus Running Wordt uitgevoerd Not Running Wordt niet uitgevoerd Startup Status Opstartstatus Enabled Ingeschakeld Disabled Uitgeschakeld System Services (%1) Systeemdiensten (%1) SettingsPage Settings Instellingen Memory Percent Geheugenpercentage Disk Percent Schijfpercentage Disks Schijven Language Taal Autostart Stacer Automatisch opstarten Alert messages (Show a warning after the specified percentage) Waarschuwingsmeldingen (laat een waarschuwing zien als het opgegeven percentage bereikt is) Start Page Startpagina CPU Percent CPU-percentage <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Gecreëerd door <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Doneren Theme Thema Dashboard Overzicht Startup Apps Opstartapplicaties System Cleaner Systeemopschoning Services Diensten Processes Processen Uninstaller Pakketverwijdering Resources Systeemgebruik StartupApp Edit App App bewerken Delete App App verwijderen StartupAppEdit Startup App Opstartapplicatie Save Opslaan Fields cannot be left blank. De velden mogen niet leeg zijn. App Comment Commentaar App Name Naam Command Opdracht Application Applicatie StartupAppsPage Not Found Startup Apps Er zijn geen opstartapplicaties gevonden. Startup Apps Opstartapplicaties Add Startup App Applicatie toevoegen Startup Applications (%1) Opstartapplicaties (%1) SystemCleanerPage System Cleaner Systeemopschoning Crash Reports Crashrapporten Application Logs Applicatielogbestanden Application Caches Applicatiecaches Trash Prullenbak Package Caches Pakketcaches Back Terug File Name Bestandsnaam Size Grootte %1 size files cleaned. %1 bestanden opgeschoond. UninstallerPage Uninstaller Pakketverwijdering Search... Zoeken... Not Found Installed Packages Geen geïnstalleerde pakketten gevonden. Uninstall Selected Geselecteerde pakketten verwijderen System Installed Packages (%1) Geínstalleerde systeempakketten (%1) UnitySettings Applications Applicaties Show "Recently Used" applications "Recent gebruikt" weergeven Enable search of your files Naar bestanden zoeken Show "More Suggestions" "Meer suggesties" weergeven Search Zoeken General Algemeen Transparency Level Doorzichtigheidsniveau Behaviour Gedrag Auto Hide Automatisch verbergen Left Side Linkerzijde Minimize applications with clicking Applicaties minimaliseren met enkele klik Top-Left Corner Linkerbovenhoek Reveal Sensitivity Opduikgevoeligheid Reveal Location Opduiklocatie Launcher Starter Appearance Uiterlijk Left Links Bottom Onderaan Visibility Zichtbaarheid Primary Desktop Huidige bureaublad Icon size Pictogramgrootte All Desktops Alle bureaubladen Position Locatie Search online sources Online bronnen doorzoeken Background Blur Achtergrondvervaging Panel Paneel Indicators Indicators Date Datum Calendar Kalender Date & Time Datum en tijd 24-Hour Time 24 uurstijd Weekday Weekdag Include Extra informatie: Seconds Seconden Volume Volume Show my name Mijn naam weergeven WindowManagerSettings General Algemeen Titlebar Actions Titelbalkacties Right click Rechtermuisknop Double click Dubbelklikken Middle click Middelste muisknop Additional Extra Workspace Settings Werkbladinstellingen Vertical workspaces Aantal verticale werkbladen Workspace switcher Werkbladwisselaar Horizontal workspaces Aantal horizontale werkbladen Focus Behaviour Focusgedrag Focus mode Focusmodus Raise on click Klikken brengt actief venster naar voorgrond Hardware Acceleration Hardwareversnelling Text quality Tekstkwaliteit Fast Snel Good Goed Best Beste Click Klik Sloppy Slordig Mouse Muis Toggle Shade Oprollen/Uitrollen Maximize Maximaliseren Maximize Horizontally Horizontaal maximaliseren Maximize Vertically Verticaal maximaliseren Minimize Minimaliseren None Niets Lower Verlagen Menu Menu ================================================ FILE: translations/stacer_oc.ts ================================================ APTSourceEdit APT Repository Edit APT Repository Components Options Cancel Fields cannot be left blank. Los camps pòdon pas èsser voids URI Save Salvar Distribution Source Binary APTSourceManagerPage Search... Edit Modificar APT Repository Manager Not Found APT Repositories Delete Suprimir Enable Source Add Repository Cancel Select to delete or edit. example %1 APT Repositories (%1) Save Salvar APTSourceRepositoryItem %1 (Source Code) App Dashboard Panèl de configuracion Startup Apps System Cleaner Netejador sistèma APT Repository Manager Uninstaller Desinstallador Resources Ressorsas Processes Processús Services Gnome Settings Settings Paramètres Feedback Quit AppearanceSettings Screen Applications Screen Reader Screen Keyboard Background Image Mode Desktop Mode Login Mode Icons Home Icon Trash Icon Mounted Volumes Icon Show Desktop Icons Network Icon None Wallpaper Centered Scaled Stretched Zoom Spanned DashboardPage Dashboard Panèl de configuracion SYSTEM INFO INFORMACIONS SISTÈMA There are update currently available. I a de mesas a jorn disponiblas Download Telecargar CPU CPU MEMORY MEMÒRIA DISK DISC DOWNLOAD TELECARGAMENT UPLOAD MANDADÍS Hostname: %1 Nom d’Òste : %1 Platform: %1 Plataforma : %1 Distribution: %1  Distribucion : %1 Kernel Release: %1 Version del nucli : %1 CPU Model: %1 Modèl del Processor : %1 CPU Speed: %1 Velocitat : %1 CPU Core: %1 Nombre de còrs : %1 High CPU Usage The amount of CPU used is over %1%. High Memory Usage The amount of memory used is over %1%. High Disk Usage The amount of disk used is over %1%. Total: %1 Total : %1 Feedback Feedback Name Email Address Send Message Send a Feedback Email address is not valid ! Your message must be at least 25 characters ! Sending.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> Something went wrong, try again ! Save Salvar Fields cannot be left blank ! GnomeSettingsPage Gnome Settings Unity Settings Window Manager Appearance ProcessesPage Processes Processús All Processes Totes los processús Search... Cercar... End Process Arrestar lo processús User Utilizaire Resident Memory %Memory Memòria residenta Virtual Memory Memòria virtuala Start Time Ora d’aviada State Estats Group Grop Nice Bon CPU Time Ora CPU Session Session Process Processús Processes (%1) Processús (%1) Refresh (%1) Actualizar (%1) QObject Dashboard Panèl de configuracion ResourcesPage History of CPU History of CPU Load Averages History of Disk Read Write History of Memory History of Network Read: %1/s Total: %2 Write: %1/s Total: %2 %1 Minute Average: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Resources Ressorsas ServicesPage Services Startup at boot ? Lançar a l’aviada ? Running Now ? En execution ara ? Not Found System Service Servici sistèma pas trobat Running Status Running Not Running Startup Status Enabled Disabled System Services (%1) Servicis sistèma (%1) SettingsPage Settings Paramètres Memory Percent Disk Percent Disks Language Lenga Autostart Stacer Alert messages (Show a warning after the specified percentage) Start Page CPU Percent <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Theme Tèma Dashboard Panèl de configuracion Startup Apps System Cleaner Netejador sistèma Services Processes Processús Uninstaller Desinstallador Resources Ressorsas StartupApp Edit App Delete App StartupAppEdit Startup App Aplicacions a l’aviada Save Salvar Fields cannot be left blank. Los camps pòdon pas èsser voids App Comment Comentari de l’aplicacion App Name Nom de l’aplicacion Command Comanda Application Aplicacion StartupAppsPage Not Found Startup Apps Aplicacions a l’aviada pas trobadas Startup Apps Add Startup App Ajustar una aplicacion a l’aviada Startup Applications (%1) SystemCleanerPage System Cleaner Netejador sistèma Crash Reports Rapòrt de problèmas Application Logs Jornals de las aplicacions Application Caches Escondedor de las aplicacions Trash Escobilhièr Package Caches Paquet de l’escondedor Back Tornar File Name Nom del fichièr Size Talha %1 size files cleaned. %1 de fichièr netejat UninstallerPage Uninstaller Desinstallador Search... Cèrca... Not Found Installed Packages Paquets installats pas trobats Uninstall Selected Desinstallar la seleccion System Installed Packages (%1) Paquets sistèma installats (%1) UnitySettings Applications Show "Recently Used" applications Enable search of your files Show "More Suggestions" Search General Transparency Level Behaviour Auto Hide Left Side Minimize applications with clicking Top-Left Corner Reveal Sensitivity Reveal Location Launcher Appearance Left Bottom Visibility Primary Desktop Icon size All Desktops Position Search online sources Background Blur Panel Indicators Date Calendar Date & Time 24-Hour Time Weekday Include Seconds Volume Show my name WindowManagerSettings General Titlebar Actions Right click Double click Middle click Additional Workspace Settings Vertical workspaces Workspace switcher Horizontal workspaces Focus Behaviour Focus mode Raise on click Hardware Acceleration Text quality Fast Good Best Click Sloppy Mouse Toggle Shade Maximize Maximize Horizontally Maximize Vertically Minimize None Lower Menu ================================================ FILE: translations/stacer_pl.ts ================================================ APTSourceEdit APT Repository Edit Edycja repozytoriów APT APT Repository Repozytorium APT Components Komponenty Options Opcje Cancel Anuluj Fields cannot be left blank. Pole nie może zostać pozostawione puste URI URI Save Zapisz Distribution Dystrybucja Source Źródło Binary Binarny APTSourceManagerPage Search... Wyszukaj... Edit Edycja APT Repository Manager Menadżer repozytoriów APT Not Found APT Repositories Nie znaleziono repozytoriów APT Delete Usuń Enable Source Włącz Źródła Add Repository Dodaj repozytoria Cancel Anuluj Select to delete or edit. Zaznacz aby usunąć lub edytować example %1 przykład %1 APT Repositories (%1) Repozytorium APT (%1) Save Zapisz APTSourceRepositoryItem %1 (Source Code) %1 (Kod źródłowy) App Dashboard Deska rozdzielcza Startup Apps Aplikacje startowe System Cleaner Czyszczenie systemu Uninstaller Deinstalator Resources Zasoby APT Repository Manager Menadżer repozytoriów APT Processes Procesy Services Usługi Gnome Settings Ustawienia GNOME Settings Ustawienia Feedback Opinia Quit Wyjdź AppearanceSettings Screen Applications Ekran aplikacji Screen Reader Ekran czytania Screen Keyboard Ekran klawiatury Background Image Mode Tryb obrazu tła Desktop Mode Tryb desktopu Login Mode Tryb loginu Icons Ikony Home Icon Ikona katalogu domowego "Home" Trash Icon Ikona Kosza Mounted Volumes Icon Ikona Mounted Volumes Show Desktop Icons Pokaż ikony pulpitu Network Icon Ikona sieci None Nic Wallpaper Tapeta Centered Wycentrowanie Scaled Skalowanie Stretched Rozciągnięcie Zoom Zbliżenie Spanned Złączenie DashboardPage Dashboard Deska rozdzielcza SYSTEM INFO Informacje systemowe There are update currently available. Dostępna jest aktualizacja Download Pobieranie CPU Procesor CPU MEMORY Pamięć RAM DISK Dysk DOWNLOAD Pobieranie UPLOAD Wysyłanie Hostname: %1 Nazwa hosta Platform: %1 Platforma: %1 Distribution: %1 Dystrybucja: %1 Kernel Release: %1 Wydanie jądra Linux: %1 CPU Model: %1 Model procesora CPU: %1 CPU Speed: %1 Prędkość zegara CPU: %1 CPU Core: %1 Rdzenie procesora CPU: %1 High CPU Usage Wysokie wykorzystanie CPU The amount of CPU used is over %1%. Wykorzystanie zasobów CPU wynosi %1. High Memory Usage Wysokie wykorzystanie pamięci The amount of memory used is over %1%. Wykorzystanie zasobów pamięci wynosi %1. High Disk Usage Wysokie wykorzystanie dysku The amount of disk used is over %1%. Wykorzystanie zasobów dysku wynosi %1. Total: %1 Całościowo: %1 Feedback Feedback Informacje zwrotne Name Imię Email Address adres e-mail Send Wyślij Message Wiadomość Send a Feedback Wysyłanie informacji zwrotnych Email address is not valid ! Błędny adres e-mail ! Your message must be at least 25 characters ! Twoja wiadomość musi zawierać przynajmniej 25 znaków ! Sending.. Wysyłanie.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Twoje informacje zwrotne zostały wysłane.</font> Something went wrong, try again ! Coś poszło nie tak, spróbuj ponownie ! Save Zapisz Fields cannot be left blank ! Pola nie mogą być pozostawione puste ! GnomeSettingsPage Gnome Settings Ustawioenia środowiska GNOME Unity Settings Ustawienia środowiska Unity Window Manager Menadżer okien Appearance Wygląd ProcessesPage Processes Procesy All Processes Wszystkie procesy Search... Szukaj... End Process Zakończ proces User Użytkownik Resident Memory Wykorzystanie pamięci %Memory %Pamięć Virtual Memory Pamięć wirtualna Start Time Czas startu State Status Group Grupa Nice Nice CPU Time CPU Time Session Sesja Process Proces Processes (%1) Procesy Refresh (%1) Odświeżanie (%1) QObject Dashboard Deska rozdzielcza ResourcesPage History of CPU Historia użycia CPU History of CPU Load Averages Historia średniego wykorzystania CPU History of Disk Read Write Historia odczytu i zapisu na dysku History of Memory Historia pamięci History of Network Historia użycia sieci Read: %1/s Total: %2 Odczyt: %1/s Całkowity: %2 Write: %1/s Total: %2 Zapis: %1/s Całkowity: %2 %1 Minute Average: %2 %1 Średnio na minutę: %2 Download: %1/s Total: %2 Pobieranie: %1/s Całkowity: %2 Upload: %1/s Total: %2 Wysyłanie: %1/s Całkowity: %2 Swap: %1 (%2%) %3 Przestrzeń wymiany: %1 (%2%) %3 Memory: %1 (%2%) %3 Pamięć: %1 (%2%) %3 Resources Zasoby ServicesPage Services Usługi Startup at boot ? Startuje podczas uruchomienia systemu? Running Now ? Działa teraz? Not Found System Service Nie znaleziono systemowej usługi Running Status Status działania Running Działa Not Running Nie działa Startup Status Status startu Enabled Aktywne Disabled Nie aktywne System Services (%1) Usługi systemowe (%1) SettingsPage Settings Ustawienia Memory Percent Pamięci procentowo Disk Percent Dysku procentowo Disks Dyski Language Język Autostart Stacer Uruchamianie programu Stacer przy starcie systemu Alert messages (Show a warning after the specified percentage) Wiadomości alarmowe (Pokazuj ostrzeżenie po przekroczeniu określonych wartości) Start Page Strona startowa CPU Percent Procesora CPU procentowo <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Stworzony przez <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Dotacja Theme Motyw Dashboard Deska rozdzielcza Startup Apps Aplikacje startowe System Cleaner Czyściciel systemu Services Usługi Processes Procesy Uninstaller Deinstalator Resources Zasoby StartupApp Edit App Edytuj aplikację Delete App Usuń aplikację StartupAppEdit Startup App Aplikacja startowa Save Zapisz Fields cannot be left blank. Pola nie mogą być pozostawione puste App Comment Komentarz aplikacji App Name Nazwa aplikacji Command Polecenie Application Aplikacja StartupAppsPage Not Found Startup Apps Nie znaleziono aplikacji startowych Startup Apps Aplikacje startowe Add Startup App Dodaj aplikację startową Startup Applications (%1) Aplikacje startowe (%1) SystemCleanerPage System Cleaner Czyszczeniel systemu Crash Reports Raporty błędów Application Logs Logi aplikacji Application Caches Pamięć podręczna aplikacji Trash Kosz Package Caches Pamięć podręczna pakietów Back Powrót File Name Nazwa pliku Size Rozmiar %1 size files cleaned. %1 rozmiar wyczyszczonych plików UninstallerPage Uninstaller Deinstalator Search... Szukaj... Not Found Installed Packages Nie znaleziono zainstalowanych aplikacji Uninstall Selected Usuń zaznaczone System Installed Packages (%1) Aplikacji zainstalowanych w systemie (%1) UnitySettings Applications Aplikacje Show "Recently Used" applications Pokaż "niedawno używane" aplikacje Enable search of your files Włącz wyszykiwanie w twoich plikach Show "More Suggestions" Pokaż "więcej sugestii" Search Szukaj General Ogólne Transparency Level Poziom przezroczystości Behaviour Zachowanie Auto Hide Automatyczne ukrywanie Left Side Z lewej strony Minimize applications with clicking Minimalizuj aplikacje po kliknięciu Top-Left Corner Lewy-górny róg Reveal Sensitivity Ustaw czułość Reveal Location Ustaw położenie Launcher Menu Appearance Wygląd Left Na lewo Bottom Na dole Visibility Widoczność Primary Desktop Główny pulpit Icon size Rozmiar ikon All Desktops Wszystkie pulpity Position Pozycja Search online sources Szukaj źródeł online Background Blur Rozmycie tła Panel Panel Indicators Wskaźniki Date Data Calendar Kalendarz Date & Time Data & Czas 24-Hour Time Czas 24-godzinny Weekday Dzień powszedni Include Zawiera Seconds Sekundy Volume Siła Show my name Pokaż moją nazwę WindowManagerSettings General Ogólne Titlebar Actions Pasek tytułowy Right click Kliknięcie prawym przyciskiem myszy Double click Podwójne kliknięcie Middle click Środkowy przycisk Additional Dodatkowe Workspace Settings Ustawienia przestrzeni roboczej Vertical workspaces Pionowa przestrzeń robocza Workspace switcher Przełącznik przestrzeni roboczej Horizontal workspaces Pozioma przestrzeń robocza Focus Behaviour Ustaw zachowanie Focus mode Ustaw tryb Raise on click Powiększ po kliknięciu Hardware Acceleration Sprzętowe przyśpieszenie Text quality Jakość tekstu Fast Szybko Good Dobrze Best Najlepiej Click Kliknięcie Sloppy Niedbale Mouse Mysz Toggle Shade Przełącznik cieni Maximize Maksymalizacja Maximize Horizontally Maksymalizuj poziomo Maximize Vertically Maksymalizuj pionowo Minimize Minimalizuj None Nic Lower Niżej Menu Menu ================================================ FILE: translations/stacer_pt.ts ================================================ APTSourceEdit APT Repository Edit Editar Repositório APT APT Repository Repositório APT Components Componentes Options Opções Cancel Cancelar Fields cannot be left blank. Os campos não podem ser deixados em branco. URI URI Save Guardar Distribution Distribuição Source Fonte Binary Binário APTSourceManagerPage Search... Pesquisar... Edit Editar APT Repository Manager Gestor de Repositório APT Not Found APT Repositories Repositório APT Não Encontrado Delete Apagar Enable Source Habilitar Fonte Add Repository Adicionar Repositório Cancel Cancelar Select to delete or edit. Selecione para apagar ou editar. example %1 exemplo %1 APT Repositories (%1) Respositório APT (%1) Save Guardar APTSourceRepositoryItem %1 (Source Code) %1 (Código Fonte) App Dashboard Visão geral Startup Apps Programas no Arranque System Cleaner Limpador do sistema APT Repository Manager Gestor de Respositório APT Uninstaller Desinstalador Resources Recursos Processes Processos Services Serviços Gnome Settings Configurações do Gnome Settings Configurações Feedback Comentários Quit Sair AppearanceSettings Screen Applications Aplicativos do Écrã Screen Reader Leitor de Écrã Screen Keyboard Teclado Virtual Background Image Mode Modo de Imagem de Fundo Desktop Mode Modo Desktop Login Mode Modo de Login Icons Ícones Home Icon Ícone do Início Trash Icon Ícone da Reciclagem Mounted Volumes Icon Ícone de Volume Montado Show Desktop Icons Mostrar Ícones do Desktop Network Icon Ícone de Rede None Nenhum Wallpaper Papel de Parede Centered Centrado Scaled Dimensionado Stretched Esticado Zoom Ampliação Spanned Abrangido DashboardPage Dashboard Visão geral SYSTEM INFO INFORMAÇÃO DO SISTEMA There are update currently available. Há atualizações disponíveis. Download Download CPU CPU MEMORY MEMÓRIA DISK DISCO DOWNLOAD DOWNLOAD UPLOAD UPLOAD Hostname: %1 Nome do computador: %1 Platform: %1 Plataforma: %1 Distribution: %1 Distribuição: %1 Kernel Release: %1 Versão do Kernel: %1 CPU Model: %1 Modelo do CPU: %1 CPU Speed: %1 Velocidade do CPU: %1 CPU Core: %1 Núcleos do CPU: %1 High CPU Usage Utilização do CPU elevada The amount of CPU used is over %1%. A quantidade de utilização do CPU está acima de %1%. High Memory Usage Utilização da Memória muito alta The amount of memory used is over %1%. A quantidade de utilização da memória está acima de %1% High Disk Usage Utilização do Disco muito alta The amount of disk used is over %1%. A quantidade de utilização do disco está acima de %1% Total: %1 Total: %1 Feedback Feedback Comentários Name Nome Email Address Endereço de E-mail Send Enviar Message Mensagem Send a Feedback Enviar um Comentário Email address is not valid ! O endereço de e-mail não é válido ! Your message must be at least 25 characters ! A sua mensagem deve ter pelo menos 25 caracteres ! Sending.. A Enviar.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>O seu Comentário foi enviado com sucesso.</font> Something went wrong, try again ! Algo deu errado, tente novamente ! Save Guardar Fields cannot be left blank ! Os campos não podem ser deixados em branco ! GnomeSettingsPage Gnome Settings Configurações do Gnome Unity Settings Configurações do Unity Window Manager Gestor de Janelas Appearance Aparência ProcessesPage Processes Processos All Processes Todos os Processos Search... Pesquisar... End Process Terminar processo User Utilizador Resident Memory Memória Residente %Memory %Memória Virtual Memory Memória virtual Start Time Tempo de Arranque State Estado Group Grupo Nice Correcto CPU Time Tempo de CPU Session Sessão Process Processo Processes (%1) Processos (%1) Refresh (%1) Atualizar (%1) QObject Dashboard Visão geral ResourcesPage History of CPU Histórico do CPU History of CPU Load Averages Histórico da Taxa de Carregamento do CPU History of Disk Read Write Histórico de Leitura e Escrita em Disco History of Memory Histórico da Memória History of Network Histórico de Rede Read: %1/s Total: %2 Leitura: %1/s Total: %2 Write: %1/s Total: %2 Escrita: %1/s Total: %2 %1 Minute Average: %2 %1 Média por Minuto: %2 Download: %1/s Total: %2 Download: %1/s Total: %2 Upload: %1/s Total: %2 Upload: %1/s Total: %2 Swap: %1 (%2%) %3 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Memória: %1 (%2%) %3 Resources Recursos ServicesPage Services Serviços Startup at boot ? Começar com o boot ? Running Now ? Rodando agora ? Not Found System Service Serviço do Sistema Não Encontrado Running Status Status de Execução Running Rodando Not Running Não está Rodando Startup Status Status de Arranque Enabled Habilitado Disabled Desabilitado System Services (%1) Serviços do Sistema (%1) SettingsPage Settings Configurações Memory Percent Percentagem de Memória Disk Percent Percentagem do Disco Disks Discos Language Idioma Autostart Stacer Início Automático do Stacer Alert messages (Show a warning after the specified percentage) Mensagens de Alerta (Mostra um aviso depois de uma percentagem espefíciada) Start Page Página Inicial CPU Percent Percentagem do CPU <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Criado Por <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Doar Theme Tema Dashboard Visão geral Startup Apps Aplicativos de Inicialização System Cleaner Limpador do Sistema Services Serviços Processes Processos Uninstaller Desinstalador Resources Recursos StartupApp Edit App Editar Aplicativo Delete App Apagar Ficheiro StartupAppEdit Startup App Aplicativo de Inicialização Save Guardar Fields cannot be left blank. Os campos não podem ser deixados em branco. App Comment Comentário do Aplicativo App Name Nome do Aplicativo Command Comando Application Aplicação StartupAppsPage Not Found Startup Apps Aplicativos de Inicialização Não Encontrados Startup Apps Aplicativos de Inicialização Add Startup App Adicionar Aplicativo de Inicialização Startup Applications (%1) Aplicativos de Inicialização (%1) SystemCleanerPage System Cleaner Limpador do Sistema Crash Reports Relatórios de Problemas Application Logs Logs de aplicativos Application Caches Caches de Aplicação Trash Reciclagem Package Caches Caches dos Pacotes Back Voltar File Name Nome do ficheiro Size Tamanho %1 size files cleaned. ficheiros de tamanho %1 limpos. UninstallerPage Uninstaller Desinstalador Search... Pesquisar... Not Found Installed Packages Pacotes Instalados Não Encontrados Uninstall Selected Desinstalar Selecionados System Installed Packages (%1) Pacotes Instalados no Sistema (%1) UnitySettings Applications Aplicações Show "Recently Used" applications Mostrar Programas "Usados Recentemente" Enable search of your files Habilitar pesquisa nos seus ficheiros Show "More Suggestions" Mostrar "Mais Sugestões" Search Pesquisa General Geral Transparency Level Nível de Transparência Behaviour Comportamento Auto Hide Ocultar Automaticamente Left Side Lado Esquerdo Minimize applications with clicking Minimizar aplicativos clicando Top-Left Corner Canto Superior Esquerdo Reveal Sensitivity Mostrar Sensibilidade Reveal Location Mostrar Localização Launcher Lançador Appearance Aparência Left Esquerda Bottom Fundo Visibility Visibilidade Primary Desktop Área de trabalho Principal Icon size Tamanho do ícone All Desktops Todas as Áreas de Trabalho Position Posição Search online sources Procurar recursos online Background Blur Desfoque de Fundo Panel Painel Indicators Indicadores Date Data Calendar Calendário Date & Time Data & Hora 24-Hour Time Dia de 24h Weekday Dia da Semana Include Incluir Seconds Segundos Volume Volume Show my name Mostrar o meu nome WindowManagerSettings General Geral Titlebar Actions Ações de Barra de Título Right click Clique direito Double click Clique duplo Middle click Clique do meio Additional Adicional Workspace Settings Configurações de Espaço de Trabalho Vertical workspaces Espaço de Trabalho Vertical Workspace switcher Alternador de espaço de trabalho Horizontal workspaces Espaço de Trabalho Horinzontal Focus Behaviour Comportamento do Foco Focus mode Modo de foco Raise on click Exibir com o clique Hardware Acceleration Aceleração de Hardware Text quality Qualidade do texto Fast Rápido Good Bom Best Melhor Click Clique Sloppy Descuidado Mouse Rato Toggle Shade Sombra Alternada Maximize Maximizar Maximize Horizontally Maximizar Horizontalmente Maximize Vertically Maximizar Verticalmente Minimize Minimizar None Nenhum Lower Inferior Menu Menu ================================================ FILE: translations/stacer_ro.ts ================================================ APTSourceEdit APT Repository Edit Editarea repozitorului APT APT Repository Repozitoriu APT Components Componente Options Opțiuni Cancel Anulare Fields cannot be left blank. Câmpurile nu pot fi lăsate necompletate. URI URI Save Salvează Distribution Distribuire Source Sursă Binary Binar APTSourceManagerPage Search... Căutare... Edit Editați APT Repository Manager Manager Repozitoriu APT Not Found APT Repositories Nu s-au găsit repozitorii APT Delete Șterge Enable Source Activați Sursa Add Repository Adăugați Repozitoriu Cancel Anulare Select to delete or edit. Selectați pentru a șterge sau a edita. example %1 exemplu %1 APT Repositories (%1) Depozite APT (%1) Save Salvează APTSourceRepositoryItem %1 (Source Code) %1 (Cod Sursă) App Dashboard Tablou de Bord Startup Apps Aplicații la Pornire System Cleaner Curățare Sistem Uninstaller Program de Dezinstalare Resources Resurse APT Repository Manager Manager Repozitoriu APT Processes Procese Services Servicii Gnome Settings Setări Gnome Settings Setări Feedback Feedback Quit Ieșire AppearanceSettings Screen Applications Aplicații Ecran Screen Reader Cititor Ecran Screen Keyboard Tastatură Ecran Background Image Mode Mod Imagine Fundal Desktop Mode Mod Desktop Login Mode Mod Autentificare Icons Pictograme Home Icon Pictogramă Acasă Trash Icon Pictogramă Gunoi Mounted Volumes Icon Pictogramă Volume Montate Show Desktop Icons Afișați Pictogramele Desktop Network Icon Pictogramă Reţea None Nici unul Wallpaper Imagine de Fundal Centered Centrat Scaled Scalat Stretched Întins Zoom Zoom Spanned Etalonat DashboardPage Dashboard Tablou de Bord SYSTEM INFO INFORMAȚIE SISTEM There are update currently available. Există actualizări disponibile în prezent. Download Descarcă CPU PROCESOR MEMORY MEMORIE DISK DISC DOWNLOAD DESCĂRCARE UPLOAD ÎNCĂRCARE Hostname: %1 Nume Gazdă: %1 Platform: %1 Platformă: %1 Distribution: %1 Distribuire: %1 Kernel Release: %1 Eliberare Kernel: %1 CPU Model: %1 Model Procesor: %1 CPU Speed: %1 Viteză Procesor: %1 CPU Core: %1 Nucleu Procesor: %1 High CPU Usage Utilizare Înaltă a Procesorului The amount of CPU used is over %1%. Cantitatea de procesor utilizată este de peste: %1%. High Memory Usage Utilizare de Memorie Ridicată The amount of memory used is over %1%. Cantitatea de memorie folosită este de peste %1%. High Disk Usage Utilizare de Disc Înaltă The amount of disk used is over %1%. Cantitatea de disc folosită este de peste %1%. Total: %1 Total: %1 Feedback Feedback Feedback Name Nume Email Address Adresă Email Send Trimite Message Mesaj Send a Feedback Trimite un Feedback Email address is not valid ! Adresa de email nu este validă ! Your message must be at least 25 characters ! Mesajul dvs. trebuie să aibă cel puțin 25 de caractere ! Sending.. Se trimite.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Feedback-ul dvs. a fost trimis cu succes.</font> Something went wrong, try again ! Ceva nu a mers bine, încercați din nou ! Save Salvează Fields cannot be left blank ! Câmpurile nu pot fi lăsate necompletate ! GnomeSettingsPage Gnome Settings Setări Gnome Unity Settings Setări Unity Window Manager Manager Fereastră Appearance Aspect ProcessesPage Processes Procese All Processes Toate Procesele Search... Căutare... End Process Închide Proces User Utilizator Resident Memory Memorie Rezidentă %Memory %Memorie Virtual Memory Memorie Virtuală Start Time Timpul de Începere State Stare Group Grup Nice Nice CPU Time Timp Procesor Session Sesiune Process Proces Processes (%1) Procese (%1) Refresh (%1) Reîmprospătare (%1) QObject Dashboard Tablou de Bord ResourcesPage History of CPU Istoricul Procesorului History of CPU Load Averages Istoricul Mediilor de Încărcare a Procesorului History of Disk Read Write Istoricul Discului Citire / Scriere History of Memory Istoricul Memoriei History of Network Istoricul Rețelei Read: %1/s Total: %2 Citire: %1/s Total: %2 Write: %1/s Total: %2 Scriere: %1/s Total: %2 %1 Minute Average: %2 %1 Minut Medie: %2 Download: %1/s Total: %2 Descărcare: %1/s Total: %2 Upload: %1/s Total: %2 Încărcare: %1/s Total: %2 Swap: %1 (%2%) %3 Swap: %1 (%2%) %3 Memory: %1 (%2%) %3 Memorie: %1 (%2%) %3 Resources Resurse ServicesPage Services Servicii Startup at boot ? Lansare la pornire ? Running Now ? Pornite Acum ? Not Found System Service Nu a Fost Găsit Serviciul de Sistem Running Status Stare de Funcționare Running Pornite Not Running Oprite Startup Status Stare de Pornire Enabled Activat Disabled Dezactivat System Services (%1) Servicii Sistem (%1) SettingsPage Settings Setări Memory Percent Procentul de Memorie Disk Percent Procentul de Disc Disks Discuri Language Limbă Autostart Stacer Pornire Automată Stacer Alert messages (Show a warning after the specified percentage) Mesaje de alertă (Afișați un avertisment după procentajul specificat) Start Page Pagină de Start CPU Percent Procentul Procesorului <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Creat de <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Donează Theme Temă Dashboard Tablou de Bord Startup Apps Aplicații la Pornire System Cleaner Curățare Sistem Services Servicii Processes Procese Uninstaller Program de Dezinstalare Resources Resurse StartupApp Edit App Editează Aplicație Delete App Șterge Aplicație StartupAppEdit Startup App Aplicație la Pornire Save Salvează Fields cannot be left blank. Câmpurile nu pot fi lăsate necompletate. App Comment Comentariu Aplicație App Name Nume Aplicație Command Comandă Application Aplicație StartupAppsPage Not Found Startup Apps Aplicații la Pornire Nu Au Fost Găsite Startup Apps Aplicații la Pornire Add Startup App Adaugă Aplicație la Pornire Startup Applications (%1) Aplicații la Pornire (%1) SystemCleanerPage System Cleaner Curățare Sistem Crash Reports Rapoarte de Avarie Application Logs Jurnalele de Aplicații Application Caches Aplicații în Cache Trash Gunoi Package Caches Pachete în Cache Back Înapoi File Name Nume Fișier Size Mărime %1 size files cleaned. %1 dimensiune fișiere curățate UninstallerPage Uninstaller Program de Dezinstalare Search... Căutare... Not Found Installed Packages Nu s-au găsit Pachete Instalate Uninstall Selected Dezinstalați Selectate System Installed Packages (%1) Pachetele de Sistem Instalate (%1) UnitySettings Applications Aplicații Show "Recently Used" applications Arată "Aplicațiile" Utilizate Recent Enable search of your files Activați căutarea fișierelor dvs. Show "More Suggestions" Arată "Mai Multe Sugestii" Search Căutare General General Transparency Level Nivel Transparență Behaviour Comportament Auto Hide Ascundere Automată Left Side Partea Stânga Minimize applications with clicking Minimizați aplicațiile cu click Top-Left Corner Colțul din Stânga-Sus Reveal Sensitivity Dezvăluie Sensibilitatea Reveal Location Dezvăluie Locația Launcher Lansator Appearance Aspect Left Stânga Bottom Partea de Jos Visibility Vizibilitate Primary Desktop Desktop Primar Icon size Mărime Pictogramă All Desktops Toate Desktop-urile Position Poziție Search online sources Căutați surse online Background Blur Neclaritate Fundal Panel Panou Indicators Indicatoare Date Dată Calendar Calendar Date & Time Dată & Timp 24-Hour Time 24 de Ore Weekday Zi de Lucru Include Include Seconds Secunde Volume Volum Show my name Arată-mi numele WindowManagerSettings General Generel Titlebar Actions Acțiuni Bară de Titlu Right click Click Dreapta Double click Dublu Click Middle click Click pe Mijloc Additional Adiţional Workspace Settings Setări ale Spațiului de Lucru Vertical workspaces Spații de lucru verticale Workspace switcher Comutator spațiu de lucru Horizontal workspaces Spații de lucru orizontale Focus Behaviour Comportament Focalizare Focus mode Mod Focalizare Raise on click Ridicați pe click Hardware Acceleration Accelerare Hardware Text quality Calitate Text Fast Rapid Good Bun Best Cel mai Bun Click Click Sloppy Neîngrijit Mouse Mouse Toggle Shade Comutare Umbră Maximize Maximizați Maximize Horizontally Maximizați Orizontal Maximize Vertically Maximizați Vertical Minimize Minimizați None Nici unul Lower Lăsa în Jos Menu Meniu ================================================ FILE: translations/stacer_ru.ts ================================================ APTSourceEdit APT Repository Edit Редактирование репозитория APT APT Repository Репозиторий APT Components Компоненты Options Параметры Cancel Отмена Fields cannot be left blank. Необходимо заполнить поля. URI Адрес Save Сохранить Distribution Дистрибутив Source Исходный код Binary Готовые пакеты APTSourceManagerPage Search... Поиск... Edit Изменить APT Repository Manager Менеджер репозиториев APT Not Found APT Repositories Не найдены репозитории APT Delete Удалить Enable Source Включить источник Add Repository Добавить репозиторий Cancel Отмена Select to delete or edit. Выберите для удаления или редактирования. example %1 пример %1 APT Repositories (%1) Репозиториев APT (%1) Save Сохранить APTSourceRepositoryItem %1 (Source Code) %1 (Исходный код) App Dashboard Обзор Startup Apps Автозапуск приложений System Cleaner Очистка системы APT Repository Manager Менеджер репозиториев APT Uninstaller Удаление пакетов Resources Ресурсы Processes Процессы Services Службы Gnome Settings Настройки Gnome Settings Настройки Feedback Обратная связь Quit Выход AppearanceSettings Screen Applications Экранные приложения Screen Reader Чтение с экрана Screen Keyboard Экранная клавиатура Background Image Mode Режим фонового изображения Desktop Mode Режим рабочего стола Login Mode Режим экрана блокировки Icons Значки Home Icon Значок домашнего каталога Trash Icon Значок корзины Mounted Volumes Icon Значок примонтированных томов Show Desktop Icons Показывать значки на рабочем столе Network Icon Значок сети None Не выбрано Wallpaper Обои Centered По центру Scaled Масштабирование Stretched Растягивание Zoom Увеличение Spanned Заполнение DashboardPage Dashboard Обзор SYSTEM INFO СИСТЕМНАЯ ИНФОРМАЦИЯ There are update currently available. Доступно обновление. Download Скачать CPU ЦП MEMORY ПАМЯТЬ DISK ДИСК DOWNLOAD ПОЛУЧЕНИЕ UPLOAD ОТПРАВКА Hostname: %1 Имя компьютера: %1 Platform: %1 Платформа: %1 Distribution: %1 Дистрибутив: %1 Kernel Release: %1 Версия ядра: %1 CPU Model: %1 Модель ЦП: %1 CPU Speed: %1 Частота ЦП: %1 CPU Core: %1 Ядра ЦП: %1 High CPU Usage Высокая загрузка процессора The amount of CPU used is over %1%. Использование процессора превышает %1%. High Memory Usage Высокое потребление памяти The amount of memory used is over %1%. Использование памяти превышает %1%. High Disk Usage Высокая загрузка диска The amount of disk used is over %1%. Использование диска превышает %1%. Total: %1 Всего: %1 Feedback Feedback Отправить отзыв Name Имя Email Address Электронная почта Send Отправить Message Сообщение Send a Feedback Отправить отзыв Email address is not valid ! Некорректный адрес электронной почты! Your message must be at least 25 characters ! Ваше сообщение должно быть больше 25 символов! Sending.. Отправка.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Ваш отзыв был отправлен.</font> Something went wrong, try again ! Что-то пошло не так, попробуйте еще раз! Save Сохранить Fields cannot be left blank ! Поля нельзя оставлять пустыми! GnomeSettingsPage Gnome Settings Настройки Gnome Unity Settings Настройки Unity Window Manager Оконный менеджер Appearance Внешний вид ProcessesPage Processes Процессы All Processes Все процессы Search... Поиск... End Process Завершить процесс Resident Memory Резидентная память %Memory %Память Virtual Memory Виртуальная память User Пользователь Start Time Запущен State Состояние Group Группа Nice Приоритет CPU Time Время ЦП Session Сессия Process Процесс Processes (%1) Процессы (%1) Refresh (%1) Обновление (%1) QObject Dashboard Обзор ResourcesPage History of CPU Использование процессора History of CPU Load Averages Средняя загрузка процессора History of Disk Read Write Диск History of Memory Память и раздел подкачки History of Network Загрузка сети Read: %1/s Total: %2 Чтение: %1/c Всего: %2 Write: %1/s Total: %2 Запись: %1/c Всего: %2 %1 Minute Average: %2 Среднее за %1 минут: %2 Download: %1/s Total: %2 Получение: %1/c Всего: %2 Upload: %1/s Total: %2 Отправка: %1/c Всего: %2 Swap: %1 (%2%) %3 Файл подкачки: %1 (%2%) %3 Memory: %1 (%2%) %3 Память: %1 (%2%) %3 Resources Ресурсы ServicesPage Services Службы Startup at boot ? Запускать при загрузке? Running Now ? Запущена сейчас? Not Found System Service Системные службы не найдены Running Status Статус Running Запущена Not Running Не запущена Startup Status Автозапуск Enabled Включено Disabled Отключено System Services (%1) Системные службы (%1) SettingsPage Settings Настройки Memory Percent Загрузка памяти Disk Percent Загрузка диска Disks Диски Language Язык Autostart Stacer Автозапуск Stacer Alert messages (Show a warning after the specified percentage) Показывать предупреждение после указанного процента Start Page Стартовый экран CPU Percent Загрузка ЦП <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Автор: <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Пожертвовать Theme Тема Dashboard Обзор Startup Apps Запускаемые приложения System Cleaner Очистка системы Services Службы Processes Процессы Uninstaller Удаление пакетов Resources Ресурсы StartupApp Edit App Редактировать Delete App Удалить StartupAppEdit Startup App Запуск приложения Save Сохранить Fields cannot be left blank. Необходимо заполнить поля. App Comment Описание App Name Имя Command Команда Application Приложение StartupAppsPage Startup Apps Автозапуск приложений Add Startup App Добавить Not Found Startup Apps Автоматически запускаемые приложения не найдены Startup Applications (%1) Автоматически запускаемые приложения (%1) SystemCleanerPage System Cleaner Очистка системы Crash Reports Отчёты об ошибках Application Logs Журналы приложений Application Caches Кэш приложений Trash Корзина Package Caches Загруженные пакеты Back Назад File Name Имя файла Size Размер %1 size files cleaned. Освобождено %1. UninstallerPage Uninstall Selected Удалить выбранные Not Found Installed Packages Установленные пакеты не найдены Uninstaller Удаление пакетов Search... Поиск... System Installed Packages (%1) Системные пакеты (%1) UnitySettings Applications Приложения Show "Recently Used" applications Показывать недавние приложения Enable search of your files Включить поиск файлов Show "More Suggestions" Показывать "Другие рекомендации" Search Поиск General Основное Transparency Level Прозрачность Behaviour Поведение Auto Hide Скрывать автоматически Left Side Слева Minimize applications with clicking Минимизация приложений по щелчку Top-Left Corner Верхний левый угол Reveal Sensitivity Скорость открытия Reveal Location Место окрытия Launcher Панель запуска Appearance Внешний вид Left Слева Bottom Снизу Visibility Видимость Primary Desktop Основной рабочий стол Icon size Размер значков All Desktops Все рабочие столы Position Расположение Search online sources Поиск результатов в сети Background Blur Фоновое размытие Panel Панель Indicators Индикаторы Date Дата Calendar Календарь Date & Time Дата и время 24-Hour Time 24-часовой формат Weekday День недели Include Добавлять Seconds Секунды Volume Громкость Show my name Показывать моё имя WindowManagerSettings General Основные Titlebar Actions Действия заголовка Right click Правый щелчок Double click Двойной щелчок Middle click Щелчок средней кнопкой Additional Дополнительно Workspace Settings Настройка рабочего окружения Vertical workspaces Вертикальных рабочих столов Workspace switcher Переключение рабочих столов Horizontal workspaces Горизонтальных рабочих столов Focus Behaviour Поведение фокуса Focus mode Режим фокусировки Raise on click На передний план по щелчку Hardware Acceleration Аппаратное ускорение Text quality Качество текста Fast Быстрое Good Хорошее Best Наилучшее Click По щелчку Sloppy По положению курсора исключая рабочий стол Mouse По положению курсора Toggle Shade Свернуть в заголовок Maximize Распахнуть Maximize Horizontally Распахнуть горизонтально Maximize Vertically Распахнуть вертикально Minimize Свернуть None Не выбрано Lower На задний план Menu Меню ================================================ FILE: translations/stacer_sv.ts ================================================ APTSourceEdit APT Repository Edit Redigera APT programkälla APT Repository APT programkälla Components Komponenter Options Alternativ Cancel Avbryt Fields cannot be left blank. Inga fält kan lämnas tomma. URI URI Save Spara Distribution Distribution Source Källa Binary Binär APTSourceManagerPage Search... Sök... Edit Redigera APT Repository Manager APT programkällor Not Found APT Repositories Inga APT programkällor hittades Delete Ta bort Enable Source Aktivera källa Add Repository Lägg till programkälla Cancel Avbryt Select to delete or edit. Markera för att ta bort eller redigera. example %1 exempel %1 APT Repositories (%1) APT programkällor (%1) Save Spara APTSourceRepositoryItem %1 (Source Code) %1 (Källkod) App Dashboard Instrumentpanel Startup Apps Uppstartsprogram System Cleaner Systemrensare APT Repository Manager APT programkällor Uninstaller Avinstallerare Resources Resurser Processes Processer Services Tjänster Gnome Settings Gnome-inställningar Settings Inställningar Feedback Återkoppling Quit Avsluta AppearanceSettings Screen Applications Skärmprogram Screen Reader Skärmläsare Screen Keyboard Skärmtangentbord Background Image Mode Bakgrundsbild Desktop Mode Skrivbord Login Mode Inloggning Icons Ikoner Home Icon Hem Trash Icon Papperskorg Mounted Volumes Icon Monterade enheter Show Desktop Icons Visa skrivbordsikoner Network Icon Nätverk None Ingen Wallpaper Skrivbordsbakgrund Centered Centrerad Scaled Skalad Stretched Utsträckt Zoom Zooma Spanned Mosaik DashboardPage Dashboard Instrumentpanel SYSTEM INFO SYSTEMINFORMATION There are update currently available. Det finns en uppdatering tillgänglig. Download Ladda ner CPU CPU MEMORY MINNE DISK DISK DOWNLOAD NERLADDNING UPLOAD UPPLADDNING Hostname: %1 Värdnamn: %1 Platform: %1 Plattform: %1 Distribution: %1 Distribution: %1 Kernel Release: %1 Linux-kärna: %1 CPU Model: %1 CPU-modell: %1 CPU Speed: %1 CPU-hastighet: %1 CPU Core: %1 CPU-kärnor: %1 High CPU Usage Hög CPU-belastning The amount of CPU used is over %1%. CPU-belastningen överstiger %1%. High Memory Usage Hög minnesanvändning The amount of memory used is over %1%. Minnesanvändningen överstiger %1%. High Disk Usage Hög diskbelastning The amount of disk used is over %1%. Diskbelastningen överstiger %1%. Total: %1 Totalt: %1 Feedback Feedback Återkoppling Name Namn Email Address E-postadress Send Skicka Message Meddelande Send a Feedback Skicka återkoppling Email address is not valid ! E-postadressen är inte giltig! Your message must be at least 25 characters ! Det meddelande måste innehålla minst 25 tecken! Sending.. Skickar... <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Din återkoppling har skickats.</font> Something went wrong, try again ! Något gick fel, försök igen! Save Spara Fields cannot be left blank ! Inga fält kan lämnas tomma! GnomeSettingsPage Gnome Settings Gnome-inställningar Unity Settings Unity-inställningar Window Manager Fönsterhanterare Appearance Utseende SearchPage Search Sök Browse... Bläddra... Search... Sök... Case Insensitive Skiftlägesokänslig minute minut Search as Root Sök som root Owner Ägare RegEx RegEx Permissions Rättigheter Readable Läsbar Writable Skrivbar Executable Körbar Time Tid Empty Tom File or Folder: Fil eller mapp: Invert Invertera Advanced Search Avancerat sök BETA version BETA-version Name Namn Path Sökväg Size Storlek User Användare Group Grupp Creation Time Skapad Last Access Senast använd Last Modification Modifierad Last Change Senast ändrad Open Folder Öppna mapp Move Trash Flytta till papperskorg Delete Ta bort Choose Välj All Alla File Fil Directory Katalog Symbolic Link Symbolisk länk Access Åtkomst Modify Modifiera Change Ändra Smaller Mindre än Equal Lika med Greater Större än Select Directory Välj katalog Directory: %1 Katalog: %1 Advanced Search %1 Avancerat sök %1 Select the search directory. Välj sökkatalog. Somethings went wrong, try again. Något gick fel, försök igen. %1 files found. Showing %2 of them. %1 filer hittades. Visar %2 av dem. ProcessesPage Processes Processer All Processes Alla processer Search... Sök... End Process Avsluta process Resident Memory Minne %Memory % Minne Virtual Memory Virtuellt minne User Användare Start Time Starttid State Status Group Grupp Nice Prioritet CPU Time CPU-tid Session Session Process Process Processes (%1) Processer (%1) Refresh (%1) Uppdateringsintervall (%1) QObject Dashboard Instrumentpanel ResourcesPage History of CPU Processorhistorik History of CPU Load Averages Historik över processorns medelbelastning History of Disk Read Write Historik över diskanvändning History of Memory Historik över minnesanvändning History of Network Nätverkshistorik Read: %1/s Total: %2 Läs: %1/s Totalt: %2 Write: %1/s Total: %2 Skriv: %1/s Totalt: %2 %1 Minute Average: %2 %1 minut(er) medelvärde: %2 Download: %1/s Total: %2 Nerladdning: %1/s Totalt: %2 Upload: %1/s Total: %2 Uppladdning: %1/s Totalt: %2 Swap: %1 (%2%) %3 Växlingsutrymme: %1 (%2%) %3 Memory: %1 (%2%) %3 Minne: %1 (%2%) %3 Resources Resurser ServicesPage Services Tjänster Startup at boot ? Starta vid systemstart? Running Now ? Körs nu? Not Found System Service Ingen systemtjänst hittades Running Status Körstatus Running Körs Not Running Körs inte Startup Status Startstatus Enabled Aktiverad Disabled Inaktiverad System Services (%1) Systemtjänster (%1) SettingsPage Settings Inställningar Memory Percent Minnesanvändning Disk Percent Diskanvändning Disks Diskar Language Språk Autostart Stacer Starta Stacer automatiskt Alert messages (Show a warning after the specified percentage) Varningsmeddelande (Visa en varning efter specificerad procentsats) Start Page Startsida CPU Percent CPU-belastning <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>Skapat av <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> App Quit Don't Ask Fråga inte vid avslut Donate Donera Theme Tema Dashboard Instrumentpanel Startup Apps Uppstartsprogram System Cleaner Systemstädare Search Sök Services Tjänster Processes Processer Uninstaller Avinstallerare Resources Resurser Helpers Hjälpare StartupApp Edit App Redigera programmet Delete App Ta bort programmet StartupAppEdit Startup App Uppstartsprogram Save Spara Fields cannot be left blank. Inga fält kan lämnas tomma. App Comment Programkommentar App Name Programnamn Command Kommando Application Program StartupAppsPage Startup Apps Uppstartsprogram Add Startup App Lägg till uppstartsprogram Not Found Startup Apps Inga uppstartsprogram hittades Startup Applications (%1) Uppstartsprogram (%1) SystemCleanerPage System Cleaner Systemrensare Crash Reports Kraschrapporter Application Logs Programloggar Application Caches Programcache Trash Papperskorgen Package Caches Paketcache Select All Markera alla Back Tillbaka File Name Filnamn Size Storlek %1 size files cleaned. %1 filer togs bort. UninstallerPage Uninstall Selected Avinstallera markerat Not Found Installed Packages Inga installerade paket hittades Uninstaller Avinstallerare Search... Sök... System Installed Packages (%1) Installerade paket (%1) HelpersPage Helpers Hjälpare Host Manage Värdhantering HostManage Hosts (%1) Värdnamn (%1) IP Address IP-adress Full Qualified Kvalificerat namn Aliases Alias Edit Redigera Delete Ta bort The IP and Fully Qualified fields are required. IP och fullt kvalificerad krävs. Save Changes Spara ändringar New Host Nytt värdnamn IP Address * IP-adress * Fully Qualified Name * Fullt kvalificerat namn * Save Spara Cancel Avbryt UnitySettings Applications Program Show "Recently Used" applications Visa "Nyligen använda" program Enable search of your files Aktivera sökning efter filer Show "More Suggestions" Visa "Fler förslag" Search Sök General Allmänt Transparency Level Transparensnivå Behaviour Beteende Auto Hide Dölj automatiskt Left Side Vänster sida Minimize applications with clicking Minimera program med klick Top-Left Corner Vänster överkant hörn Reveal Sensitivity Avslöja känslighet Reveal Location Avslöja plats Launcher Programstartare Appearance Utseende Left Vänster Bottom Underkant Visibility Synlighet Primary Desktop Primärt skrivbord Icon size Ikonstorlek All Desktops Alla skrivbord Position Position Search online sources Sök källor online Background Blur Bakgrundsoskärpa Panel Panel Indicators Indikatorer Date Datum Calendar Kalender Date & Time Datum & tid 24-Hour Time 24-timmars tid Weekday Veckodag Include Inkludera Seconds Sekunder Volume Volym Show my name Visa mitt namn WindowManagerSettings General Allmänt Titlebar Actions Namnfältsåtgärder Right click Högerklick Double click Dubbelklick Middle click Mushjulsklick Additional Ytterligare Workspace Settings Inställningar för arbetsytor Vertical workspaces Vertikala arbetsytor Workspace switcher Arbetsyteväxlare Horizontal workspaces Horisontella arbetsytor Focus Behaviour Fokusbeteende Focus mode Fokusläge Raise on click Ta fram vid klick Hardware Acceleration Hårdvaruacceleration Text quality Textkvalitet Fast Snabb Good Bra Best Bäst Click Klick Sloppy Slarvig Mouse Mus Toggle Shade Skugga av/på Maximize Maximera Maximize Horizontally Maximera horisontellt Maximize Vertically Maximera vertikalt Minimize Minimera None Ingen Lower Lägre Menu Meny ================================================ FILE: translations/stacer_tr.ts ================================================ APTSourceEdit APT Repository Edit APT Depo Düzenle APT Repository APT Depo Components Komponentler Options Seçenekler Cancel İptal Fields cannot be left blank. Alanları boş bırakmayın. URI URI Save Kaydet Distribution Dağıtım Source Kaynak Binary İkili APTSourceManagerPage Search... Arama... Edit Düzenle APT Repository Manager APT Depo Yönetimi Not Found APT Repositories APT Deposu bulunamadı Delete Sil Enable Source Kaynağı Etkinleştir Add Repository Depo Ekle Cancel İptal Select to delete or edit. Silmek veya düzenlemek için seçim yapın. example %1 örnek %1 APT Repositories (%1) APT Depolar (%1) Save Kaydet APTSourceRepositoryItem %1 (Source Code) %1 (Kaynak Kod) App Dashboard Genel Startup Apps Başlangıç Uygulamaları System Cleaner Sistem Temizleyici APT Repository Manager APT Depo Yönetimi Uninstaller Kaldırıcı Resources Kaynaklar Processes İşlemler Services Servisler Gnome Settings Gnome Ayarları Settings Ayarlar Feedback Geri Bildirim Quit Çıkış AppearanceSettings Screen Applications Ekran Uygulamaları Screen Reader Ekran Okuyucu Screen Keyboard Ekran Klavyesi Background Image Mode Arkaplan Resim Biçim Desktop Mode Masaüstü Biçimi Login Mode Giriş Ekranı Biçimi Icons İkonlar Home Icon Ev İkon Trash Icon Çöp Kutusu İkon Mounted Volumes Icon Bağlanan Cihazlar İkon Show Desktop Icons Masaüstü İkonları Göster Network Icon Ağ İkon None Yok Wallpaper Duvar Kağıdı Centered Merkezi Scaled Sığdırılmış Stretched Gergin Zoom Yakınlaştır Spanned Yayılmış DashboardPage Dashboard Genel SYSTEM INFO SİSTEM BİLGİLERİ There are update currently available. Şu anda mevcut güncelleme var. Download İndir CPU CPU MEMORY BELLEK DISK DİSK DOWNLOAD İNDİRME UPLOAD YÜKLEME Hostname: %1 Bilgisayar Adı: %1 Platform: %1 Platform: %1 Distribution: %1 Dağıtım: %1 Kernel Release: %1 Çekirdek Sürümü: %1 CPU Model: %1 CPU Modeli: %1 CPU Speed: %1 CPU Hızı: %1 CPU Core: %1 CPU Çekirdek: %1 High CPU Usage Yüksek CPU Kullanımı The amount of CPU used is over %1%. Kullanılan CPU miktarı %1% den fazla. High Memory Usage Yüksek Bellek Kullanımı The amount of memory used is over %1%. Kullanılan bellek miktarı %1% den fazla. High Disk Usage Yüksek Disk Kullanımı The amount of disk used is over %1%. Kullanılan disk miktarı %1% den fazla. Total: %1 Toplam: %1 Feedback Feedback Geri Bildirim Name İsim Email Address Mail Adresi Send Gönder Message Mesaj Send a Feedback Geribildirim Gönder Email address is not valid ! Mail adresiniz geçerli değil ! Your message must be at least 25 characters ! Mesajınız en az 25 karakter olmalı ! Sending.. Gönderiliyor.. <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>Geribildiriminiz başarıyla gönderildi.</font> Something went wrong, try again ! Bir şeyler ters gitti, tekrar deneyin ! Save Kaydet Fields cannot be left blank ! Alanlar boş bırakılamaz ! GnomeSettingsPage Gnome Settings Gnome Ayarları Unity Settings Unity Ayarları Window Manager Pencere Yönetimi Appearance Görünüm ProcessesPage Processes İşlemler All Processes Bütün İşlemler Search... Arama... End Process İşlemi Sonlandır User Kullanıcı Resident Memory Yerleşmiş Bellek %Memory %Bellek Virtual Memory Sanal Bellek Start Time Başlangıç Zamanı State Durum Group Grup Nice Güzel CPU Time CPU Zamanı Session Oturum Process İşlem Processes (%1) İşlemler (%1) Refresh (%1) Yenile (%1) QObject Dashboard Genel ResourcesPage History of CPU CPU Geçmişi History of CPU Load Averages CPU Yük Ortalamaları Geçmişi History of Disk Read Write Disk Okuma Yazma Geçmişi History of Memory Bellek Geçmişi History of Network Ağ Geçmişi Read: %1/s Total: %2 Okuma: %1/s Toplam: %2 Write: %1/s Total: %2 Yazma: %1/s Toplam: %2 %1 Minute Average: %2 %1 Dakika Ortalama: %2 Download: %1/s Total: %2 İndirme: %1/s Toplam: %2 Upload: %1/s Total: %2 Gönderme %1/s Toplam: %2 Swap: %1 (%2%) %3 Takas Alanı: %1 (%2%) %3 Memory: %1 (%2%) %3 Dahili Hafıza: %1 (%2%) %3 Resources Kaynaklar ServicesPage Services Servisler Startup at boot ? Açılışta başlatma ? Running Now ? Şimdi Çalışıyor ? Not Found System Service Sistem Servisi Bulunamadı Running Status Çalışma Durumu Running Çalışma Not Running Çalışmıyor Startup Status Başlangıç Durumu Enabled Aktif Disabled Pasif System Services (%1) Sistem Servisleri (%1) SettingsPage Settings Ayarlar Memory Percent Bellek Yüzde Disk Percent Disk Yüzde Disks Diskler Language Dil Autostart Stacer Stacer'ı otomatik başlat Alert messages (Show a warning after the specified percentage) Uyarı mesajları (Belirtilen yüzdeyi geçince uyarı göster) Start Page Başlangıç Sayfası CPU Percent CPU Yüzde <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p><a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate Bağış Yap Theme Tema Dashboard Genel Startup Apps Başlangıç Uygulamaları System Cleaner Sistem Temizleyici Services Servisler Processes İşlemler Uninstaller Kaldırıcı Resources Kaynaklar StartupApp Edit App Uygulamayı Düzenle Delete App Uygulamayı Sil StartupAppEdit Startup App Başlangıç Uygulaması Save Kaydet Fields cannot be left blank. Alanları boş bırakmayın. App Comment Uygulama Yorum App Name Uygulama Adı Command Komut Application Uygulama StartupAppsPage Not Found Startup Apps Başlangıç Uygulaması Bulunamadı Startup Apps Başlangıç Uygulamaları Add Startup App Başlangıç Uygulaması Ekle Startup Applications (%1) Başlangıç Uygulamaları (%1) SystemCleanerPage System Cleaner Sistem Temizleyici Crash Reports Kilitlenme Raporları Application Logs Uygulama Günlükleri Application Caches Uygulama Önbellekleri Trash Çöp Package Caches Paket Önbellekleri Back Geri File Name Dosya Adı Size Boyut %1 size files cleaned. %1 boyutunda dosya temizlendi. UninstallerPage Uninstaller Kaldırıcı Search... Arama... Not Found Installed Packages Yüklü Uygulama Bulunamadı Uninstall Selected Seçilenleri Kaldır System Installed Packages (%1) Sistemde Yüklü Uygulamalar (%1) UnitySettings Applications Uygulamalar Show "Recently Used" applications Göster "Son Kullanılan" uygulamalar Enable search of your files Dosyalarınızı aramayı etkinleştirin Show "More Suggestions" Göster "Daha Fazla Öneri" Search Ara General Genel Transparency Level Şeffaflık Seviyesi Behaviour Davranış Auto Hide Otomatik Gizle Left Side Sol Kısım Minimize applications with clicking Tıklayarak uygulamaları küçültün Top-Left Corner Sol Üst Köşe Reveal Sensitivity Hassasiyeti Göster Reveal Location Konumu Göster Launcher Başlatıcı Appearance Görünüm Left Sol Bottom Alt Visibility Görünürlük Primary Desktop Birincil Masaüstü Icon size Simge boyutu All Desktops Tüm Masaüstü Position Pozisyon Search online sources Çevrimiçi arama kaynağı Background Blur Arka Plan Bulanıklığı Panel Panel Indicators Göstergeler Date Tarih Calendar Takvim Date & Time Tarih & Zaman 24-Hour Time 24 Saat Dilimi Weekday İş Günü Include Dahil Et Seconds Saniye Volume Ses Show my name İsmimi göster WindowManagerSettings General Genel Titlebar Actions Başlık Çubuğu İşlemleri Right click Sağ tıklama Double click Çift tıklama Middle click Orta tıklama Additional İlave Workspace Settings Çalışma Alanı Ayarları Vertical workspaces Dikey çalışma alanları Workspace switcher Çalışma alanı değiştirici Horizontal workspaces Yatay çalışma alanları Focus Behaviour Odak Davranışı Focus mode Odak modu Raise on click Tıklayınca büyüt Hardware Acceleration Donanım Hızlandırma Text quality Yazı kalitesi Fast Hızlı Good İyi Best En İyi Click Tıklama Sloppy Yarım Mouse Fare Toggle Shade Ekran Geçişi Maximize Büyüt Maximize Horizontally Yatay Büyüt Maximize Vertically Dikey Büyüt Minimize Küçült None Yok Lower Alt Menu Menü ================================================ FILE: translations/stacer_ua.ts ================================================ App Dashboard Огляд System Cleaner Очищення системи System Startup Apps Програми які автоматично запускаються System Services Системні служби Uninstaller Видалення пакетів Resources Ресурси Processes Процеси Settings Налаштування DashboardPage SYSTEM INFO СИСТЕМНА ІНФОРМАЦІЯ There are update currently available. Доступно оновлення. Download Завантажити CPU ЦП MEMORY ПАМ'ЯТЬ DISK ДИСК DOWNLOAD ОТРИМАНО UPLOAD НАДІСЛАНО Hostname: %1 Ім'я комп'ютера: %1 Platform: %1 Платформа: %1 Distribution: %1 Дистрибутив: %1 Kernel Release: %1 Версія ядра: %1 CPU Model: %1 Модель ЦП: %1 CPU Speed: %1 Частота ЦП: %1 CPU Core: %1 Ядра ЦП: %1 Total: %1 Всього: %1 ProcessesPage Processes Процеси All Processes Всі процеси Search... Пошук... End Process Завершити процес Resident Memory Резидентна пам'ять %Memory %Пам'ять Virtual Memory Віртуальна пам'ять User Користувач Start Time Запущено State Стан Group Група Nice Пріоритет CPU Time Час ЦП Session Сесія Seat Робоче місце Process Процес Processes (%1) Процеси (%1) Refresh (%1) Оновлення (%1) ResourcesPage CPU History Використання ЦП Memory History Використання пам'яті і підкачування Network History Використання мережі Download %1/s Total: %2 Отримано %1/с Всього: %2 Upload %1/s Total: %2 Надіслано %1/с Всього: %2 Swap %1 (%2%) %3 Підкачка %1 (%2%) %3 Memory %1 (%2%) %3 Пам'ять %1 (%2%) %3 ServicesPage System Services Системні служби Startup at boot ? Запускати при завантаженні? Running Now ? Запущено зараз? Not Found System Service Системні служби не знайдені System Services (%1) Системні служби (%1) SettingsPage Language Мова Theme Тема StartupApp Delete Видалити Edit Змінити StartupAppEdit Startup App Запуск програми Save Зберегти Fields cannot be left blank. Необхідно заповнити поля. App Comment Опис App Name Ім'я Command Команда Application Програма StartupAppsPage Add Startup App Додати System Startup Applications Програми які автоматично запускаються Not Found Startup Apps Не знайдено програми які автоматично запускаються System Startup Applications (%1) Програми які автоматично запускаються (%1) SystemCleanerPage Crash Reports Звіти про помилки Application Logs Журнали програми Application Caches Кеші програми Trash Смітник Package Caches Завантажені пакети Back Назад File Name Ім'я файлу Size Розмір %1 size files cleaned. Звільнено %1. UninstallerPage Uninstall Selected Видалити вибрані Not Found Installed Packages Встановлені пакети не знайдені System Installed Packages Системні пакети Search... Пошук... System Installed Packages (%1) Системні пакети (%1) ================================================ FILE: translations/stacer_vn.ts ================================================ App Dashboard Bảng Điều Khiển System Cleaner Làm Sạch Hệ Thống System Startup Apps Ứng Dụng Khởi Động Cùng Hệ Thống System Services Dịch Vụ Hệ Thống Uninstaller Gỡ Cài Đặt Resources Biểu Đồ Tài Nguyên Processes Tiến Trình Settings Cài Đặt DashboardPage SYSTEM INFO Thông Tin Hệ Thống There are update currently available. Có Cập Nhật Mới Download Tải Xuống CPU CPU MEMORY RAM DISK Ổ Đĩa DOWNLOAD Tải Xuống UPLOAD Tải Lên Hostname: %1 Tên Máy: %1 Platform: %1 Nền Tảng: %1 Distribution: %1 Phiên Bản: %1 Kernel Release: %1 Phiên Bản Kernel: %1 CPU Model: %1 Model Của CPU: %1 CPU Speed: %1 Tốc Độ CPU: %1 CPU Core: %1 Nhân CPU:%1 Total: %1 Tổng: %1 ProcessesPage Processes Tiến Trình All Processes Tất Cả Tiến Trình Search... Tìm Kiếm... End Process Kết Thúc Tiến Trình User Người Dùng Resident MEMORY RAM Sử Dụng %Memory % RAM Virtual Memory RAM Ảo Start Time Thời Gian Bắt Đầu State Khu Vực Group Nhóm Nice Tốt CPU Time Thời Gian CPC Session Phiên Làm Việc Seat Vị Trí Process Tiến Trình Processes (%1) Tiến Trình (%1) Refresh (%1) Làm Mới (%1) ResourcesPage CPU History Lịch Sử CPC Memory History Lịch Sử RAM Network History Kết Nối Internet Download %1/s Total: %2 Tải Xuống %1/s Tổng: %2 Upload %1/s Total: %2 Tải Lên %1 /s Tổng: %2 Swap %1 (%2%) %3 SWAP %1 (%2%) %3 Memory %1 (%2%) %3 RAM %1 (%2%) %3 ServicesPage System Services Dịch Vụ Hệ Thống Startup at boot ? Khởi Động Cùng Hệ Thống ? Running Now ? Đang Chạy ? Not Found System Service Không Tìm Thấy Dịch Vụ Hệ Thống System Services (%1) Dịch Vụ Hệ Thống (%1) SettingsPage Language Ngôn Ngữ Theme Giao Diện StartupApp Delete Xóa Edit Sửa StartupAppEdit Startup App Ứng Dụng Khởi Động Cùng Hệ Thống Save Lưu Fields cannot be left blank. Trường Nhập Không Được Bỏ Trống. App Comment Mô Tả Ứng Dụng App Name Tên Ứng Dụng Command Lệnh Application Ứng Dụng StartupAppsPage Not Found Startup Apps Không Tìm Thấy Ứng Dụng Khởi Động Cùng Hệ Thống System Startup Applications Ứng Dụng Khởi Động Cùng Hệ Thống Add Startup App Thêm Ứng Dụng System Startup Applications (%1) Ứng Dụng Khởi Động Cùng Hệ Thống (%1) SystemCleanerPage Crash Reports Báo Cáo Lỗi Application Logs Bản Ghi Ứng Dụng Application Caches Bộ Nhớ Tạm Ứng Dụng Trash Thùng Rác Package Caches Bộ Nhớ Tạm Gói Back Quay Lại File Name Tên Tập Tin Size Kích Cỡ %1 size files cleaned. %1 Kích Cỡ Tập Tin Được Làm Sạch UninstallerPage System Installed Packages Gói Hệ Thống Đã Cài Đặt Search... Tìm Kiếm... Not Found Installed Packages Không Tìm Thấy Gói Uninstall Selected Gỡ Bỏ Gói Đã Chọn System Installed Packages (%1) Gói Hệ Thống Đã Cài Đặt (%1) ================================================ FILE: translations/stacer_zh-cn.ts ================================================ APTSourceEdit APT Repository Edit APT源编辑 APT Repository APT源 Components 组件 Options 选项 Cancel 取消 Fields cannot be left blank. 字段不能留空 URI URI Save 保存 Distribution 发行版 Source Binary 二进制 APTSourceManagerPage Search... 搜索... Edit 编辑 APT Repository Manager APT源管理 Not Found APT Repositories 未发现APT源 Delete 删除 Enable Source 使用源 Add Repository 添加源 Cancel 取消 Select to delete or edit. 选中即可删除或编辑. example %1 例如 %1 APT Repositories (%1) APT源(%1) Save 保存 APTSourceRepositoryItem %1 (Source Code) %1 (源代码) App Dashboard 仪表盘 Startup Apps 开机启动程序 System Cleaner 系统清理 APT Repository Manager APT源管理 Uninstaller 程序卸载 Resources 系统资源 Processes 进程 Services 服务 Gnome Settings Gnome设置 Settings 设置 Feedback 反馈 Quit 退出 AppearanceSettings Screen Applications 屏幕程序 Screen Reader 屏幕朗读 Screen Keyboard 屏幕键盘 Background Image Mode 背景图片模式 Desktop Mode 桌面模式 Login Mode 登录模式 Icons 图标 Home Icon 用户主图标 Trash Icon 回收站图标 Mounted Volumes Icon 已挂载卷图标 Show Desktop Icons 显示桌面图标 Network Icon 网络图标 None Wallpaper 壁纸 Centered 居中 Scaled 按比例缩放 Stretched 拉伸 Zoom 缩放 Spanned 贯穿 DashboardPage Dashboard 仪表盘 SYSTEM INFO 系统信息 There are update currently available. 当前有可用更新 Download 下载 CPU CPU MEMORY 内存 DISK 磁盘 DOWNLOAD 下载 UPLOAD 上传 Hostname: %1 主机名: %1 Platform: %1 平台: %1 Distribution: %1 发行版: %1 Kernel Release: %1 内核版本: %1 CPU Model: %1 CPU型号: %1 CPU Speed: %1 CPU频率: %1 CPU Core: %1 CPU内核数: %1 High CPU Usage CPU负载高 The amount of CPU used is over %1%. CPU使用量已过%1%。 High Memory Usage 内存负载高 The amount of memory used is over %1%. 内存使用量已过%1%。 High Disk Usage 磁盘负载高 The amount of disk used is over %1%. 磁盘使用量已过%1%。 Total: %1 总计: %1 Feedback Feedback 反馈 Name 姓名 Email Address 邮件地址 Send 发送 Message 正文 Send a Feedback 发送反馈 Email address is not valid ! 邮件地址不正确! Your message must be at least 25 characters ! 正文不得少于25个字符。 Sending.. 正在发送… <font color='#2ecc71'>Your Feedback has been successfully sended.</font> <font color='#2ecc71'>反馈发送成功。</font> Something went wrong, try again ! 出错,请重试! Save 保存 Fields cannot be left blank ! 此处不能留空! GnomeSettingsPage Gnome Settings Gnome设置 Unity Settings Unity设置 Window Manager 窗口管理器 Appearance 屏幕外观 ProcessesPage Processes 进程 All Processes 全部进程 Search... 搜索… End Process 结束进程 User 用户 Resident Memory 常驻内存 %Memory %内存 Virtual Memory 虚拟内存 Start Time 开始时间 State 状态 Group 群组 Nice 优先值 CPU Time CPU时间 Session 会话 Process 进程 Processes (%1) 进程 (%1) Refresh (%1) 刷新 (%1) QObject Dashboard 仪表盘 ResourcesPage History of CPU CPU历史 History of CPU Load Averages CPU平均负载历史记录 History of Disk Read Write 磁盘读写历史 History of Memory 内存历史 History of Network 网络历史 Read: %1/s Total: %2 读取: %1/s 总计: %2 Write: %1/s Total: %2 写入: %1/s 总计: %2 %1 Minute Average: %2 %1 分钟平均值: %2 Download: %1/s Total: %2 下载: %1/s 总计: %2 Upload: %1/s Total: %2 上传: %1/s 总计: %2 Swap: %1 (%2%) %3 交换分区: %1 (%2%) %3 Memory: %1 (%2%) %3 内存: %1 (%2%) %3 Resources 系统资源 ServicesPage Services 服务 Startup at boot ? 设置为开机启动吗? Running Now ? 现在运行吗? Not Found System Service 未找到系统服务 Running Status 运行状态 Running 正在运行 Not Running 未在运行 Startup Status 启动状态 Enabled 启用 Disabled 禁止 System Services (%1) 系统服务 (%1) SettingsPage Settings 设置 Memory Percent 内存占比 Disk Percent 磁盘占比 Disks 磁盘分区 Language 语言 Autostart Stacer Stacer自启动 Alert messages (Show a warning after the specified percentage) 提醒信息(在超过指定百分比后显示警告) Start Page 开始页面 CPU Percent CPU占比 <html><head/><body><p>Created by <a href="https://github.com/oguzhaninan"><span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> <html><head/><body><p>由<a href="https://github.com/oguzhaninan"><创建 span style=" text-decoration: underline; color:#007af4;">Oğuzhan İNAN</span></a></p></body></html> Donate 捐赠 Theme 主题 Dashboard 仪表盘 Startup Apps 开机启动程序 System Cleaner 系统清理 Services 服务 Processes 进程 Uninstaller 卸载程序 Resources 系统资源 StartupApp Edit App 编辑程序 Delete App 删除程序 StartupAppEdit Startup App 开机启动程序 Save 保存 Fields cannot be left blank. 字段不能留空。 App Comment 程序备注 App Name 程序名称 Command 命令 Application 程序 StartupAppsPage Not Found Startup Apps 未发现开机启动程序 Startup Apps 开机启动程序 Add Startup App 添加开机启动程序 Startup Applications (%1) 开机启动程序(%1) SystemCleanerPage System Cleaner 系统清理 Crash Reports 崩溃报告 Application Logs 程序日志 Application Caches 应用缓存 Trash 回收站 Package Caches 包缓存 Back 返回 File Name 文件名 Size 大小 %1 size files cleaned. 已经清理文件%1。 UninstallerPage Uninstaller 卸载程序 Search... 搜索… Not Found Installed Packages 未发现已安装过的包 Uninstall Selected 卸载选中项 System Installed Packages (%1) 系统已安装了的包 (%1) UnitySettings Applications 程序 Show "Recently Used" applications 显示"近期使用"程序 Enable search of your files 启用文件搜索 Show "More Suggestions" 显示"更多建议" Search 搜索 General 常规 Transparency Level 透明程度 Behaviour 行为 Auto Hide 自动隐藏 Left Side 左侧 Minimize applications with clicking 通过点击最小化程序 Top-Left Corner 左上角 Reveal Sensitivity 展示灵敏度 Reveal Location 展示区域 Launcher 启动器 Appearance 外观 Left 左侧 Bottom 底部 Visibility 可见 Primary Desktop 主桌面 Icon size 图标尺寸 All Desktops 所有桌面 Position 位置 Search online sources 搜索网络源 Background Blur 背景模糊 Panel 面板 Indicators 系统托盘指示器 Date 日期 Calendar 日历 Date & Time 日期 & 时间 24-Hour Time 24时间制 Weekday 工作日 Include 包括 Seconds Volume Show my name 显示用户名 WindowManagerSettings General 常规 Titlebar Actions 标题栏动作 Right click 右键点击 Double click 左键双击 Middle click 中键点击 Additional 附加 Workspace Settings 工作区设置 Vertical workspaces 工作区垂直排列 Workspace switcher 工作区切换器 Horizontal workspaces 工作区水平排列 Focus Behaviour 鼠标焦点行为 Focus mode 焦点模式 Raise on click 点击则提升到最上层 Hardware Acceleration 硬件加速 Text quality 文本质量 Fast 快速 Good Best 最好 Click 点击 Sloppy 滑过 Mouse 鼠标 Toggle Shade 切换形状 Maximize 最大化 Maximize Horizontally 水平最大化 Maximize Vertically 垂直最大化 Minimize 最小化 None Lower 更低 Menu 菜单 ================================================ FILE: translations/stacer_zh-tw.ts ================================================ App Dashboard 儀表板 System Cleaner 系統清理 System Startup Apps 系統開機啟動項目 System Services 系統服務 Uninstaller 解除安裝 Resources 系統資源 Processes 處理程序 Settings 設定 DashboardPage SYSTEM INFO 系統資訊 There are update currently available. 目前有可用更新 Download 下載 CPU CPU MEMORY 記憶體 DISK 磁碟 DOWNLOAD 下載 UPLOAD 上傳 Hostname: %1 主機名稱: %1 Platform: %1 平台: %1 Distribution: %1 發行版: %1 Kernel Release: %1 Kernel 版本: %1 CPU Model: %1 CPU 型號: %1 CPU Speed: %1 CPU 時脈: %1 CPU Core: %1 CPU 核心: %1 Total: %1 總計: %1 ProcessesPage Processes 處理程序 All Processes 所有處理程序 Search... 搜尋... End Process 結束處理程序 User 使用者 Resident Memory 常駐記憶體 %Memory %記憶體 Virtual Memory 虛擬記憶體 Start Time 開始時間 State 狀態 Group 群組 Nice 優先權 CPU Time CPU 時間 Session 工作階段 Seat 座位 Process 處理程序 Processes (%1) 處理程序 (%1) Refresh (%1) 更新 (每 %1 秒) ResourcesPage CPU History CPU 使用量記錄 Memory History 記憶體使用量記錄 Network History 網路使用量記錄 Download %1/s Total: %2 下載 %1/s 總計: %2 Upload %1/s Total: %2 上傳 %1/s 總計: %2 Swap %1 (%2%) %3 交換區 %1 (%2%) %3 Memory %1 (%2%) %3 記憶體 %1 (%2%) %3 ServicesPage System Services 系統服務 Startup at boot ? 開機後自動啟動? Running Now ? 立即執行? Not Found System Service 沒有找到系統服務 System Services (%1) 系統服務 (%1) SettingsPage Language 語言 Theme 主題 StartupApp Delete 刪除 Edit 編輯 StartupAppEdit Startup App 系統開機啟動項目 Save 儲存 Fields cannot be left blank. 欄位不能為空 App Comment 註解 App Name 名稱 Command 指令 Application 應用程式 StartupAppsPage Not Found Startup Apps 沒有找到系統開機啟動項目 System Startup Applications 系統開機啟動項目 Add Startup App 加入系統開機啟動項目 System Startup Applications (%1) 系統開機啟動項目 (%1) SystemCleanerPage Crash Reports 當機報告 Application Logs 應用程式日誌 Application Caches 應用程式快取 Trash 垃圾桶 Package Caches 套件快取 Back 返回 File Name 檔案名稱 Size 大小 %1 size files cleaned. 已清除 %1 的空間 UninstallerPage System Installed Packages 系統已安裝的套件 Search... 搜尋... Not Found Installed Packages 未發現已安裝的套件 Uninstall Selected 解除安裝選中的項目 System Installed Packages (%1) 系統已安裝的套件 (%1)