From d434a3c63502c3a2f0d681fb0d2486cdce38aefc Mon Sep 17 00:00:00 2001 From: Josevi Date: Sun, 20 Sep 2026 23:15:29 +0200 Subject: [PATCH] plasmoids: quita claudeusageswitcher y tt.launchpadPlasma (sin usar) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ninguno de los dos está colocado en ningún panel actualmente (solo aparecían en backups antiguos de appletsrc, o ni eso). Detectado en auditoría de plasmoides instalados vs. plasmoides realmente puestos. Co-Authored-By: Claude Sonnet 5 --- .../LICENSE | 674 ---------- .../README.md | 212 --- .../claude-usage-widget.plasmoid | Bin 42178 -> 0 bytes .../contents/config/config.qml | 15 - .../contents/config/main.xml | 54 - .../contents/icons/claude-usage-widget.svg | 26 - .../contents/icons/claude.svg | 3 - .../contents/icons/widget.svg | 22 - .../contents/screenshot.png | Bin 17899 -> 0 bytes .../contents/ui/Translations.qml | 790 ----------- .../contents/ui/configGeneral.qml | 191 --- .../contents/ui/main.qml | 1163 ----------------- .../executable_install.sh | 16 - .../logo.png | Bin 51520 -> 0 bytes .../logo.svg | 36 - .../metadata.json | 21 - .../screenshots/panel.png | Bin 4947 -> 0 bytes .../screenshots/popup.png | Bin 61972 -> 0 bytes .../contents/config/config.qml | 17 - .../contents/config/main.xml | 95 -- .../contents/ui/ActionMenu.qml | 122 -- .../contents/ui/CompactRepresentation.qml | 119 -- .../contents/ui/ConfigGeneral.qml | 239 ---- .../contents/ui/DashboardRepresentation.qml | 523 -------- .../contents/ui/ItemGridDelegate.qml | 120 -- .../contents/ui/ItemGridView.qml | 472 ------- .../contents/ui/ItemListDelegate.qml | 137 -- .../contents/ui/ItemListDialog.qml | 99 -- .../contents/ui/ItemListView.qml | 267 ---- .../contents/ui/ItemMultiGridView.qml | 235 ---- .../contents/ui/SideBarItem.qml | 142 -- .../contents/ui/SideBarSection.qml | 83 -- .../contents/ui/code/tools.js | 181 --- .../tt.launchpadPlasma/contents/ui/main.qml | 274 ---- .../tt.launchpadPlasma/metadata.json | 24 - 35 files changed, 6372 deletions(-) delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/LICENSE delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/README.md delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/claude-usage-widget.plasmoid delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/config/config.qml delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/config/main.xml delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude-usage-widget.svg delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude.svg delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/widget.svg delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/screenshot.png delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/ui/Translations.qml delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/ui/configGeneral.qml delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/ui/main.qml delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/executable_install.sh delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.png delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.svg delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/metadata.json delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/screenshots/panel.png delete mode 100644 dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/screenshots/popup.png delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/config/config.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/config/main.xml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ActionMenu.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/CompactRepresentation.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ConfigGeneral.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/DashboardRepresentation.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridDelegate.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridView.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDelegate.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDialog.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListView.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemMultiGridView.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarItem.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarSection.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/code/tools.js delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/main.qml delete mode 100644 dot_local/share/plasma/plasmoids/tt.launchpadPlasma/metadata.json diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/LICENSE b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/LICENSE deleted file mode 100644 index f288702..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/LICENSE +++ /dev/null @@ -1,674 +0,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 -. diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/README.md b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/README.md deleted file mode 100644 index a815963..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/README.md +++ /dev/null @@ -1,212 +0,0 @@ -# Claude Usage Widget - -A KDE Plasma 6 widget that displays your Claude Code usage statistics in the taskbar. - -![Popup](screenshots/popup.png) - -## Features - -- **Compact Panel Display**: Shows session and weekly usage percentages right in your taskbar - ![Panel](screenshots/panel.png) -- **Color-coded Indicators**: Green (<50%), Yellow (<80%), Red (≥80%) -- **Detailed Popup**: Click to see full statistics - - Session and weekly usage with progress bars - - Reset times for both limits - - Per-model breakdown (Sonnet/Opus) - - Your subscription plan badge -- **Configurable Refresh**: Default 5 min polling (adjustable in settings) -- **Smart Rate Limit Handling**: Uses `retry-after` header, exponential backoff, and token watcher for automatic recovery -- **Local Cache**: Remembers last data on restart (up to 24h) -- **Stale Detection**: Widget dims when data is outdated -- **Error Handling**: Clear messages when not logged in, token expired, or rate limited -- **Custom API Support**: Optional proxy/gateway with custom base URL and API key -- **15 Languages**: EN, HU, DE, FR, ES, IT, PT, RU, PL, NL, TR, JA, KO, ZH-CN, ZH-TW -- **No Dependencies**: Pure QML, no Python or external tools required - -## Requirements - -- KDE Plasma 6.0 or later -- Claude Code CLI installed and logged in - -## Installation - -### From KDE Store - -1. Right-click on your panel -2. Select "Add Widgets..." -3. Click "Get New Widgets..." > "Download New Plasma Widgets..." -4. Search for "Claude Usage" -5. Click Install - -### Manual Installation - -```bash -kpackagetool6 -t Plasma/Applet -i claude-usage-widget.plasmoid -``` - -### From Source - -```bash -git clone https://github.com/izll/plasma-claude-usage.git -cd claude-usage-widget -kpackagetool6 -t Plasma/Applet -i . -``` - -## Usage - -1. Make sure you're logged in to Claude Code (run `claude` in terminal) -2. Add the widget to your panel -3. Click the widget to see detailed usage statistics - -## Configuration - -Right-click the widget and select **Configure...** to open the settings. - -### Custom API Base URL (optional) - -By default the widget reads your OAuth credentials from `~/.claude/.credentials.json` and calls `https://api.anthropic.com` directly — no configuration needed. - -If you use a custom API proxy or gateway, you can override this: - -| Setting | Description | -|---|---| -| **Base URL** | Your proxy URL, e.g. `https://your-proxy.example.com` | -| **API key** | Your `ANTHROPIC_API_KEY` | - -> **Note:** The widget calls `/api/oauth/usage`, not the standard `/v1/messages` endpoint. Use the root URL without any path suffix — e.g. `https://api.anthropic.com`, not `https://api.anthropic.com/v1`. - -When a base URL is configured, the widget authenticates with `x-api-key` instead of the OAuth token. Leave the Base URL field empty to go back to the default credentials file method. - -## How It Works - -The widget calls the Anthropic usage API directly from QML. No data is stored or sent anywhere else. - -### API Endpoint - -``` -GET https://api.anthropic.com/api/oauth/usage -Headers: - Authorization: Bearer (default mode) - x-api-key: (custom base URL mode) - anthropic-beta: oauth-2025-04-20 -``` - -## Troubleshooting - -### "Not logged in" error - -Make sure you're logged in to Claude Code: -```bash -claude -``` - -### "Token expired" error - -Your OAuth token has expired. Run Claude Code again to refresh it: -```bash -claude -``` -The widget also has an "Open Claude" button for this. - -### "Rate limited" error - -The API allows ~4 requests per 5-minute window. The widget handles this automatically: -- Reads the `retry-after` header and waits the specified time -- Falls back to exponential backoff (5/10/15 min) -- Monitors for token refresh and recovers instantly - -To avoid rate limiting, keep the refresh interval at 5 minutes or higher. - -### "Invalid API key" error - -The API key in the widget settings is wrong or revoked. Open **Configure...** and update it. - -### "Endpoint not found — check base URL" error - -The base URL in the widget settings doesn't point to a valid API. Make sure you're using the root URL without `/v1`, e.g. `https://api.anthropic.com`. - -### Widget shows 0% - -- Click the refresh button in the popup -- Check logs: `journalctl --user -f | grep -i claude` - -## File Structure - -``` -claude-usage-widget/ -├── metadata.json # Widget metadata -├── install.sh # Installation script -├── contents/ -│ ├── config/ -│ │ └── main.xml # Configuration schema -│ ├── ui/ -│ │ ├── main.qml # Widget implementation -│ │ ├── configGeneral.qml # Settings UI -│ │ └── Translations.qml # i18n (15 languages) -│ └── icons/ -│ └── claude.svg # Claude logo (orange) -└── screenshots/ # Preview images -``` - -## License - -GPL-3.0-or-later - -## Author - -izll - -## Version History - -### 1.3.6 (2026) -- Vertical layout option for taller panels (thanks @nahall, issue #5) -- Panel metrics can now be stacked vertically to save horizontal space - -### 1.3.5 (2026) -- Widget picker now shows proper preview image (progress ring + Claude logo + USAGE) -- About page shows correct icon via auto-install to system icon theme -- New `contents/screenshot.png` for KPackage widget picker preview - -### 1.3.2 (2026) -- Fix widget icon not showing in panel widget picker dialog - -### 1.3.1 (2026) -- Configurable background opacity for desktop mode (thanks @Endle) -- Background opacity only applies on desktop, panel keeps default Plasma theme -- Default opacity set to 100% for consistent upgrade experience - -### 1.3.0 (2026) -- Three panel display styles: Text (classic), Circular (ring charts), Bar (vertical bars) -- Claude icon can be hidden in panel -- Tooltip shows all enabled metrics - -### 1.2.5 (2026) -- Configurable panel metrics: choose Session, Weekly, Sonnet independently -- Sonnet weekly usage can now be displayed in the panel (off by default) - -### 1.2.1 (2026) -- Remove false decimal precision from percentage displays (thanks @robinpie) - -### 1.2.0 (2026) -- Smart rate limit handling with `retry-after` header support -- Exponential backoff with automatic recovery -- Token watcher: instantly recovers when Claude Code refreshes the token -- Local data cache: shows last known values on restart (up to 24h) -- Stale detection: widget dims when data is outdated -- Default refresh interval changed to 5 min to prevent rate limiting -- Rate limit warning in popup and settings for intervals under 5 min - -### 1.1.0 (2026) -- Custom API base URL and API key support for proxy/gateway users -- 429 rate limit handling with auto-retry -- Token expired state with "Open Claude" button -- Dynamic Claude Code version detection for User-Agent -- All strings translated across 15 languages -- Install script added - -### 1.0.0 (2025) -- Initial release -- Session and weekly usage display -- Per-model breakdown (Sonnet/Opus) -- Configurable refresh interval -- Error handling for login issues diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/claude-usage-widget.plasmoid b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/claude-usage-widget.plasmoid deleted file mode 100644 index fa1490e9f20212b67c4598c03058c2423fb872f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42178 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 - - - - - - - system - - - - 5 - - - - horizontal - - - - true - - - - text - - - - true - - - - true - - - - false - - - - - - - - - - - - 1.0 - - - diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude-usage-widget.svg b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude-usage-widget.svg deleted file mode 100644 index a75ed63..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude-usage-widget.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - USAGE - diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude.svg b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude.svg deleted file mode 100644 index cb5dce1..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/claude.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/widget.svg b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/widget.svg deleted file mode 100644 index 4afe9b6..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/icons/widget.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/screenshot.png b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/screenshot.png deleted file mode 100644 index bb1c948e6658be5d630aa4ae53d00a2d58a6c4de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17899 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 z z*yefc7(;^%4@!DVxq7$KBN^c`a(ug)hSBx@Wt`kb=Jv$!|JJ|r=V@)NkEgQplaIaq zF8}xq4_naMk`-C*KVPIO&)*-r`=_nDG^56YLp`^P`eiJBY?uVB6b03k&q-UeEuUi~ z0?gwE5^ySw}->+@dMpdfn}SGR)?OBU?eBeehjM$XlB zKLn>mc_+(Xk2PNVanJW@d+ui~iMw3-_tGXKkv;!UavuNk?k@N9<@1{5?(SOX+-`B@ zYUIZM2OM*5{IIV3``2G)zRJJgVfPrhJT2lGu^iqA>H&;8QfV<5f z9@73_TOS$ua!>Q`@0p&CP7N)2ci+ldm!0|-f3Vwsb*^``^K2&Irt~glC8g-Ip6dl| zl$6et8Wm5xRkp>|gfXBYr|ZwP45L>(Y>R(4n=*A>%xJloBGha4)B3x6woJbo1J{pN zZ`HF{4<*}HeOzy?FRveLfeM>v?xw+=8zQUFNcdrKb znEMDX?g=hQ`}}qhZHwHw z&Z^Dtk}l@>hyuqTw&s3fz4`FY+cn$PmR!5Fzo6ro{Yx_p)opa?Yx|C!0LYJxpE+d8$`Txo{ { - cfg_language = languageValues[index] - } - } - - RowLayout { - Kirigami.FormData.label: tr("Refresh interval:") - - QQC2.SpinBox { - id: refreshSpinBox - from: 1 - to: 999 - stepSize: 1 - value: cfg_refreshInterval - - onValueChanged: { - cfg_refreshInterval = value - } - } - - QQC2.Label { - text: tr("minutes") - } - } - - QQC2.Label { - visible: cfg_refreshInterval < 5 - text: "⚠ " + tr("Values under 5 min may cause rate limiting") - color: Kirigami.Theme.negativeTextColor - font.italic: true - Layout.fillWidth: true - } - - Kirigami.Separator { - Kirigami.FormData.isSection: true - Kirigami.FormData.label: tr("Panel display") - } - - QQC2.ComboBox { - Kirigami.FormData.label: tr("Layout:") - model: [tr("Horizontal"), tr("Vertical")] - currentIndex: cfg_panelLayout === "vertical" ? 1 : 0 - onCurrentIndexChanged: cfg_panelLayout = currentIndex === 1 ? "vertical" : "horizontal" - } - - QQC2.CheckBox { - Kirigami.FormData.label: tr("Icon:") - text: tr("Show Claude icon") - checked: cfg_showIcon - onCheckedChanged: cfg_showIcon = checked - } - - QQC2.ComboBox { - Kirigami.FormData.label: tr("Style:") - model: [tr("Text"), tr("Circular"), tr("Bar")] - currentIndex: cfg_panelStyle === "circular" ? 1 : cfg_panelStyle === "bar" ? 2 : 0 - onCurrentIndexChanged: { - var styles = ["text", "circular", "bar"] - cfg_panelStyle = styles[currentIndex] - } - } - - QQC2.CheckBox { - Kirigami.FormData.label: tr("Show in panel:") - text: tr("Session (5hr)") - checked: cfg_showSession - onCheckedChanged: cfg_showSession = checked - } - - QQC2.CheckBox { - text: tr("Weekly (7day)") - checked: cfg_showWeekly - onCheckedChanged: cfg_showWeekly = checked - } - - QQC2.CheckBox { - text: tr("Sonnet") - checked: cfg_showSonnet - onCheckedChanged: cfg_showSonnet = checked - } - - RowLayout { - Kirigami.FormData.label: tr("Background opacity (desktop):") - - QQC2.Slider { - id: opacitySlider - from: 0.0 - to: 1.0 - stepSize: 0.05 - value: cfg_backgroundOpacity - Layout.preferredWidth: Kirigami.Units.gridUnit * 10 - - onMoved: { - cfg_backgroundOpacity = value - } - } - - QQC2.Label { - text: Math.round(opacitySlider.value * 100) + "%" - Layout.preferredWidth: Kirigami.Units.gridUnit * 2 - } - } - - Kirigami.Separator { - Kirigami.FormData.isSection: true - Kirigami.FormData.label: tr("Custom API (optional)") - } - - QQC2.TextField { - id: baseUrlField - Kirigami.FormData.label: tr("Base URL:") - placeholderText: "https://api.anthropic.com" - text: cfg_baseUrl - onTextChanged: cfg_baseUrl = text - Layout.fillWidth: true - } - - QQC2.Label { - text: tr("Leave empty to use ~/.claude/.credentials.json (default)") - font.italic: true - opacity: 0.7 - Layout.fillWidth: true - } - - QQC2.TextField { - id: apiKeyField - Kirigami.FormData.label: tr("API key:") - placeholderText: "sk-ant-..." - text: cfg_apiKey - echoMode: TextInput.Password - enabled: cfg_baseUrl !== "" - onTextChanged: cfg_apiKey = text - Layout.fillWidth: true - } - } -} diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/ui/main.qml b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/ui/main.qml deleted file mode 100644 index c7470d0..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/contents/ui/main.qml +++ /dev/null @@ -1,1163 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import org.kde.plasma.plasmoid -import org.kde.plasma.components as PlasmaComponents -import org.kde.kirigami as Kirigami -import org.kde.plasma.plasma5support as Plasma5Support -import org.kde.plasma.core as PlasmaCore - -PlasmoidItem { - id: root - - // Translations - Translations { - id: i18n - currentLanguage: Plasmoid.configuration.language || "system" - } - - property real sessionUsagePercent: 0 - property real weeklyUsagePercent: 0 - property real sonnetWeeklyPercent: 0 - property real opusWeeklyPercent: 0 - property string lastUpdate: "" - property string planName: "" - property string sessionReset: "" - property string weeklyReset: "" - property string errorMsg: "" - property string accessToken: "" - property string apiKey: "" - property string baseUrl: "" - property bool isLoading: false - property var sessionResetTime: null - property var weeklyResetTime: null - property bool hasSonnetData: false - property bool hasOpusData: false - property bool hasTokenError: false - property bool hasRateLimitError: false - property int rateLimitRetryCount: 0 - property int rateLimitRetryMs: 0 // from retry-after header - property double lastFetchTime: 0 - property double lastSuccessTime: 0 - property bool isStale: false - readonly property int minFetchIntervalMs: 55000 // just under 1 minute - // Stale threshold: if rate limited, use retry-after + buffer; otherwise 3x refresh interval - readonly property int staleThresholdMs: root.hasRateLimitError && root.rateLimitRetryMs > 0 - ? root.rateLimitRetryMs + 60000 - : Math.max(Plasmoid.configuration.refreshInterval || 1, 1) * 60000 * 3 - - // Cache writer - saves last successful data to file - Plasma5Support.DataSource { - id: cacheWriter - engine: "executable" - connectedSources: [] - onNewData: function(sourceName, data) { disconnectSource(sourceName) } - } - - // Cache reader - loads cached data on startup - Plasma5Support.DataSource { - id: cacheReader - engine: "executable" - connectedSources: [] - - onNewData: function(sourceName, data) { - var stdout = (data["stdout"] || "").trim() - disconnectSource(sourceName) - if (stdout.length > 10) { - try { - var cache = JSON.parse(stdout) - var age = Date.now() - (cache.timestamp || 0) - if (age < 86400000) { // less than 24 hours old - root.sessionUsagePercent = cache.session || 0 - root.weeklyUsagePercent = cache.weekly || 0 - root.sonnetWeeklyPercent = cache.sonnet || 0 - root.opusWeeklyPercent = cache.opus || 0 - root.hasSonnetData = cache.hasSonnet || false - root.hasOpusData = cache.hasOpus || false - root.planName = cache.plan || "" - root.sessionReset = cache.sessionReset || "" - root.weeklyReset = cache.weeklyReset || "" - root.sessionResetTime = cache.sessionResetTs ? new Date(cache.sessionResetTs) : null - root.weeklyResetTime = cache.weeklyResetTs ? new Date(cache.weeklyResetTs) : null - root.lastSuccessTime = cache.timestamp - root.lastUpdate = Qt.formatTime(new Date(cache.timestamp), "hh:mm:ss") + " *" - root.isStale = age > root.staleThresholdMs - console.log("Claude Usage: Loaded cache, age:", Math.round(age/60000), "min, stale:", root.isStale) - } else { - console.log("Claude Usage: Cache too old, ignoring") - } - } catch (e) { - console.log("Claude Usage: Cache parse error:", e) - } - } - } - } - - function saveCache() { - var cache = { - session: root.sessionUsagePercent, - weekly: root.weeklyUsagePercent, - sonnet: root.sonnetWeeklyPercent, - opus: root.opusWeeklyPercent, - hasSonnet: root.hasSonnetData, - hasOpus: root.hasOpusData, - plan: root.planName, - sessionReset: root.sessionReset, - weeklyReset: root.weeklyReset, - sessionResetTs: root.sessionResetTime ? root.sessionResetTime.getTime() : null, - weeklyResetTs: root.weeklyResetTime ? root.weeklyResetTime.getTime() : null, - timestamp: Date.now() - } - var json = JSON.stringify(cache) - cacheWriter.connectSource("echo '" + json.replace(/'/g, "'\\''") + "' > $HOME/.local/share/claude-usage-cache.json") - } - - // Stale checker - updates isStale flag periodically - Timer { - id: staleTimer - interval: 60000 - running: true - repeat: true - onTriggered: { - if (root.lastSuccessTime > 0) { - root.isStale = (Date.now() - root.lastSuccessTime) > root.staleThresholdMs - } - } - } - - // Token watcher - polls credentials file during rate limit to detect token refresh - Plasma5Support.DataSource { - id: tokenWatcher - engine: "executable" - connectedSources: [] - - onNewData: function(sourceName, data) { - var stdout = (data["stdout"] || "").trim() - disconnectSource(sourceName) - if (stdout.length > 10) { - try { - var creds = JSON.parse(stdout) - var newToken = (creds.claudeAiOauth || {}).accessToken || "" - if (newToken && newToken !== root.accessToken) { - console.log("Claude Usage: New token detected! Resetting rate limit state.") - root.accessToken = newToken - root.hasRateLimitError = false - root.rateLimitRetryCount = 0 - root.lastFetchTime = 0 - fetchUsageFromApi(true) - } - } catch (e) { - console.log("Claude Usage: Token watcher parse error:", e) - } - } - } - } - - Timer { - id: tokenWatchTimer - interval: 30000 // check every 30 seconds - running: root.hasRateLimitError && !root.baseUrl - repeat: true - onTriggered: { - tokenWatcher.connectSource("cat $HOME/.claude/.credentials.json 2>/dev/null") - } - } - - // Data source for reading credentials file - Plasma5Support.DataSource { - id: fileReader - engine: "executable" - connectedSources: [] - - onNewData: function(sourceName, data) { - var stdout = data["stdout"] || "" - disconnectSource(sourceName) - - console.log("Claude Usage: Got credentials, length:", stdout.length) - - if (stdout.length > 10) { - try { - var creds = JSON.parse(stdout) - var oauth = creds.claudeAiOauth || {} - root.accessToken = oauth.accessToken || "" - - // Get plan name from tier - var tier = oauth.rateLimitTier || "default_claude_pro" - var planMap = { - "default_claude_pro": "Pro", - "default_claude_max_5x": "Max 5x", - "default_claude_max_20x": "Max 20x" - } - root.planName = planMap[tier] || tier - - console.log("Claude Usage: Token found, plan:", root.planName) - - if (root.accessToken) { - fetchUsageFromApi() - } else { - root.errorMsg = i18n.tr("Not logged in") - root.isLoading = false - } - } catch (e) { - console.log("Claude Usage: Failed to parse credentials:", e) - root.errorMsg = "Not logged in" - root.isLoading = false - } - } else { - console.log("Claude Usage: No credentials file found") - root.errorMsg = "Not logged in" - root.isLoading = false - } - } - } - - // Data source for detecting Claude Code version - property string claudeVersion: "" - property string userAgent: "claude-code/" + Qt.formatDateTime(new Date(), "yyyy.M.d") - - Plasma5Support.DataSource { - id: versionReader - engine: "executable" - connectedSources: [] - - onNewData: function(sourceName, data) { - var stdout = (data["stdout"] || "").trim() - disconnectSource(sourceName) - // Output format: "2.1.81 (Claude Code)" - var match = stdout.match(/^(\d+\.\d+\.\d+)/) - if (match) { - root.claudeVersion = match[1] - root.userAgent = "claude-code/" + match[1] - console.log("Claude Usage: Detected version:", root.claudeVersion) - } - } - } - - // Data source for launching claude in terminal - Plasma5Support.DataSource { - id: claudeLauncher - engine: "executable" - connectedSources: [] - - onNewData: function(sourceName, data) { - disconnectSource(sourceName) - console.log("Claude Usage: Terminal launched") - } - } - - function loadCredentials() { - root.isLoading = true - root.errorMsg = "" - var configBaseUrl = (Plasmoid.configuration.baseUrl || "").trim() - if (configBaseUrl) { - root.baseUrl = configBaseUrl.replace(/\/$/, "") - root.apiKey = (Plasmoid.configuration.apiKey || "").trim() - root.planName = "API Key" - console.log("Claude Usage: Using configured base URL:", root.baseUrl) - if (root.apiKey) { - fetchUsageFromApi() - } else { - root.errorMsg = "API key not configured" - root.isLoading = false - } - } else { - root.baseUrl = "" - root.apiKey = "" - console.log("Claude Usage: No base URL configured, reading credentials file") - fileReader.connectSource("cat $HOME/.claude/.credentials.json 2>/dev/null") - } - } - - function fetchUsageFromApi(force) { - var now = Date.now() - if (!force && root.lastFetchTime > 0 && (now - root.lastFetchTime) < root.minFetchIntervalMs) { - console.log("Claude Usage: Skipping fetch, too soon since last request") - root.isLoading = false - return - } - root.lastFetchTime = now - - var url = root.baseUrl - ? root.baseUrl + "/api/oauth/usage" - : "https://api.anthropic.com/api/oauth/usage" - - var xhr = new XMLHttpRequest() - xhr.open("GET", url) - xhr.setRequestHeader("Content-Type", "application/json") - xhr.setRequestHeader("User-Agent", root.userAgent) - xhr.setRequestHeader("anthropic-beta", "oauth-2025-04-20") - - if (root.baseUrl) { - // Custom base URL: authenticate with API key - xhr.setRequestHeader("x-api-key", root.apiKey) - } else { - // Default: OAuth token from credentials file - xhr.setRequestHeader("Authorization", "Bearer " + root.accessToken) - } - - xhr.onreadystatechange = function() { - if (xhr.readyState === XMLHttpRequest.DONE) { - root.isLoading = false - - if (xhr.status === 200) { - try { - var data = JSON.parse(xhr.responseText) - - var fiveHour = data.five_hour || {} - var sevenDay = data.seven_day || {} - - root.sessionUsagePercent = fiveHour.utilization || 0 - root.weeklyUsagePercent = sevenDay.utilization || 0 - root.hasSonnetData = !!data.seven_day_sonnet - root.hasOpusData = !!data.seven_day_opus - root.sonnetWeeklyPercent = root.hasSonnetData ? (data.seven_day_sonnet.utilization || 0) : 0 - root.opusWeeklyPercent = root.hasOpusData ? (data.seven_day_opus.utilization || 0) : 0 - - if (fiveHour.resets_at) { - root.sessionResetTime = new Date(fiveHour.resets_at) - root.sessionReset = Qt.formatTime(root.sessionResetTime, "hh:mm") - } - if (sevenDay.resets_at) { - root.weeklyResetTime = new Date(sevenDay.resets_at) - root.weeklyReset = Qt.formatDateTime(root.weeklyResetTime, "MMM d, hh:mm") - } - - root.lastUpdate = Qt.formatTime(new Date(), "hh:mm:ss") - root.lastSuccessTime = Date.now() - root.isStale = false - root.errorMsg = "" - root.hasTokenError = false - root.hasRateLimitError = false - root.rateLimitRetryCount = 0 - root.rateLimitRetryMs = 0 - saveCache() - - console.log("Claude Usage: API success - session:", root.sessionUsagePercent, "weekly:", root.weeklyUsagePercent) - } catch (e) { - console.log("Claude Usage: JSON parse error:", e) - root.errorMsg = "Parse error" - } - } else if (xhr.status === 401) { - if (root.baseUrl) { - root.errorMsg = i18n.tr("Invalid API key") - console.log("Claude Usage: 401 Unauthorized - invalid API key") - } else { - console.log("Claude Usage: 401 Unauthorized - token expired") - root.hasTokenError = true - root.errorMsg = "" - } - } else if (xhr.status === 404) { - root.errorMsg = root.baseUrl - ? i18n.tr("Endpoint not found") - : i18n.tr("API error") + " (404)" - console.log("Claude Usage: 404 Not Found:", url) - } else if (xhr.status === 429) { - var retryAfter = parseInt(xhr.getResponseHeader("retry-after") || "0") - if (retryAfter > 0) { - root.rateLimitRetryMs = retryAfter * 1000 - } - root.rateLimitRetryCount++ - console.log("Claude Usage: 429 Rate limited (retry #" + root.rateLimitRetryCount + ", retry-after: " + retryAfter + "s, waiting: " + root.rateLimitBackoffMs/1000 + "s)") - root.hasRateLimitError = true - root.lastFetchTime = 0 // allow retry timer to work - root.errorMsg = "" - } else { - root.errorMsg = i18n.tr("API error") + " (" + xhr.status + ")" - console.log("Claude Usage: API error:", xhr.status, xhr.statusText) - } - } - } - - xhr.send() - } - - function refresh() { - root.hasTokenError = false - root.hasRateLimitError = false - root.rateLimitRetryCount = 0 - root.rateLimitRetryMs = 0 - loadCredentials() - } - - // Compact representation (panel) - readonly property bool isVerticalLayout: Plasmoid.configuration.panelLayout === "vertical" - - compactRepresentation: Item { - Layout.minimumWidth: usageRow.implicitWidth + Kirigami.Units.largeSpacing * 2 - Layout.minimumHeight: root.isVerticalLayout ? usageRow.implicitHeight + Kirigami.Units.largeSpacing * 2 : Kirigami.Units.iconSizes.medium - Layout.preferredWidth: usageRow.implicitWidth + Kirigami.Units.largeSpacing * 2 - Layout.preferredHeight: root.isVerticalLayout ? usageRow.implicitHeight + Kirigami.Units.largeSpacing * 2 : -1 - - MouseArea { - anchors.fill: parent - onClicked: root.expanded = !root.expanded - } - - GridLayout { - id: usageRow - anchors.centerIn: parent - columns: root.isVerticalLayout ? 1 : -1 - rows: root.isVerticalLayout ? -1 : 1 - flow: root.isVerticalLayout ? GridLayout.TopToBottom : GridLayout.LeftToRight - columnSpacing: Kirigami.Units.smallSpacing - rowSpacing: Kirigami.Units.smallSpacing / 2 - - // Claude icon with error indicator - Item { - visible: Plasmoid.configuration.showIcon !== false - Layout.preferredWidth: Kirigami.Units.iconSizes.smallMedium - Layout.preferredHeight: Kirigami.Units.iconSizes.smallMedium - Layout.rightMargin: Kirigami.Units.smallSpacing - - Kirigami.Icon { - anchors.fill: parent - source: Qt.resolvedUrl("../icons/claude.svg") - } - - // Red dot for token/rate limit error - Rectangle { - visible: root.hasTokenError || root.hasRateLimitError - width: 8 - height: 8 - radius: 4 - color: Kirigami.Theme.negativeTextColor - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.rightMargin: -2 - anchors.bottomMargin: -2 - } - } - - // Error state (non-token errors) - PlasmaComponents.Label { - visible: root.errorMsg !== "" && !root.hasTokenError && !root.hasRateLimitError - text: "⚠" - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize - color: Kirigami.Theme.negativeTextColor - } - - // === TEXT STYLE === - - // Session usage (text) - Rectangle { - visible: (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showSession !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 10 - Layout.preferredHeight: 10 - radius: 5 - color: getUsageColor(root.sessionUsagePercent) - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - } - - PlasmaComponents.Label { - visible: (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showSession !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - text: Math.round(root.sessionUsagePercent) + "%" - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize - font.bold: true - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - } - - // Separator session-weekly (text) - PlasmaComponents.Label { - visible: !root.isVerticalLayout && (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showSession !== false) && (Plasmoid.configuration.showWeekly !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - text: "|" - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.25 : root.isStale ? 0.35 : 0.5 - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize - } - - // Weekly usage (text) - Rectangle { - visible: (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showWeekly !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 10 - Layout.preferredHeight: 10 - radius: 5 - color: getUsageColor(root.weeklyUsagePercent) - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - } - - PlasmaComponents.Label { - visible: (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showWeekly !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - text: Math.round(root.weeklyUsagePercent) + "%" - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize - font.bold: true - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - } - - // Separator before sonnet (text) - PlasmaComponents.Label { - visible: !root.isVerticalLayout && (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showSonnet === true) && ((Plasmoid.configuration.showSession !== false) || (Plasmoid.configuration.showWeekly !== false)) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - text: "|" - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.25 : root.isStale ? 0.35 : 0.5 - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize - } - - // Sonnet usage (text) - Rectangle { - visible: (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showSonnet === true) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 10 - Layout.preferredHeight: 10 - radius: 5 - color: getUsageColor(root.sonnetWeeklyPercent) - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - } - - PlasmaComponents.Label { - visible: (!Plasmoid.configuration.panelStyle || Plasmoid.configuration.panelStyle === "text") && (Plasmoid.configuration.showSonnet === true) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - text: Math.round(root.sonnetWeeklyPercent) + "%" - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize - font.bold: true - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - } - - // === CIRCULAR STYLE === - - // Session (circular) - Item { - visible: Plasmoid.configuration.panelStyle === "circular" && (Plasmoid.configuration.showSession !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 28 - Layout.preferredHeight: 28 - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - - Canvas { - anchors.fill: parent - onPaint: { - var ctx = getContext("2d") - drawCircularProgress(ctx, width, height, root.sessionUsagePercent) - } - property real _percent: root.sessionUsagePercent - on_PercentChanged: requestPaint() - Component.onCompleted: requestPaint() - } - - PlasmaComponents.Label { - anchors.centerIn: parent - text: Math.round(root.sessionUsagePercent) - font.pixelSize: 9 - font.bold: true - } - } - - // Weekly (circular) - Item { - visible: Plasmoid.configuration.panelStyle === "circular" && (Plasmoid.configuration.showWeekly !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 28 - Layout.preferredHeight: 28 - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - - Canvas { - anchors.fill: parent - onPaint: { - var ctx = getContext("2d") - drawCircularProgress(ctx, width, height, root.weeklyUsagePercent) - } - property real _percent: root.weeklyUsagePercent - on_PercentChanged: requestPaint() - Component.onCompleted: requestPaint() - } - - PlasmaComponents.Label { - anchors.centerIn: parent - text: Math.round(root.weeklyUsagePercent) - font.pixelSize: 9 - font.bold: true - } - } - - // Sonnet (circular) - Item { - visible: Plasmoid.configuration.panelStyle === "circular" && (Plasmoid.configuration.showSonnet === true) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 28 - Layout.preferredHeight: 28 - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - - Canvas { - anchors.fill: parent - onPaint: { - var ctx = getContext("2d") - drawCircularProgress(ctx, width, height, root.sonnetWeeklyPercent) - } - property real _percent: root.sonnetWeeklyPercent - on_PercentChanged: requestPaint() - Component.onCompleted: requestPaint() - } - - PlasmaComponents.Label { - anchors.centerIn: parent - text: Math.round(root.sonnetWeeklyPercent) - font.pixelSize: 9 - font.bold: true - } - } - - // === BAR STYLE === - - // Session (bar) - Item { - visible: Plasmoid.configuration.panelStyle === "bar" && (Plasmoid.configuration.showSession !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 32 - Layout.preferredHeight: parent.height - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - - Rectangle { - anchors.fill: parent - radius: 3 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - - Rectangle { - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 1 - height: Math.max((parent.height - 2) * Math.min(root.sessionUsagePercent / 100, 1), 1) - radius: 2 - color: getUsageColor(root.sessionUsagePercent) - } - } - - PlasmaComponents.Label { - anchors.centerIn: parent - text: Math.round(root.sessionUsagePercent) - font.pixelSize: 9 - font.bold: true - } - } - - // Weekly (bar) - Item { - visible: Plasmoid.configuration.panelStyle === "bar" && (Plasmoid.configuration.showWeekly !== false) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 32 - Layout.preferredHeight: parent.height - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - - Rectangle { - anchors.fill: parent - radius: 3 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - - Rectangle { - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 1 - height: Math.max((parent.height - 2) * Math.min(root.weeklyUsagePercent / 100, 1), 1) - radius: 2 - color: getUsageColor(root.weeklyUsagePercent) - } - } - - PlasmaComponents.Label { - anchors.centerIn: parent - text: Math.round(root.weeklyUsagePercent) - font.pixelSize: 9 - font.bold: true - } - } - - // Sonnet (bar) - Item { - visible: Plasmoid.configuration.panelStyle === "bar" && (Plasmoid.configuration.showSonnet === true) && (root.errorMsg === "" || root.hasTokenError || root.hasRateLimitError) - Layout.preferredWidth: 32 - Layout.preferredHeight: parent.height - opacity: (root.hasTokenError || root.hasRateLimitError) ? 0.5 : root.isStale ? 0.6 : 1.0 - - Rectangle { - anchors.fill: parent - radius: 3 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - - Rectangle { - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 1 - height: Math.max((parent.height - 2) * Math.min(root.sonnetWeeklyPercent / 100, 1), 1) - radius: 2 - color: getUsageColor(root.sonnetWeeklyPercent) - } - } - - PlasmaComponents.Label { - anchors.centerIn: parent - text: Math.round(root.sonnetWeeklyPercent) - font.pixelSize: 9 - font.bold: true - } - } - - // Error text (non-token errors only) - PlasmaComponents.Label { - visible: root.errorMsg !== "" && !root.hasTokenError && !root.hasRateLimitError - text: root.errorMsg - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.negativeTextColor - } - } - } - - // Full representation (popup) - fullRepresentation: Item { - Layout.minimumWidth: Kirigami.Units.gridUnit * 14 - Layout.minimumHeight: Kirigami.Units.gridUnit * 16 - Layout.preferredWidth: Kirigami.Units.gridUnit * 16 - Layout.preferredHeight: Kirigami.Units.gridUnit * 18 - - ColumnLayout { - anchors.fill: parent - anchors.margins: Kirigami.Units.largeSpacing - spacing: Kirigami.Units.mediumSpacing - - // Header - RowLayout { - Layout.fillWidth: true - PlasmaComponents.Label { - text: i18n.tr("Claude Usage") - font.bold: true - font.pixelSize: Kirigami.Theme.defaultFont.pixelSize * 1.3 - } - Item { Layout.fillWidth: true } - Rectangle { - Layout.preferredWidth: planLabel.implicitWidth + Kirigami.Units.smallSpacing * 2 - Layout.preferredHeight: planLabel.implicitHeight + Kirigami.Units.smallSpacing - radius: 3 - color: Kirigami.Theme.highlightColor - PlasmaComponents.Label { - id: planLabel - anchors.centerIn: parent - text: root.planName - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.highlightedTextColor - } - } - } - - // Error message (regular errors) - Rectangle { - visible: root.errorMsg !== "" && !root.hasTokenError && !root.hasRateLimitError - Layout.fillWidth: true - Layout.preferredHeight: errorColumn.implicitHeight + Kirigami.Units.largeSpacing - radius: 5 - color: Kirigami.Theme.negativeBackgroundColor - - ColumnLayout { - id: errorColumn - anchors.fill: parent - anchors.margins: Kirigami.Units.smallSpacing - - PlasmaComponents.Label { - text: "⚠ " + root.errorMsg - color: Kirigami.Theme.negativeTextColor - font.bold: true - } - PlasmaComponents.Label { - text: root.baseUrl - ? i18n.tr("Check base URL and API key in widget settings") - : i18n.tr("Run 'claude' to log in") - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.negativeTextColor - } - } - } - - // Token error message - Rectangle { - visible: root.hasTokenError - Layout.fillWidth: true - Layout.preferredHeight: tokenErrorColumn.implicitHeight + Kirigami.Units.largeSpacing - radius: 5 - color: Kirigami.Theme.negativeBackgroundColor - - ColumnLayout { - id: tokenErrorColumn - anchors.fill: parent - anchors.margins: Kirigami.Units.smallSpacing - spacing: Kirigami.Units.smallSpacing - - PlasmaComponents.Label { - text: "⚠ " + i18n.tr("Token expired") - color: Kirigami.Theme.negativeTextColor - font.bold: true - } - - PlasmaComponents.Button { - text: i18n.tr("Open Claude") - icon.name: "utilities-terminal" - onClicked: { - claudeLauncher.connectSource("bash -c 'cd $HOME && if command -v konsole >/dev/null; then konsole --hold -e env -u CLAUDECODE bash -lc claude; elif command -v gnome-terminal >/dev/null; then gnome-terminal -- env -u CLAUDECODE bash -lc \"claude; exec bash\"; elif command -v xfce4-terminal >/dev/null; then xfce4-terminal --hold -e \"env -u CLAUDECODE bash -lc claude\"; elif command -v xterm >/dev/null; then xterm -hold -e env -u CLAUDECODE bash -lc claude; fi &'") - } - } - } - } - - // Rate limit error message - Rectangle { - visible: root.hasRateLimitError - Layout.fillWidth: true - Layout.preferredHeight: rateLimitErrorColumn.implicitHeight + Kirigami.Units.largeSpacing - radius: 5 - color: Kirigami.Theme.negativeBackgroundColor - - ColumnLayout { - id: rateLimitErrorColumn - anchors.fill: parent - anchors.margins: Kirigami.Units.smallSpacing - spacing: Kirigami.Units.smallSpacing - - PlasmaComponents.Label { - text: "⚠ " + i18n.tr("Rate limited") - color: Kirigami.Theme.negativeTextColor - font.bold: true - } - - PlasmaComponents.Label { - text: i18n.tr("Auto-retry in") + " " + Math.round(root.rateLimitBackoffMs / 60000) + " min" - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.negativeTextColor - } - } - } - - // Separator - Rectangle { - Layout.fillWidth: true - height: 1 - color: Kirigami.Theme.disabledTextColor - opacity: 0.3 - } - - // Session Usage - ColumnLayout { - Layout.fillWidth: true - spacing: Kirigami.Units.smallSpacing - - RowLayout { - Layout.fillWidth: true - PlasmaComponents.Label { - text: i18n.tr("Session (5hr)") - font.bold: true - } - Item { Layout.fillWidth: true } - PlasmaComponents.Label { - text: Math.round(root.sessionUsagePercent) + "%" - color: getUsageColor(root.sessionUsagePercent) - font.bold: true - } - } - - Rectangle { - Layout.fillWidth: true - height: 10 - radius: 5 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - Rectangle { - width: parent.width * Math.min(root.sessionUsagePercent / 100, 1) - height: parent.height - radius: 5 - color: getUsageColor(root.sessionUsagePercent) - } - } - - PlasmaComponents.Label { - visible: root.sessionReset !== "" - text: i18n.tr("Resets at:") + " " + root.sessionReset + (root.sessionResetTime ? " (" + formatTimeRemaining(root.sessionResetTime) + ")" : "") - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.disabledTextColor - } - } - - // Weekly Usage - ColumnLayout { - Layout.fillWidth: true - spacing: Kirigami.Units.smallSpacing - - RowLayout { - Layout.fillWidth: true - PlasmaComponents.Label { - text: i18n.tr("Weekly (7day)") - font.bold: true - } - Item { Layout.fillWidth: true } - PlasmaComponents.Label { - text: Math.round(root.weeklyUsagePercent) + "%" - color: getUsageColor(root.weeklyUsagePercent) - font.bold: true - } - } - - Rectangle { - Layout.fillWidth: true - height: 10 - radius: 5 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - Rectangle { - width: parent.width * Math.min(root.weeklyUsagePercent / 100, 1) - height: parent.height - radius: 5 - color: getUsageColor(root.weeklyUsagePercent) - } - } - - PlasmaComponents.Label { - visible: root.weeklyReset !== "" - text: i18n.tr("Resets:") + " " + root.weeklyReset + (root.weeklyResetTime ? " (" + formatTimeRemaining(root.weeklyResetTime) + ")" : "") - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.disabledTextColor - } - } - - // Separator - Rectangle { - Layout.fillWidth: true - height: 1 - color: Kirigami.Theme.disabledTextColor - opacity: 0.3 - } - - // Model breakdown - PlasmaComponents.Label { - text: i18n.tr("By Model (Weekly)") - font.bold: true - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - } - - // Sonnet - RowLayout { - Layout.fillWidth: true - visible: root.hasSonnetData - - PlasmaComponents.Label { - text: i18n.tr("Sonnet") - } - Item { Layout.fillWidth: true } - Rectangle { - Layout.preferredWidth: 60 - height: 8 - radius: 3 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - Rectangle { - width: parent.width * Math.min(root.sonnetWeeklyPercent / 100, 1) - height: parent.height - radius: 3 - color: getUsageColor(root.sonnetWeeklyPercent) - } - } - PlasmaComponents.Label { - text: Math.round(root.sonnetWeeklyPercent) + "%" - Layout.preferredWidth: 40 - horizontalAlignment: Text.AlignRight - } - } - - // Opus - RowLayout { - Layout.fillWidth: true - visible: root.hasOpusData - - PlasmaComponents.Label { - text: i18n.tr("Opus") - } - Item { Layout.fillWidth: true } - Rectangle { - Layout.preferredWidth: 60 - height: 8 - radius: 3 - color: Kirigami.Theme.backgroundColor - border.color: Kirigami.Theme.disabledTextColor - border.width: 1 - Rectangle { - width: parent.width * Math.min(root.opusWeeklyPercent / 100, 1) - height: parent.height - radius: 3 - color: getUsageColor(root.opusWeeklyPercent) - } - } - PlasmaComponents.Label { - text: Math.round(root.opusWeeklyPercent) + "%" - Layout.preferredWidth: 40 - horizontalAlignment: Text.AlignRight - } - } - - // No model data message - PlasmaComponents.Label { - visible: !root.hasSonnetData && !root.hasOpusData - text: i18n.tr("No model breakdown available") - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.disabledTextColor - font.italic: true - } - - // Rate limit warning - PlasmaComponents.Label { - visible: (Plasmoid.configuration.refreshInterval || 5) < 5 - text: "⚠ " + i18n.tr("Values under 5 min may cause rate limiting") - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.neutralTextColor - font.italic: true - Layout.fillWidth: true - wrapMode: Text.WordWrap - } - - Item { Layout.fillHeight: true } - - // Footer - Rectangle { - Layout.fillWidth: true - height: 1 - color: Kirigami.Theme.disabledTextColor - opacity: 0.3 - } - - RowLayout { - Layout.fillWidth: true - PlasmaComponents.Label { - text: root.lastUpdate !== "" ? i18n.tr("Updated:") + " " + root.lastUpdate : i18n.tr("Loading...") - font.pixelSize: Kirigami.Theme.smallFont.pixelSize - color: Kirigami.Theme.disabledTextColor - } - Item { Layout.fillWidth: true } - PlasmaComponents.Button { - icon.name: "view-refresh" - text: i18n.tr("Refresh") - onClicked: refresh() - } - } - } - } - - Timer { - id: rateLimitRetryTimer - interval: root.rateLimitBackoffMs - running: root.hasRateLimitError - repeat: true - onTriggered: { - console.log("Claude Usage: Backoff retry, interval:", interval/1000, "s") - loadCredentials() - } - } - - // Use retry-after header if available, otherwise fallback to 5min steps (capped at 15min) - readonly property int rateLimitBackoffMs: root.rateLimitRetryMs > 0 - ? root.rateLimitRetryMs + 10000 // retry-after + 10s buffer - : Math.min((root.rateLimitRetryCount + 1) * 300000, 900000) - - Timer { - id: refreshTimer - interval: Math.max(Plasmoid.configuration.refreshInterval || 5, 1) * 60000 - running: !root.hasRateLimitError - repeat: true - onTriggered: loadCredentials() - } - - function drawCircularProgress(ctx, w, h, percent) { - var centerX = w / 2 - var centerY = h / 2 - var radius = Math.min(w, h) / 2 - 2 - var lineWidth = 3 - var startAngle = -Math.PI / 2 - var endAngle = startAngle + (2 * Math.PI * Math.min(percent, 100) / 100) - - ctx.reset() - - // Background circle - ctx.beginPath() - ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI) - ctx.strokeStyle = Kirigami.Theme.disabledTextColor - ctx.globalAlpha = 0.3 - ctx.lineWidth = lineWidth - ctx.stroke() - - // Progress arc - if (percent > 0) { - ctx.beginPath() - ctx.arc(centerX, centerY, radius, startAngle, endAngle) - ctx.strokeStyle = getUsageColor(percent) - ctx.globalAlpha = 1.0 - ctx.lineWidth = lineWidth - ctx.lineCap = "round" - ctx.stroke() - } - } - - function getUsageColor(percent) { - if (percent < 50) return Kirigami.Theme.positiveTextColor - if (percent < 80) return Kirigami.Theme.neutralTextColor - return Kirigami.Theme.negativeTextColor - } - - function formatTimeRemaining(resetTime) { - if (!resetTime) return "" - var now = new Date() - var diff = resetTime.getTime() - now.getTime() - if (diff <= 0) return "" - - var hours = Math.floor(diff / (1000 * 60 * 60)) - var minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)) - - if (hours > 24) { - var days = Math.floor(hours / 24) - hours = hours % 24 - return days + i18n.tr("d") + " " + hours + i18n.tr("h") - } else if (hours > 0) { - return hours + i18n.tr("h") + " " + minutes + i18n.tr("m") - } else { - return minutes + i18n.tr("m") - } - } - - // Install icon to system theme for about page - Plasma5Support.DataSource { - id: iconInstaller - engine: "executable" - connectedSources: [] - onNewData: function(sourceName, data) { disconnectSource(sourceName) } - } - - Component.onCompleted: { - console.log("Claude Usage: Widget loaded") - var iconSource = Qt.resolvedUrl("../icons/claude-usage-widget.svg").toString().replace("file://", "") - iconInstaller.connectSource("bash -c 'ICON_DIR=${XDG_DATA_HOME:-$HOME/.local/share}/icons/hicolor/scalable/apps && mkdir -p $ICON_DIR && cp \"" + iconSource + "\" $ICON_DIR/claude-usage-widget.svg && chmod 644 $ICON_DIR/claude-usage-widget.svg 2>/dev/null'") - cacheReader.connectSource("cat $HOME/.local/share/claude-usage-cache.json 2>/dev/null") - versionReader.connectSource("claude --version 2>/dev/null") - loadCredentials() - } - - // Only use custom background on desktop, panel keeps default Plasma background - readonly property bool isOnPanel: Plasmoid.location === PlasmaCore.Types.TopEdge - || Plasmoid.location === PlasmaCore.Types.BottomEdge - || Plasmoid.location === PlasmaCore.Types.LeftEdge - || Plasmoid.location === PlasmaCore.Types.RightEdge - - Plasmoid.backgroundHints: isOnPanel ? PlasmaCore.Types.DefaultBackground : PlasmaCore.Types.NoBackground - - // Custom background with configurable opacity (desktop only) - Rectangle { - visible: !root.isOnPanel - anchors.fill: parent - color: Kirigami.Theme.backgroundColor - opacity: Plasmoid.configuration.backgroundOpacity - radius: Kirigami.Units.cornerRadius - } - - Plasmoid.icon: "claude-usage-widget" - toolTipMainText: i18n.tr("Claude Usage") - toolTipSubText: { - var parts = [] - if (Plasmoid.configuration.showSession !== false) - parts.push(i18n.tr("Session (5hr)") + ": " + Math.round(root.sessionUsagePercent) + "%") - if (Plasmoid.configuration.showWeekly !== false) - parts.push(i18n.tr("Weekly (7day)") + ": " + Math.round(root.weeklyUsagePercent) + "%") - if (Plasmoid.configuration.showSonnet === true) - parts.push(i18n.tr("Sonnet") + ": " + Math.round(root.sonnetWeeklyPercent) + "%") - return parts.join(" | ") - } -} diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/executable_install.sh b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/executable_install.sh deleted file mode 100644 index 27f137c..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/executable_install.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -PLUGIN_ID="org.kde.plasma.claudeusage" -INSTALL_DIR="$HOME/.local/share/plasma/plasmoids/$PLUGIN_ID" -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" - -echo "Installing Claude Usage widget..." - -mkdir -p "$INSTALL_DIR" -cp -r "$SCRIPT_DIR/contents" "$INSTALL_DIR/" -cp "$SCRIPT_DIR/metadata.json" "$INSTALL_DIR/" - -echo "Installed to $INSTALL_DIR" -echo "" -echo "Restart Plasma to apply changes:" -echo " kquitapp6 plasmashell && kstart plasmashell" diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.png b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.png deleted file mode 100644 index 8e6d0a20f98510ced7c540a7c0ae54f3885e70d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51520 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

GQVQEEsa|jz$fFD<_5637 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 diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.svg b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.svg deleted file mode 100644 index c351cf2..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/logo.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - USAGE - diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/metadata.json b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/metadata.json deleted file mode 100644 index 966811f..0000000 --- a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/metadata.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "KPackageStructure": "Plasma/Applet", - "KPlugin": { - "Authors": [ - { - "Name": "izll" - } - ], - "Category": "System Information", - "Description": "Display Claude Code usage statistics (session and weekly limits) in your taskbar. Shows real-time usage percentages with color-coded indicators.", - "EnabledByDefault": true, - "Icon": "claude-usage-widget", - "Id": "org.kde.plasma.claudeusageswitcher", - "License": "GPL-3.0-or-later", - "Name": "Claude Usage", - "Version": "1.3.6", - "Website": "https://github.com/izll/plasma-claude-usage" - }, - "X-Plasma-API-Minimum-Version": "6.0", - "X-Plasma-Provides": [] -} diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/screenshots/panel.png b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/screenshots/panel.png deleted file mode 100644 index 4ab282ebada4a8892f7b8661fcb08abfda68f47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4947 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 diff --git a/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/screenshots/popup.png b/dot_local/share/plasma/plasmoids/org.kde.plasma.claudeusageswitcher/screenshots/popup.png deleted file mode 100644 index 4c51c95c4cb53dbaca0868777254411ca85d27ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61972 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

-g{fr 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 z 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 - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.plasma.configuration 2.0 - -ConfigModel { - ConfigCategory { - name: i18n("General") - icon: "preferences-desktop-plasma" - source: "ConfigGeneral.qml" - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/config/main.xml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/config/main.xml deleted file mode 100644 index f1d976b..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/config/main.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - start-here-kde-symbolic - - - - false - - - - - - - - - 0 - - - - false - - - - false - - - - - 0 - - - - preferred://browser,org.kde.kontact.desktop,systemsettings.desktop,org.kde.dolphin.desktop,org.kde.discover - - - - shutdown,reboot,logout,lock-screen - - - - false - - - - - - - - - true - - - - true - - - - - true - - - - krunner_shell,krunner_bookmarksrunner,baloosearch,locations - - - - true - - - - false - - - - 3 - - - - 2 - - - - 1 - - - - diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ActionMenu.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ActionMenu.qml deleted file mode 100644 index be10f70..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ActionMenu.qml +++ /dev/null @@ -1,122 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013 Aurélien Gâteau - SPDX-FileCopyrightText: 2014-2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.plasma.extras 2.0 as PlasmaExtras - -Item { - id: root - - property QtObject menu - property Item visualParent - property variant actionList - property bool opened: menu ? (menu.status !== PlasmaExtras.Menu.Closed) : false - - signal actionClicked(string actionId, variant actionArgument) - signal closed - - onActionListChanged: refreshMenu(); - - onOpenedChanged: { - if (!opened) { - closed(); - } - } - - function open(x, y) { - if (!actionList) { - return; - } - - if (x && y) { - menu.open(x, y); - } else { - menu.open(); - } - } - - function refreshMenu() { - if (menu) { - menu.destroy(); - } - - if (!actionList) { - return; - } - - menu = contextMenuComponent.createObject(root); - - fillMenu(menu, actionList); - } - - function fillMenu(menu, items) { - items.forEach(function(actionItem) { - if (actionItem.subActions) { - // This is a menu - var submenuItem = contextSubmenuItemComponent.createObject( - menu, { "actionItem" : actionItem }); - - fillMenu(submenuItem.submenu, actionItem.subActions); - - } else { - var item = contextMenuItemComponent.createObject( - menu, - { - "actionItem": actionItem, - } - ); - } - }); - - } - - Component { - id: contextMenuComponent - - PlasmaExtras.Menu { - visualParent: root.visualParent - } - } - - Component { - id: contextSubmenuItemComponent - - PlasmaExtras.MenuItem { - id: submenuItem - - property variant actionItem - - text: actionItem.text ? actionItem.text : "" - icon: actionItem.icon ? actionItem.icon : null - - property PlasmaExtras.Menu submenu: PlasmaExtras.Menu { - visualParent: submenuItem.action - } - } - } - - Component { - id: contextMenuItemComponent - - PlasmaExtras.MenuItem { - property variant actionItem - - text : actionItem.text ? actionItem.text : "" - enabled : actionItem.type !== "title" && ("enabled" in actionItem ? actionItem.enabled : true) - separator : actionItem.type === "separator" - section : actionItem.type === "title" - icon : actionItem.icon ? actionItem.icon : null - checkable : actionItem.checkable ? actionItem.checkable : false - checked : actionItem.checked ? actionItem.checked : false - - onClicked: { - root.actionClicked(actionItem.actionId, actionItem.actionArgument); - } - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/CompactRepresentation.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/CompactRepresentation.qml deleted file mode 100644 index 9b94640..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/CompactRepresentation.qml +++ /dev/null @@ -1,119 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013-2014 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 -import QtQuick.Layouts 1.15 - -import org.kde.plasma.core as PlasmaCore -import org.kde.plasma.plasmoid 2.0 -import org.kde.kirigami 2.20 as Kirigami - -import org.kde.plasma.private.kicker 0.1 as Kicker - -Item { - id: root - - readonly property bool vertical: (Plasmoid.formFactor === PlasmaCore.Types.Vertical) - readonly property bool useCustomButtonImage: (Plasmoid.configuration.useCustomButtonImage - && Plasmoid.configuration.customButtonImage.length !== 0) - - readonly property Component dashWindowComponent: kicker.isDash ? Qt.createComponent(Qt.resolvedUrl("./DashboardRepresentation.qml"), root) : null - readonly property Kicker.DashboardWindow dashWindow: dashWindowComponent && dashWindowComponent.status === Component.Ready - ? dashWindowComponent.createObject(root, { visualParent: root }) : null - - onWidthChanged: updateSizeHints() - onHeightChanged: updateSizeHints() - - function updateSizeHints() { - if (useCustomButtonImage) { - if (vertical) { - const scaledHeight = Math.floor(parent.width * (buttonIcon.implicitHeight / buttonIcon.implicitWidth)); - root.Layout.minimumWidth = -1; - root.Layout.minimumHeight = scaledHeight; - root.Layout.maximumWidth = Kirigami.Units.iconSizes.huge; - root.Layout.maximumHeight = scaledHeight; - } else { - const scaledWidth = Math.floor(parent.height * (buttonIcon.implicitWidth / buttonIcon.implicitHeight)); - root.Layout.minimumWidth = scaledWidth; - root.Layout.minimumHeight = -1; - root.Layout.maximumWidth = scaledWidth; - root.Layout.maximumHeight = Kirigami.Units.iconSizes.huge; - } - } else { - root.Layout.minimumWidth = Kirigami.Units.iconSizes.huge; - root.Layout.minimumHeight = Kirigami.Units.iconSizes.huge; - } - } - - Kirigami.Icon { - id: buttonIcon - - anchors.fill: parent - - readonly property double aspectRatio: root.vertical - ? implicitHeight / implicitWidth - : implicitWidth / implicitHeight - - active: mouseArea.containsMouse && !justOpenedTimer.running - source: root.useCustomButtonImage ? Plasmoid.configuration.customButtonImage : Plasmoid.configuration.icon - - // A custom icon could also be rectangular. However, if a square, custom, icon is given, assume it - // to be an icon and round it to the nearest icon size again to avoid scaling artifacts. - roundToIconSize: !root.useCustomButtonImage || aspectRatio === 1 - - onSourceChanged: root.updateSizeHints() - } - - MouseArea { - id: mouseArea - - anchors.fill: parent - - property bool wasExpanded: false; - - activeFocusOnTab: true - hoverEnabled: !root.dashWindow || !root.dashWindow.visible - - Keys.onPressed: { - switch (event.key) { - case Qt.Key_Space: - case Qt.Key_Enter: - case Qt.Key_Return: - case Qt.Key_Select: - Plasmoid.activated(); - break; - } - } - Accessible.name: Plasmoid.title - Accessible.description: toolTipSubText - Accessible.role: Accessible.Button - - onPressed: { - if (!kicker.isDash) { - wasExpanded = kicker.expanded - } - } - - onClicked: { - if (kicker.isDash) { - root.dashWindow.toggle(); - justOpenedTimer.start(); - } else { - kicker.expanded = !wasExpanded; - } - } - } - - Connections { - target: Plasmoid - enabled: kicker.isDash && root.dashWindow !== null - - function onActivated() { - root.dashWindow.toggle(); - justOpenedTimer.start(); - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ConfigGeneral.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ConfigGeneral.qml deleted file mode 100644 index ff6a529..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ConfigGeneral.qml +++ /dev/null @@ -1,239 +0,0 @@ -/* - SPDX-FileCopyrightText: 2014 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 -import QtQuick.Controls 2.15 - -import org.kde.draganddrop 2.0 as DragDrop -import org.kde.kirigami 2.5 as Kirigami -import org.kde.iconthemes as KIconThemes -import org.kde.plasma.core as PlasmaCore -import org.kde.kirigami 2.20 as Kirigami -import org.kde.ksvg 1.0 as KSvg -import org.kde.plasma.plasmoid 2.0 -import org.kde.kcmutils as KCM - -KCM.SimpleKCM { - id: configGeneral - - property bool isDash: (Plasmoid.pluginName === "org.kde.plasma.kickerdash") - - property string cfg_icon: Plasmoid.configuration.icon - property bool cfg_useCustomButtonImage: Plasmoid.configuration.useCustomButtonImage - property string cfg_customButtonImage: Plasmoid.configuration.customButtonImage - - property alias cfg_appNameFormat: appNameFormat.currentIndex - property alias cfg_limitDepth: limitDepth.checked - property alias cfg_alphaSort: alphaSort.checked - property alias cfg_showIconsRootLevel: showIconsRootLevel.checked - - property alias cfg_recentOrdering: recentOrdering.currentIndex - property alias cfg_showRecentApps: showRecentApps.checked - property alias cfg_showRecentDocs: showRecentDocs.checked - - property alias cfg_useExtraRunners: useExtraRunners.checked - property alias cfg_alignResultsToBottom: alignResultsToBottom.checked - - property alias cfg_appsIconSize: appsIconSize.currentIndex - property alias cfg_favsIconSize: favsIconSize.currentIndex - property alias cfg_systemIconSize: systemIconSize.currentIndex - - Kirigami.FormLayout { - anchors.left: parent.left - anchors.right: parent.right - - Button { - id: iconButton - - Kirigami.FormData.label: i18n("Icon:") - - implicitWidth: previewFrame.width + Kirigami.Units.smallSpacing * 2 - implicitHeight: previewFrame.height + Kirigami.Units.smallSpacing * 2 - - // Just to provide some visual feedback when dragging; - // cannot have checked without checkable enabled - checkable: true - checked: dropArea.containsAcceptableDrag - - onPressed: iconMenu.opened ? iconMenu.close() : iconMenu.open() - - DragDrop.DropArea { - id: dropArea - - property bool containsAcceptableDrag: false - - anchors.fill: parent - - onDragEnter: { - // Cannot use string operations (e.g. indexOf()) on "url" basic type. - var urlString = event.mimeData.url.toString(); - - // This list is also hardcoded in KIconDialog. - var extensions = [".png", ".xpm", ".svg", ".svgz"]; - containsAcceptableDrag = urlString.indexOf("file:///") === 0 && extensions.some(function (extension) { - return urlString.indexOf(extension) === urlString.length - extension.length; // "endsWith" - }); - - if (!containsAcceptableDrag) { - event.ignore(); - } - } - onDragLeave: containsAcceptableDrag = false - - onDrop: { - if (containsAcceptableDrag) { - // Strip file:// prefix, we already verified in onDragEnter that we have only local URLs. - iconDialog.setCustomButtonImage(event.mimeData.url.toString().substr("file://".length)); - } - containsAcceptableDrag = false; - } - } - - KIconThemes.IconDialog { - id: iconDialog - - function setCustomButtonImage(image) { - configGeneral.cfg_customButtonImage = image || configGeneral.cfg_icon || "start-here-kde-symbolic" - configGeneral.cfg_useCustomButtonImage = true; - } - - onIconNameChanged: setCustomButtonImage(iconName); - } - - KSvg.FrameSvgItem { - id: previewFrame - anchors.centerIn: parent - imagePath: Plasmoid.location === PlasmaCore.Types.Vertical || Plasmoid.location === PlasmaCore.Types.Horizontal - ? "widgets/panel-background" : "widgets/background" - width: Kirigami.Units.iconSizes.large + fixedMargins.left + fixedMargins.right - height: Kirigami.Units.iconSizes.large + fixedMargins.top + fixedMargins.bottom - - Kirigami.Icon { - anchors.centerIn: parent - width: Kirigami.Units.iconSizes.large - height: width - source: configGeneral.cfg_useCustomButtonImage ? configGeneral.cfg_customButtonImage : configGeneral.cfg_icon - } - } - - Menu { - id: iconMenu - - // Appear below the button - y: +parent.height - - onClosed: iconButton.checked = false; - - MenuItem { - text: i18nc("@item:inmenu Open icon chooser dialog", "Choose…") - icon.name: "document-open-folder" - onClicked: iconDialog.open() - } - MenuItem { - text: i18nc("@item:inmenu Reset icon to default", "Clear Icon") - icon.name: "edit-clear" - onClicked: { - configGeneral.cfg_icon = "start-here-kde-symbolic" - configGeneral.cfg_useCustomButtonImage = false - } - } - } - } - - - Item { - Kirigami.FormData.isSection: true - } - - ComboBox { - id: appNameFormat - - Kirigami.FormData.label: i18n("Show applications as:") - - model: [i18n("Name only"), i18n("Description only"), i18n("Name (Description)"), i18n("Description (Name)")] - } - - Item { - Kirigami.FormData.isSection: true - } - - CheckBox { - id: alphaSort - visible: false - Kirigami.FormData.label: i18n("Behavior:") - - text: i18n("Sort applications alphabetically") - } - - CheckBox { - id: limitDepth - visible: false - text: i18n("Flatten sub-menus to a single level") - } - - CheckBox { - id: showIconsRootLevel - visible: false - text: i18n("Show icons on the root level of the menu") - } - - CheckBox { - id: showRecentApps - visible: false - Kirigami.FormData.label: i18n("Show categories:") - - text: recentOrdering.currentIndex == 0 - ? i18n("Recent applications") - : i18n("Often used applications") - } - - CheckBox { - id: showRecentDocs - visible: false - text: recentOrdering.currentIndex == 0 - ? i18n("Recent files") - : i18n("Often used files") - } - - ComboBox { - id: recentOrdering - visible: false - Kirigami.FormData.label: i18n("Sort items in categories by:") - model: [i18nc("@item:inlistbox Sort items in categories by [Recently used | Often used]", "Recently used"), i18nc("@item:inlistbox Sort items in categories by [Recently used | Ofetn used]", "Often used")] - } - - CheckBox { - id: useExtraRunners - visible: false - Kirigami.FormData.label: i18n("Search:") - text: i18n("Expand search to bookmarks, files and emails") - } - - CheckBox { - id: alignResultsToBottom - visible: false - text: i18n("Align search results to bottom") - } - - ComboBox { - id: appsIconSize - Kirigami.FormData.label: i18n("Apps icon size:") - model: [i18n("Small"),i18n("Medium"),i18n("Large"), i18n("Huge"),i18n("HUGE"),i18n("Enormous")] - } - - ComboBox { - id: favsIconSize - Kirigami.FormData.label: i18n("Favs icon size:") - model: [i18n("Small"),i18n("Medium"),i18n("Large"), i18n("Huge"),i18n("Enormous")] - } - - ComboBox { - id: systemIconSize - Kirigami.FormData.label: i18n("Favs icon size:") - model: [i18n("Small"),i18n("Medium"),i18n("Large"), i18n("Huge"),i18n("Enormous")] - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/DashboardRepresentation.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/DashboardRepresentation.qml deleted file mode 100644 index c72b6fb..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/DashboardRepresentation.qml +++ /dev/null @@ -1,523 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 -import Qt5Compat.GraphicalEffects -// Deliberately imported after QtQuick to avoid missing restoreMode property in Binding. Fix in Qt 6. -import QtQml 2.15 - -import org.kde.kquickcontrolsaddons 2.0 -import org.kde.kwindowsystem 1.0 -import org.kde.plasma.components as PlasmaComponents -import org.kde.plasma.extras 2.0 as PlasmaExtras -import org.kde.plasma.core as PlasmaCore -import org.kde.ksvg 1.0 as KSvg -import org.kde.plasma.private.shell 2.0 -import org.kde.kirigami 2.20 as Kirigami -import QtQuick.Layouts 1.1 - -import org.kde.plasma.plasmoid 2.0 -import org.kde.plasma.private.kicker 0.1 as Kicker - -import QtQuick.Controls -import QtQuick -import Qt5Compat.GraphicalEffects - - -import "code/tools.js" as Tools - - -Kicker.DashboardWindow { - id: root - - property bool smallScreen: ((Math.floor(width / Kirigami.Units.iconSizes.huge) <= 22) || (Math.floor(height / Kirigami.Units.iconSizes.huge) <= 14)) - - property int iconSize:{ switch(Plasmoid.configuration.appsIconSize){ - case 0: return Kirigami.Units.iconSizes.smallMedium; - case 1: return Kirigami.Units.iconSizes.medium; - case 2: return Kirigami.Units.iconSizes.large; - case 3: return Kirigami.Units.iconSizes.huge; - case 4: return Kirigami.Units.iconSizes.large * 2; - case 5: return Kirigami.Units.iconSizes.enormous; - default: return 64 - } - } - - property int favsIconSize:{ switch(Plasmoid.configuration.favsIconSize){ - case 0: return Kirigami.Units.iconSizes.smallMedium; - case 1: return Kirigami.Units.iconSizes.medium; - case 2: return Kirigami.Units.iconSizes.large; - case 3: return Kirigami.Units.iconSizes.huge; - case 4: return Kirigami.Units.iconSizes.enormous; - default: return 64 - } - } - - property int systemIconSize:{ switch(Plasmoid.configuration.systemIconSize){ - case 0: return Kirigami.Units.iconSizes.smallMedium; - case 1: return Kirigami.Units.iconSizes.medium; - case 2: return Kirigami.Units.iconSizes.large; - case 3: return Kirigami.Units.iconSizes.huge; - case 4: return Kirigami.Units.iconSizes.enormous; - default: return 64 - } - } - - property int cellSize: iconSize + (2 * Kirigami.Units.iconSizes.sizeForLabels) - + (2 * Kirigami.Units.largeSpacing) - + (2 * Math.max(highlightItemSvg.margins.top + highlightItemSvg.margins.bottom, - highlightItemSvg.margins.left + highlightItemSvg.margins.right)) - //property int columns: Math.floor(width*0.7/root.cellSize)// Math.floor(((smallScreen ? 85 : 80)/100) * Math.ceil(width / cellSize)) - property int columns: Math.floor(((smallScreen ? 85 : 80)/100) * Math.ceil(width / cellSize)) - property bool searching: searchField.text !== "" - - property int favoritesRows: Math.floor(height*0.4/cellSize) - - //keyEventProxy: searchField - backgroundColor: "transparent" - - - onKeyEscapePressed: { - if (searching) { - searchField.clear(); - } else { - root.toggle(); - } - } - - onVisibleChanged: { - if(visible){ - animatorMainColumn.start() - }else{ - rootItem.opacity = 0 - } - reset(); - } - - onSearchingChanged: { - if (!searching) { - //mainView.currentIndex = 1 - mainView.pop() - reset(); - } else { - mainView.push(runnerComponent) - //mainView.currentIndex = 0 - } - } - - function colorWithAlpha(color: color, alpha: real): color { - return Qt.rgba(color.r, color.g, color.b, alpha) - } - - - - function reset() { - allAppsGrid.model = rootModel.modelForRow(2) - globalFavoritesGrid.model = globalFavorites - - allAppsGrid.currentIndex = -1 - globalFavoritesGrid.currentIndex = -1; - systemFavoritesGrid.currentIndex = -1; - - allAppsGrid.forceLayout() - - searchField.clear(); - searchField.focus = true - - } - - mainItem: MouseArea { - id: rootItem - - anchors.fill: parent - - acceptedButtons: Qt.LeftButton | Qt.RightButton - - LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft - LayoutMirroring.childrenInherit: true - - Rectangle{ - anchors.fill: parent - color: Kirigami.Theme.backgroundColor - opacity: 0.4 - } - - - Connections { - target: kicker - - function onReset() { - if (!root.searching) { - //filterList.applyFilter(); - //funnelModel.reset(); - } - } - - function onDragSourceChanged() { - if (!kicker.dragSource) { - // FIXME TODO HACK: Reset all views post-DND to work around - // mouse grab bug despite QQuickWindow::mouseGrabberItem==0x0. - // Needs a more involved hunt through Qt Quick sources later since - // it's not happening with near-identical code in the menu repr. - rootModel.refresh(); - } - } - } - - Connections { - target: Plasmoid - function onUserConfiguringChanged() { - if (Plasmoid.userConfiguring) { - root.hide() - } - } - } - - PlasmaExtras.Menu { - id: contextMenu - - PlasmaExtras.MenuItem { - action: Plasmoid.internalAction("configure") - } - } - - Kirigami.Heading { - id: dummyHeading - - visible: false - - width: 0 - - level: 1 - } - - TextMetrics { - id: headingMetrics - - font: dummyHeading.font - } - - Kicker.FunnelModel { - id: funnelModel - - onSourceModelChanged: { - if (mainColumn.visible) { - mainGrid.currentIndex = -1; - mainGrid.forceLayout(); - } - } - } - - Kicker.ContainmentInterface { - id: containmentInterface - } - - TextField{ - id: searchField - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: mainView.top - anchors.bottomMargin: Kirigami.Units.largeSpacing * 6 - //focus: true - width: Kirigami.Units.gridUnit * 13 - topPadding: Kirigami.Units.largeSpacing - bottomPadding: Kirigami.Units.largeSpacing - placeholderText: i18nc("@info:placeholder as in, 'start typing to initiate a search'", "Search") - horizontalAlignment: TextInput.AlignHCenter - wrapMode: Text.NoWrap - font.pointSize: Kirigami.Theme.defaultFont.pointSize + 0.5 - - onTextChanged: { - runnerModel.query = searchField.text; - } - - function clear() { - text = ""; - } - - background: Rectangle { - color: colorWithAlpha(Kirigami.Theme.backgroundColor,0.7) - radius: 100 - border.width: 1 - border.color: colorWithAlpha(Kirigami.Theme.textColor,0.05) - } - - function appendText(newText) { - if (!root.visible) { - return; - } - focus = true; - text = text + newText; - } - - function backspace() { - if (!root.visible) { - return; - } - focus = true; - text = text.slice(0, -1); - } - - function updateSelection() { - if (!searchField.selectedText) { - return; - } - - var delta = text.lastIndexOf(searchField.text, text.length - 2); - searchHeading.select(searchField.selectionStart + delta, searchField.selectionEnd + delta); - } - Keys.onPressed: event => { - if (event.key === Qt.Key_Down || event.key === Qt.Key_Tab) { - event.accepted = true; - if(root.searching){ - mainView.currentItem.tryActivate(0,0) - mainView.currentItem.forceActiveFocus() - } - else{ - allAppsGrid.tryActivate(0,0) - allAppsGrid.forceActiveFocus() - } - } - } - } - - - OpacityAnimator{ id: animatorMainColumn ;from: 0; to: 1 ; target: rootItem;} - - StackView { - id: mainView - width: (root.columns * root.cellSize) + Kirigami.Units.gridUnit - height: Math.ceil(root.height*0.7/root.cellSize) * root.cellSize - anchors{ - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - } - - initialItem: Column { - id: allAppsColumn - clip: true - spacing: Kirigami.Units.largeSpacing * 2 - - ItemGridView { - id: allAppsGrid - width: parent.width - height: Math.ceil(root.height*0.7/cellHeight) * cellHeight - cellWidth: root.cellSize - cellHeight: root.cellSize - iconSize: root.iconSize - dropEnabled: false - - onKeyNavDown: { - allAppsGrid.focus = false - globalFavoritesGrid.tryActivate(0,0) - globalFavoritesGrid.forceActiveFocus() - } - onKeyNavUp: { - allAppsGrid.focus = false - searchField.focus = true - } - Keys.onPressed: event => { - if (event.key === Qt.Key_Tab) { - event.accepted = true; - allAppsGrid.focus = false - globalFavoritesGrid.tryActivate(0,0) - globalFavoritesGrid.forceActiveFocus() - } - } - } - } - - pushEnter: Transition { - PropertyAnimation { - property: "opacity" - from: 0 - to:1 - duration: 200 - } - } - pushExit: Transition { - PropertyAnimation { - property: "opacity" - from: 1 - to:0 - duration: 200 - } - } - popEnter: Transition { - PropertyAnimation { - property: "opacity" - from: 0 - to:1 - duration: 200 - } - } - popExit: Transition { - PropertyAnimation { - property: "opacity" - from: 1 - to:0 - duration: 200 - } - } - - } - - Component { - id: runnerComponent - - ItemGridView { - id: runnerGrid - anchors.horizontalCenter: mainView.horizontalCenter - width: mainView.width/2 - clip: true - height: mainView.height - grabFocus: true - cellWidth: root.cellSize - cellHeight: root.cellSize - iconSize: root.iconSize - model: runnerModel.count > 0 ? runnerModel.modelForRow(0) : undefined - onKeyNavDown: { - runnerGrid.focus = false - globalFavoritesGrid.tryActivate(0,0) - globalFavoritesGrid.forceActiveFocus() - } - onKeyNavUp: { - runnerGrid.focus = false - searchField.focus = true - } - Keys.onPressed: event => { - if (event.key === Qt.Key_Tab) { - event.accepted = true; - runnerGrid.focus = false - globalFavoritesGrid.tryActivate(0,0) - globalFavoritesGrid.forceActiveFocus() - } - } - } - - } - - Rectangle{ - anchors.centerIn: globalFavoritesGrid - height: globalFavoritesGrid.height + Kirigami.Units.largeSpacing - width: globalFavoritesGrid.width + Kirigami.Units.largeSpacing - color: Kirigami.Theme.backgroundColor - radius: 10 - opacity: 0.6 - z:1 - } - - ItemGridView { - id: globalFavoritesGrid - width: globalFavoritesGrid.model ? Math.min(Math.floor((root.width*0.85)/cellWidth)*cellWidth,globalFavoritesGrid.model.count*cellWidth) : 0 - - iconSize: root.favsIconSize - cellHeight: iconSize + Kirigami.Units.largeSpacing - cellWidth: cellHeight + Kirigami.Units.largeSpacing - clip: true - z:2 - verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff - height: cellHeight - - anchors.bottom: parent.bottom - anchors.bottomMargin: Kirigami.Units.largeSpacing - anchors.horizontalCenter: parent.horizontalCenter - showLabels: false - dropEnabled: true - dragEnabled: true - - onKeyNavUp: { - if(root.searching){ - globalFavoritesGrid.focus = false - //runnerGrid.tryActivate(0,0) - //runnerGrid.forceActiveFocus() - mainView.currentItem.tryActivate(0,0) - mainView.currentItem.forceActiveFocus() - } - else{ - globalFavoritesGrid.focus = false - allAppsGrid.tryActivate(0,0) - allAppsGrid.forceActiveFocus() - } - } - Keys.onPressed: event => { - if (event.key === Qt.Key_Tab) { - event.accepted = true; - globalFavoritesGrid.focus = false - systemFavoritesGrid.tryActivate(0,0) - systemFavoritesGrid.forceActiveFocus() - } - } - } - - - ItemGridView { - id: systemFavoritesGrid - anchors.top: parent.top - anchors.right: parent.right - clip: true - width: cellWidth - height: systemFavoritesGrid.model ? systemFavoritesGrid.model.count * cellHeight : 0 - cellWidth: iconSize + Kirigami.Units.largeSpacing * 2 - cellHeight: cellWidth - iconSize: root.systemIconSize - z:5 - showLabels: false - model: systemFavorites - dragEnabled: false - dropEnabled: false - Keys.onPressed: event => { - if (event.key === Qt.Key_Tab) { - event.accepted = true; - systemFavoritesGrid.focus = false - searchField.focus = true - } - } - } - - onPressed: mouse => { - if (mouse.button === Qt.RightButton) { - contextMenu.open(mouse.x, mouse.y); - } - } - - onClicked: mouse => { - if (mouse.button === Qt.LeftButton) { - root.toggle(); - } - } - Keys.onPressed: (event)=> { - if(event.modifiers & Qt.ControlModifier ||event.modifiers & Qt.ShiftModifier){ - searchField.focus = true; - return - } - if (event.key === Qt.Key_Escape) { - event.accepted = true; - if (root.searching) { - reset(); - } else { - root.visible = false; - } - return; - } - if (searchField.focus) { - return; - } - if (event.key === Qt.Key_Backspace) { - event.accepted = true; - searchField.backspace(); - } else if (event.text !== "") { - event.accepted = true; - searchField.appendText(event.text); - } - //searchField.focus = true - } - } - - Component.onCompleted: { - rootModel.refresh(); - searchField.forceActiveFocus() - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridDelegate.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridDelegate.qml deleted file mode 100644 index a985c9a..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridDelegate.qml +++ /dev/null @@ -1,120 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.plasma.components 3.0 as PlasmaComponents3 -import org.kde.plasma.core as PlasmaCore -import org.kde.kirigami 2.20 as Kirigami - -import "code/tools.js" as Tools - -Item { - id: item - - width: GridView.view.cellWidth - height: GridView.view.cellHeight - - enabled: !model.disabled - - property bool showLabel: true - - property int itemIndex: model.index - property string favoriteId: model.favoriteId !== undefined ? model.favoriteId : "" - property url url: model.url !== undefined ? model.url : "" - property variant icon: model.decoration !== undefined ? model.decoration : "" - property var m: model - property bool hasActionList: ((model.favoriteId !== null) - || (("hasActionList" in model) && (model.hasActionList === true))) - - Accessible.role: Accessible.MenuItem - Accessible.name: model.display - - function openActionMenu(x, y) { - var actionList = hasActionList ? model.actionList : []; - Tools.fillActionMenu(i18n, actionMenu, actionList, GridView.view.model.favoritesModel, model.favoriteId); - actionMenu.visualParent = item; - actionMenu.open(x, y); - } - - function actionTriggered(actionId, actionArgument) { - var close = (Tools.triggerAction(GridView.view.model, model.index, actionId, actionArgument) === true); - - if (close) { - root.toggle(); - } - } - - Kirigami.Icon { - id: icon - - y: item.showLabel ? (2 * highlightItemSvg.margins.top) : null - - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: item.showLabel ? undefined : parent.verticalCenter - - width: iconSize - height: width - - animated: false - - source: model.decoration - } - - PlasmaComponents3.Label { - id: label - - visible: item.showLabel - - anchors { - top: icon.bottom - topMargin: Kirigami.Units.smallSpacing - left: parent.left - leftMargin: highlightItemSvg.margins.left - right: parent.right - rightMargin: highlightItemSvg.margins.right - } - - horizontalAlignment: Text.AlignHCenter - - maximumLineCount: 2 - elide: Text.ElideMiddle - wrapMode: Text.Wrap - font.pointSize: Kirigami.Theme.defaultFont.pointSize + 0.5 - - text: ("name" in model ? model.name : model.display) - textFormat: Text.PlainText - } - - PlasmaCore.ToolTipArea { - id: toolTip - - property string text: model.display - - anchors.fill: parent - - //active: root.visible && - active: root.visible && ( !item.showLabel || label.truncated) - mainItem: toolTipDelegate - onContainsMouseChanged: item.GridView.view.itemContainsMouseChanged(containsMouse) - } - - Keys.onPressed: event => { - if (event.key === Qt.Key_Menu && hasActionList) { - event.accepted = true; - openActionMenu(item); - } else if ((event.key === Qt.Key_Enter || event.key === Qt.Key_Return)) { - event.accepted = true; - - if ("trigger" in GridView.view.model) { - GridView.view.model.trigger(index, "", null); - root.toggle(); - } - - itemGrid.itemActivated(index, "", null); - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridView.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridView.qml deleted file mode 100644 index 04f923b..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemGridView.qml +++ /dev/null @@ -1,472 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 -import QtQuick.Controls - -import org.kde.kquickcontrolsaddons 2.0 -import org.kde.ksvg 1.0 as KSvg -import org.kde.plasma.components as PlasmaComponents -import org.kde.plasma.extras 2.0 as PlasmaExtras -import org.kde.kirigami 2.20 as Kirigami - -FocusScope { - id: itemGrid - - signal keyNavLeft - signal keyNavRight - signal keyNavUp - signal keyNavDown - - signal itemActivated(int index, string actionId, string argument) - - property bool dragEnabled: true - property bool dropEnabled: false - property bool showLabels: true - property bool grabFocus: false - property alias currentIndex: gridView.currentIndex - property alias currentItem: gridView.currentItem - property alias contentItem: gridView.contentItem - property alias count: gridView.count - property alias model: gridView.model - property alias verticalLayoutDirection : gridView.verticalLayoutDirection - - property alias cellWidth: gridView.cellWidth - property alias cellHeight: gridView.cellHeight - property alias iconSize: gridView.iconSize - - property var horizontalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff - property var verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AsNeeded - - onDropEnabledChanged: { - if (!dropEnabled && "dropPlaceHolderIndex" in model) { - model.dropPlaceHolderIndex = -1; - } - } - - onFocusChanged: { - // if (!focus && !root.keyEventProxy.activeFocus) { - if (!focus) { - currentIndex = -1; - } - } - - function currentRow() { - if (currentIndex === -1) { - return -1; - } - - return Math.floor(currentIndex / Math.floor(width / itemGrid.cellWidth)); - } - - function currentCol() { - if (currentIndex === -1) { - return -1; - } - - return currentIndex - (currentRow() * Math.floor(width / itemGrid.cellWidth)); - } - - function lastRow() { - var columns = Math.floor(width / itemGrid.cellWidth); - return Math.ceil(count / columns) - 1; - } - - function tryActivate(row, col) { - if (count) { - var columns = Math.floor(width / itemGrid.cellWidth); - var rows = Math.ceil(count / columns); - row = Math.min(row, rows - 1); - col = Math.min(col, columns - 1); - currentIndex = Math.min(row ? ((Math.max(1, row) * columns) + col) - : col, - count - 1); - - focus = true; - } - } - - function forceLayout() { - gridView.forceLayout(); - } - - ActionMenu { - id: actionMenu - - onActionClicked: { - visualParent.actionTriggered(actionId, actionArgument); - } - } - - DropArea { - id: dropArea - - width: itemGrid.width - height: itemGrid.height - - onPositionChanged: event => { - if (!itemGrid.dropEnabled || gridView.animating || !kicker.dragSource) { - return; - } - - var x = Math.max(0, event.x - (width % itemGrid.cellWidth)); - var cPos = mapToItem(gridView.contentItem, x, event.y); - var item = gridView.itemAt(cPos.x, cPos.y); - - if (item) { - if (kicker.dragSource.parent === gridView.contentItem) { - if (item !== kicker.dragSource) { - item.GridView.view.model.moveRow(dragSource.itemIndex, item.itemIndex); - } - } else if (kicker.dragSource.GridView.view.model.favoritesModel === itemGrid.model - && !itemGrid.model.isFavorite(kicker.dragSource.favoriteId)) { - var hasPlaceholder = (itemGrid.model.dropPlaceholderIndex !== -1); - - itemGrid.model.dropPlaceholderIndex = item.itemIndex; - - if (!hasPlaceholder) { - gridView.currentIndex = (item.itemIndex - 1); - } - } - } else if (kicker.dragSource.parent !== gridView.contentItem - && kicker.dragSource.GridView.view.model.favoritesModel === itemGrid.model - && !itemGrid.model.isFavorite(kicker.dragSource.favoriteId)) { - var hasPlaceholder = (itemGrid.model.dropPlaceholderIndex !== -1); - - itemGrid.model.dropPlaceholderIndex = hasPlaceholder ? itemGrid.model.count - 1 : itemGrid.model.count; - - if (!hasPlaceholder) { - gridView.currentIndex = (itemGrid.model.count - 1); - } - } else { - itemGrid.model.dropPlaceholderIndex = -1; - gridView.currentIndex = -1; - } - } - - onExited: { - if ("dropPlaceholderIndex" in itemGrid.model) { - itemGrid.model.dropPlaceholderIndex = -1; - gridView.currentIndex = -1; - } - } - - onDropped: { - if (kicker.dragSource && kicker.dragSource.parent !== gridView.contentItem && kicker.dragSource.GridView.view.model.favoritesModel === itemGrid.model) { - itemGrid.model.addFavorite(kicker.dragSource.favoriteId, itemGrid.model.dropPlaceholderIndex); - gridView.currentIndex = -1; - } - } - - Timer { - id: resetAnimationDurationTimer - - interval: 120 - repeat: false - - onTriggered: { - gridView.animationDuration = interval - 20; - } - } - - GridView { - id: gridView - - width: itemGrid.width - height: itemGrid.height - - signal itemContainsMouseChanged(bool containsMouse) - - property int iconSize: Kirigami.Units.iconSizes.huge - - property bool animating: false - property int animationDuration: itemGrid.dropEnabled ? resetAnimationDurationTimer.interval : 0 - - focus: true - - currentIndex: -1 - - ScrollBar.vertical: ScrollBar { - snapMode: ScrollBar.SnapAlways - } - - snapMode: GridView.SnapOneRow - move: Transition { - enabled: itemGrid.dropEnabled - - SequentialAnimation { - PropertyAction { target: gridView; property: "animating"; value: true } - - NumberAnimation { - duration: gridView.animationDuration - properties: "x, y" - easing.type: Easing.OutQuad - } - - PropertyAction { target: gridView; property: "animating"; value: false } - } - } - - moveDisplaced: Transition { - enabled: itemGrid.dropEnabled - - SequentialAnimation { - PropertyAction { target: gridView; property: "animating"; value: true } - - NumberAnimation { - duration: gridView.animationDuration - properties: "x, y" - easing.type: Easing.OutQuad - } - - PropertyAction { target: gridView; property: "animating"; value: false } - } - } - - keyNavigationWraps: false - boundsBehavior: Flickable.StopAtBounds - - delegate: ItemGridDelegate { - showLabel: itemGrid.showLabels - } - - highlight: Rectangle { color: colorWithAlpha(Kirigami.Theme.highlightColor,0.65); radius: 10 } - - /* - highlight: Item { - property bool isDropPlaceHolder: "dropPlaceholderIndex" in itemGrid.model && itemGrid.currentIndex === itemGrid.model.dropPlaceholderIndex - - PlasmaExtras.Highlight { - visible: gridView.currentItem && !isDropPlaceHolder - hovered: true - pressed: hoverArea.pressed - - anchors.fill: parent - } - - KSvg.FrameSvgItem { - visible: gridView.currentItem && isDropPlaceHolder - - anchors.fill: parent - - imagePath: "widgets/viewitem" - prefix: "selected" - - opacity: 0.5 - - Kirigami.Icon { - anchors { - right: parent.right - rightMargin: parent.margins.right - bottom: parent.bottom - bottomMargin: parent.margins.bottom - } - - width: Kirigami.Units.iconSizes.smallMedium - height: width - - source: "list-add" - active: false - } - } - } - */ - highlightFollowsCurrentItem: true - highlightMoveDuration: 0 - - onCurrentIndexChanged: { - if (currentIndex !== -1) { - hoverArea.hoverEnabled = false - focus = true; - } - } - - onCountChanged: { - animationDuration = 0; - resetAnimationDurationTimer.start(); - if (count > 0 && itemGrid.grabFocus) { - currentIndex = 0; - focus = true; - forceActiveFocus() - } - - } - - onModelChanged: { - currentIndex = -1; - } - - Keys.onLeftPressed: event => { - if (itemGrid.currentCol() !== 0) { - event.accepted = true; - moveCurrentIndexLeft(); - } else { - itemGrid.keyNavLeft(); - } - } - - Keys.onRightPressed: event => { - var columns = Math.floor(width / cellWidth); - - if (itemGrid.currentCol() !== columns - 1 && currentIndex !== count -1) { - event.accepted = true; - moveCurrentIndexRight(); - } else { - itemGrid.keyNavRight(); - } - } - - Keys.onUpPressed: event => { - if (itemGrid.currentRow() !== 0) { - event.accepted = true; - moveCurrentIndexUp(); - positionViewAtIndex(currentIndex, GridView.Contain); - } else { - itemGrid.keyNavUp(); - } - } - - Keys.onDownPressed: event => { - if (itemGrid.currentRow() < itemGrid.lastRow()) { - // Fix moveCurrentIndexDown()'s lack of proper spatial nav down - // into partial columns. - event.accepted = true; - var columns = Math.floor(itemGrid.width / cellWidth); - var newIndex = currentIndex + columns; - currentIndex = Math.min(newIndex, gridView.count - 1); - positionViewAtIndex(currentIndex, GridView.Visible); - } else { - itemGrid.keyNavDown(); - } - } - - onItemContainsMouseChanged: containsMouse => { - if (!containsMouse) { - //if (!actionMenu.opened) { - // gridView.currentIndex = -1; - //} - hoverArea.pressX = -1; - hoverArea.pressY = -1; - hoverArea.lastX = -1; - hoverArea.lastY = -1; - hoverArea.pressedItem = null; - hoverArea.hoverEnabled = true; - } - } - } - //<>} - - MouseArea { - id: hoverArea - - width: itemGrid.width - Kirigami.Units.gridUnit - height: itemGrid.height - //anchors.fill: parent - - property int pressX: -1 - property int pressY: -1 - property int lastX: -1 - property int lastY: -1 - property Item pressedItem: null - - acceptedButtons: Qt.LeftButton | Qt.RightButton - - hoverEnabled: true - - function updatePositionProperties(x, y) { - // Prevent hover event synthesis in QQuickWindow interfering - // with keyboard navigation by ignoring repeated events with - // identical coordinates. As the work done here would be re- - // dundant in any case, these are safe to ignore. - if (lastX === x && lastY === y) { - return; - } - - lastX = x; - lastY = y; - - var cPos = mapToItem(gridView.contentItem, x, y); - var item = gridView.itemAt(cPos.x, cPos.y); - - if (!item) { - gridView.currentIndex = -1; - pressedItem = null; - } else { - itemGrid.focus = (item.itemIndex !== -1) - itemGrid.forceActiveFocus() //<> - gridView.currentIndex = item.itemIndex; - } - - return item; - } - - onPressed: mouse => { - mouse.accepted = true; - - updatePositionProperties(mouse.x, mouse.y); - - pressX = mouse.x; - pressY = mouse.y; - - if (mouse.button === Qt.RightButton) { - if (gridView.currentItem) { - if (gridView.currentItem.hasActionList) { - var mapped = mapToItem(gridView.currentItem, mouse.x, mouse.y); - gridView.currentItem.openActionMenu(mapped.x, mapped.y); - } - } else { - var mapped = mapToItem(rootItem, mouse.x, mouse.y); - contextMenu.open(mapped.x, mapped.y); - } - } else { - pressedItem = gridView.currentItem; - } - } - - onReleased: mouse => { - mouse.accepted = true; - updatePositionProperties(mouse.x, mouse.y); - - if (!dragHelper.dragging) { - if (pressedItem) { - if ("trigger" in gridView.model) { - gridView.model.trigger(pressedItem.itemIndex, "", null); - root.toggle(); - } - - itemGrid.itemActivated(pressedItem.itemIndex, "", null); - } else if (mouse.button === Qt.LeftButton) { - root.toggle(); - } - } - - pressX = pressY = -1; - pressedItem = null; - } - - onPositionChanged: mouse => { - var item = pressedItem? pressedItem : updatePositionProperties(mouse.x, mouse.y); - - if (gridView.currentIndex !== -1) { - if (itemGrid.dragEnabled && pressX !== -1 && dragHelper.isDrag(pressX, pressY, mouse.x, mouse.y)) { - if ("pluginName" in item.m) { - dragHelper.startDrag(kicker, item.url, item.icon, - "text/x-plasmoidservicename", item.m.pluginName); - } else { - //dragHelper.startDrag(kicker, item.url, item.icon); - dragHelper.startDrag(kicker, item.url); - } - - kicker.dragSource = item; - - pressX = -1; - pressY = -1; - } - } - } - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDelegate.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDelegate.qml deleted file mode 100644 index 4e071b2..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDelegate.qml +++ /dev/null @@ -1,137 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.plasma.components 3.0 as PlasmaComponents3 -import org.kde.plasma.core as PlasmaCore -import org.kde.kirigami 2.20 as Kirigami - -import "code/tools.js" as Tools - -Item { - id: item - - width: ListView.view.width - height: 40 - - enabled: !model.disabled - - property bool showLabel: true - - property int itemIndex: model.index - property string favoriteId: model.favoriteId !== undefined ? model.favoriteId : "" - property url url: model.url !== undefined ? model.url : "" - property variant icon: model.decoration !== undefined ? model.decoration : "" - property var m: model - property bool hasActionList: ((model.favoriteId !== null) - || (("hasActionList" in model) && (model.hasActionList === true))) - - Accessible.role: Accessible.MenuItem - Accessible.name: model.display - - function openActionMenu(x, y) { - var actionList = hasActionList ? model.actionList : []; - Tools.fillActionMenu(i18n, actionMenu, actionList, GridView.view.model.favoritesModel, model.favoriteId); - actionMenu.visualParent = item; - actionMenu.open(x, y); - } - - function actionTriggered(actionId, actionArgument) { - var close = (Tools.triggerAction(GridView.view.model, model.index, actionId, actionArgument) === true); - - if (close) { - root.toggle(); - } - } - - Kirigami.Icon { - id: icon - - //y: item.showLabel ? (2 * highlightItemSvg.margins.top) : undefined - - anchors.left: parent.left - anchors.leftMargin: Kirigami.Units.largeSpacing - anchors.verticalCenter: parent.verticalCenter - - width: iconSize - height: width - - animated: false - - source: model.decoration - } - - PlasmaComponents3.Label { - id: label - visible: item.showLabel - anchors { - left: icon.right - leftMargin: Kirigami.Units.largeSpacing - right: desc.left - rightMargin: Kirigami.Units.largeSpacing - verticalCenter: icon.verticalCenter - - } - horizontalAlignment: Text.AlignLeft - maximumLineCount: 1 - elide: Text.ElideMiddle - //wrapMode: Text.Wrap - color: Kirigami.Theme.textColor - font.pointSize: Kirigami.Theme.defaultFont.pointSize - text: ("name" in model ? model.name : model.display) - textFormat: Text.PlainText - } - - PlasmaComponents3.Label { - id: desc - anchors { - //top: itemColumns == 2 ? label.bottom: undefined - //left: itemColumns == 2 ? icon.right : undefined - leftMargin: Kirigami.Units.largeSpacing - right: parent.right - rightMargin: Kirigami.Units.largeSpacing - verticalCenter: icon.verticalCenter - } - horizontalAlignment: Text.AlignRight - maximumLineCount: 1 - elide: Text.ElideMiddle - //wrapMode: Text.Wrap - - color: colorWithAlpha(Kirigami.Theme.textColor,0.4) - font.pointSize: Kirigami.Theme.defaultFont.pointSize - 1 - text: ("description" in model ? model.description : "") - textFormat: Text.PlainText - } - - PlasmaCore.ToolTipArea { - id: toolTip - - property string text: model.display - - anchors.fill: parent - active: root.visible && label.truncated - mainItem: toolTipDelegate - - //<>onContainsMouseChanged: item.GridView.view.itemContainsMouseChanged(containsMouse) - } - - Keys.onPressed: event => { - if (event.key === Qt.Key_Menu && hasActionList) { - event.accepted = true; - openActionMenu(item); - } else if ((event.key === Qt.Key_Enter || event.key === Qt.Key_Return)) { - event.accepted = true; - - if ("trigger" in GridView.view.model) { - GridView.view.model.trigger(index, "", null); - root.toggle(); - } - - itemGrid.itemActivated(index, "", null); - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDialog.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDialog.qml deleted file mode 100644 index a6d78f0..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListDialog.qml +++ /dev/null @@ -1,99 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013-2014 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.plasma.core as PlasmaCore -import org.kde.plasma.plasmoid 2.0 -import org.kde.kirigami 2.20 as Kirigami - -import org.kde.plasma.private.kicker 0.1 as Kicker - -Kicker.SubMenu { - id: itemDialog - - property alias focusParent: itemListView.focusParent - property alias model: funnelModel.sourceModel - - property bool aboutToBeDestroyed: false - - visible: false - hideOnWindowDeactivate: kicker.hideOnWindowDeactivate - location: PlasmaCore.Types.Floating - offset: Kirigami.Units.smallSpacing - - onWindowDeactivated: { - if (!aboutToBeDestroyed) { - kicker.expanded = false; - } - } - - mainItem: ItemListView { - id: itemListView - - height: { - const m = funnelModel.sourceModel; - - if (m === null || m === undefined) { - // TODO: setting height to 0 triggers a warning in PlasmaQuick::Dialog - return 0; - } - - return Math.min( - // either fit in screen boundaries (cut to the nearest item/separator boundary), ... - __subFloorMultipleOf( - itemDialog.availableScreenRectForItem(itemListView).height - - itemDialog.margins.top - - itemDialog.margins.bottom, - itemHeight - ) + m.separatorCount * (separatorHeight - itemHeight) - , - // ...or fit the content itself -- whichever is shorter. - ((m.count - m.separatorCount) * itemHeight) - + (m.separatorCount * separatorHeight) - ); - } - - // get x rounded down to the multiple of y, minus extra y. - function __subFloorMultipleOf(x : real, y : real) : real { - return (Math.floor(x / y) - 1) * y; - } - - iconsEnabled: true - - dialog: itemDialog - - model: funnelModel - - Kicker.FunnelModel { - id: funnelModel - - property bool sorted: sourceModel?.sorted ?? false - - Component.onCompleted: { - kicker.reset.connect(funnelModel.reset); - } - - onCountChanged: { - if (sourceModel && count === 0) { - itemDialog.delayedDestroy(); - } - } - - onSourceModelChanged: { - itemListView.currentIndex = -1; - } - } - } - - function delayedDestroy() { - aboutToBeDestroyed = true; - Plasmoid.hideOnWindowDeactivate = false; - visible = false; - - Qt.callLater(() => itemDialog.destroy()); - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListView.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListView.qml deleted file mode 100644 index fccb84f..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemListView.qml +++ /dev/null @@ -1,267 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013-2014 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 -import QtQuick.Controls - -import org.kde.kquickcontrolsaddons 2.0 -import org.kde.plasma.extras 2.0 as PlasmaExtras -import org.kde.kirigami 2.20 as Kirigami - -FocusScope { - id: itemList - - property real minimumWidth: Kirigami.Units.gridUnit * 14 - property real maximumWidth: minimumWidth * 2 - - width: minimumWidth - height: listView.contentHeight - - signal exited - signal keyNavigationAtListEnd - signal appendSearchText(string text) - - property Item focusParent: null - property QtObject dialog: null - property QtObject childDialog: null - property bool iconsEnabled: false - property int itemHeight: Math.ceil((Math.max(Kirigami.Units.iconSizes.sizeForLabels, Kirigami.Units.iconSizes.small) - + Math.max(highlightItemSvg.margins.top + highlightItemSvg.margins.bottom, - listItemSvg.margins.top + listItemSvg.margins.bottom)) / 2) * 2 - property int separatorHeight: model.sorted === true ? 0 : lineSvg.horLineHeight + (2 * Kirigami.Units.smallSpacing) - - property alias currentIndex: listView.currentIndex - property alias currentItem: listView.currentItem - property alias keyNavigationWraps: listView.keyNavigationWraps - property alias showChildDialogs: listView.showChildDialogs - property alias model: listView.model - property alias count: listView.count - property alias containsMouse: listener.containsMouse - property alias resetOnExitDelay: resetIndexTimer.interval - - onFocusParentChanged: { - appendSearchText.connect(focusParent.appendSearchText); - } - - Timer { - id: dialogSpawnTimer - - property bool focusOnSpawn: false - - interval: 70 - repeat: false - - onTriggered: { - if (!kicker.expanded || model === undefined || currentIndex == -1) { - return; - } - - if (itemList.childDialog != null) { - itemList.childDialog.delayedDestroy(); - } - - // Gets reenabled after the dialog spawn causes a focus-in on the dialog window. - kicker.hideOnWindowDeactivate = false; - - itemList.childDialog = itemListDialogComponent.createObject(itemList); - itemList.childDialog.focusParent = itemList; - itemList.childDialog.visualParent = listView.currentItem; - itemList.childDialog.model = model.modelForRow(listView.currentIndex); - itemList.childDialog.visible = true; - - windowSystem.forceActive(itemList.childDialog.mainItem); - itemList.childDialog.mainItem.focus = true; - - if (focusOnSpawn) { - itemList.childDialog.mainItem.showChildDialogs = false; - itemList.childDialog.mainItem.currentIndex = 0; - itemList.childDialog.mainItem.showChildDialogs = true; - } - } - } - - Timer { - id: resetIndexTimer - - interval: (dialog != null) ? 50 : 150 - repeat: false - - onTriggered: { - if (focus && (!itemList.childDialog || !itemList.childDialog.mainItem.containsMouse)) { - currentIndex = -1; - itemList.exited(); - } - } - } - - MouseEventListener { - id: listener - - anchors.fill: parent - - hoverEnabled: true - - onContainsMouseChanged: { - listView.eligibleWidth = listView.width; - - if (containsMouse) { - resetIndexTimer.stop(); - itemList.forceActiveFocus(); - } else if ((!itemList.childDialog || !dialog) - && (!currentItem || !currentItem.menu.opened)) { - resetIndexTimer.start(); - } - } - - ScrollView { - anchors.fill: parent - - focus: true - - ListView { - id: listView - - property bool showChildDialogs: true - property int eligibleWidth: width - - currentIndex: -1 - - boundsBehavior: Flickable.StopAtBounds - snapMode: ListView.SnapToItem - spacing: 0 - keyNavigationEnabled: false - - delegate: ItemListDelegate { - onFullTextWidthChanged: { - if (fullTextWidth > itemList.width) itemList.width = Math.min(fullTextWidth, itemList.maximumWidth); - } - } - - highlight: PlasmaExtras.Highlight { - visible: !listView.currentItem || !listView.currentItem.isSeparator - pressed: listView.currentItem && listView.currentItem.pressed && !listView.currentItem.hasChildren - active: listView.currentItem && listView.currentItem.hovered - } - - highlightMoveDuration: 0 - - onCountChanged: { - if (currentIndex == 0) { - currentItem.forceActiveFocus(); - } else { - currentIndex = -1; - } - } - - onCurrentIndexChanged: { - if (currentIndex != -1) { - if (itemList.childDialog) { - if (currentItem && currentItem.hasChildren) { - itemList.childDialog.mainItem.width = itemList.minimumWidth; - itemList.childDialog.model = model.modelForRow(currentIndex); - itemList.childDialog.visualParent = listView.currentItem; - } else { - itemList.childDialog.delayedDestroy(); - } - - return; - } - - if (currentItem == null || !currentItem.hasChildren || !kicker.expanded) { - dialogSpawnTimer.stop(); - - return; - } - - if (showChildDialogs) { - dialogSpawnTimer.focusOnSpawn = false; - dialogSpawnTimer.restart(); - } - } else if (itemList.childDialog != null) { - itemList.childDialog.delayedDestroy(); - itemList.childDialog = null; - } - } - - onCurrentItemChanged: { - if (currentItem) { - currentItem.menu.closed.connect(resetIndexTimer.restart); - } - } - } - - Keys.onPressed: event => { - if (event.key === Qt.Key_Right || event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - if (itemList.childDialog === null && currentItem != null && currentItem.hasChildren) { - dialogSpawnTimer.focusOnSpawn = true; - dialogSpawnTimer.restart(); - } else if (currentItem != null && currentItem.hasChildren) { - windowSystem.forceActive(itemList.childDialog.mainItem); - itemList.childDialog.mainItem.focus = true; - itemList.childDialog.mainItem.currentIndex = 0; - } - } else if (event.key === Qt.Key_Up) { - event.accepted = true; - - if (!keyNavigationWraps && currentIndex == 0) { - itemList.keyNavigationAtListEnd(); - - return; - } - - showChildDialogs = false; - listView.decrementCurrentIndex(); - - if (currentItem.isSeparator) { - listView.decrementCurrentIndex(); - } - listView.currentItem.forceActiveFocus() - - showChildDialogs = true; - } else if (event.key === Qt.Key_Down) { - event.accepted = true; - - if (!keyNavigationWraps && currentIndex == count - 1) { - itemList.keyNavigationAtListEnd(); - - return; - } - - showChildDialogs = false; - listView.incrementCurrentIndex(); - - if (currentItem.isSeparator) { - listView.incrementCurrentIndex(); - } - listView.currentItem.forceActiveFocus() - - showChildDialogs = true; - } else if (event.key === Qt.Key_Left && dialog != null) { - dialog.destroy(); - } else if (event.key === Qt.Key_Escape) { - kicker.expanded = false; - } else if (event.key === Qt.Key_Tab) { - //do nothing, and skip appending text - } else if (event.text !== "") { - if (/[\x00-\x1F\x7F]/.test(event.text)) { - // We still want to focus it - appendSearchText(""); - } else { - appendSearchText(event.text); - } - } - } - } - } - - Component.onCompleted: { - windowSystem.monitorWindowFocus(itemList); - - if (dialog == null) { - appendSearchText.connect(root.appendSearchText); - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemMultiGridView.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemMultiGridView.qml deleted file mode 100644 index 8427701..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/ItemMultiGridView.qml +++ /dev/null @@ -1,235 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick - -import org.kde.ksvg 1.0 as KSvg -import org.kde.plasma.components as PlasmaComponents -import org.kde.plasma.extras 2.0 as PlasmaExtras -import org.kde.kirigami 2.20 as Kirigami -import org.kde.plasma.private.kicker 0.1 as Kicker - -PlasmaComponents.ScrollView { - id: itemMultiGrid - - anchors { - top: parent.top - } - - width: parent.width - - implicitHeight: itemColumn.implicitHeight - - signal keyNavLeft(int subGridIndex) - signal keyNavRight(int subGridIndex) - signal keyNavUp() - signal keyNavDown() - - property bool grabFocus: false - - property alias model: repeater.model - property alias count: repeater.count - property alias flickableItem: flickable - - function subGridAt(index) { - return repeater.itemAt(index).itemGrid; - } - - function tryActivate(row, col) { // FIXME TODO: Cleanup messy algo. - if (flickable.contentY > 0) { - row = 0; - } - - var target = null; - var rows = 0; - - for (var i = 0; i < repeater.count; i++) { - var grid = subGridAt(i); - - if (rows <= row) { - target = grid; - rows += grid.lastRow() + 2; // Header counts as one. - } else { - break; - } - } - - if (target) { - rows -= (target.lastRow() + 2); - target.tryActivate(row - rows, col); - } - } - - onFocusChanged: { - if (!focus) { - for (var i = 0; i < repeater.count; i++) { - subGridAt(i).focus = false; - } - } - } - - Flickable { - id: flickable - - flickableDirection: Flickable.VerticalFlick - contentHeight: itemColumn.implicitHeight - //focusPolicy: Qt.NoFocus - - Column { - id: itemColumn - - width: itemMultiGrid.width - Kirigami.Units.gridUnit - - Repeater { - id: repeater - - delegate: Item { - width: itemColumn.width - Kirigami.Units.gridUnit - height: headerHeight + gridView.height + (index == repeater.count - 1 ? 0 : footerHeight) - - property int headerHeight: (gridViewLabel.height - + gridViewLabelUnderline.height + Kirigami.Units.gridUnit) - property int footerHeight: (Math.ceil(headerHeight / cellSize) * cellSize) - headerHeight - - property Item itemGrid: gridView - - Kirigami.Heading { - id: gridViewLabel - - anchors.top: parent.top - - x: Kirigami.Units.smallSpacing - width: parent.width - x - height: dummyHeading.height - - elide: Text.ElideRight - wrapMode: Text.NoWrap - opacity: 1.0 - - color: "white" // FIXME TODO: Respect theming? - - level: 1 - - text: repeater.model.modelForRow(index).description - textFormat: Text.PlainText - } - - KSvg.SvgItem { - id: gridViewLabelUnderline - - anchors.top: gridViewLabel.bottom - - width: parent.width - Kirigami.Units.gridUnit - height: lineSvg.horLineHeight - - svg: lineSvg - elementId: "horizontal-line" - } - - MouseArea { - width: parent.width - height: parent.height - - onClicked: root.toggle() - } - - ItemGridView { - id: gridView - - anchors { - top: gridViewLabelUnderline.bottom - topMargin: Kirigami.Units.gridUnit - } - - width: parent.width - height: Math.ceil(count / Math.floor(width / cellSize)) * cellSize - - cellWidth: cellSize - cellHeight: cellSize - iconSize: root.iconSize - - verticalScrollBarPolicy: PlasmaComponents.ScrollBar.AlwaysOff - - model: repeater.model.modelForRow(index) - - onFocusChanged: { - if (focus) { - itemMultiGrid.focus = true; - } - } - - onCountChanged: { - if (itemMultiGrid.grabFocus && index == 0 && count > 0) { - currentIndex = 0; - focus = true; - } - } - - onCurrentItemChanged: { - if (!currentItem) { - return; - } - - if (index == 0 && currentRow() === 0) { - flickable.contentY = 0; - return; - } - - var y = currentItem.y; - y = contentItem.mapToItem(flickable.contentItem, 0, y).y; - - if (y < flickable.contentY) { - flickable.contentY = y; - } else { - y += cellSize; - y -= flickable.contentY; - y -= itemMultiGrid.height; - - if (y > 0) { - flickable.contentY += y; - } - } - } - - onKeyNavLeft: { - itemMultiGrid.keyNavLeft(index); - } - - onKeyNavRight: { - itemMultiGrid.keyNavRight(index); - } - - onKeyNavUp: { - if (index > 0) { - var prevGrid = subGridAt(index - 1); - prevGrid.tryActivate(prevGrid.lastRow(), currentCol()); - } else { - itemMultiGrid.keyNavUp(); - } - } - - onKeyNavDown: { - if (index < repeater.count - 1) { - subGridAt(index + 1).tryActivate(0, currentCol()); - } else { - itemMultiGrid.keyNavDown(); - } - } - } - - // HACK: Steal wheel events from the nested grid view and forward them to - // the ScrollView's internal WheelArea. - Kicker.WheelInterceptor { - anchors.fill: gridView - z: 1 - - destination: findWheelArea(itemMultiGrid) - } - } - } - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarItem.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarItem.qml deleted file mode 100644 index dd6a69b..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarItem.qml +++ /dev/null @@ -1,142 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013-2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.kquickcontrolsaddons 2.0 -import org.kde.plasma.core as PlasmaCore -import org.kde.kirigami 2.20 as Kirigami -import org.kde.plasma.plasmoid 2.0 - -import "code/tools.js" as Tools - -Item { - id: item - - width: root.width - height: root.width - - signal actionTriggered(string actionId, variant actionArgument) - signal aboutToShowActionMenu(variant actionMenu) - - property bool hasActionList: ((model.favoriteId !== null) - || (("hasActionList" in model) && (model.hasActionList !== null))) - property int itemIndex: model.index - - onAboutToShowActionMenu: actionMenu => { - const actionList = (model.hasActionList !== null) ? model.actionList : []; - Tools.fillActionMenu(i18n, actionMenu, actionList, repeater.model, model.favoriteId); - } - - onActionTriggered: (actionId, actionArgument) => { - if (Tools.triggerAction(repeater.model, model.index, actionId, actionArgument) === true) { - kicker.expanded = false; - } - } - - function openActionMenu(visualParent, x, y) { - aboutToShowActionMenu(actionMenu); - actionMenu.visualParent = visualParent; - actionMenu.open(x, y); - } - - ActionMenu { - id: actionMenu - - onActionClicked: { - actionTriggered(actionId, actionArgument); - } - } - - Kirigami.Icon { - anchors.fill: parent - - active: toolTip.containsMouse - - source: model.decoration - } - - MouseEventListener { - id: listener - - anchors { - fill: parent - leftMargin: - sideBar.margins.left - rightMargin: - sideBar.margins.right - } - - enabled: (item.parent && !item.parent.animating) - - property bool pressed: false - property int pressX: -1 - property int pressY: -1 - - hoverEnabled: true - acceptedButtons: Qt.LeftButton | Qt.RightButton - - onPressed: { - if (mouse.buttons & Qt.RightButton) { - if (item.hasActionList) { - item.openActionMenu(item, mouse.x, mouse.y); - } - } else { - pressed = true; - pressX = mouse.x; - pressY = mouse.y; - } - } - - onReleased: { - if (pressed) { - repeater.model.trigger(index, "", null); - kicker.expanded = false; - } - - pressed = false; - pressX = -1; - pressY = -1; - } - - onContainsMouseChanged: { - if (!containsMouse) { - pressed = false; - pressX = -1; - pressY = -1; - } - } - - onPositionChanged: { - if (pressX !== -1 && dragHelper.isDrag(pressX, pressY, mouse.x, mouse.y)) { - kicker.dragSource = item; - dragHelper.startDrag(kicker, model.url, model.icon); - pressed = false; - pressX = -1; - pressY = -1; - - return; - } - } - } - - PlasmaCore.ToolTipArea { - id: toolTip - - property string text: model.display - - anchors { - fill: parent - leftMargin: - sideBar.margins.left - rightMargin: - sideBar.margins.right - } - - interactive: false - location: (((Plasmoid.location === PlasmaCore.Types.RightEdge) - || (Qt.application.layoutDirection === Qt.RightToLeft)) - ? PlasmaCore.Types.RightEdge : PlasmaCore.Types.LeftEdge) - - mainItem: toolTipDelegate - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarSection.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarSection.qml deleted file mode 100644 index 81c6163..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/SideBarSection.qml +++ /dev/null @@ -1,83 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013-2014 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 - -import org.kde.draganddrop 2.0 -import org.kde.kirigami 2.20 as Kirigami - -DropArea { - id: root - - width: Kirigami.Units.iconSizes.medium - height: contentHeight - - anchors.horizontalCenter: parent.horizontalCenter - - property int contentHeight: model ? (model.count * Kirigami.Units.iconSizes.medium) + ((model.count - 1) * flow.spacing) : 0 - - property alias model: repeater.model - - onDragMove: event => { - if (flow.animating) { - return; - } - - var above = flow.childAt(event.x, event.y); - - if (above && above !== kicker.dragSource && dragSource.parent == flow) { - repeater.model.moveRow(dragSource.itemIndex, above.itemIndex); - } - - } - - Flow { - id: flow - - anchors.fill: parent - - property bool animating: false - property int animationDuration: resetAnimationDurationTimer.interval - - move: Transition { - SequentialAnimation { - PropertyAction { target: flow; property: "animating"; value: true } - - NumberAnimation { - duration: flow.animationDuration - properties: "x, y" - easing.type: Easing.OutQuad - } - - PropertyAction { target: flow; property: "animating"; value: false } - } - } - - spacing: (2 * Kirigami.Units.smallSpacing) - - Repeater { - id: repeater - - delegate: SideBarItem {} - - onCountChanged: { - flow.animationDuration = 0; - resetAnimationDurationTimer.start(); - } - } - } - - Timer { - id: resetAnimationDurationTimer - - interval: 150 - repeat: false - - onTriggered: { - flow.animationDuration = interval - 20; - } - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/code/tools.js b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/code/tools.js deleted file mode 100644 index fa1cbd3..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/code/tools.js +++ /dev/null @@ -1,181 +0,0 @@ -/* - SPDX-FileCopyrightText: 2013 Aurélien Gâteau - SPDX-FileCopyrightText: 2013-2015 Eike Hein - SPDX-FileCopyrightText: 2017 Ivan Cukic - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -.pragma library - -function fillActionMenu(i18n, actionMenu, actionList, favoriteModel, favoriteId) { - // Accessing actionList can be a costly operation, so we don't - // access it until we need the menu. - - var actions = createFavoriteActions(i18n, favoriteModel, favoriteId); - - if (actions) { - if (actionList && actionList.length > 0) { - var actionListCopy = Array.from(actionList); - var separator = { "type": "separator" }; - actionListCopy.push(separator); - // actionList = actions.concat(actionList); // this crashes Qt O.o - actionListCopy.push.apply(actionListCopy, actions); - actionList = actionListCopy; - } else { - actionList = actions; - } - } - - actionMenu.actionList = actionList; -} - -function createFavoriteActions(i18n, favoriteModel, favoriteId) { - if (!favoriteModel || !favoriteModel.enabled || !favoriteId) { - return null; - } - - - if (favoriteModel.activities === undefined || - favoriteModel.activities.runningActivities.length <= 1) { - var action = {}; - - if (favoriteModel.isFavorite(favoriteId)) { - action.text = i18n("Remove from Favorites"); - action.icon = "bookmark-remove"; - action.actionId = "_kicker_favorite_remove"; - } else if (favoriteModel.maxFavorites === -1 || favoriteModel.count < favoriteModel.maxFavorites) { - action.text = i18n("Add to Favorites"); - action.icon = "bookmark-new"; - action.actionId = "_kicker_favorite_add"; - } else { - return null; - } - - action.actionArgument = { favoriteModel: favoriteModel, favoriteId: favoriteId }; - - return [action]; - - } else { - var actions = []; - - var linkedActivities = favoriteModel.linkedActivitiesFor(favoriteId); - - var activities = favoriteModel.activities.runningActivities; - - // Adding the item to link/unlink to all activities - - var linkedToAllActivities = - !(linkedActivities.indexOf(":global") === -1); - - actions.push({ - text : i18n("On All Activities"), - checkable : true, - - actionId : linkedToAllActivities ? - "_kicker_favorite_remove_from_activity" : - "_kicker_favorite_set_to_activity", - checked : linkedToAllActivities, - - actionArgument : { - favoriteModel: favoriteModel, - favoriteId: favoriteId, - favoriteActivity: "" - } - }); - - - // Adding items for each activity separately - - var addActivityItem = function(activityId, activityName) { - var linkedToThisActivity = - !(linkedActivities.indexOf(activityId) === -1); - - actions.push({ - text : activityName, - checkable : true, - checked : linkedToThisActivity && !linkedToAllActivities, - - actionId : - // If we are on all activities, and the user clicks just one - // specific activity, unlink from everything else - linkedToAllActivities ? "_kicker_favorite_set_to_activity" : - - // If we are linked to the current activity, just unlink from - // that single one - linkedToThisActivity ? "_kicker_favorite_remove_from_activity" : - - // Otherwise, link to this activity, but do not unlink from - // other ones - "_kicker_favorite_add_to_activity", - - actionArgument : { - favoriteModel : favoriteModel, - favoriteId : favoriteId, - favoriteActivity : activityId - } - }); - }; - - // Adding the item to link/unlink to the current activity - - addActivityItem(favoriteModel.activities.currentActivity, i18n("On the Current Activity")); - - actions.push({ - type: "separator", - actionId: "_kicker_favorite_separator" - }); - - // Adding the items for each activity - - activities.forEach(function(activityId) { - addActivityItem(activityId, favoriteModel.activityNameForId(activityId)); - }); - - return [{ - text : i18n("Show in Favorites"), - icon : "favorite", - subActions : actions - }]; - } -} - -function triggerAction(model, index, actionId, actionArgument) { - function startsWith(txt, needle) { - return txt.substr(0, needle.length) === needle; - } - - if (startsWith(actionId, "_kicker_favorite_")) { - handleFavoriteAction(actionId, actionArgument); - return; - } - - var closeRequested = model.trigger(index, actionId, actionArgument); - - if (closeRequested) { - return true; - } - - return false; -} - -function handleFavoriteAction(actionId, actionArgument) { - var favoriteId = actionArgument.favoriteId; - var favoriteModel = actionArgument.favoriteModel; - - if (favoriteModel === null || favoriteId === null) { - return null; - } - - if (actionId === "_kicker_favorite_remove") { - favoriteModel.removeFavorite(favoriteId); - } else if (actionId === "_kicker_favorite_add") { - favoriteModel.addFavorite(favoriteId); - } else if (actionId === "_kicker_favorite_remove_from_activity") { - favoriteModel.removeFavoriteFrom(favoriteId, actionArgument.favoriteActivity); - } else if (actionId === "_kicker_favorite_add_to_activity") { - favoriteModel.addFavoriteTo(favoriteId, actionArgument.favoriteActivity); - } else if (actionId === "_kicker_favorite_set_to_activity") { - favoriteModel.setFavoriteOn(favoriteId, actionArgument.favoriteActivity); - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/main.qml b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/main.qml deleted file mode 100644 index f0c30ad..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/contents/ui/main.qml +++ /dev/null @@ -1,274 +0,0 @@ - /* - SPDX-FileCopyrightText: 2014-2015 Eike Hein - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -import QtQuick 2.15 -import QtQuick.Layouts 1.15 - -import org.kde.plasma.components 3.0 as PlasmaComponents3 -import org.kde.plasma.core as PlasmaCore -import org.kde.ksvg 1.0 as KSvg -import org.kde.plasma.plasmoid 2.0 -import org.kde.kirigami 2.20 as Kirigami - -import org.kde.plasma.private.kicker 0.1 as Kicker -import org.kde.plasma.plasma5support 2.0 as P5Support - - -PlasmoidItem { - id: kicker - - anchors.fill: parent - - signal reset - - property bool isDash: true // Plasmoid.pluginName === "org.kde.plasma.kickerdash" - - switchWidth: isDash || !fullRepresentationItem ? 0 :fullRepresentationItem.Layout.minimumWidth - switchHeight: isDash || !fullRepresentationItem ? 0 :fullRepresentationItem.Layout.minimumHeight - - // this is a bit of a hack to prevent Plasma from spawning a dialog on its own when we're Dash - preferredRepresentation: isDash ?fullRepresentation : null - - compactRepresentation: isDash ? null : compactRepresentation - fullRepresentation: compactRepresentation - - property Component itemListDialogComponent: Qt.createComponent(Qt.resolvedUrl("./ItemListDialog.qml")) - property Item dragSource: null - - property QtObject globalFavorites: rootModel.favoritesModel - property QtObject systemFavorites: rootModel.systemFavoritesModel - - Plasmoid.icon: Plasmoid.configuration.useCustomButtonImage ? Plasmoid.configuration.customButtonImage : Plasmoid.configuration.icon - - onSystemFavoritesChanged: { - systemFavorites.favorites = Plasmoid.configuration.favoriteSystemActions; - } - - function action_menuedit() { - processRunner.runMenuEditor(); - } - - function updateSvgMetrics() { - lineSvg.horLineHeight = lineSvg.elementSize("horizontal-line").height; - lineSvg.vertLineWidth = lineSvg.elementSize("vertical-line").width; - } - - Component { - id: compactRepresentation - CompactRepresentation {} - } - - Kicker.RootModel { - id: rootModel - - autoPopulate: false - - appNameFormat: Plasmoid.configuration.appNameFormat - flat: kicker.isDash || Plasmoid.configuration.limitDepth - sorted: Plasmoid.configuration.alphaSort - showSeparators: !kicker.isDash - // TODO: appletInterface property now can be ported to "applet" and have the real Applet* assigned directly - appletInterface: kicker - - showAllApps: kicker.isDash - showAllAppsCategorized: false //<> true - showTopLevelItems: !kicker.isDash - showRecentApps: true //<>Plasmoid.configuration.showRecentApps - showRecentDocs: true //<>Plasmoid.configuration.showRecentDocs - recentOrdering: Plasmoid.configuration.recentOrdering - - onShowRecentAppsChanged: { - Plasmoid.configuration.showRecentApps = showRecentApps; - } - - onShowRecentDocsChanged: { - Plasmoid.configuration.showRecentDocs = showRecentDocs; - } - - onRecentOrderingChanged: { - Plasmoid.configuration.recentOrdering = recentOrdering; - } - - Component.onCompleted: { - favoritesModel.initForClient("org.kde.plasma.kicker.favorites.instance-" + Plasmoid.id) - - if (!Plasmoid.configuration.favoritesPortedToKAstats) { - if (favoritesModel.count < 1) { - favoritesModel.portOldFavorites(Plasmoid.configuration.favoriteApps); - } - Plasmoid.configuration.favoritesPortedToKAstats = true; - } - } - } - - Connections { - target: globalFavorites - - function onFavoritesChanged() { - Plasmoid.configuration.favoriteApps = target.favorites; - } - } - - Connections { - target: systemFavorites - - function onFavoritesChanged() { - Plasmoid.configuration.favoriteSystemActions = target.favorites; - } - } - - Connections { - target: Plasmoid.configuration - - function onFavoriteAppsChanged() { - globalFavorites.favorites = Plasmoid.configuration.favoriteApps; - } - - function onFavoriteSystemActionsChanged() { - systemFavorites.favorites = Plasmoid.configuration.favoriteSystemActions; - } - } - - P5Support.DataSource { - id: pmEngine - engine: "powermanagement" - connectedSources: ["PowerDevil", "Sleep States"] - function performOperation(what) { - var service = serviceForSource("PowerDevil") - var operation = service.operationDescription(what) - service.startOperationCall(operation) - } - } - - - Kicker.RunnerModel { - id: runnerModel - - appletInterface: kicker - - favoritesModel: globalFavorites - mergeResults: true - - runners: { - const results = ["krunner_services", "krunner_systemsettings"]; - - if (kicker.isDash) { - results.push("krunner_sessions", "krunner_powerdevil", "calculator", "unitconverter"); - } - - if (Plasmoid.configuration.useExtraRunners) { - results.push(...Plasmoid.configuration.extraRunners); - } - - return results; - } - } - - Kicker.DragHelper { - id: dragHelper - - dragIconSize: Kirigami.Units.iconSizes.medium - } - - Kicker.ProcessRunner { - id: processRunner - } - - Kicker.WindowSystem { - id: windowSystem - } - - KSvg.FrameSvgItem { - id: highlightItemSvg - - visible: false - - imagePath: "widgets/viewitem" - prefix: "hover" - } - - KSvg.FrameSvgItem { - id: listItemSvg - - visible: false - - imagePath: "widgets/listitem" - prefix: "normal" - } - - KSvg.Svg { - id: lineSvg - imagePath: "widgets/line" - - property int horLineHeight - property int vertLineWidth - } - - PlasmaComponents3.Label { - id: toolTipDelegate - - width: contentWidth - height: undefined - font.pointSize: Kirigami.Theme.defaultFont.pointSize + 0.5 - - property Item toolTip - - text: toolTip ? toolTip.text : "" - } - - Timer { - id: justOpenedTimer - - repeat: false - interval: 600 - } - - Connections { - target: kicker - - function onExpandedChanged(expanded) { - if (expanded) { - windowSystem.monitorWindowVisibility(Plasmoid.fullRepresentationItem); - justOpenedTimer.start(); - } else { - kicker.reset(); - } - } - } - - function resetDragSource() { - dragSource = null; - } - - function enableHideOnWindowDeactivate() { - kicker.hideOnWindowDeactivate = true; - } - - Plasmoid.contextualActions: [ - PlasmaCore.Action { - text: i18n("Edit Applications…") - icon.name: "kmenuedit" - visible: Plasmoid.immutability !== PlasmaCore.Types.SystemImmutable - onTriggered: processRunner.runMenuEditor() - } - ] - - Component.onCompleted: { - if (Plasmoid.hasOwnProperty("activationTogglesExpanded")) { - Plasmoid.activationTogglesExpanded = !kicker.isDash - } - - windowSystem.focusIn.connect(enableHideOnWindowDeactivate); - kicker.hideOnWindowDeactivate = true; - - updateSvgMetrics(); - PlasmaCore.Theme.themeChanged.connect(updateSvgMetrics); - - rootModel.refreshed.connect(reset); - - dragHelper.dropped.connect(resetDragSource); - } -} diff --git a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/metadata.json b/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/metadata.json deleted file mode 100644 index 229d3bc..0000000 --- a/dot_local/share/plasma/plasmoids/tt.launchpadPlasma/metadata.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "KPackageStructure": "Plasma/Applet", - "KPlugin": { - "Authors": [ - { - "Email": "adhemarks@gmail.com", - "Name": "Ademir" - } - ], - "BugReportUrl": "https://bugs.kde.org/enter_bug.cgi?product=plasmashell&component=Application%20Menu%20(Kicker)", - "Category": "Application Launchers", - "Description": "Configurable grid of application icons.", - "EnabledByDefault": true, - "Icon": "start-here-kde", - "Id": "tt.launchpadPlasma", - "License": "GPL-2.0+", - "Name": "Launchpad Plasma", - "Website": "https://kde.org/plasma-desktop" - }, - "X-Plasma-API-Minimum-Version": "6.0", - "X-Plasma-Provides": [ - "org.kde.plasma.launchermenu" - ] -}