From ed83a74b30865bdbc755cbc84f6e30775df59534 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 15:10:33 +0200 Subject: [PATCH] Update theming --- cursors/default/index.theme | 5 + .../plasmoids/AndromedaLauncher/LICENSE | 339 ++++++++++++++ .../AndromedaLauncher/contents/code/tools.js | 181 +++++++ .../contents/config/config.qml | 30 ++ .../contents/config/main.xml | 78 ++++ ...applet_com.github.SnoutBug.mmckLauncher.mo | Bin 0 -> 2415 bytes ...applet_com.github.SnoutBug.mmckLauncher.mo | Bin 0 -> 2339 bytes ...applet_com.github.SnoutBug.mmckLauncher.mo | Bin 0 -> 2406 bytes .../contents/ui/ActionMenu.qml | 122 +++++ .../AndromedaLauncher/contents/ui/AppList.qml | 352 ++++++++++++++ .../contents/ui/CompactRepresentation.qml | 103 ++++ .../contents/ui/ConfigGeneral.qml | 329 +++++++++++++ .../contents/ui/FavoriteItem.qml | 219 +++++++++ .../contents/ui/FloatingAvatar.qml | 100 ++++ .../contents/ui/GenericItem.qml | 199 ++++++++ .../AndromedaLauncher/contents/ui/Header.qml | 95 ++++ .../contents/ui/MainView.qml | 440 ++++++++++++++++++ .../contents/ui/MenuRepresentation.qml | 171 +++++++ .../AndromedaLauncher/contents/ui/NavGrid.qml | 134 ++++++ .../contents/ui/RunnerList.qml | 212 +++++++++ .../contents/ui/icons/feather/LICENSE | 21 + .../contents/ui/icons/feather/code.svg | 48 ++ .../contents/ui/icons/feather/file-text.svg | 66 +++ .../contents/ui/icons/feather/globe.svg | 57 +++ .../contents/ui/icons/feather/image.svg | 59 +++ .../contents/ui/icons/feather/power.svg | 51 ++ .../contents/ui/icons/feather/search.svg | 53 +++ .../contents/ui/icons/feather/settings.svg | 50 ++ .../contents/ui/icons/feather/star.svg | 44 ++ .../contents/ui/icons/feather/tool.svg | 44 ++ .../contents/ui/icons/feather/trash-2.svg | 62 +++ .../contents/ui/icons/lucide/LICENSE | 15 + .../contents/ui/icons/lucide/cpu.svg | 111 +++++ .../contents/ui/icons/lucide/film.svg | 97 ++++ .../ui/icons/lucide/flask-conical.svg | 51 ++ .../contents/ui/icons/lucide/gamepad-2.svg | 49 ++ .../contents/ui/icons/lucide/paperclip.svg | 43 ++ .../AndromedaLauncher/contents/ui/main.qml | 269 +++++++++++ .../plasmoids/AndromedaLauncher/metadata.json | 22 + .../AndromedaLauncher/translate/build.sh | 53 +++ .../AndromedaLauncher/translate/de.po | 135 ++++++ .../AndromedaLauncher/translate/fr.po | 135 ++++++ .../AndromedaLauncher/translate/id.po | 135 ++++++ .../AndromedaLauncher/translate/merge.sh | 229 +++++++++ .../AndromedaLauncher/translate/nl.po | 136 ++++++ .../AndromedaLauncher/translate/template.pot | 135 ++++++ .../contents/config/config.qml | 10 + .../contents/config/main.xml | 23 + .../contents/fonts/Aller_Bd.ttf | Bin 0 -> 128368 bytes .../contents/fonts/Aller_Lt.ttf | Bin 0 -> 132780 bytes .../contents/ui/AlbumArtStackView.qml | 229 +++++++++ .../contents/ui/GeneralConfig.qml | 96 ++++ .../contents/ui/Representation.qml | 139 ++++++ .../contents/ui/main.qml | 44 ++ .../org.kde.MinimalMusic.P6/metadata.desktop | 20 + .../org.kde.MinimalMusic.P6/metadata.json | 23 + .../plasma-org.kde.plasma.desktop-appletsrc | 37 +- qt6ct/qt6ct.conf | 8 +- 58 files changed, 5894 insertions(+), 14 deletions(-) create mode 100644 cursors/default/index.theme create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/LICENSE create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/code/tools.js create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/config/config.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/config/main.xml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/locale/de/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/locale/id/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/locale/nl/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ActionMenu.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/AppList.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/CompactRepresentation.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ConfigGeneral.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FavoriteItem.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FloatingAvatar.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/GenericItem.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/Header.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MainView.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MenuRepresentation.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/NavGrid.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/RunnerList.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/LICENSE create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/code.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/file-text.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/globe.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/image.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/power.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/search.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/settings.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/star.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/tool.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/trash-2.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/LICENSE create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/cpu.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/film.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/flask-conical.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/gamepad-2.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/paperclip.svg create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/contents/ui/main.qml create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/metadata.json create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/build.sh create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/de.po create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/fr.po create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/id.po create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/merge.sh create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/nl.po create mode 100644 kde/plasma/plasmoids/AndromedaLauncher/translate/template.pot create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/config.qml create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/main.xml create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/fonts/Aller_Bd.ttf create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/fonts/Aller_Lt.ttf create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/AlbumArtStackView.qml create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/GeneralConfig.qml create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/Representation.qml create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/main.qml create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.desktop create mode 100644 kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.json diff --git a/cursors/default/index.theme b/cursors/default/index.theme new file mode 100644 index 00000000..11f13316 --- /dev/null +++ b/cursors/default/index.theme @@ -0,0 +1,5 @@ +# This file is written by nwg-look. Do not edit. +[Icon Theme] +Name=Default +Comment=Default Cursor Theme +Inherits=Posy_Cursor diff --git a/kde/plasma/plasmoids/AndromedaLauncher/LICENSE b/kde/plasma/plasmoids/AndromedaLauncher/LICENSE new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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. diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/code/tools.js b/kde/plasma/plasmoids/AndromedaLauncher/contents/code/tools.js new file mode 100644 index 00000000..fa1cbd34 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/code/tools.js @@ -0,0 +1,181 @@ +/* + 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/kde/plasma/plasmoids/AndromedaLauncher/contents/config/config.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/config/config.qml new file mode 100644 index 00000000..e0923316 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/config/config.qml @@ -0,0 +1,30 @@ +/*************************************************************************** + * Copyright (C) 2014 by Eike Hein * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ***************************************************************************/ + +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/kde/plasma/plasmoids/AndromedaLauncher/contents/config/main.xml b/kde/plasma/plasmoids/AndromedaLauncher/contents/config/main.xml new file mode 100644 index 00000000..7af96193 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/config/main.xml @@ -0,0 +1,78 @@ + + + + + + + + start-here-kde-symbolic + + + + false + + + + + + + + true + + + + #2164C9 + + + + true + + + + 0 + + + + + + + + 0 + + + + 0 + + + + 0 + + + + false + + + + false + + + + 0 + + + + true + + + + shell,bookmarks,baloosearch,locations + + + + false + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/locale/de/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo b/kde/plasma/plasmoids/AndromedaLauncher/contents/locale/de/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo new file mode 100644 index 0000000000000000000000000000000000000000..2c20a7ef19c2587a7608f706e140677560cfe708 GIT binary patch literal 2415 zcmZvc&u<(x6vqv;{0NjErTi?V21-exlcXuoGNq{5bT>pKZPeXTgh0YO^LEzkjJ?>N zZnF{+f&4*#2yQ_fazsL$5Em*W#0ma_Uf}ySlOKhS*7I3=?C1Bse$Q8T zZu>;w8Ap2z?X8=Hcme$4X1wt9ZxI4N@g81}f+hF>coDoC{2IIs{0`g!eh=OS{#cFw z3LZrN_v-tOZ9?3R{%&wPxDVv@&sO8p;2r261MdUtAkRAo-V44Bj)4YbJIf&Z^C8Id zJ_C9GOV#%)AkY66d=UHrycPTfzmz&Anm*MhwN z0Aza~RQ-=ZUVjmsg_fU#FfFcP(r)k%a4+}|$noukF}8CEyc3KoHbCC@4EQ4W4#;*t zt@stl`(CN~-&Fk-kmFwk+25b5@jt$eK!haT2POCscmTW%vYtPIZ2vEi=U)Tw0e8W9-e(`ke!m2Ad?%{@DUj!#1@RMv z7vvLKmT} z`_3i6K68F>?mvxoKN?bbq$MzV_TkOG^TRpH`t!p&ApFtuP(?A5=iKB>zn|+w1#OL& z<0q-3$~+tpv!xHVkaLbGXp_knT?nx_sa$W%q-wUPD3?@5m_+9(w|y$e1W`Atol`36 z7y8Pi(vxyYR|YHF*7gdR^9N-|=j0`Srb6l5i-tOHoesp#p_f~@XEHIT3i4u(3^|pH zIj8zvonWByF&3|4)zF%tayg65$%*;Inpn)6ltZ*m&f46%Ed%@)^9%*Cph}Z;$;l<_ zHOql5W3iyKF1}eG=AzEE3Msc4FI)@6-d&${%DGAYh8of@=Lzq|= zMbgVFy~fT^-?|Vj`b?)$t;~GXva#%j(D(7=WTr#6Y)@e4NpEZ!+GRF*-SVZ=(HT0g z*>H4H1&ZbL)bw;TbvT+jg1_IXtr;$$0q>KNo#><`c z!3n=Ucp@tyV4;Cb22&D37*v7~?{t(M!&l0hzQk8P0mV8IbhK zr3XZfOc{pcQtD`<$szY^l)2TF)h{s@HC37(=g#Je^?w3?T=0Z)iBWA~pm8)kX;QNc;=h$yBKT literal 0 HcmV?d00001 diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/locale/id/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo b/kde/plasma/plasmoids/AndromedaLauncher/contents/locale/id/LC_MESSAGES/plasma_applet_com.github.SnoutBug.mmckLauncher.mo new file mode 100644 index 0000000000000000000000000000000000000000..4d38c67519e0f52ae2c7dea05b204d426392b6e9 GIT binary patch literal 2339 zcmZvcON`t!7{?8i76w|{@+y=T7fM;6*)15g_%Dk^&LB%Z`1u|w?a zb~ymz!jWE(P=%0?P$k5L14vvd?&ZP>aamM}8xj|ehy(vGlYQ`rV*g_M^XKp3FTWhz z^)bUUf%X{Mo3}CcGWhB3=a4&cRychhTng1C) ziSeyweeW*D?!x#mcqe!qr2Wq}^DlsRV|)fY0Cqr8P(tUw2$Fx(AoR?1>OhlhceQ~(b0JmAld&4NOrfuNpKk?|KDxq zKLY8TYamQ#Uw~xCmmpsDH9CslcOadA6QuKg1Zm$b5HI@;9r^VKNc;D|se|A?ko-Od zk{weZ#mNUr?lMUCAp(zq?}3NG&q1>P21t5tf^_aiGyWYUd&mgVyBj2Z2SA!X1d=~T zL4=PTMI${=qme%xjqD=X3A9=VNM}<%PoQCIZPVi*J(O4S^+_81&qMcu&OFkr-2*;? zMkPS8A-~Djr_d;OxXN`df%-X)o_wT-azy^qL-~Ze_49B;Hj`!4_)Jk`Dilr`ZTUo7 zjzpEYXV_e2oyqw^DWy|7=7GH8eAX6ax0YGVx236 z&=I#%lwrc1;X`B69O~>zK2n*qoR(!SRA$+{ST&_`l8nPBGcZrbY(eDGvIVJSDKfTD ziXu@VCK?-kwuoKt80|#H=Ww_z*-~h<&z5vVE}D|hnaq?sCg>A#S~}Jhl@1eG^1iW( z!hs`w)>UzWHDet=!RJk-Bi0ixOvs)dBBgQ}DZ$Pg9*!dxZ$`{Q=kjQzLP@{~;n6bV z6Q{Vcd^6Dg=Hej4M$J1>EdL|Y&!n)Dhlw$O;30Xz`eqH*LN^pR1_VTk3VTJ$!!hRBH}b3D?LA)(cqW zPytg#CX_ydOo$R0oxTvvd#AVM$heU#y^an|L}BEohsw1O<-8K(9#=Y3sjzBC83i)6 zd>{$|N6yu^$j2?uM6p9=v(y$vCUVHliZzI{zSObIhwu@Dwi2mRqZFUrN?4E=xEDgy zAxh;|&5cWrM-Zqhj%^v$R37U=uc-Cnh!WA%Pu4C~Z{MqRIf==QjQVc|{)0nb4%< zQUH^8mR_JDk#c08+d6{jxDMAz0ZP+VB|9fH+3@c&oZhO!&80vVWKUPDi;}8vhr|FT zC3Q$q7zuu4!wP<{k(=~KfSa1Pu@8|^_>R}&`CClDn*k9(WaXpG$E^GL!p#|cg8#GuE!p1 zPtxRoDlVLmdZ~mEaOA=jj{LYHE}SYZ{J6m%fH-jC`*vq($`5NjpY_;&e(&q|=BI;u zZ!)wI^rz9U+{M@#@T0r&Kr8kzh97$ykEg&Ad6iD&Sf)v*>cnG`}`N#|4oqmY=gAkf^`2o zAWX8GAnEoocoO^uB)xtGY2P0p?c0Ok=pGM%BPqTt7Qn&5?eG(WwN; zXNr?ze;)l&bfhwS5`EZC;16j_jdGOYqDFc^hJJgZB0Hxwb$+fWv`R!!)_6X0L3Tu` z!zi08eXu!Sa8d?kGTxHcLd-4**W0zITFol*rpP1~$xW$kA#-U0YZ%eiGG&cxg)k}i zQn;kcgXL{&dpXSc)4Zd!^qi(;E|m6cUTj*Yf+XiK(iZNSj4g;N$8-00fM(n{lYU=w5Y+8iD%kbr;c<{!z4B(_4ssKg<4aW$kS-vy4>TaqCfPrlQVqqcXq_^q$+yyks)z5g&#rTeUsj)*{_fS9fsbr+HiUkHabS zi~3c{Q)}Ihl|5;yf|ZbsUEV_Zo2pjN=?tF%8amNYu+PrR%-Q}YC1xusO<`}OJ1kqF zM_E%Pp&#b1D(z`m{!i8RBSIRK9A6v*YqsFp()SEsqGgq!cvm;2Q`sQHWgd{>Vt45- zP}#}b5^~6aa7l-Y!UP1#)=HJ*YqTkh=x}_;B$aVr5xRhw*GKPMf{BK>Gs43)uwd|(ULIuM&*#dly>#h3f)lThR@-6PEOE4eCV-11_n Ki=2eknEMMeWkgW` literal 0 HcmV?d00001 diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ActionMenu.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ActionMenu.qml new file mode 100644 index 00000000..be10f70d --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ActionMenu.qml @@ -0,0 +1,122 @@ +/* + 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/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/AppList.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/AppList.qml new file mode 100644 index 00000000..d1fd13df --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/AppList.qml @@ -0,0 +1,352 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ + + +// Agregar condicion para que los categproes repeater solo se muestren cuando el index sea diferente a 0 para +//evitar que aparesca el listado de a b c de .. abajo de todas las aplicaciones + +import Qt5Compat.GraphicalEffects + +import QtQuick 2.12 +import QtQuick.Controls 2.15 + +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents + +import org.kde.kirigami as Kirigami + +import org.kde.draganddrop 2.0 + + +ScrollView { + id: scrollView + + anchors { + top: parent.top + } + width: parent.width + height: parent.height + + contentWidth: availableWidth //no horizontal scrolling + + property bool grabFocus: false + property bool showDescriptions: false + property int iconSize: Kirigami.Units.iconSizes.medium + + property var pinnedModel: [globalFavorites, rootModel.modelForRow(0), rootModel.modelForRow(1)] + property QtObject allAppsModel + + property var currentStateIndex: Plasmoid.configuration.defaultPage + + property bool hasListener: false + property bool isRight: true + + property var scrollpositon: 0.0 + property var scrollheight: 0.0 + + property var appsCategoriesList: { + + var categories = []; + var categoryName; + var categoryIcon; + + for (var i = 1; i < rootModel.count - 2; i++) { + categoryName = rootModel.data(rootModel.index(i, 0), Qt.DisplayRole); + categoryIcon = rootModel.data(rootModel.index(i, 0), Qt.DecorationRole); + categories.push({ + name: categoryName, + index: i, + icon: categoryIcon + }); + } + scrollView.allAppsModel = rootModel.modelForRow(1) + return categories; + } + + property var currentSelectedCategory: scrollView.appsCategoriesList[currentStateIndex] + + function updateModels() { + item.pinnedModel = [globalFavorites, rootModel.modelForRow(0), rootModel.modelForRow(1)] + item.allAppsModel = rootModel.modelForRow(1) + } + + function reset(){ + ScrollBar.vertical.position = 0 + currentStateIndex = plasmoid.configuration.defaultPage + currentSelectedCategory = appsCategoriesList[currentStateIndex] + sortingLabel.text = currentSelectedCategory.name + sortingImage.source = currentSelectedCategory.icon + } + function get_position(){ + return ScrollBar.vertical.position; + } + function get_size(){ + return ScrollBar.vertical.size; + } + Connections { + target: root + function onVisibleChanged() { + currentStateIndex = plasmoid.configuration.defaultPage + currentSelectedCategory = appsCategoriesList[currentStateIndex] + sortingLabel.text = currentSelectedCategory.name + sortingImage.source = currentSelectedCategory.icon + } + } + onContentHeightChanged: { + ScrollBar.vertical.position = scrollpositon * scrollheight / scrollView.contentHeight + } + Column { + id: column + width: parent.width + onPositioningComplete: { + scrollView.contentHeight = height + if (height < appList.height) { + scrollView.contentHeight = appList.height + } + } + + DropArea { + + width: flow.width + height:flow.height + visible: !main.showAllApps + onDragMove: event => { + + var above = flow.childAt(event.x, event.y); + + if (above && above !== kicker.dragSource && dragSource.parent == flow) { + repeater.model.moveRow(dragSource.itemIndex, above.itemIndex); + } + + } + Flow { //Favorites + id: flow + width: scrollView.width + spacing: 12 + leftPadding: 25 + visible: !main.showAllApps + Repeater { + id: repeater + model: globalFavorites + delegate: + FavoriteItem { + id: favitem + } + } + } + } + + Kirigami.Icon { + id: sortingImage + width: 15 * 1 + height: width + visible: main.showAllApps + source: scrollView.currentSelectedCategory.icon + + PlasmaComponents.Label { + id: sortingLabel + x: parent.width + 10 * 1 + anchors.verticalCenter: parent.verticalCenter + text: i18n(scrollView.currentSelectedCategory.name) + color: main.textColor + font.family: main.textFont + font.pointSize: main.textSize + } + MouseArea { + id: mouseArea + width: parent.width + sortingLabel.width + 5 + height: parent.height + cursorShape: Qt.PointingHandCursor + hoverEnabled: true + acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton + onClicked: { + if (mouse.button == Qt.LeftButton) { + isRight = false + currentStateIndex += 1 + } else if (mouse.button == Qt.RightButton) { + isRight = true + currentStateIndex -= 1 + } else if (mouse.button == Qt.MiddleButton) { + isRight = false + currentStateIndex = plasmoid.configuration.defaultPage + } + if (currentStateIndex > scrollView.appsCategoriesList.length - 1) { + currentStateIndex = 0 + } else if (currentStateIndex < 0) { + currentStateIndex = scrollView.appsCategoriesList.length - 1 + } + + var currentCategory = scrollView.appsCategoriesList[currentStateIndex]; + var choosenRepeater = (currentStateIndex % 2 == 0) ? categoriesRepeater : categoriesRepeater2; + + sortingLabel.text = currentCategory.name; + sortingImage.source = currentCategory.icon; + choosenRepeater.model = rootModel.modelForRow(currentCategory.index); + } + } + } + Item { //Spacer + id: spacer + width: 1 + height: 10 * 1 + } + + Grid { + id: allAppsGrid + x: - 10 * 1 + columns: 1 + width: scrollView.width - 10 * 1 + visible: opacity > 0 && main.showAllApps + Repeater { + id: allAppsRepeater + model: allAppsModel + Repeater { + id: repeater2 + model: allAppsRepeater.model.modelForRow(index) + delegate: + GenericItem { + id: genericItem + triggerModel: repeater2.model + } + } + } + states: [ + State { + name: "hidden"; when: (currentStateIndex != 0) + PropertyChanges { target: allAppsGrid; opacity: 0.0 } + PropertyChanges { target: allAppsGrid; x: (!isRight ? -20 * 1 : 0) } + }, + State { + name: "shown"; when: (currentStateIndex == 0) + PropertyChanges { target: allAppsGrid; opacity: 1.0 } + PropertyChanges { target: allAppsGrid; x: -10 } + }] + transitions: [ + Transition { + to: "hidden" + PropertyAnimation { properties: 'opacity'; duration: 80; easing.type: Easing.InQuart} + PropertyAnimation { properties: 'x'; from: -10 * 1; duration: 80;easing.type: Easing.InQuart} + }, + Transition { + to: "shown" + PropertyAnimation { properties: 'opacity'; duration: 80; easing.type: Easing.InQuart} + PropertyAnimation { properties: 'x'; from: (isRight ? -20 * 1 : 0); duration: 80; easing.type: Easing.InQuart} + } + ] + onStateChanged: { + if (state == 'hidden') { + scrollpositon = scrollView.ScrollBar.vertical.position + scrollheight = scrollView.contentHeight + } + } + } + Grid { //Categories + id: appCategories + columns: 1 + width: scrollView.width - 10 * 1 + visible: opacity > 0 && main.showAllApps + Repeater { + id: categoriesRepeater + delegate: + GenericItem { + id: genericItemCat + triggerModel: categoriesRepeater.model + } + } + states: [ + State { + name: "hidden"; when: (currentStateIndex == 0 || currentStateIndex % 2 === 1) + PropertyChanges { target: appCategories; opacity: 0.0 } + PropertyChanges { target: appCategories; x: (isRight ? -20 * 1 : 0) } + }, + State { + name: "shown"; when: (currentStateIndex != 0 && currentStateIndex % 2 === 0) + PropertyChanges { target: appCategories; opacity: 1.0 } + PropertyChanges { target: appCategories; x: -10 * 1 } + }] + transitions: [ + Transition { + to: "hidden" + PropertyAnimation { properties: 'opacity'; duration: 80; easing.type: Easing.InQuart} + PropertyAnimation { properties: 'x'; from: -10 * 1; duration: 80; easing.type: Easing.InQuart} + }, + Transition { + to: "shown" + PropertyAnimation { properties: 'opacity'; duration: 80; easing.type: Easing.InQuart} + PropertyAnimation { properties: 'x'; from: (isRight ? -20 * 1 : 0); duration: 80; easing.type: Easing.InQuart} + } + ] + onStateChanged: { + if (state == 'hidden') { + scrollpositon = scrollView.ScrollBar.vertical.position + scrollheight = scrollView.contentHeight + } + } + } + + Grid { //Categories + id: appCategories2 + columns: 1 + width: scrollView.width - 10 * 1 + visible: opacity > 0 && main.showAllApps + Repeater { + id: categoriesRepeater2 + delegate: + GenericItem { + id: genericItemCat2 + triggerModel: categoriesRepeater2.model + } + } + states: [ + State { + name: "hidden"; when: (currentStateIndex == 0 || currentStateIndex % 2 === 0) + PropertyChanges { target: appCategories2; opacity: 0.0 } + PropertyChanges { target: appCategories2; x: (isRight ? -20 * 1 : 0) } + }, + State { + name: "shown"; when: (currentStateIndex != 0 && currentStateIndex % 2 === 1) + PropertyChanges { target: appCategories2; opacity: 1.0 } + PropertyChanges { target: appCategories2; x: -10 * 1} + }] + transitions: [ + Transition { + to: "hidden" + PropertyAnimation { properties: 'opacity'; duration: 80; easing.type: Easing.InQuart} + PropertyAnimation { properties: 'x'; from: -10 * 1; duration: 80; easing.type: Easing.InQuart} + }, + Transition { + to: "shown" + PropertyAnimation { properties: 'opacity'; duration: 80; easing.type: Easing.InQuart} + PropertyAnimation { properties: 'x'; from: (isRight ? -20 * 1 : 0);duration: 80; easing.type: Easing.InQuart} + } + ] + onStateChanged: { + if (state == 'hidden') { + scrollpositon = scrollView.ScrollBar.vertical.position + scrollheight = scrollView.contentHeight + } + } + } + + Item { //Spacer + width: 1 + height: 20 * 1 + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/CompactRepresentation.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/CompactRepresentation.qml new file mode 100644 index 00000000..c0089a07 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/CompactRepresentation.qml @@ -0,0 +1,103 @@ +/***************************************************************************** + * Copyright (C) 2013-2014 by Eike Hein * + * Copyright (C) 2021 by Prateek SU * + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 + +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core as PlasmaCore + +import org.kde.kirigami as Kirigami + +Item { + id: root + + property QtObject dashWindow: null + readonly property bool useCustomButtonImage: (Plasmoid.configuration.useCustomButtonImage && Plasmoid.configuration.customButtonImage.length != 0) + + Kirigami.Icon { + id: buttonIcon + + width: Plasmoid.configuration.activationIndicator ? parent.width * 0.65 : parent.width + height: Plasmoid.configuration.activationIndicator ? parent.height * 0.65 : parent.height + anchors.centerIn: parent + + source: useCustomButtonImage ? Plasmoid.configuration.customButtonImage : Plasmoid.configuration.icon + + active: mouseArea.containsMouse + + smooth: true + + Rectangle { + id: indicator + width: 0 + anchors.horizontalCenter: parent.horizontalCenter + height: 3 * 1 + radius: 10 + y: parent.height + height + color: Plasmoid.configuration.indicatorColor + visible: Plasmoid.configuration.activationIndicator + + states: [ + State { name: "inactive" + when: !dashWindow.visible + PropertyChanges { + target: indicator + width: 0 + + } + }, + State { name: "active" + when: dashWindow.visible + PropertyChanges { + target: indicator + width: parent.width * 0.65 + } + } + ] + transitions: [ + Transition { + NumberAnimation { properties: 'width'; duration: 60} + } + ] + } + } + + MouseArea + { + id: mouseArea + + anchors.fill: parent + + hoverEnabled: true + + onClicked: { + dashWindow.visible = !dashWindow.visible; + } + } + + Component.onCompleted: { + dashWindow = Qt.createQmlObject("MenuRepresentation {}", root); + plasmoid.activated.connect(function() { + dashWindow.visible = !dashWindow.visible; + }); + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ConfigGeneral.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ConfigGeneral.qml new file mode 100644 index 00000000..332da5ae --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/ConfigGeneral.qml @@ -0,0 +1,329 @@ +/***************************************************************************** + * Copyright (C) 2013-2014 by Eike Hein * + * Copyright (C) 2021 by Prateek SU * + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Dialogs + +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.core as PlasmaCore +import org.kde.draganddrop 2.0 as DragDrop +import org.kde.kirigami 2.3 as Kirigami + +import org.kde.ksvg 1.0 as KSvg +import org.kde.plasma.plasmoid 2.0 +import org.kde.kcmutils as KCM + +import org.kde.iconthemes as KIconThemes + + +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 bool cfg_activationIndicator: Plasmoid.configuration.activationIndicator + property color cfg_indicatorColor: Plasmoid.configuration.indicatorColor + property bool cfg_enableGreeting: Plasmoid.configuration.enableGreeting + property alias cfg_defaultPage: defaultPage.currentIndex + property alias cfg_useExtraRunners: useExtraRunners.checked + property alias cfg_customGreeting: customGreeting.text + property alias cfg_floating: floating.checked + property alias cfg_launcherPosition: launcherPosition.currentIndex + property alias cfg_offsetX: screenOffset.value + property alias cfg_offsetY: panelOffset.value + + property alias cfg_enableGlow: enableGlowCheck.checked + property alias cfg_glowColor: glowColor.currentIndex + + property alias cfg_useSystemFontSettings: useSystemFontSettings.checked + + 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 + } + } + } + } + CheckBox { + id: activationIndicatorCheck + Kirigami.FormData.label: i18n("Indicator:") + text: i18n("Enabled") + checked: Plasmoid.configuration.activationIndicator + onCheckedChanged: { + Plasmoid.configuration.activationIndicator = checked + cfg_activationIndicator = checked + } + } + Button { + id: colorButton + width: Kirigami.Units.iconSizes.small + height: width + Kirigami.FormData.label: i18n("Indicator Color:") + + Rectangle { + anchors.centerIn: parent + anchors.fill: parent + radius: 10 + color: cfg_indicatorColor + } + onPressed: colorDialog.visible ? colorDialog.close() : colorDialog.open() + ColorDialog { + id: colorDialog + title: i18n("Please choose a color") + onAccepted: { + cfg_indicatorColor = colorDialog.color + } + } + } + Item { + Kirigami.FormData.isSection: true + } + CheckBox { + id: enableGreetingCheck + Kirigami.FormData.label: i18n("Greeting:") + text: i18n("Enabled") + checked: Plasmoid.configuration.enableGreeting + onCheckedChanged: { + Plasmoid.configuration.enableGreeting = checked + cfg_enableGreeting = checked + customGreeting.enabled = checked + } + } + TextField { + id: customGreeting + Kirigami.FormData.label: i18n("Custom Greeting Text:") + placeholderText: i18n("No custom greeting set") + } + Item { + Kirigami.FormData.isSection: true + } + CheckBox { + id: enableGlowCheck + Kirigami.FormData.label: i18n("Glow") + text: i18n("Enabled") + checked: Plasmoid.configuration.enableGlow + onCheckedChanged: { + Plasmoid.configuration.enableGlow = checked + } + } + ComboBox { + id: glowColor + Kirigami.FormData.label: i18n("Glow color:") + visible: Plasmoid.configuration.enableGlow + model: [ + i18n("Purple (Default)"), + i18n("Blue"), + i18n("Red"), + ] + } + Item { + Kirigami.FormData.isSection: true + } + ComboBox { + id: launcherPosition + Kirigami.FormData.label: i18n("Launcher Positioning:") + model: [ + i18n("Default"), + i18n("Horizontal Center"), + i18n("Screen Center"), + ] + onCurrentIndexChanged: { + if (currentIndex == 2) { + floating.enabled = false + floating.checked = true + } else { + floating.enabled = true + } + } + } + CheckBox { + id: floating + text: i18n("Floating") + onCheckedChanged: { + screenOffset.visible = checked + panelOffset.visible = checked + } + } + Slider { + id: screenOffset + visible: Plasmoid.configuration.floating + Kirigami.FormData.label: i18n("Offset Screen Edge (0 is Default):") + from: 0 + value: 0 + to: 100 + stepSize: 1 + PlasmaComponents.ToolTip { + text: screenOffset.value + } + } + Slider { + id: panelOffset + visible: Plasmoid.configuration.floating + Kirigami.FormData.label: i18n("Offset Panel (0 is Default):") + from: 0 + value: 0 + to: 100 + stepSize: 1 + PlasmaComponents.ToolTip { + text: panelOffset.value + } + } + Item { + Kirigami.FormData.isSection: true + } + ComboBox { + id: defaultPage + Kirigami.FormData.label: i18n("Default Page:") + model: [ + i18n("All Applications (Default)"), + i18n("Developement"), + i18n("Games"), + i18n("Graphics"), + i18n("Internet"), + i18n("Multimedia"), + i18n("Office"), + i18n("Science & Math"), + i18n("Settings"), + i18n("System"), + i18n("Utilities"), + i18n("Lost & Found"), + ] + } + Item { + Kirigami.FormData.isSection: true + } + CheckBox { + id: useExtraRunners + Kirigami.FormData.label: i18n("Search:") + text: i18n("Expand search to bookmarks, files and emails") + } + + Item { + Kirigami.FormData.isSection: true + } + + CheckBox { + id: useSystemFontSettings + Kirigami.FormData.label: i18n("Use system font settings") + text: i18n("Enabled") + checked: Plasmoid.configuration.useSystemFontSettings + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FavoriteItem.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FavoriteItem.qml new file mode 100644 index 00000000..f38a46b5 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FavoriteItem.qml @@ -0,0 +1,219 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import Qt5Compat.GraphicalEffects +import QtQuick.Window 2.2 +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.coreaddons 1.0 as KCoreAddons +import org.kde.kirigami as Kirigami +import QtQuick.Controls 2.15 + +import "../code/tools.js" as Tools + +Item { + id: favItem + + property int iconSize: Kirigami.Units.gridUnit * 3.2 + + width: 125 + height: iconSize + Kirigami.Units.smallSpacing + appname.implicitHeight + 10 + + signal itemActivated(int index, string actionId, string argument) + signal actionTriggered(string actionId, variant actionArgument) + signal aboutToShowActionMenu(variant actionMenu) + + + property bool highlighted: false + property bool isDraging: false + + property bool hasActionList: ((model.favoriteId !== null) + || (("hasActionList" in model) && (model.hasActionList !== null))) + + property int itemIndex: model.index + + + function openActionMenu(visualParent, x, y) { + aboutToShowActionMenu(actionMenu); + actionMenu.visualParent = visualParent; + actionMenu.open(x, y); + } + + onAboutToShowActionMenu: actionMenu => { + const actionList = (model.hasActionList !== null) ? model.actionList : []; + Tools.fillActionMenu(i18n, actionMenu, actionList, scrollView.pinnedModel[0], model.favoriteId); + } + onActionTriggered: (actionId, actionArgument) => { + if (Tools.triggerAction(scrollView.pinnedModel[0], model.index, actionId, actionArgument) === true) { + kicker.expanded = false; + } + } + + Kirigami.Icon { + id: appicon + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + } + width: iconSize + height: iconSize + source: model.decoration + } + + PlasmaComponents.Label { + id: appname + text: ("name" in model ? model.name : model.display) + font.family: main.textFont + font.pointSize: main.textSize + color: main.textColor + anchors { + top: appicon.bottom + topMargin: Kirigami.Units.smallSpacing + left: parent.left + right: parent.right + } + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignTop + wrapMode: Text.WordWrap + } + + Rectangle { + id: rect + z: -20 + visible: !plasmoid.configuration.enableGlow + height: parent.height + width: parent.width + anchors.centerIn: parent + radius: 8 + + color: PlasmaCore.Theme.highlightColor + states: [ + State { + name: "highlight"; when: (highlighted) + PropertyChanges { target: rect; opacity: 0.3} + }, + State { + name: "default"; when: (!highlighted) + PropertyChanges { target: rect; opacity: 0} + } + ] + transitions: highlight + } + + DropShadow { + id:appIconGlow + visible: plasmoid.configuration.enableGlow + anchors.fill: appicon + cached: true + horizontalOffset: 0 + verticalOffset: 0 + radius: 15.0 + samples: 16 + color: main.glowColor1 + source: appicon + states: [ + State { + name: "highlight"; when: (highlighted) + PropertyChanges { target: appIconGlow; opacity: 1} + PropertyChanges { target: appNameGlow; opacity: 1} + }, + State { + name: "default"; when: (!highlighted) + PropertyChanges { target: appIconGlow; opacity: 0} + PropertyChanges { target: appNameGlow; opacity: 0} + } + ] + transitions: highlight + } + + DropShadow { + id: appNameGlow + visible: plasmoid.configuration.enableGlow + anchors.fill: appname + cached: true + horizontalOffset: 0 + verticalOffset: 0 + radius: 15.0 + samples: 16 + color: main.glowColor1 + source: appname + } + + MouseArea { + id: ma + anchors.fill: parent + z: parent.z + 1 + acceptedButtons: Qt.LeftButton | Qt.RightButton + cursorShape: Qt.PointingHandCursor + hoverEnabled: true + onClicked: { + + if (mouse.button == Qt.RightButton ) { + if (favItem.hasActionList) { + var mapped = mapToItem(favItem, mouse.x, mouse.y); + favItem.openActionMenu(favItem, mouse.x, mouse.y); + } + } else { + kicker.globalFavorites.trigger(index, "", null); + root.toggle() + } + + } + onReleased: { + isDraging: false + } + onEntered: { + if(plasmoid.configuration.enableGlow) { + appIconGlow.state = "highlight" + } else { rect.state = "highlight" } + + } + onExited: { + if(plasmoid.configuration.enableGlow) { + appIconGlow.state = "default" + } else { rect.state = "default" } + } + onPositionChanged: { + isDraging = pressed + if (pressed){ + if ("pluginName" in model) { + dragHelper.startDrag(kicker, model.url, model.decoration, + "text/x-plasmoidservicename", model.pluginName); + } else { + kicker.dragSource = favItem; + dragHelper.startDrag(kicker, model.url, model.icon); + } + } + } + } + ActionMenu { + id: actionMenu + + onActionClicked: { + actionTriggered(actionId, actionArgument); + // root.toggle() + } + } + Transition { + id: highlight + ColorAnimation {duration: 100 } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FloatingAvatar.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FloatingAvatar.qml new file mode 100644 index 00000000..8b649b9c --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/FloatingAvatar.qml @@ -0,0 +1,100 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ +import QtQuick 2.12 +import QtQuick.Window 2.2 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.kirigami as Kirigami +import org.kde.kirigamiaddons.components 1.0 as KirigamiComponents +import org.kde.kcmutils as KCM + +PlasmaCore.Dialog { //cosmic background noise is less random than the placement of this dialog + id: avatarContainer + + property int avatarWidth + property bool isTop: false + + readonly property color borderGradientColor1: plasmoid.configuration.glowColor == 0 ? "#FEAC5E" : + plasmoid.configuration.glowColor == 1 ? "#a5fecb" : + "#ff005d" + readonly property color borderGradientColor2: plasmoid.configuration.glowColor == 0 ? "#C779D0" : + plasmoid.configuration.glowColor == 1 ? "#20bdff" : + "#ff005c" + readonly property color borderGradientColor3: plasmoid.configuration.glowColor == 0 ? "#4BC0C8" : + plasmoid.configuration.glowColor == 1 ? "#5433ff" : + "#ff8b26" + + type: "Notification" + + x: root.x + root.width / 2 - width / 2 + y: root.y - width / 2 //you can't even add 1 without everything breaking wtf + + mainItem: + Item { + onParentChanged: { + //This removes the dialog background + if (parent){ + var popupWindow = Window.window + if (typeof popupWindow.backgroundHints !== "undefined"){ + popupWindow.backgroundHints = PlasmaCore.Types.NoBackground + } + } + } + } + Item { + id: avatarFrame + anchors.centerIn: parent + width: avatarWidth + height: avatarWidth + KirigamiComponents.AvatarButton { + id: mainFaceIcon + source: kuser.faceIconUrl + anchors { + fill: parent + margins: Kirigami.Units.smallSpacing + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + hoverEnabled: false + onClicked: { + KCM.KCMLauncher.openSystemSettings("kcm_users") + root.toggle() + } + } + } + + Rectangle { + visible: plasmoid.configuration.enableGlow + anchors.centerIn: mainFaceIcon + width: parent.width - 4 // Subtract to prevent fringing + height: width + radius: width / 2 + + gradient: Gradient { + GradientStop { position: 0.0; color: borderGradientColor1 } + GradientStop { position: 0.33; color: borderGradientColor2 } + GradientStop { position: 1.0; color: borderGradientColor3 } + } + + z:-1 + rotation: 270 + transformOrigin: Item.Center + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/GenericItem.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/GenericItem.qml new file mode 100644 index 00000000..76dae562 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/GenericItem.qml @@ -0,0 +1,199 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import Qt5Compat.GraphicalEffects +import QtQuick.Window 2.2 +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.coreaddons 1.0 as KCoreAddons +import org.kde.kirigami 2.13 as Kirigami +import QtQuick.Controls 2.15 + +import "../code/tools.js" as Tools + +Item { + id: allItem + + width: rect.width + 4 * 1 + height: rect.height + 4 * 1 + + property bool highlighted: false + property bool isDraging: false + property bool canDrag: true + property bool canNavigate: false + property bool isMouseHighlight: false + + property int subIndex: 0 + + signal highlightChanged + signal aboutToShowActionMenu(variant actionMenu) + + property bool hasActionList: ((model.favoriteId !== null) + || (("hasActionList" in model) && (model.hasActionList !== null))) + + property var triggerModel + + onAboutToShowActionMenu: { + var actionList = allItem.hasActionList ? model.actionList : []; + //Tools.fillActionMenu(i18n, actionMenu, actionList, ListView.view.model.favoritesModel, model.favoriteId); + Tools.fillActionMenu(i18n, actionMenu, actionList, globalFavorites, model.favoriteId); + } + + function openActionMenu(x, y) { + aboutToShowActionMenu(actionMenu); + actionMenu.visualParent = allItem; + actionMenu.open(x, y); + } + function actionTriggered(actionId, actionArgument) { + var close = (Tools.triggerAction(triggerModel, index, actionId, actionArgument) === true); + if (close) { + root.toggle(); + } + } + function trigger() { + triggerModel.trigger(index, "", null); + root.toggle() + } + function updateHighlight() { + if (navGrid.currentIndex == index){ + highlighted = true + } else { + highlighted = false + } + } + function deselect(){ + highlighted = false + listView.currentIndex = -1 + } + Item { + id: rect + x: 10 * 1 + y: 10 * 1 + width: main.width - 40 * 1 - allItem.x + height: 38 * 1 + + Kirigami.Icon { + x: 9 * 1 + anchors.verticalCenter: rect.verticalCenter + id: appicon + width: 24 * 1 + height: width + source: model.decoration + PlasmaComponents.Label { + id: appname + x: appicon.width + 9 * 1 + anchors.verticalCenter: appicon.verticalCenter + text: ("name" in model ? model.name : model.display) + color: main.textColor + font.family: main.textFont + font.pointSize: main.textSize + } + } + states: [ + State { + name: "highlight"; when: !canNavigate ? highlighted : runnerList.currentMainIndex == index && runnerList.currentSubIndex == subIndex + PropertyChanges { target: rectFill; opacity: 0.3} + PropertyChanges { target: appname; color: highlightedTextColor} + }, + State { + name: "default"; when: !canNavigate ? !highlighted : runnerList.currentMainIndex != index || runnerList.currentSubIndex != subIndex + PropertyChanges { target: rectFill; opacity: 0} + PropertyChanges { target: appname; color: textColor} + }] + transitions: highlight + onStateChanged: { + if (state == 'default'){ + isMouseHighlight = false + } + } + } + + Rectangle { + id: rectFill + color: PlasmaCore.Theme.highlightColor + radius: 6 + z: -20 + anchors.fill: rect + } + + MouseArea { + id: ma + anchors.fill: parent + z: parent.z + 1 + acceptedButtons: Qt.LeftButton | Qt.RightButton + cursorShape: Qt.PointingHandCursor + hoverEnabled: true + onClicked: { + if (mouse.button == Qt.RightButton) { + if (allItem.hasActionList) { + var mapped = mapToItem(allItem, mouse.x, mouse.y); + allItem.openActionMenu(mapped.x, mapped.y); + } + } else { + trigger() + } + + } + onReleased: { + isDraging: false + } + onExited: { + rect.state = "default" + isMouseHighlight = false + } + onPositionChanged: { + isDraging = pressed + if (pressed && canDrag){ + if ("pluginName" in model) { + dragHelper.startDrag(kicker, model.url, model.decoration, + "text/x-plasmoidservicename", model.pluginName); + } else { + dragHelper.startDrag(kicker, model.url, model.decoration); + } + } + if (containsMouse) { + isMouseHighlight = true + rect.state = "highlight" + if (canNavigate) { + if (runnerList.currentSubIndex != subIndex) { + repeater.itemAt(runnerList.currentSubIndex).nGrid.currentIndex = -1 + } + runnerList.currentSubIndex = subIndex + runnerList.currentMainIndex = index + listView.currentIndex = index + listView.focus = true + } + } + } + } + ActionMenu { + id: actionMenu + + onActionClicked: { + visualParent.actionTriggered(actionId, actionArgument); + //root.toggle() + } + } + Transition { + id: highlight + ColorAnimation {duration: 100 } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/Header.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/Header.qml new file mode 100644 index 00000000..69f59f06 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/Header.qml @@ -0,0 +1,95 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.core 2.0 as PlasmaCore +import QtQuick.Controls 2.5 +import QtQuick 2.0 +import QtQuick.Window 2.2 +import Qt5Compat.GraphicalEffects +import org.kde.kcmutils as KCM + +Item { + property var iconSize + width: iconSize * 3.75 + height: iconSize + PlasmaComponents.RoundButton { + id: settingsButton + visible: true + flat: true + height: iconSize * 2 + width: height + anchors.left: parent.left + + PlasmaComponents.ToolTip { + text: i18n("Settings") + } + Item { + id: visualParentSettings + y: 2 * iconSize + } + Image { + id: settingsImage + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + source: "icons/feather/settings.svg" + width: iconSize + height: width + ColorOverlay { + visible: plasmoid.configuration.theming != 0 + anchors.fill: settingsImage + source: settingsImage + color: main.textColor + } + } + onClicked: { + KCM.KCMLauncher.openSystemSettings("kcm_landingpage") + root.toggle() + //plasmoid.action("configure").trigger() //might implement later + } + } + PlasmaComponents.RoundButton { + id: powerOffButton + visible: true + flat: true + height: iconSize * 2 + width: height + anchors.right: parent.right + + PlasmaComponents.ToolTip { + text: i18n("Power Off") + } + Image { + id: powerImage + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + source: "icons/feather/power.svg" + width: iconSize + height: width + ColorOverlay { + visible: true + anchors.fill: powerImage + source: powerImage + color: main.textColor + } + } + onClicked: { + pmEngine.performOperation("requestShutDown") + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MainView.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MainView.qml new file mode 100644 index 00000000..f136d231 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MainView.qml @@ -0,0 +1,440 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ +import QtQuick 2.15 +import QtQuick.Layouts 1.12 +import Qt5Compat.GraphicalEffects +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.coreaddons 1.0 as KCoreAddons + +import org.kde.plasma.plasma5support 2.0 as P5Support +import org.kde.kirigami as Kirigami + +Item { + id: main + anchors.fill: parent + property bool searching: (searchBar.text != "") + signal newTextQuery(string text) + + readonly property color textColor: Kirigami.Theme.textColor + readonly property string textFont: plasmoid.configuration.useSystemFontSettings ? Kirigami.Theme.defaultFont : "SF Pro Text" + readonly property real textSize: plasmoid.configuration.useSystemFontSettings ? Kirigami.Theme.defaultFont.pointSize : 11 + readonly property color bgColor: Kirigami.Theme.backgroundColor + readonly property color highlightColor: Kirigami.Theme.highlightColor + readonly property color highlightedTextColor: Kirigami.Theme.highlightedTextColor + readonly property bool isTop: plasmoid.location == PlasmaCore.Types.TopEdge & plasmoid.configuration.launcherPosition != 2 & !plasmoid.configuration.floating + + readonly property color glowColor1: plasmoid.configuration.glowColor == 0 ? "#D300DC" : + plasmoid.configuration.glowColor == 1 ? "#20bdff" : + "#ff005d" + readonly property color glowColor2: plasmoid.configuration.glowColor == 0 ? "#8700FF" : + plasmoid.configuration.glowColor == 1 ? "#5433ff" : + "#ff8b26" + + property bool showAllApps: false + + property real innerPadding: 7.5 + property real itemsWidth: width - (innerPadding * 4) + + KCoreAddons.KUser { + id: kuser + } + + 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) + } + } + + function updateStartpage(){ + appList.currentStateIndex = plasmoid.configuration.defaultPage + } + + function reload() { + searchBar.clear() + searchBar.focus = true + appList.reset() + } + function reset(){ + searchBar.clear() + searchBar.focus = true + appList.reset() + } + + Rectangle { + id: backdrop + x: 0 + y: isTop ? 0 : 125 * 1 + width: main.width + height: isTop ? main.height - 200 * 1 : main.height - y - (searchBarContainer.height + 20) + color: bgColor + opacity: 0 + } + //Floating Avatar + Item { + id: avatarParent + x: main.width / 2 + y: - root.margins.top + FloatingAvatar { //Anyone looking for an unpredictable number generator? + id: floatingAvatar + //visualParent: root + isTop: main.isTop + avatarWidth: 125 * 1 + visible: root.visible && !isTop ? true : root.visible && plasmoid.configuration.floating ? true : false + } + } + //Power & Settings + Item { + Header { + id: powerSettings + x: main.width - width - iconSize / 2 + y: isTop ? main.height - 2 * height - iconSize / 2 : iconSize / 2 + iconSize: 20 * 1 + } + } + //Greeting + Item { + id: greeting + Text { + id: nameLabel + x: main.width / 2 - width / 2 //This centeres the Text + y: isTop ? main.height - height - 135 * 1 : 70 * 1 + text: plasmoid.configuration.enableGreeting && plasmoid.configuration.customGreeting ? plasmoid.configuration.customGreeting : plasmoid.configuration.enableGreeting ? 'Hi, ' + kuser.fullName : i18n("%1@%2", kuser.loginName, kuser.host) + color: textColor + font.family: textFont + font.pixelSize: 25 * 1 + font.bold: true + } + // Text shadow for greeting label + DropShadow { + anchors.fill: nameLabel + cached: true + horizontalOffset: 0 + verticalOffset: 0 + radius: 10.0 + samples: 16 + color: glowColor1 + source: nameLabel + visible: plasmoid.configuration.enableGlow + } + } + //Searchbar + Item { + Rectangle { + id: searchBarContainer + y: isTop ? main.height - height - (2 * powerSettings.height + powerSettings.iconSize / 2) - 10 * 1 : main.height - (height + innerPadding * 2) + width: main.width - (root.margins.left*2) + anchors.left: parent.left + height: 45 + radius: 8 + color: Qt.lighter(Kirigami.Theme.backgroundColor, 1.3) // better contrast color + Image { + id: searchIcon + x: 15 + width: 15 + height: width + anchors.verticalCenter: parent.verticalCenter + source: 'icons/feather/search.svg' + ColorOverlay { + visible: true + anchors.fill: searchIcon + source: searchIcon + color: main.textColor + } + } + Rectangle { + x: parent.x + 45 + width: parent.width - 60 + height: searchBar.height + anchors.verticalCenter: parent.verticalCenter + clip: true + color: 'transparent' + MouseArea { + anchors.fill: parent + cursorShape: Qt.IBeamCursor + hoverEnabled: true + } + TextInput { + id: searchBar + width: parent.width + anchors.verticalCenter: parent.verticalCenter + focus: true + color: textColor + selectByMouse: true + selectionColor: highlightColor + font.family: textFont + font.pixelSize: 13 * 1 + Text { + anchors.fill: parent + text: i18n("Search your computer") + color: Kirigami.Theme.disabledTextColor + visible: !parent.text + } + onTextChanged: { + runnerModel.query = text; + newTextQuery(text) + } + function clear() { + text = ""; + } + function backspace() { + if (searching) { + text = text.slice(0, -1); + } + focus = true; + } + function appendText(newText) { + if (!root.visible) { + return; + } + focus = true; + text = text + newText; + } + Keys.onPressed: { + if (event.key == Qt.Key_Down) { + event.accepted = true; + runnerList.setFocus() + } else if (event.key == Qt.Key_Tab || event.key == Qt.Key_Up) { + event.accepted = true; + runnerList.setFocus() + } else if (event.key == Qt.Key_Escape) { + event.accepted = true; + if (searching) { + clear() + } else { + root.toggle() + } + } else if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return) { + runnerList.setFocus() + runnerList.triggerFirst() + } + } + } + } + } + } + + // Fvorites / All apps label + Image { + id: headerLabel + source: "icons/feather/star.svg" + width: 15 + height: width + y: backdrop.y + width + anchors.leftMargin: Kirigami.Units.largeSpacing + anchors.topMargin: Kirigami.Units.largeSpacing + anchors.left: parent.left + + PlasmaComponents.Label { + id: mainLabelGrid + x: parent.width + 10 + anchors.verticalCenter: parent.verticalCenter + text: i18n(showAllApps ? "All apps" : "Favorite Apps") + font.family: textFont + font.pointSize: textSize + } + + ColorOverlay { + visible: true + anchors.fill: headerLabel + source: headerLabel + color: main.textColor + } + } + // Show all app buttons + PlasmaComponents.Button { + MouseArea { + hoverEnabled: true + anchors.fill: parent + cursorShape: containsMouse ? Qt.PointingHandCursor : Qt.ArrowCursor + onClicked: showAllApps = !showAllApps + } + text: i18n(showAllApps ? "Back" : "All apps") + id: mainsecLabelGrid + icon.name: showAllApps ? "go-previous" : "go-next" + font.pointSize: textSize + font.family: textFont + icon.height: 15 + icon.width: icon.height + LayoutMirroring.enabled: true + LayoutMirroring.childrenInherit: !showAllApps + flat: false + background: Rectangle { + color: Qt.lighter(Kirigami.Theme.backgroundColor) + border.width: 1 + border.color: Qt.darker(Kirigami.Theme.backgroundColor, 1.14) + radius: plasmoid.configuration.enableGlow ? height / 2 : 5 + + Rectangle { + id: bgMask + width: parent.width + height: parent.height + radius: height / 2 + border.width: 0 + visible: plasmoid.configuration.enableGlow && !searching + } + Item { + visible: plasmoid.configuration.enableGlow && !searching + anchors.fill: bgMask + // x: container.x - 20 + layer.enabled: true + layer.effect: OpacityMask { + maskSource: bgMask + } + + LinearGradient { + anchors.fill: parent + start: Qt.point(bgMask.width, 0) + end: Qt.point(0, bgMask.height) + gradient: Gradient { + GradientStop { position: 0.0; color: glowColor1 } + GradientStop { position: 1.0; color: glowColor2 } + } + } + } + + } + topPadding: 5 + bottomPadding: topPadding + leftPadding: 8 + rightPadding: 8 + icon{ + width: height + height: visible ? Kirigami.Units.iconSizes.small : 0 + name: showAllApps ? "go-previous" : "go-next" + } + + anchors { + topMargin: Kirigami.Units.smallSpacing + verticalCenter: headerLabel.verticalCenter + // rightMargin: Kirigami.Units.largeSpacing + // leftMargin: Kirigami.Units.largeSpacing + //right: parent.right + } + x: main.width - (width + Kirigami.Units.largeSpacing + root.margins.right) + visible: !searching + } + // All apps button shadow + DropShadow { + anchors.fill: mainsecLabelGrid + cached: true + horizontalOffset: 0 + verticalOffset: 0 + radius: 11.0 + samples: 16 + color: glowColor1 + source: mainsecLabelGrid + visible: plasmoid.configuration.enableGlow && !searching + } + + //List of Apps + AppList { + id: appList + state: "visible" + anchors.top: headerLabel.bottom + anchors.topMargin: showAllApps ? headerLabel.width : headerLabel.width * 1.5 + + width: itemsWidth + height: backdrop.height - (headerLabel.height * 3.4) + visible: opacity > 0 + states: [ + State { + name: "visible"; when: (!searching) + PropertyChanges { target: appList; opacity: 1.0 } + PropertyChanges { target: appList; x: innerPadding } + }, + State { + name: "hidden"; when: (searching) + PropertyChanges { target: appList; opacity: 0.0} + PropertyChanges { target: appList; x: 5 * 1} + }] + transitions: [ + Transition { + to: "visible" + PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart} + PropertyAnimation {properties: 'x'; from: 5 * 1; duration: 100; easing.type: Easing.OutQuart} + }, + Transition { + to: "hidden" + PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart} + PropertyAnimation {properties: 'x'; from: 25 * 1; duration: 100; easing.type: Easing.OutQuart} + } + ] + } + RunnerList { + id: runnerList + model: runnerModel + state: "hidden" + visible: opacity > 0 + anchors.top: headerLabel.bottom + anchors.topMargin: headerLabel.width + width: main.width - 30 * 1 + height: backdrop.height - (headerLabel.height * 3.5) + states: [ + State { + name: "visible"; when: (searching) + PropertyChanges { target: runnerList; opacity: 1.0 } + PropertyChanges { target: runnerList; x: 20 * 1} + }, + State { + name: "hidden"; when: (!searching) + PropertyChanges { target: runnerList; opacity: 0.0} + PropertyChanges { target: runnerList; x: 40 * 1} + }] + transitions: [ + Transition { + to: "visible" + PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart} + PropertyAnimation {properties: 'x'; from: 80 * 1; duration: 100; easing.type: Easing.OutQuart} + }, + Transition { + to: "hidden" + PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart} + PropertyAnimation {properties: 'x'; from: 20 * 1; duration: 100; easing.type: Easing.OutQuart} + } + ] + } + + Keys.onPressed: { + if (event.key == Qt.Key_Backspace) { + event.accepted = true; + if (searching) + searchBar.backspace(); + else + searchBar.focus = true + } else if (event.key == Qt.Key_Escape) { + event.accepted = true; + if (searching) { + searchBar.clear() + } else { + root.toggle() + } + } else if (event.text != "" || event.key == Qt.Key_Down) { + if (event.key != Qt.Key_Return){ + event.accepted = true; + searchBar.appendText(event.text); + } + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MenuRepresentation.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MenuRepresentation.qml new file mode 100644 index 00000000..0796ecb5 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/MenuRepresentation.qml @@ -0,0 +1,171 @@ +/***************************************************************************** + * Copyright (C) 2014 by Weng Xuetian * + * Copyright (C) 2013-2017 by Eike Hein * + * Copyright (C) 2021 by Prateek SU * + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import QtQml 2.15 + +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents + +import org.kde.plasma.plasmoid 2.0 + + +PlasmaCore.Dialog { + id: root + + objectName: "popupWindow" + flags: Qt.WindowStaysOnTopHint + + location: Plasmoid.configuration.floating || Plasmoid.configuration.launcherPosition == 2 ? "Floating" : Plasmoid.location + hideOnWindowDeactivate: true + + onVisibleChanged: { + if (!visible) { + reset(); + } else { + main.updateStartpage() + var pos = popupPosition(width, height); + x = pos.x; + y = pos.y; + requestActivate(); + } + } + + onHeightChanged: { + var pos = popupPosition(width, height); + x = pos.x; + y = pos.y; + } + + onWidthChanged: { + var pos = popupPosition(width, height); + x = pos.x; + y = pos.y; + } + + function toggle() { + root.visible = false; + } + + function reset() { + main.reset() + } + + function popupPosition(width, height) { + var screenAvail = Plasmoid.availableScreenRect; + var screen/*Geom*/ = kicker.screenGeometry; + //QtBug - QTBUG-64115 + /*var screen = Qt.rect(screenAvail.x + screenGeom.x, + screenAvail.y + screenGeom.y, + screenAvail.width, + screenAvail.height);*/ + + var offset = 0 + + if (Plasmoid.configuration.offsetX > 0 && Plasmoid.configuration.floating) { + offset = Plasmoid.configuration.offsetX + } else { + offset = plasmoid.configuration.floating ? parent.height * 0.35 : 0 + } + // Fall back to bottom-left of screen area when the applet is on the desktop or floating. + var x = offset; + var y = screen.height - height - offset; + var horizMidPoint = screen.x + (screen.width / 2); + var vertMidPoint = screen.y + (screen.height / 2); + var appletTopLeft = parent.mapToGlobal(0, 0); + var appletBottomLeft = parent.mapToGlobal(0, parent.height); + + if (Plasmoid.configuration.launcherPosition != 0){ + x = horizMidPoint - width / 2; + } else { + x = (appletTopLeft.x < horizMidPoint) ? screen.x : (screen.x + screen.width) - width; + if (Plasmoid.configuration.floating) { + if (appletTopLeft.x < horizMidPoint) { + x += offset + } else if (appletTopLeft.x + width > horizMidPoint){ + x -= offset + } + } + } + + if (Plasmoid.configuration.launcherPosition != 2){ + if (Plasmoid.location == PlasmaCore.Types.TopEdge) { + if (Plasmoid.configuration.floating) { + /*this is floatingAvatar.width*/ + if (Plasmoid.configuration.offsetY > 0) { + offset = (125 * 1) / 2 + Plasmoid.configuration.offsetY + } else { + offset = (125 * 1) / 2 + parent.height * 0.125 + } + } + y = screen.y + parent.height + panelSvg.margins.bottom + offset; + } else { + if (Plasmoid.configuration.offsetY > 0) { + offset = Plasmoid.configuration.offsetY + } + y = screen.y + screen.height - parent.height - height - panelSvg.margins.top - offset * 2.5; + } + } else { + y = vertMidPoint - height / 2 + } + + return Qt.point(x, y); + } + + FocusScope { + id: fs + focus: true + Layout.minimumWidth: 600 * 1 + Layout.minimumHeight: 550 * 1 + Layout.maximumWidth: Layout.minimumWidth + Layout.maximumHeight: Layout.minimumHeight + + Item { + x: - root.margins.left + y: - root.margins.top + width: parent.width + root.margins.left + root.margins.right + height: parent.height + root.margins.top + root.margins.bottom + + MainView { + id: main + } + } + + Keys.onPressed: { + if (event.key == Qt.Key_Escape) { + root.visible = false; + } + } + } + + function refreshModel() { + main.reload() + } + + Component.onCompleted: { + kicker.reset.connect(reset); + // windowSystem.hidden.connect(reset); + + rootModel.refresh(); + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/NavGrid.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/NavGrid.qml new file mode 100644 index 00000000..bdbb0432 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/NavGrid.qml @@ -0,0 +1,134 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ +import QtQuick 2.12 + +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.extras 2.0 as PlasmaExtras +import org.kde.kquickcontrolsaddons 2.0 + +import org.kde.draganddrop 2.0 + +FocusScope { + id: navGrid + + signal keyNavUp + signal keyNavDown + + property alias triggerModel: listView.model + property alias count: listView.count + property alias currentIndex: listView.currentIndex + property alias currentItem: listView.currentItem + property alias contentItem: listView.contentItem + property Item flickableItem: listView + property int subIndex: 0 + + onFocusChanged: { + if (!focus) { + currentIndex = -1; + } + } + function setFocus() { + currentIndex = 0 + focus = true + runnerList.currentMainIndex = currentIndex + } + function setFocusLast() { + if (count > 0) { + currentIndex = count - 1 + focus = true + runnerList.currentMainIndex = currentIndex + } else { + setFocus() + } + } + + ListView { + anchors.fill: parent + id: listView + currentIndex: -1 + focus: true + // keyNavigationEnabled: true + // highlightFollowsCurrentItem: true + // highlightMoveDuration: 0 + snapMode: ListView.SnapToItem + interactive: false + // clip: false + + + delegate: GenericItem { + x: 20 + canNavigate: true + canDrag: false + triggerModel: listView.model + subIndex: navGrid.subIndex + } + + onCurrentIndexChanged: { + if (currentIndex != -1) { + focus = true; + } + } + onModelChanged: { + currentIndex = -1; + } + onFocusChanged: { + if (!focus) { + currentIndex = -1 + } + } + Keys.onUpPressed: { + + if (runnerList.currentSubIndex != subIndex) { + repeater.itemAt(runnerList.currentSubIndex).nGrid.currentIndex = -1 + } + if (currentIndex > 0) { + event.accepted = true; + currentIndex = currentIndex - 1 + runnerList.currentMainIndex = currentIndex + runnerList.currentSubIndex = subIndex + positionViewAtIndex(currentIndex, ListView.Contain); + } else { + navGrid.keyNavUp(); + } + } + Keys.onDownPressed: { + if (runnerList.currentSubIndex != subIndex) { + repeater.itemAt(runnerList.currentSubIndex).nGrid.currentIndex = -1 + } + if (currentIndex < count - 1) { // si no ha llegado al ultimo elemento de la lists incrementa currentIndex para pasar al siguiente elemento de la lista + event.accepted = true; + currentIndex = currentIndex + 1; + runnerList.currentMainIndex = currentIndex + runnerList.currentSubIndex = subIndex + positionViewAtIndex(currentIndex, ListView.Contain); + } else { + navGrid.keyNavDown(); + } + } + Keys.onPressed: { + if (event.key == Qt.Key_Enter || event.key == Qt.Key_Return) { + event.accepted = true; + if (currentItem){ + currentItem.trigger() + } + } + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/RunnerList.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/RunnerList.qml new file mode 100644 index 00000000..49ff033b --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/RunnerList.qml @@ -0,0 +1,212 @@ +/***************************************************************************** + * Copyright (C) 2022 by Friedrich Schriewer * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ****************************************************************************/ + +import QtQuick 2.12 + +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.extras 2.0 as PlasmaExtras + +import org.kde.plasma.private.kicker 0.1 as Kicker + +import QtQuick.Window 2.2 +import org.kde.plasma.components 3.0 as PlasmaComponents +import QtQuick.Layouts 1.15 +import QtQuick.Controls 2.15 + +import Qt5Compat.GraphicalEffects +import org.kde.kirigami as Kirigami + +ScrollView { + id: runnerList + + anchors { top: parent.top } + + width: parent.width + height: parent.height + + + + contentWidth: - 1 //no horizontal scrolling + + +// focus: true + property alias model: repeater.model + property alias count: repeater.count + + // ScrollBar.horizontal.policy: ScrollBar.AlwaysOff + // ScrollBar.vertical.policy: ScrollBar.AsNeeded + + property int currentMainIndex: 0 + property int currentSubIndex: 0 + + onFocusChanged: { + if (!focus) { + for (var i = 0; i < repeater.count; i++) { + repeater.itemAt(i).nGrid.focus = false + } + } else { + currentMainIndex = 0 + for (var i = 0; i < repeater.count; ++i) { + if (repeater.itemAt(i).nGrid.count > 0) { + currentSubIndex = i + repeater.itemAt(i).nGrid.setFocus(); + break + } + } + } + } + + function get_position(){ + return flickableItem.contentY / (flickableItem.contentHeight - height) + } + function get_size(){ + return (flickableItem.contentHeight <= height ? -1 : 0.99999) + } + function setFocus() { + currentMainIndex = 0 + for (var i = 0; i < repeater.count; ++i) { + if (repeater.itemAt(i).nGrid.count > 0) { + currentSubIndex = i + repeater.itemAt(i).nGrid.setFocus(); + break + } + } + } + function triggerFirst(){ + repeater.itemAt(currentSubIndex).nGrid.currentItem.trigger() + } + + + Column { + x: -10 * 1 + Repeater { + id: repeater + delegate: + Item { + id: section + width: runnerList.width + height: headerLabel.height + navGrid.height + (index == repeater.count - 1 ? 0 : 10) + visible: navGrid.count > 0 + property Item nGrid: navGrid + Item { + id: headerLabel + anchors.top: parent.top + height: image.height + Image { + id: image + x: 20 * 1 + source: repeater.model.modelForRow(index).description === 'Command Line' ? "icons/feather/code.svg" : repeater.model.modelForRow(index).description == 'File Search' ? "icons/feather/search.svg" : "icons/feather/file-text.svg" + width: 15 * 1 + height: width + //visible: repeater.model.modelForRow(index).count > 0 + PlasmaComponents.Label { + x: parent.width + 10 * 1 + anchors.verticalCenter: parent.verticalCenter + text: repeater.model.modelForRow(index).name + color: main.textColor + font.family: main.textFont + font.pointSize: main.textSize + 2 + } + ColorOverlay { + visible: true + anchors.fill: image + source: image + color: main.textColor + } + } + } + NavGrid { + id: navGrid + width: runnerList.width + height: Math.ceil(count * (42 * 1 )) + 10 * 1 + anchors.top: headerLabel.bottom + subIndex: index + triggerModel: repeater.model.modelForRow(index) + x: 20 + + onFocusChanged: { + if (focus) { + runnerList.focus = true; + } + } + onCountChanged: { + if (index == 0 && count > 0) { + currentIndex = 0; + focus = true; + } + } + onCurrentItemChanged: { + if (!currentItem) { + return; + } + if (currentItem.isMouseHighlight) { + return + } + if (index == 0 && currentIndex === 0) { + nGrid.flickableItem.contentY = 0; + return; + } + var y = currentItem.y; + y = contentItem.mapToItem(runnerList.contentItem, 0, y).y; + if (y < runnerList.contentItem.contentY) { + flickableItem.contentY = y; + } else { + y += currentItem.height + 20 * 1 + 15 * 1; + y -= runnerList.contentItem.contentY; + y -= runnerList.height; + + if (y > 0) { + runnerList.contentItem.contentY += y; + } + } + } + onKeyNavUp: { + if (index > 0) { + for (var i = index - 1; i > -1; --i) { + if (repeater.itemAt(i).nGrid.count > 0) { + repeater.itemAt(i).nGrid.setFocusLast() + currentSubIndex = index - 1 + break + } + } + } + } + + onKeyNavDown: { + if (index < repeater.count - 1) { + for (var i = index + 1; i < repeater.count; ++i) { + if (repeater.itemAt(i).nGrid.count > 0) { + repeater.itemAt(i).nGrid.setFocus() + currentSubIndex = index + 1 + break + } + } + } + } + } + // Kicker.WheelInterceptor { + // anchors.fill: navGrid + // // z: -1 + // destination: findWheelArea(runnerList.flickableItem) + // } + + } + } + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/LICENSE b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/LICENSE new file mode 100644 index 00000000..b869713b --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 Cole Bemis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/code.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/code.svg new file mode 100644 index 00000000..3e718ae9 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/code.svg @@ -0,0 +1,48 @@ + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/file-text.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/file-text.svg new file mode 100644 index 00000000..5aa61d5f --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/file-text.svg @@ -0,0 +1,66 @@ + + + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/globe.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/globe.svg new file mode 100644 index 00000000..aeec3e8b --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/globe.svg @@ -0,0 +1,57 @@ + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/image.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/image.svg new file mode 100644 index 00000000..0b22c3f5 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/image.svg @@ -0,0 +1,59 @@ + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/power.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/power.svg new file mode 100644 index 00000000..6773a703 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/power.svg @@ -0,0 +1,51 @@ + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/search.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/search.svg new file mode 100644 index 00000000..95df9e62 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/search.svg @@ -0,0 +1,53 @@ + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/settings.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/settings.svg new file mode 100644 index 00000000..fb7effea --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/settings.svg @@ -0,0 +1,50 @@ + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/star.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/star.svg new file mode 100644 index 00000000..ed8af3f0 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/star.svg @@ -0,0 +1,44 @@ + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/tool.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/tool.svg new file mode 100644 index 00000000..6790dc4a --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/tool.svg @@ -0,0 +1,44 @@ + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/trash-2.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/trash-2.svg new file mode 100644 index 00000000..7e808769 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/feather/trash-2.svg @@ -0,0 +1,62 @@ + + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/LICENSE b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/LICENSE new file mode 100644 index 00000000..66cc0220 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2020, Lucide Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/cpu.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/cpu.svg new file mode 100644 index 00000000..fb452299 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/cpu.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/film.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/film.svg new file mode 100644 index 00000000..a4625490 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/film.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/flask-conical.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/flask-conical.svg new file mode 100644 index 00000000..a405ff4d --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/flask-conical.svg @@ -0,0 +1,51 @@ + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/gamepad-2.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/gamepad-2.svg new file mode 100644 index 00000000..49e4da52 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/gamepad-2.svg @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/paperclip.svg b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/paperclip.svg new file mode 100644 index 00000000..3446bb5e --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/icons/lucide/paperclip.svg @@ -0,0 +1,43 @@ + + + + + + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/main.qml b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/main.qml new file mode 100644 index 00000000..65a74796 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/contents/ui/main.qml @@ -0,0 +1,269 @@ + +/*************************************************************************** + * Copyright (C) 2014-2015 by Eike Hein * + * Copyright (C) 2021 by Prateek SU * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ***************************************************************************/ + +import QtQuick 2.15 +import QtQuick.Layouts 1.15 +import org.kde.plasma.plasmoid 2.0 + +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents + +import org.kde.ksvg as KSvg + +import org.kde.plasma.private.kicker 0.1 as Kicker + +import org.kde.kirigami 2.20 as Kirigami + + +PlasmoidItem { + id: kicker + + anchors.fill: parent + + signal reset + + property bool isDash: false + + preferredRepresentation: fullRepresentation + + compactRepresentation: null + fullRepresentation: compactRepresentation + + 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(); + } + + Component { + id: compactRepresentation + CompactRepresentation { } + } + + Component { + id: menuRepresentation + MenuRepresentation { } + } + + Kicker.RootModel { + id: rootModel + + autoPopulate: false + + appNameFormat: 0// Plasmoid.configuration.appNameFormat + flat: true + sorted: true + showSeparators: false + appletInterface: kicker + + showAllApps: true + showAllAppsCategorized: true + showTopLevelItems: !kicker.isDash + showRecentApps: true // Plasmoid.configuration.showRecentApps + showRecentDocs: false //Plasmoid.configuration.showRecentDocs + // showRecentContacts: Plasmoid.configuration.showRecentContacts + recentOrdering: 0 // Plasmoid.configuration.recentOrdering + + onShowRecentAppsChanged: { + Plasmoid.configuration.showRecentApps = showRecentApps; + } + + onShowRecentDocsChanged: { + Plasmoid.configuration.showRecentDocs = showRecentDocs; + } + + // onShowRecentContactsChanged: { + // plasmoid.configuration.showRecentContacts = showRecentContacts; + // } + + onRecentOrderingChanged: { + Plasmoid.configuration.recentOrdering = recentOrdering; + } + + + + + Component.onCompleted: { + favoritesModel.initForClient("org.kde.plasma.kicker.favorites.instance-" + Plasmoid.id) + + // kicker.logListModel("rootmodel", rootModel); + if (!Plasmoid.configuration.favoritesPortedToKAstats) { + if (favoritesModel.count < 1) { + favoritesModel.portOldFavorites(Plasmoid.configuration.favoriteApps); + } + Plasmoid.configuration.favoritesPortedToKAstats = true; + } + } + + // onFavoritesModelChanged: { + // if ("initForClient" in favoritesModel) { + // favoritesModel.initForClient("org.kde.plasma.kicker.favorites.instance-" + plasmoid.id) + + // if (!plasmoid.configuration.favoritesPortedToKAstats) { + // favoritesModel.portOldFavorites(plasmoid.configuration.favoriteApps); + // plasmoid.configuration.favoritesPortedToKAstats = true; + // } + // } else { + // favoritesModel.favorites = plasmoid.configuration.favoriteApps; + // } + + // favoritesModel.maxFavorites = pageSize; + // } + + // onSystemFavoritesModelChanged: { + // systemFavoritesModel.enabled = false; + // systemFavoritesModel.favorites = plasmoid.configuration.favoriteSystemActions; + // systemFavoritesModel.maxFavorites = 6; + // } + + // Component.onCompleted: { + // if ("initForClient" in favoritesModel) { + // favoritesModel.initForClient("org.kde.plasma.kicker.favorites.instance-" + plasmoid.id) + + // if (!plasmoid.configuration.favoritesPortedToKAstats) { + // favoritesModel.portOldFavorites(plasmoid.configuration.favoriteApps); + // plasmoid.configuration.favoritesPortedToKAstats = true; + // } + // } else { + // favoritesModel.favorites = plasmoid.configuration.favoriteApps; + // } + + // favoritesModel.maxFavorites = pageSize; + // rootModel.refresh(); + // } + } + + 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; + } + } + + Kicker.RunnerModel { + id: runnerModel + + favoritesModel: globalFavorites + appletInterface: kicker + + + 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; + } + + KSvg.FrameSvgItem { + id: highlightItemSvg + + visible: false + + imagePath: "widgets/viewitem" + prefix: "hover" + } + + KSvg.FrameSvgItem { + id: panelSvg + visible: false + imagePath: "widgets/panel-background" + } + + PlasmaComponents.Label { + id: toolTipDelegate + + width: contentWidth + height: contentHeight + + property Item toolTip + + text: (toolTip != null) ? toolTip.text : "" + } + + function resetDragSource() { + dragSource = null; + } + + Plasmoid.contextualActions: [ + PlasmaCore.Action { + text: i18n("Edit Applications…") + icon.name: "kmenuedit" + visible: Plasmoid.immutability !== PlasmaCore.Types.SystemImmutable + onTriggered: processRunner.runMenuEditor() + } + ] + + Component.onCompleted: { + //plasmoid.setAction("menuedit", i18n("Edit Applications...")); + rootModel.refreshed.connect(reset); + + dragHelper.dropped.connect(resetDragSource); + } +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/metadata.json b/kde/plasma/plasmoids/AndromedaLauncher/metadata.json new file mode 100644 index 00000000..2a79b5fd --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/metadata.json @@ -0,0 +1,22 @@ +{ + "KPackageStructure": "Plasma/Applet", + "KPlugin": { + "Authors": [ + { + "Email": "eliverlara@gmail.com", + "Name": "EliverLara" + } + ], + "Category": "Application Launchers", + "Description": "A modern Launcher for plasma!", + "EnabledByDefault": true, + "Icon": "start-here-kde", + "Id": "AndromedaLauncher", + "Name": "Andromeda Launcher", + + "Version": "0.6", + "Website": "https://github.com/EliverLara/AndromedaLauncher" + }, + "X-Plasma-Provides": [ "org.kde.plasma.launchermenu" ], + "X-Plasma-API-Minimum-Version": "6.0" +} diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/build.sh b/kde/plasma/plasmoids/AndromedaLauncher/translate/build.sh new file mode 100644 index 00000000..c88cd5d5 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/build.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# Version: 6 + +# This script will convert the *.po files to *.mo files, rebuilding the package/contents/locale folder. +# Feature discussion: https://phabricator.kde.org/D5209 +# Eg: contents/locale/fr_CA/LC_MESSAGES/plasma_applet_org.kde.plasma.eventcalendar.mo + +DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` +plasmoidName=`kreadconfig5 --file="$DIR/../metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Name"` +website=`kreadconfig5 --file="$DIR/../metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Website"` +bugAddress="$website" +packageRoot=".." # Root of translatable sources +projectName="plasma_applet_${plasmoidName}" # project name + +#--- +if [ -z "$plasmoidName" ]; then + echo "[build] Error: Couldn't read plasmoidName." + exit +fi + +if [ -z "$(which msgfmt)" ]; then + echo "[build] Error: msgfmt command not found. Need to install gettext" + echo "[build] Running 'sudo apt install gettext'" + sudo apt install gettext + echo "[build] gettext installation should be finished. Going back to installing translations." +fi + +#--- +echo "[build] Compiling messages" + +catalogs=`find . -name '*.po' | sort` +for cat in $catalogs; do + echo "$cat" + catLocale=`basename ${cat%.*}` + msgfmt -o "${catLocale}.mo" "$cat" + + installPath="$DIR/../contents/locale/${catLocale}/LC_MESSAGES/${projectName}.mo" + + echo "[build] Install to ${installPath}" + mkdir -p "$(dirname "$installPath")" + mv "${catLocale}.mo" "${installPath}" +done + +echo "[build] Done building messages" + +if [ "$1" = "--restartplasma" ]; then + echo "[build] Restarting plasmashell" + killall plasmashell + kstart5 plasmashell + echo "[build] Done restarting plasmashell" +else + echo "[build] (re)install the plasmoid and restart plasmashell to test." +fi diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/de.po b/kde/plasma/plasmoids/AndromedaLauncher/translate/de.po new file mode 100644 index 00000000..2f93f9aa --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/de.po @@ -0,0 +1,135 @@ +# Translation of MMcK Launcher in German +# Copyright (C) 2022 +# This file is distributed under the same license as the MMcK Launcher package. +# Friedrich Schriewer , 2022. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: mmcklauncher\n" +"Report-Msgid-Bugs-To: https://github.com/snoutbug/mmcklauncher\n" +"POT-Creation-Date: 2022-03-07 20:42-0000\n" +"PO-Revision-Date: 2022-03-07 20:42+0000\n" +"Last-Translator: Friedrich Schriewer \n" +"Language-Team: n/a\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Settings" +msgstr "Einstellungen" + +msgid "Power Off" +msgstr "Herunterfahren" + +msgid "Favorite Apps" +msgstr "Favoriten" + +msgid "General" +msgstr "Allgemein" + +msgid "Default Page:" +msgstr "Startseite:" + +msgid "All" +msgstr "Alle" + +msgid "Developement" +msgstr "Entwicklung" + +msgid "Games" +msgstr "Spiele" + +msgid "Graphics" +msgstr "Grafik" + +msgid "Internet" +msgstr "Internet" + +msgid "Multimedia" +msgstr "Multimedia" + +msgid "Office" +msgstr "Büro" + +msgid "Science & Math" +msgstr "Wissenschaft & Mathematik" + +msgid "System" +msgstr "System" + +msgid "Utilities" +msgstr "Werkzeuge" + +msgid "Lost & Found" +msgstr "Fundsachen" + +msgid "Icon:" +msgstr "Ikone:" + +msgid "Indicator:" +msgstr "Statusanzeige:" + +msgid "Enabled" +msgstr "Eingeschaltet" + +msgid "Indicator Color:" +msgstr "Farbe der Statusanzeige:" + +msgid "Please choose a color" +msgstr "Bitte wählen Sie eine Farbe" + +msgid "Greeting:" +msgstr "Begrüßung:" + +msgid "Custom Greeting Text:" +msgstr "Benutzerdefinierte Begrüßung:" + +msgid "No custom greeting set" +msgstr "Keine Begrüßung gesetzt" + +msgid "Launcher Positioning:" +msgstr "Startmenü Position:" + +msgid "Default" +msgstr "Standard" + +msgid "Horizontal Center" +msgstr "Horizontal zentriert" + +msgid "Screen Center" +msgstr "Bildschirmmitte" + +msgid "Floating" +msgstr "Schwebend" + +msgid "Offset Screen Edge (0 is Default):" +msgstr "Versatz Bildschirmkante (0 ist Standard):" + +msgid "Offset Panel (0 is Default):" +msgstr "Versatz Leiste (0 ist Standard):" + +msgid "All Applications (Default)" +msgstr "Alle Anwendungen (Standard)" + +msgid "Search:" +msgstr "Suche:" + +msgid "Expand search to bookmarks, files and emails" +msgstr "Erweiterte Suche für Lesezeichen, Dateien und E-Mails" + +msgid "Theming:" +msgstr "Thematisierung:" + +msgid "Dark (Default)" +msgstr "Dunkel (Standard)" + +msgid "Light" +msgstr "Hell" + +msgid "Matching" +msgstr "Automatisch anpassend" + +msgid "Search your computer" +msgstr "Computer durchsuchen" diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/fr.po b/kde/plasma/plasmoids/AndromedaLauncher/translate/fr.po new file mode 100644 index 00000000..5fd534e6 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/fr.po @@ -0,0 +1,135 @@ +# Translation of MMcK Launcher in French +# Copyright (C) 2022 +# This file is distributed under the same license as the MMcK Launcher package. +# Augustin Laurent , 2022. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: mmcklauncher\n" +"Report-Msgid-Bugs-To: https://github.com/snoutbug/mmcklauncher\n" +"POT-Creation-Date: 2022-08-07 10:00-0000\n" +"PO-Revision-Date: 2022-08-07 HO:MI+ZONE\n" +"Last-Translator: ugustin Laurent \n" +"Language-Team: French <>\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Settings" +msgstr "Réglages" + +msgid "Power Off" +msgstr "Éteindre" + +msgid "Favorite Apps" +msgstr "Applications préférées" + +msgid "General" +msgstr "Général" + +msgid "Default Page:" +msgstr "Page par défaut:" + +msgid "All" +msgstr "Tout" + +msgid "Developement" +msgstr "Développement" + +msgid "Games" +msgstr "Jeux" + +msgid "Graphics" +msgstr "Graphisme" + +msgid "Internet" +msgstr "Internet" + +msgid "Multimedia" +msgstr "Multimédia" + +msgid "Office" +msgstr "Office" + +msgid "Science & Math" +msgstr "Sciences & Math" + +msgid "System" +msgstr "Système" + +msgid "Utilities" +msgstr "Utilitaires" + +msgid "Lost & Found" +msgstr "Lost & Found" + +msgid "Icon:" +msgstr "Icône:" + +msgid "Indicator:" +msgstr "Indicateur:" + +msgid "Enabled" +msgstr "Activé" + +msgid "Indicator Color:" +msgstr "Couleur de l'indicateur:" + +msgid "Please choose a color" +msgstr "Veuillez choisir une couleur" + +msgid "Greeting:" +msgstr "Message d'acceuil:" + +msgid "Custom Greeting Text:" +msgstr "Texte d'acceuil personnalisé :" + +msgid "No custom greeting set" +msgstr "Aucun message d'accueil personnalisé défini" + +msgid "Launcher Positioning:" +msgstr "Positionnement du lanceur:" + +msgid "Default" +msgstr "Défaut" + +msgid "Horizontal Center" +msgstr "Centre horizontal" + +msgid "Screen Center" +msgstr "Centre de l'écran" + +msgid "Floating" +msgstr "Flottant" + +msgid "Offset Screen Edge (0 is Default):" +msgstr "Décalage par rapport au bord de l'écran (0 est la valeur par défaut):" + +msgid "Offset Panel (0 is Default):" +msgstr "Décalage par rapport à la barre de tâche (0 est la valeur par défaut):" + +msgid "All Applications (Default)" +msgstr "Toutes les applications (par défaut)" + +msgid "Search:" +msgstr "Rechercher:" + +msgid "Expand search to bookmarks, files and emails" +msgstr "Étendre la recherche aux signets, fichiers et e-mails" + +msgid "Theming:" +msgstr "Thème:" + +msgid "Dark (Default)" +msgstr "Dark (Default)" + +msgid "Light" +msgstr "Light" + +msgid "Matching" +msgstr "Correspondant" + +msgid "Search your computer" +msgstr "Rechercher dans votre ordinateur" diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/id.po b/kde/plasma/plasmoids/AndromedaLauncher/translate/id.po new file mode 100644 index 00000000..767ce90e --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/id.po @@ -0,0 +1,135 @@ +# Translation of MMcK Launcher in id +# Copyright (C) 2022 +# This file is distributed under the same license as the MMcK Launcher package. +# Adam Adrian <4.adam.adrian@gmail.com>, 2022. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: mmcklauncher\n" +"Report-Msgid-Bugs-To: https://github.com/snoutbug/mmcklauncher\n" +"POT-Creation-Date: 2022-03-07 20:42-0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Adam Adrian <4.adam.adrian@gmail.com>\n" +"Language-Team: Indonesia <>\n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Settings" +msgstr "Pengaturan" + +msgid "Power Off" +msgstr "Matikan Daya" + +msgid "Favorite Apps" +msgstr "Aplikasi Favorit" + +msgid "General" +msgstr "Umum" + +msgid "Default Page:" +msgstr "Halaman Bawaan" + +msgid "All" +msgstr "Semua" + +msgid "Developement" +msgstr "Pengembangan" + +msgid "Games" +msgstr "Permainan" + +msgid "Graphics" +msgstr "Grafis" + +msgid "Internet" +msgstr "Intenet" + +msgid "Multimedia" +msgstr "Multimedia" + +msgid "Office" +msgstr "Kantor" + +msgid "Science & Math" +msgstr "Sains & Matematika" + +msgid "System" +msgstr "Sistem" + +msgid "Utilities" +msgstr "Alat" + +msgid "Lost & Found" +msgstr "Hilang & Ditemukan" + +msgid "Icon:" +msgstr "Ikon:" + +msgid "Indicator:" +msgstr "Indkator:" + +msgid "Enabled" +msgstr "Diaktifkan" + +msgid "Indicator Color:" +msgstr "Warna Indikator" + +msgid "Please choose a color" +msgstr "Silahkan pilih sebuah warna" + +msgid "Greeting:" +msgstr "Sapaan:" + +msgid "Custom Greeting Text:" +msgstr "Teks Sapaan Kustom:" + +msgid "No custom greeting set" +msgstr "Tidak ada spaan kustom yang diatur" + +msgid "Launcher Positioning:" +msgstr "Pemosisian Peluncur:" + +msgid "Default" +msgstr "Default" + +msgid "Horizontal Center" +msgstr "Tengah Horizontal" + +msgid "Screen Center" +msgstr "Di Tengah Layar" + +msgid "Floating" +msgstr "Mengambang" + +msgid "Offset Screen Edge (0 is Default):" +msgstr "Offset Tepian Layar (0 = Default)" + +msgid "Offset Panel (0 is Default):" +msgstr "Offset Panel (0 = Default)" + +msgid "All Applications (Default)" +msgstr "Semua Aplikasi (Default)" + +msgid "Search:" +msgstr "Cari:" + +msgid "Expand search to bookmarks, files and emails" +msgstr "Luaskan pencaarian ke bookmark, file dan email" + +msgid "Theming:" +msgstr "Tema:" + +msgid "Dark (Default)" +msgstr "Gelap (Default)" + +msgid "Light" +msgstr "Terang" + +msgid "Matching" +msgstr "Cocokkan Tema" + +msgid "Search your computer" +msgstr "Cari di komputermu" diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/merge.sh b/kde/plasma/plasmoids/AndromedaLauncher/translate/merge.sh new file mode 100644 index 00000000..b8ce86e0 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/merge.sh @@ -0,0 +1,229 @@ +#!/bin/sh +# Version: 21 + +# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems +# https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems/Outside_KDE_repositories +# https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh + +DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` +plasmoidName=`kreadconfig5 --file="$DIR/../metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Name"` +widgetName="${plasmoidName##*.}" # Strip namespace +website=`kreadconfig5 --file="$DIR/../metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Website"` +bugAddress="$website" +packageRoot=".." # Root of translatable sources +projectName="plasma_applet_${plasmoidName}" # project name + +#--- +if [ -z "$plasmoidName" ]; then + echo "[merge] Error: Couldn't read plasmoidName." + exit +fi + +if [ -z "$(which xgettext)" ]; then + echo "[merge] Error: xgettext command not found. Need to install gettext" + echo "[merge] Running 'sudo apt install gettext'" + sudo apt install gettext + echo "[merge] gettext installation should be finished. Going back to merging translations." +fi + +#--- +echo "[merge] Extracting messages" +potArgs="--from-code=UTF-8 --width=200 --add-location=file" + +# Note: xgettext v0.20.1 (Kubuntu 20.04) and below will attempt to translate Icon, +# so we need to specify Name, GenericName, Comment, and Keywords. +# https://github.com/Zren/plasma-applet-lib/issues/1 +# https://savannah.gnu.org/support/?108887 +find "${packageRoot}" -name '*.desktop' | sort > "${DIR}/infiles.list" +xgettext \ + ${potArgs} \ + --files-from="${DIR}/infiles.list" \ + --language=Desktop \ + -k -kName -kGenericName -kComment -kKeywords \ + -D "${packageRoot}" \ + -D "${DIR}" \ + -o "template.pot.new" \ + || \ + { echo "[merge] error while calling xgettext. aborting."; exit 1; } + +sed -i 's/"Content-Type: text\/plain; charset=CHARSET\\n"/"Content-Type: text\/plain; charset=UTF-8\\n"/' "template.pot.new" + +# See Ki18n's extract-messages.sh for a full example: +# https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh#L25 +# The -kN_ and -kaliasLocale keywords are mentioned in the Outside_KDE_repositories wiki. +# We don't need -kN_ since we don't use intltool-extract but might as well keep it. +# I have no idea what -kaliasLocale is used for. Googling aliasLocale found only listed kde1 code. +# We don't need to parse -ki18nd since that'll extract messages from other domains. +find "${packageRoot}" -name '*.cpp' -o -name '*.h' -o -name '*.c' -o -name '*.qml' -o -name '*.js' | sort > "${DIR}/infiles.list" +xgettext \ + ${potArgs} \ + --files-from="${DIR}/infiles.list" \ + -C -kde \ + -ci18n \ + -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 \ + -kki18n:1 -kki18nc:1c,2 -kki18np:1,2 -kki18ncp:1c,2,3 \ + -kxi18n:1 -kxi18nc:1c,2 -kxi18np:1,2 -kxi18ncp:1c,2,3 \ + -kkxi18n:1 -kkxi18nc:1c,2 -kkxi18np:1,2 -kkxi18ncp:1c,2,3 \ + -kI18N_NOOP:1 -kI18NC_NOOP:1c,2 \ + -kI18N_NOOP2:1c,2 -kI18N_NOOP2_NOSTRIP:1c,2 \ + -ktr2i18n:1 -ktr2xi18n:1 \ + -kN_:1 \ + -kaliasLocale \ + --package-name="${widgetName}" \ + --msgid-bugs-address="${bugAddress}" \ + -D "${packageRoot}" \ + -D "${DIR}" \ + --join-existing \ + -o "template.pot.new" \ + || \ + { echo "[merge] error while calling xgettext. aborting."; exit 1; } + +sed -i 's/# SOME DESCRIPTIVE TITLE./'"# Translation of ${widgetName} in LANGUAGE"'/' "template.pot.new" +sed -i 's/# Copyright (C) YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/'"# Copyright (C) $(date +%Y)"'/' "template.pot.new" + +if [ -f "template.pot" ]; then + newPotDate=`grep "POT-Creation-Date:" template.pot.new | sed 's/.\{3\}$//'` + oldPotDate=`grep "POT-Creation-Date:" template.pot | sed 's/.\{3\}$//'` + sed -i 's/'"${newPotDate}"'/'"${oldPotDate}"'/' "template.pot.new" + changes=`diff "template.pot" "template.pot.new"` + if [ ! -z "$changes" ]; then + # There's been changes + sed -i 's/'"${oldPotDate}"'/'"${newPotDate}"'/' "template.pot.new" + mv "template.pot.new" "template.pot" + + addedKeys=`echo "$changes" | grep "> msgid" | cut -c 9- | sort` + removedKeys=`echo "$changes" | grep "< msgid" | cut -c 9- | sort` + echo "" + echo "Added Keys:" + echo "$addedKeys" + echo "" + echo "Removed Keys:" + echo "$removedKeys" + echo "" + + else + # No changes + rm "template.pot.new" + fi +else + # template.pot didn't already exist + mv "template.pot.new" "template.pot" +fi + +potMessageCount=`expr $(grep -Pzo 'msgstr ""\n(\n|$)' "template.pot" | grep -c 'msgstr ""')` +echo "| Locale | Lines | % Done|" > "./Status.md" +echo "|----------|---------|-------|" >> "./Status.md" +entryFormat="| %-8s | %7s | %5s |" +templateLine=`perl -e "printf(\"$entryFormat\", \"Template\", \"${potMessageCount}\", \"\")"` +echo "$templateLine" >> "./Status.md" + +rm "${DIR}/infiles.list" +echo "[merge] Done extracting messages" + +#--- +echo "[merge] Merging messages" +catalogs=`find . -name '*.po' | sort` +for cat in $catalogs; do + echo "[merge] $cat" + catLocale=`basename ${cat%.*}` + + widthArg="" + catUsesGenerator=`grep "X-Generator:" "$cat"` + if [ -z "$catUsesGenerator" ]; then + widthArg="--width=400" + fi + + cp "$cat" "$cat.new" + sed -i 's/"Content-Type: text\/plain; charset=CHARSET\\n"/"Content-Type: text\/plain; charset=UTF-8\\n"/' "$cat.new" + + msgmerge \ + ${widthArg} \ + --add-location=file \ + --no-fuzzy-matching \ + -o "$cat.new" \ + "$cat.new" "${DIR}/template.pot" + + sed -i 's/# SOME DESCRIPTIVE TITLE./'"# Translation of ${widgetName} in ${catLocale}"'/' "$cat.new" + sed -i 's/# Translation of '"${widgetName}"' in LANGUAGE/'"# Translation of ${widgetName} in ${catLocale}"'/' "$cat.new" + sed -i 's/# Copyright (C) YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/'"# Copyright (C) $(date +%Y)"'/' "$cat.new" + + poEmptyMessageCount=`expr $(grep -Pzo 'msgstr ""\n(\n|$)' "$cat.new" | grep -c 'msgstr ""')` + poMessagesDoneCount=`expr $potMessageCount - $poEmptyMessageCount` + poCompletion=`perl -e "printf(\"%d\", $poMessagesDoneCount * 100 / $potMessageCount)"` + poLine=`perl -e "printf(\"$entryFormat\", \"$catLocale\", \"${poMessagesDoneCount}/${potMessageCount}\", \"${poCompletion}%\")"` + echo "$poLine" >> "./Status.md" + + # mv "$cat" "$cat.old" + mv "$cat.new" "$cat" +done +echo "[merge] Done merging messages" + +#--- +echo "[merge] Updating .desktop file" + +# Generate LINGUAS for msgfmt +if [ -f "$DIR/LINGUAS" ]; then + rm "$DIR/LINGUAS" +fi +touch "$DIR/LINGUAS" +for cat in $catalogs; do + catLocale=`basename ${cat%.*}` + echo "${catLocale}" >> "$DIR/LINGUAS" +done + +cp -f "$DIR/../metadata.desktop" "$DIR/template.desktop" +sed -i '/^Name\[/ d; /^GenericName\[/ d; /^Comment\[/ d; /^Keywords\[/ d' "$DIR/template.desktop" + +msgfmt \ + --desktop \ + --template="$DIR/template.desktop" \ + -d "$DIR/" \ + -o "$DIR/new.desktop" + +# Delete empty msgid messages that used the po header +if [ ! -z "$(grep '^Name=$' "$DIR/new.desktop")" ]; then + echo "[merge] Name in metadata.desktop is empty!" + sed -i '/^Name\[/ d' "$DIR/new.desktop" +fi +if [ ! -z "$(grep '^GenericName=$' "$DIR/new.desktop")" ]; then + echo "[merge] GenericName in metadata.desktop is empty!" + sed -i '/^GenericName\[/ d' "$DIR/new.desktop" +fi +if [ ! -z "$(grep '^Comment=$' "$DIR/new.desktop")" ]; then + echo "[merge] Comment in metadata.desktop is empty!" + sed -i '/^Comment\[/ d' "$DIR/new.desktop" +fi +if [ ! -z "$(grep '^Keywords=$' "$DIR/new.desktop")" ]; then + echo "[merge] Keywords in metadata.desktop is empty!" + sed -i '/^Keywords\[/ d' "$DIR/new.desktop" +fi + +# Place translations at the bottom of the desktop file. +translatedLines=`cat "$DIR/new.desktop" | grep "]="` +if [ ! -z "${translatedLines}" ]; then + sed -i '/^Name\[/ d; /^GenericName\[/ d; /^Comment\[/ d; /^Keywords\[/ d' "$DIR/new.desktop" + if [ "$(tail -c 2 "$DIR/new.desktop" | wc -l)" != "2" ]; then + # Does not end with 2 empty lines, so add an empty line. + echo "" >> "$DIR/new.desktop" + fi + echo "${translatedLines}" >> "$DIR/new.desktop" +fi + +# Cleanup +mv "$DIR/new.desktop" "$DIR/../metadata.desktop" +rm "$DIR/template.desktop" +rm "$DIR/LINGUAS" + +#--- +# Populate ReadMe.md +echo "[merge] Updating translate/ReadMe.md" +sed -i -E 's`share\/plasma\/plasmoids\/(.+)\/translate`share/plasma/plasmoids/'"${plasmoidName}"'/translate`' ./ReadMe.md +if [[ "$website" == *"github.com"* ]]; then + sed -i -E 's`\[new issue\]\(https:\/\/github\.com\/(.+)\/(.+)\/issues\/new\)`[new issue]('"${website}"'/issues/new)`' ./ReadMe.md +fi +sed -i '/^|/ d' ./ReadMe.md # Remove status table from ReadMe +cat ./Status.md >> ./ReadMe.md +rm ./Status.md + +echo "[merge] Done" + diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/nl.po b/kde/plasma/plasmoids/AndromedaLauncher/translate/nl.po new file mode 100644 index 00000000..4814d11e --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/nl.po @@ -0,0 +1,136 @@ +# Translation of MMcK Launcher in LANGUAGE +# Copyright (C) 2022 +# This file is distributed under the same license as the MMcK Launcher package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: mmcklauncher\n" +"Report-Msgid-Bugs-To: https://github.com/snoutbug/mmcklauncher\n" +"POT-Creation-Date: 2022-03-07 20:42-0000\n" +"PO-Revision-Date: 2022-03-08 13:20+0100\n" +"Last-Translator: Heimen Stoffels \n" +"Language-Team: \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +msgid "Settings" +msgstr "Instellingen" + +msgid "Power Off" +msgstr "Uitschakelen" + +msgid "Favorite Apps" +msgstr "Favorieten" + +msgid "General" +msgstr "Algemeen" + +msgid "Default Page:" +msgstr "Startpagina:" + +msgid "All" +msgstr "Alles" + +msgid "Developement" +msgstr "Ontwikkeling" + +msgid "Games" +msgstr "Games" + +msgid "Graphics" +msgstr "Grafisch" + +msgid "Internet" +msgstr "Internet" + +msgid "Multimedia" +msgstr "Multimedia" + +msgid "Office" +msgstr "Kantoor" + +msgid "Science & Math" +msgstr "Wetenschap" + +msgid "System" +msgstr "Systeem" + +msgid "Utilities" +msgstr "Hulpmiddelen" + +msgid "Lost & Found" +msgstr "Overig" + +msgid "Icon:" +msgstr "Pictogram:" + +msgid "Indicator:" +msgstr "Indicator:" + +msgid "Enabled" +msgstr "Ingeschakeld" + +msgid "Indicator Color:" +msgstr "Indicatorkleur:" + +msgid "Please choose a color" +msgstr "Kies een kleur" + +msgid "Greeting:" +msgstr "Begroeting:" + +msgid "Custom Greeting Text:" +msgstr "Eigen tekst:" + +msgid "No custom greeting set" +msgstr "Geen eigen tekst ingesteld" + +msgid "Launcher Positioning:" +msgstr "Startmenu openen op locatie:" + +msgid "Default" +msgstr "Standaard" + +msgid "Horizontal Center" +msgstr "Midden (horizontaal)" + +msgid "Screen Center" +msgstr "Midden van scherm" + +msgid "Floating" +msgstr "Zweven" + +msgid "Offset Screen Edge (0 is Default):" +msgstr "Ruimte vanaf schermrand (standaard: 0)" + +msgid "Offset Panel (0 is Default):" +msgstr "Ruimte vanaf paneel (standaard: 0)" + +msgid "All Applications (Default)" +msgstr "Alle programma's (standaard)" + +msgid "Search:" +msgstr "Zoeken:" + +msgid "Expand search to bookmarks, files and emails" +msgstr "Ook bladwijzers, bestanden en e-mails doorzoeken" + +msgid "Theming:" +msgstr "Thema:" + +msgid "Dark (Default)" +msgstr "Donker (standaard)" + +msgid "Light" +msgstr "Licht" + +msgid "Matching" +msgstr "Systeemthema" + +msgid "Search your computer" +msgstr "Doorzoek je computer" diff --git a/kde/plasma/plasmoids/AndromedaLauncher/translate/template.pot b/kde/plasma/plasmoids/AndromedaLauncher/translate/template.pot new file mode 100644 index 00000000..53c62d15 --- /dev/null +++ b/kde/plasma/plasmoids/AndromedaLauncher/translate/template.pot @@ -0,0 +1,135 @@ +# Translation of MMcK Launcher in LANGUAGE +# Copyright (C) 2022 +# This file is distributed under the same license as the MMcK Launcher package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: mmcklauncher\n" +"Report-Msgid-Bugs-To: https://github.com/snoutbug/mmcklauncher\n" +"POT-Creation-Date: 2022-03-07 20:42-0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "Settings" +msgstr "" + +msgid "Power Off" +msgstr "" + +msgid "Favorite Apps" +msgstr "" + +msgid "General" +msgstr "" + +msgid "Default Page:" +msgstr "" + +msgid "All" +msgstr "" + +msgid "Developement" +msgstr "" + +msgid "Games" +msgstr "" + +msgid "Graphics" +msgstr "" + +msgid "Internet" +msgstr "" + +msgid "Multimedia" +msgstr "" + +msgid "Office" +msgstr "" + +msgid "Science & Math" +msgstr "" + +msgid "System" +msgstr "" + +msgid "Utilities" +msgstr "" + +msgid "Lost & Found" +msgstr "" + +msgid "Icon:" +msgstr "" + +msgid "Indicator:" +msgstr "" + +msgid "Enabled" +msgstr "" + +msgid "Indicator Color:" +msgstr "" + +msgid "Please choose a color" +msgstr "" + +msgid "Greeting:" +msgstr "" + +msgid "Custom Greeting Text:" +msgstr "" + +msgid "No custom greeting set" +msgstr "" + +msgid "Launcher Positioning:" +msgstr "" + +msgid "Default" +msgstr "" + +msgid "Horizontal Center" +msgstr "" + +msgid "Screen Center" +msgstr "" + +msgid "Floating" +msgstr "" + +msgid "Offset Screen Edge (0 is Default):" +msgstr "" + +msgid "Offset Panel (0 is Default):" +msgstr "" + +msgid "All Applications (Default)" +msgstr "" + +msgid "Search:" +msgstr "" + +msgid "Expand search to bookmarks, files and emails" +msgstr "" + +msgid "Theming:" +msgstr "" + +msgid "Dark (Default)" +msgstr "" + +msgid "Light" +msgstr "" + +msgid "Matching" +msgstr "" + +msgid "Search your computer" +msgstr "" diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/config.qml b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/config.qml new file mode 100644 index 00000000..7253f1c1 --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/config.qml @@ -0,0 +1,10 @@ +import QtQuick 2.12 +import org.kde.plasma.configuration 2.0 + +ConfigModel { + ConfigCategory { + name: i18n("General") + icon: "preferences-desktop" + source: "GeneralConfig.qml" + } +} \ No newline at end of file diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/main.xml b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/main.xml new file mode 100644 index 00000000..8f027ae4 --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/config/main.xml @@ -0,0 +1,23 @@ + + + + + + + 100 + + + + @multiplex + + + + "Noto Sans" + + + + + diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/fonts/Aller_Bd.ttf b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/fonts/Aller_Bd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b0513c46abdd613c3548d4023c6afe2670e440f4 GIT binary patch literal 128368 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

m8v5B&%2{;tD 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 U7?r8Mp-s zx6d5L8Dk#&DPxJ1GZSNP#A`p!_)G6+ED#!7yJqIUR(}0f#!jNpd5@0G%noP1`lT}& zKm0gjgO9A*Ff(qy{v)4d{PQ1XOx(F#QWFd{lq!D z4(%IiojixJ7t4_M@{z-DJ3o2d-Ct$wSFZscuQ7rZu63^Wx9o8CzRD`J-y(;7`-xj^ zGJQJvbYWw`Xt-0mANLj}C>Q_mj&^s!$ijwa@qCNnPFa(BCjW}tCYeL#CGHi^$&N#+=li=w0G~2|V#~3D9zo=uq zd^<~t5UUlv$ak|&9ww6?GdYyjo4Ma%wK{%!GHd>iCvESehGh?gW^T-A3&Wc^o?M>#HFoc ztrGr#J;A?t0rpM_e|O<`++8S$Re*UB_5}a=7vUA%6a432fWMq4N@?8G{^At4C)+<& zN_cq~W25oUA|)76KmS=uI81nSsucK*@vIY1quz0h)miv4#`z*rIbNi{#r^Lw2R^`| z9;w7faUAbuFsE1-gqw1006#%?Heroy0G=+RwL?5$?Q&RIYKX zGxRY;>rAG!*0J8?nxB`VpO;}BG#2|*YMa(}if!b7!CIjU>kjD_-p&s4*VqSfe=DvH zxR#3tSZ%S*#c8n*{FOpp`)wi5p2IrSFMbQwe)0MSe$#akn-aIMZo{*f*8`v(2UsWj zSz#mAY(1_Vu5nzGxVGV1~YZ})$u2r~taM5#mM(_6G8pPF#i^|aRQCyVQiK`D6 zES?Abt&wzpmiPtHCG@RJORyHcz3?!86EBeb0O<@bpzM1=dq;4c#!}ivxQ^rZ6)eji zV|Dx`W(SVjK?iDti`9ui(79hTs~Bdj_}%hW;q#Wuy~5UG-fzM+iR%{N!wtZVP58YP z*B*%@e_^NL_s#NB&+fE2 zh<{VwB(7;({kSAg7w<+Lzr}o(v8V_D$M&%n;YZm)^!sJd+4Xof$Qo$;r@R0Yf{TO= z;GqR^#Q?8aj2C0qK7@JQ!4eWSfRlvF#Vkc|0IVtjqaMI-gRGz6I{z}VD4yXe{5P&Y z6=6znU2qXR=UozR)aPQqigQ-1`?sncIe#>VrFkqogLZz6>qWHd=Ig;P)tt`IycRFn z51L=<(P}}Kd-;Vz7sykzU%lvI3X|8LC=a8l@T8(ye8pF zwBbt7nF#v#C9I!UfDgw&o4&+GDNp+vYcurVev;M7%LQ1wfG1TfjVs3c(bs;YkPqKP z>mb|kJ3!-}XXC(`83s{UU1i^dR7?LVk%M1&+sMC%`viL)((VVu2gQfPt@2bhZs+xRM=Z$JjOOo$My|LH1#GJG+B@ zgx$$L%0ABSVxM52WS?Spvrn_nu+Or4*yq^2>|fcxvCp&rU|(ckVqfN`vvb%^woCHW z^BL&{2f!)LWBd6>*;VX)faqcVG5&G3hrNy8!au}6$fx+7>>ztP=J8|f3+xiMgPqAg z%zOAp_y^b->|(wHa{Hz13ie)J&K-OMpXHnR7QT_6#{Qjug5Ag4`5t}&-^F+HPx4Rk zZR`TRiErgQ+2!n7b{TsIyP93kj?EUNye3(zLLwtmfLT0^? zPx5iT0$R$?Q054rXaJPi-+R@4 zB6gzj#O)_Oe&XKOqOXm-QC28O9I64V?`Qvo7DKYd2hrk>WQ#{*e@S=~p+sdOAzSR0 zEuNn^I zU9jY@&0m(kG=J#iV<&I?qarR6 zVoW5(xVS>JiFVN;I>l-+B__lwF)6CVTCqkn##C76&aa`O0-v9sO_WzID|6j#zqGk1k z6WTAuV=M!X@G;PUw6w07_+BxQe~byXqVS6NAMsQ0&6VKVow;^@dyM;iMpMe~bBI(` zlj!W|7r7=*Nqbu$=-{R%o~m*Pzc0`pEdFRi8ByC`b~(qt%j>5O4&-)C)O)I0lSlCHZteY`$!Rt_&7bPq(i^MjSl=BR z>Ta^T$NL)wYJEnlCs1xM`{K2}uCBg#$8h!J`b5`Q2BYDyXFb5)E1rNH!My#PI_P$w zd+E%S$!E5BOeT-T>@$hSs9*WN(qAHkoV68BV=rk|$QBGkq8FMpIZ{=LL-YG$;w7`s zVse-Q+3G-`IvYR-EiQ|_zBU@It^YLDmE3*lyQik!ed(Sg-38Xa{kHAfZ@XyyqWb$$ zbCbxZnq#QhAxyH(HoY!8szv3+cF?57_vyg;i>S7@uMbe&$vvv2-AUYl4|nr3`Tfx0 zZIGOTkde|De^+~3oExiB^*m!TnlfFvU?6BpXL9&~S<7KwF?E?2?d3Ly!R#P-#|-5c zXyxZsR7{7Rw*(?1RElT@F${T?CiF}uuWm*pNB(>)gYZRY)EH>F>p zysyx6xA`jqIw8$dtne;&DH{63R0 zRn@C$et*EP{+51_@QXfn6i)I3m@Hs@l3bJJMZ={?mJVPw!6@(-SjWw``c%vV{+fU$UvSb<-u| zddfGvL;r`qK$d_V_rT!g2KE z7tQ5_5oVv&t3j`%arNNO32`H2Zq}a35f-OYRYt-gnhDiyCr>I64;sD|>&yfvN84A& z43@IUmgTMMy5pXjWi?mvR)Tl==rvXe1p}~An$;TVZLS~hjJs-AwkHO>rgAlnbV2A-ouIdE$`f|X?$?+ zREu4d@rvCm(yMxFYKJ#8bZ+Xe`fIYcDYAYt)t9ZPsPE?9*$-d3-ew7yT?SLj)b4JZ z&(_i(&Yjk`d~n>g3_quP|A+%C>Bx{MyTT!$K4jxoiE*FggugHNc$yd-5WVvR{r;0&!Y;15yy zfLwSn5tKO28?&datdF<$R#vvw_!GI++3f0E!e7%`S=rkfuU~mucKuAav9BuC+Zdi% zKQbE1w1vZMnb4@+pPlH)4!0z1ws?J4s-~|o7;NmTNp;o7ZMH+hc&NVI37 zHe0k76F4Du_jgv-Cjur@AW>i0*-vxRQ}~E*!@eiyh7-3)6J71sKml{aI22Q+0hx+x zg!pkx2scfR@y&BH)40Uk9F%k8sW6z!mYSP$zNO|S*if7s$Phh6r+w|F5RyKgqY20fn~<)Y{~B zRoLHoz0>RV816N>9l>&vVP@I$LgPOXX?`m-ZX^C~l6W$&?i|tUESEISATjwgpy<~8 zCs8&3II6zEJY4Ny zMzf)Dtnq@kH}>|qEyS2irgKoh_Ug1qN1mnxI zk%rZ0^t)>7GLE~}O|6*?H#;27;mp+XRIFpPc0YPiRwlOYjJMZSn#wA&E1J8eJ1T@` z5d4nuV0TVZDY6>FYefaY-XmJ>==n_J*BoMlb zIq(A0l;yvjmkI1nba$b6%;+|oyvDz(B>#d+Wxa(w|1Ro;j!ftvKOV+J(Ehb6I5kvMudxn=c+4 z*bv671SY$?caCK0$9LtjeF6S9Y9{}2i``t-bo%vMXlmSMPuOjC%ZWL6vf7032EYqz zVI9^2Nrh@9xRY-EhZ+^`_2H?u`EI4#7`;~LIr%$_!;}p^%G)Sa>w<63>!X$Ju+J`~ zFYPPoOA=UfZz~wZ3a{`a;0}4nn^MwryIU7vhyqFZ<>%MXYu~MG?oGt9Zp~3%<@3}e zeBx#UO{d}H1C71aPP3shSq5FOHc2#q#yuwc6P+8m8fQeG3=JkuQqUIk@cfeyvmi{I z;FY$Z&EmDpCj|Tm-$6ae-<>~Bsg94&p&iKfCHU&P!9E2+7)|Mw>-CC`7`-O5+emY> z5qAzv!OxgFGEq}Aab&8PF5j>$ z5?Quk`SRIZB$Au8=k^?5x9<8qx!j)X*R4CgCpVB?f8NTK=dH_T*HOA2;=P)C4Q+a8 z<#}VE&Lr^bGB6QqrDD+B>x2BP)#>y)t4F(2k+$*1aBcaBwYnke>Df7wZkX8B8LSE@ z(83swfA*RcxyGJqmnN2RgQkT#W_kv;EDJ-}__aQ84dcE<+=4!sfZ5F$Ib@Rz^rTE_ z^{YNChJd)mVEVDixS=@yV!8+pP32tY+ozzMknSVO?8hH5-GO&Umb$ zI_WKsHS}iJ?JYB!HD}ymE??OZsf|_G-PJ8aO&#lUQMb*RQnbhe9`JL}q5!Z)r$stL zN$GHT<{LB~{t*57hQ8WvA|~Q78ePO$P9CO5SYO*f`-%R{tuHqQMk;u5nfZ)Bz|L(7 zlKzI_rmeH65k{p8ue=hRit5Qv51h8F;>^qWzstLk_u?Pwj)QJYqHfZ~6)7*$4NXzB zxG`w8giH@VNb*e3_y<$iVh!oWs*@Lp8>u!$7cg+nsu6{7!IE@nQN2YvRBa4V{WpHn z7_pcuO?SP^?4@=-XR5SVqo$92RHZs`xI!G0?G;l+B+fheZpxK3q5|XTLi6mtFNZN4~jpS$lhl7`_GMJWdT>AF*d<&v`g8I zl0dSIMg|7H%L$v&D;^jPG>t4rs%$&jdPB7p)Xi+}qP@-CDa6%R3-RFHMi_9)jatfp z)M5Jj+3MXfem;K=?O1g@40=;Gp8CDTZ}$7|8ou%PFr+z7idbF#htw|)8^!B|-;zDc zKsp2*w6S?Hb>d><0_^{D$ zGz5(PH3QAlx%kaDWH&_m%%*VH%<`=VUFm@q{w13C{Ergt(f;kj*M7il1+027_WLk) z2tGxbACT>rB0u;J0i&qt@y{A8qGB*}`LRU*w!ZX;&s65?OJ!GN0|z$6a)Z_?o5g0t zwE5NjJIi4^DKB?qMt3b=wtKR^s&BT@=F8(`L5#Q+8n}v&7ut+KBU=l=)6Ix%@!`7Ol&W-M-zRc|#6iuthuS z>J2bZI}G{dRFcN6vD$)3I56%$#1p_Wfw?W3&dB7dgk}1xW*UMGEvi(p6x4LN0!-=R zN`TQbqZRGISRj1Irm5QTJMPnNTIvQv)>w7gQ&zUa;f!^T)ioq4 zgGO&v#NON;$aF-v9qj0Nuy1Inzkg_`uU(9EX9ltrj(B@bdem*NiDWwbfywrop_WR& zyUc1bI6YoxptZ7LI2*Egl76elX@R{d8%lUg1C8kf=X*NF#yW5j%r^n%e*%sH!*s&$ zCW$SeuiA`U%)n-yR&P=uwI=F26Psq#&9cr^Ut@*(t?(=VZBI?ibHlIb^0^NG##v zH0OyUadGLQ#};HVfrx+!_I0!!L6ph7w&zT^0V%znsu!23UcgjX5wCR!vmuzWM#J7D zHMyw4Vt-Elu)Zr^ZZ_JIR;zHtqT=2~1!d0^Ej!8o2Xj$Qc9i05C@l9%Ck6x_&}4lM z)KWkD%Pw!g_oW|tJORJHxMgR!33UFY{9lTEXH(&C+>W|Qk5{nO<)e8kTd&ye30Q0) zv!RSTQciz;(x=z^!Em%3tju0%$1@>l& zErg{q-5QV9$Nd&tWp#6O^BOhbot=n6ajW00P4SMjU;XCN;NWTVd8;ekj*2S3t19B& zza#%unh@T!ZaUo9lgvLO?|N2G#+R*bDlod6!+k5Fkcu$T`@R_aqq;u0sn|9)VihRH7ciqHTv8_8caMY|Qu*TF^F3XiW{vt}(_ z-5a|rVa)69p6!lCyJwq@?AmpNuH|*(yO%B7JziH#6&`uO6N!F96H>Dsm+V6+BE$uC zOQ?4t!`x(qT#f%aJFFhrHxybHRERblY^}?TcEl9lRB#_nv=LhzK4T(dHoqi+oV8dg zz&%et=*kSVV6FERJd&4G5LK@sWG-rb~gOeH_?&xMvHI=7G3W=8k)R%SER zUe$wGrV>=7BGR^^F4^zXOy*F}uJPf66B*5DHl9pU^Wxu)WmWwf+FM7P0#;LTjwc{0 zB#Mv-(j1e3BVB@N2*1V>aVt)*Z@kA~gW=a~F|1s_U}9T+HSL@nL44!h{Oi;t)&R*u z?*hDGd6p80a!546TOoOuk_Z+nT3wTY(M0d4Kh+qlXiWzN=Ts;}K0t?@^4 z*=V$5yrE?(XdJbacV;4~5P9|Djmf@M4s*29c?A93ZG0p;o zSNRHYJNyoF6mEV*fLi&vK#&BY&clj<_Ltp2!?~f{A919@Cat=qdkiE@GRd8NcPJK` z|6)bdWw3-}w!RV7)&`9IH-PUvdsk5m)X9uK=Nr@{1{(S^$qt{osoC1nJkwXLkSYH{ z*GR@`GV*UxKk`ni)6>3XoW>J|eEny%0a;(CT_qKQ=wTS@gE?gU*j+}5^giSFoi3M4 zuX2n_XLKHFGwMkePC`Ov407B2dVmTG>Vp*swI*RrG6#+4USamyV4}L>T&SI>{e2#{ z*LCSt^jB|VnzTic-@v6WoSNdF%5PD0mu%xF`Ll={wMh*q1B8fk=~tdl(eHT&>hm9c zzuWEe{_3dTQ$B zxz`dj{-*-cXFjEX^t@*{>u+#4%?V#LRZbjJS#DiiF5{DDXp@e0jU3BiEo0Q1ZL zjpt9LZ^fZ=NbQUtDa-$mSI8;6%EiB=@TNRJrZ7p?1$~Qe7JovNC(DuRuCrh3<5(+- z+e3DaN@rP2Lkg0hXQw;wuvgSYqjeSbnFCaRZA%4oxnxB}(rY$XwA51Gftf?qo%Kmq znJZb}S-pDyZqnBr25`=W|X>hyutMMHxY-Ha-90~kjMgFM3 zc+BKQV1h~6-!v(1{CzDorQU-+$G7NXfr6og7udfrAPTpkfk8&rvjcKKLBB)u|5+bH zb9inH;bwgdwlIw|Y)kCltu(=<`cIH`n0D`9J#WCOPa(dGKgb`3zXW5E=C=jjCGwG^ zA#tW^+`()%8}v1V%AJOaW$8duHtP?yhJyUvcE8(F?zFpt_J|`8wmZwcLGq^ywzJT} zz6$?fIaykyy9%}gwbFAW4%5=n-D{si2neiLWfTeGG&|<`(H)-G#b;e&IbvZpH3RRx0zRBD(N4CV?i57W>5 z`PQJfsioN;ZV#)a6CX-t*YqS^W>3&VVR@5%OLwvL*MM%`%sglJ6PLJKt z6SYpc{lT)b2XTGk+Y8M}4}4P79(o9uGArF-ce%^=(I38ALi_AT7x^#BhJGvm%HOn31sf^+h5t%CikSA(KneBm5h*-0 zb16N{3)j=JUrG^it|pTHIuL1+h8PE78+eNMxYR=f!4ZSeR5{+fdKS`z?_f=H*c$gc z-0`ke*^bc^tcbl${c9mG`>xFPCISv`qIb5dW#*42r`_muSnJZ4*#c%;Wlh@Q4>)Y@ z=Cmj5a~P}amGNp{b$7_oP#Nz``&~9y*lBauHTWW)a%0BP(N^0Va@JQSJJUWVFVhSL zgWDf=h7b$muof9CKz zt&Z5T)y*wymnY0dcfesZY?_=}YyD*F?0G{&=gqbj)1K}<*RNf3d{6hXz1Oc@d;K05 z@CjG?d5T{t9)Z2B0ZXL`0&~&IkkezUK$;{{mh5d(_~gTmT6f<{U!vAq(ctgsh;;@L zDmRo`w>CPP-Z-;+x}wnu1Atba4#k`Xt?Wl_jTVzRWj9(@PUK%P*m{SD$27=H6u*(f z4x(!Qd&HjZLWT){|AG{LHSEay3--LiCs*`hb;?*DMC$#8?5qJp{Q#eo`gtaKzkqH*lp5~gGX1c_9tRo!=q&s58G~L#g#--wN z1oYA6hy^0MqX}_2EdOoH>uR`CFA?98HiLG55}|`Iex*r#&_f5o@QtQNK9_%1yDZb( znvK@FHIo)?i;k?zHt{oa=F2nFm8qE3V2rzMrrz$x8Q6+Z?<``$E<(M~PlzeWKw6r} z99E*vgzCYfa;Z+f$FMKnSXmxv8OkJ^)8dZ@y-|22jPHSTiMDPQ(|nI^*CyE{M`4G7;Lkikr{@A#w(TLCSf^>nAdJZJ zn+hIb2EJpJ6)8Sh@X)P!Bp-pfX~{v0{>)8EpBa)iW%V0+w83jE6VRo%HmNLK#(w4W z1Ed`DI+|{>R*7UyqHRU~=X6i=-Bx&={{ek=lFl%vF}ndGuO1l9E6ZEg^(5k>=dKS# z%5TP19trU7P|HMH&rC<~WDN{8h*?z8ssx8__8azoK1^$LF@>EU6Z^Y)L{-7B;N*J| zr2*A4C_$&2(IH*Lurw*cl@I~}s(&VC%4iIW^PeD- z`x5z&!z?{Ng3s#BE`fb_U?43F6KG8hGNFV z)#+$7O&9FFe=eNVW`P??8U0KYpyVSgx%f(9Or1%d(%J`uUcZO`2R7W{-{O#_{D1Rk z*(YLRi*#Qf1W2a0e%k_oH8~HrV`yxWcr6oh-5zHTOi?NiNLW=ufc3+ zZ<~748msBwJC^xp5oNqpu0neRt1zHe;ciQA>*Z@t8D|Fk*oT3($pXxF4N8f`4Yt#>0>kWvL3u9j?^Ge?a#0eEB=hn5l9-SMfN`Zrt zrk%eya&8+T#K*rtf4?w4hz^_XCKiU#@imHlD^{NW4ECJlk9s3VuZnn&9`#ooJyzl8XIxd`zlv^-R(g(J<%MFTk)Kjf%uy2K zp?H%yC0ThbN_q;mvk(g=#zA~usw=v$GQiUN_AZ%bu7Znt}+x|(i#w^!HV&hvrD zWDCXQ_=Bm)cr!&O`TV=vu3ba1NmcPqP217>4jG^Xy;9Q-N8=Qy)ORq`9Enk+Qt$o@ z;38v0Bz#FW04^hBp5V1GpWu7#68T2{_~!ZL3683sN8v1_dStAFte=P_a29GE;ULYo z2A@+*`kdw@T9SEmL%c3rc#HB6)DV+9rhPV073|zK(Xb#WO6jqa6g`#d9<6qGoh~cI zQ(=dt2rt_*FtC|oqYzyW$wI}8AO*chg2P?KV`aJ zN%n){WHpr$agyvFWs2@VY+vYHH(Qyi3{}@xhbkI+Q?X(RqIBY2iuxsfq0}c)m(+$WG+&W92Te19j~ZNMM8;eRdudod8WBJ zkR5Bum(y?nV-i^F`w;i@p#nxOpm_+NW2e zJJky_+M0~-&oz#=M<|3M)#VoM_5k86YO+38Z7mj& zlb@wKiJh z@t&s0>@%Qj5 zlA#rtPZi@pc(fAZ03MP0xkUbXLrdoKVPa#Y@`Nv{p8ZLc?*w0aUQqpiK!%A86t0lv z;rr&sQofO$_X%0P@H^sbbNPJuCY4`6zF$!NRF9GECw>Q-LOw*d_$6em9!vwIXGoh} zAlzgYRd&8PPg@{}OccR?(%j}t$UGeBO~O*MZ+yGWWt?6ye%{5sn|k1C+|XS!9mYfm zgiN$14%*8N+h$fzubueQcz=7_DS@4gFF5)OvpX&w~Pb90w%WBmHT6| zB9uynDw4&N`-n8$1M`;Su~d04{((M*?^*&OdM6lKCb0 ztMUYARnLB1_EY{Us-GAoaGpdo;4tah6uULgPaP};YY`Mm>=6b|U1X5r0tG7I|37zA z>)|Lr{wIEFj8*lK`mXx8Uzc;0Ub7MT3FGF+T3)9?+ELtZL$Q4h?4`28 z-Uk765l8d8-=ybKr@C^G?4-g=))g6*RbLU6-dBd4Vc_L{GI}HZzO#6ckRlcf3 zG*Sxvn;#xHk5f_XpTQJM*SW$;bUmtfJvJHDiUEPk=Yj?$%;nx3DUVeF)+E<`NakY= zf@cvv4kI7<2m>+A(ceugZs>pHNd-iUk| zKZt!Cyu`B1 z|G8*EShPDTJeqj(;zZvlF4G}nX}Sq-=i)L=uof)UA*{)&xtS#+I_-%dJGs$RirDl8 zDjc55Me8vcGuVy)D3CK=ZZdo9o?LjrT8vIa`6%962H&p$jXBNws z)Bdtj`KNKB0rgYW|7@xJ5B2_&-nUNnpE967?pF1zgG~1)?HJ0Bsr=WCNXb@_7ykub z&?@(GFJ7<7B^NGSk;VOFyff)PU)m`2O%BDKWh!ss{xbgQ{GB4Cmg`Yku1D2hebGu^ zWpTe5zvI$NX>CBJ<*$RDfSQz|HWznF#{MmipDU`1dldmudY~dKr;a3Df|h*dAB2?_ z3WXn|f6Jv^McIHJevgEA;YH-P2$Bn>49zEWn-R&}wUYLz@;}haE18>UkCM3$>E&^9 zOj#r`8M82PIFvtQE7Q~lzpQu$|E;Omv+{TuI>@y{4N ztiWn9l23-3S!kJQLhP36QBDtto-7k$@=a0EJ=7=uUcN>)`&@@JU@feSQG5)3c`3j|z6#fLdh1ma6Jwp(W30C_G8>n5m4?}^fG&NE=P0PbtNFnRv zMTh@B(}HcQ3$_lYf8E9!kzKu zr}acDyJwfjmxl+G!^>zaZi+RSR8C2t73)lf;zr>z&|}y?AnR%8VNUCDk^`dDY8Hsm zi;bd$d`fOL%=79N4WpuL-nOIl=Y%6WMv7tbBfG;DJ0{c?q?4c5gXqQ1H*H25?CoAr zjGQ0H@{JPCu(c(=jnFh=h#@7@KSFiMMF}g} zQu~KNN&lgDlUU#XVR!Mt(-FM6q#ZbA`9JPD-h9Z>wS;+iyV{9N@%v60zYppw-5viV ze*d2h6eiZU5Zu3h#DA*sHLMK0m6-p5b=J`#j2v430Qpep|e$zq^KwEti&c)m?W0w@k5 zJ%6U6RCns#2;6FPI<45-?JjqEZa?+b1ZCO#xTan7kG3dqR@`G=J71>MyHV8U=K=u~ z^LR$>9{dK;K7H@G+`@gMzA<@PsZHEY%kZYwYMjsp&J`!L{U%#}u7`Z52A z#$x=i+(6j2XlKSkAiQ~(#z_?@eA6O8+@!Lvp0{HIIH7!<i<_#~f^feU;7yKf zT48ZoYDW!ieswHT;Hnbg@Ts@i7|e;x5;j%2_XhBmXBEgb-i1Ds4dy914{9$B!5bU` zcr<(^5|j@?22IQIuo58uaT0ZrzsLu`hfVX#lP_JBf0WcQly`uT1Y|vABm#faZ6{DS z5bH(l5~6^=>3mF;C!LbYlb!EoS&u4Dwj5cW7i~F<>wjbruc6&V_45_fPvFsI;KQ^x zIfN4v6qQgeqT)Fk@QHt2*)2sDK`Z(J=wWU\xXqPseMI>H}X)il}?DsF?0 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 + SPDX-FileCopyrightText: 2014 Sebastian Kügler + SPDX-FileCopyrightText: 2014 Kai Uwe Broulik + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Window 2.15 + +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.components 3.0 as PC3 +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.extras as PlasmaExtras + +Item { + id: container + + /** + * Whether the album art image is available or in loading status + */ + readonly property bool hasImage: (pendingImage !== null && (pendingImage.status === Image.Ready || pendingImage.status === Image.Loading)) + || (albumArt.currentItem instanceof Image && albumArt.currentItem.status === Image.Ready) + + readonly property bool animating: exitTransition.running || popExitTransition.running + + /** + * Whether the component is used in the compact representation + */ + property bool inCompactRepresentation: false + + /** + * Provides source item for \ShaderEffectSource + */ + readonly property alias albumArt: albumArt + + property Image pendingImage: null + + onWidthChanged: geometryChangeTimer.restart(); + onHeightChanged: geometryChangeTimer.restart(); + + function loadAlbumArt() { + if (pendingImage !== null) { + pendingImage.destroy(); + pendingImage = null; + } + + if (!root.albumArt) { + albumArt.clear(StackView.PopTransition); + return; + } + + const oldImageRatio = albumArt.currentItem instanceof Image ? albumArt.currentItem.sourceSize.width / albumArt.currentItem.sourceSize.height : 1; + pendingImage = albumArtComponent.createObject(albumArt, { + "source": root.albumArt, + "sourceSize": Qt.size(container.width * Screen.devicePixelRatio, container.height * Screen.devicePixelRatio), + "opacity": 0, + }); + + function replaceWhenLoaded() { + if (pendingImage.status === Image.Loading) { + return; + } + + if (pendingImage.status === Image.Ready) { + const newImageRatio = pendingImage.sourceSize.width / pendingImage.sourceSize.height; + exitTransitionOpacityAnimator.duration = oldImageRatio === newImageRatio ? 0 : PlasmaCore.Units.longDuration; + } else { + // Load placeholder icon, but keep the invalid image to avoid flashing application icons + exitTransitionOpacityAnimator.duration = 0; + } + + albumArt.replace(pendingImage, {}, StackView.ReplaceTransition); + pendingImage.statusChanged.disconnect(replaceWhenLoaded); + pendingImage = null; + } + + pendingImage.statusChanged.connect(replaceWhenLoaded); + replaceWhenLoaded(); + } + + // Reload album art when size of container changes + Timer { + id: geometryChangeTimer + interval: 250 + onTriggered: container.loadAlbumArt(); + } + + StackView { + id: albumArt + + anchors.fill: parent + + readonly property string icon: (mpris2Source.currentData && mpris2Source.currentData["Desktop Icon Name"]) || "media-album-cover" + + replaceEnter: Transition { + OpacityAnimator { + from: 0 + to: 1 + duration: PlasmaCore.Units.longDuration + } + } + + replaceExit: Transition { + id: exitTransition + + SequentialAnimation { + PauseAnimation { + duration: PlasmaCore.Units.longDuration + } + + /** + * If the new ratio and the old ratio are different, + * perform a fade-out animation for the old image + * to prevent it from suddenly disappearing. + */ + OpacityAnimator { + id: exitTransitionOpacityAnimator + from: 1 + to: 0 + duration: 0 + } + } + } + + popExit: Transition { + id: popExitTransition + + OpacityAnimator { + from: 1 + to: 0 + duration: PlasmaCore.Units.longDuration + } + } + + Component { + id: albumArtComponent + + Image { // Album Art + horizontalAlignment: Image.AlignHCenter + verticalAlignment: Image.AlignVCenter + fillMode: Image.PreserveAspectFit + + asynchronous: true + cache: false + + StackView.onRemoved: { + source = ""; // HACK: Reduce memory usage + destroy(); + } + } + } + + Component { + id: fallbackIconItem + + PlasmaCore.IconItem { // Fallback + id: fallbackIcon + + anchors.margins: PlasmaCore.Units.largeSpacing * 2 + opacity: 0 + source: albumArt.icon + + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.OutCubic + property: "opacity" + running: true + target: fallbackIcon + to: 1 + } + } + } + + // "No media playing" placeholder message + Component { + id: placeholderMessage + + // Put PlaceholderMessage in Item so PlaceholderMessage will not fill its parent. + Item { + property alias source: message.iconName + + PlasmaExtras.PlaceholderMessage { + id: message + anchors.centerIn: parent + width: parent.width // For text wrap + iconName: albumArt.icon + text: (root.isPlaying || root.state === "paused") ? i18n("No title") : i18n("No media playing") + } + } + } + + Component { + id: busyComponent + + Item { + PC3.BusyIndicator { + id: busyIndicator + anchors.centerIn: parent + opacity: 0 + } + + NumberAnimation { + duration: PlasmaCore.Units.longDuration + easing.type: Easing.OutCubic + property: "opacity" + running: true + target: busyIndicator + to: 1 + } + } + + } + } + + Loader { + anchors.fill: parent + visible: active + + readonly property bool isLoadingImage: pendingImage !== null && pendingImage.status === Image.Loading + + active: (inCompactRepresentation || Plasmoid.expanded) && (!container.hasImage || isLoadingImage) + asynchronous: true + sourceComponent: root.track ? (isLoadingImage ? busyComponent : fallbackIconItem) : placeholderMessage + } +} + diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/GeneralConfig.qml b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/GeneralConfig.qml new file mode 100644 index 00000000..d8cb2bed --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/GeneralConfig.qml @@ -0,0 +1,96 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.11 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.plasma5support as Plasma5Support + +Item { + id: configRoot + + signal configurationChanged + + property alias cfg_opacity: opacitySpinBox.value + + property string cfg_preferredSource + + property string cfg_fontFamily + + ColumnLayout { + spacing: units.smallSpacing * 2 + + + RowLayout{ + Label { + text: i18n("Opacity percent") + } + SpinBox { + id: opacitySpinBox + from: 0 + to: 100 + } + } + + RowLayout{ + + Label { + text: i18n("Preferred media source") + } + + ListModel { + id: sourcesModel + Component.onCompleted: { + var arr = [] + arr.push({ + "text": cfg_preferredSource + }) + var sources = dataSource.sources + for (var i = 0, j = sources.length; i < j; ++i) { + if (sources[i] === cfg_preferredSource) { + continue + } + arr.push({ + "text": sources[i] + }) + } + append(arr) + } + } + + ComboBox { + id: sourcesComboBox + model: sourcesModel + focus: true + currentIndex: 0 + textRole: "text" + onCurrentIndexChanged: { + var current = model.get(currentIndex) + if (current) { + cfg_preferredSource = current.text + configRoot.configurationChanged() + } + } + } + } + + RowLayout{ + Label { + text: i18n("Font") + } + ComboBox{ + id: fontFamilyComboBox + model: Qt.fontFamilies() + onCurrentIndexChanged: { + var current = Qt.fontFamilies()[currentIndex] + cfg_fontFamily=current + configRoot.configurationChanged() + } + } + } + + } + + Plasma5Support.DataSource { + id: dataSource + engine: "mpris2" + } +} diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/Representation.qml b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/Representation.qml new file mode 100644 index 00000000..a492f411 --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/Representation.qml @@ -0,0 +1,139 @@ +import QtQuick 2.15 +import QtQuick.Layouts 1.11 +import QtQuick.Controls 2.15 +import org.kde.kirigami as Kirigami +import org.kde.plasma.components 3.0 as PlasmaComponents3 +import org.kde.plasma.core as PlasmaCore + +RowLayout { + id: fullView + focus: true + + // loading fonts + + FontLoader { + id: antonio_Bold + source: "../fonts/Antonio-Bold.ttf" + } + FontLoader { + id: aller_Lt + source: "../fonts/Aller_Lt.ttf" + } + FontLoader { + id: aller_Bd + source: "../fonts/Aller_Bd.ttf" + } + + Keys.onReleased: { + if (!event.modifiers) { + event.accepted = true + if (event.key === Qt.Key_Space || event.key === Qt.Key_K) { + root.mediaToggle() + } else if (event.key === Qt.Key_P) { + root.mediaPrev() + } else if (event.key === Qt.Key_N) { + root.mediaNext() + } else { + event.accepted = false + } + } + } + + ColumnLayout { + Layout.fillWidth: true + id: fullwidget + PlasmaComponents3.Label { + id: title + text: track + Layout.fillWidth: true + font.pixelSize: 20 + font.family: aller_Bd.name + // color: "red" + lineHeight: 0.8 + font.bold: true + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideRight + } + Rectangle { + id: separator + height: 1 + // color: "black" + width: !title.height ? title.height/2 : 100 + anchors.horizontalCenter: parent.horizontalCenter + } + + PlasmaComponents3.Label { + font.family: aller_Lt.name + horizontalAlignment: Text.AlignHCenter + anchors.horizontalCenter: parent.horizontalCenter + Layout.maximumWidth: 300 + Layout.fillWidth: true + text: artist + font.pixelSize: 16 + // color: "red" + lineHeight: 0.8 + elide: Text.ElideRight + } + MouseArea { + // Layout.alignment: Qt.AlignRight + id: mediaControlsMouseArea + height: title.height + Layout.fillWidth: true + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + hoverEnabled: true + RowLayout { + id: mediaControls + opacity: mediaControlsMouseArea.containsMouse + anchors.horizontalCenter: parent.horizontalCenter + Behavior on opacity { + PropertyAnimation { + easing.type: Easing.InOutQuad + duration: 250 + } + } + Button { + Layout.preferredWidth: fullwidget.height/2 + Layout.preferredHeight: fullwidget.height/1.5 + contentItem: Kirigami.Icon { + source: "media-skip-backward" + } + padding: 0 + background: null + onClicked: { + root.mediaPrev() + console.log("prev clicked") + } + } + Button { + Layout.preferredWidth: fullwidget.height/2 + Layout.preferredHeight: fullwidget.height/1.5 + id: playButton + contentItem: Kirigami.Icon { + source: root.playbackStatus === 0 ? "media-playback-pause" : "media-playback-start" + } + padding: 0 + background: null + onClicked: { + root.mediaToggle() + console.log("pause clicked") + } + } + Button { + Layout.preferredWidth: fullwidget.height/2 + Layout.preferredHeight: fullwidget.height/1.5 + contentItem: Kirigami.Icon { + source: "media-skip-forward" + } + onClicked: { + root.mediaNext() + console.log(mediaSource.playbackStatus) + console.log("next clicked") + } + padding: 0 + background: null + } + } + } + } +} diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/main.qml b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/main.qml new file mode 100644 index 00000000..679b0702 --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/contents/ui/main.qml @@ -0,0 +1,44 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.11 +import QtQuick.Controls 2.12 +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore +import org.kde.plasma.plasma5support as Plasma5Support +import org.kde.plasma.private.mpris as Mpris + +PlasmoidItem { + id: root + + Layout.minimumWidth: units.gridUnit*25 + Layout.minimumHeight: units.gridUnit*5 + + Plasmoid.backgroundHints: "NoBackground" + + opacity: plasmoid.configuration.opacity/100 + + + Representation { + id: fullView + anchors.fill: parent + } + + + property string artist: mpris2Model.currentPlayer?.artist ?? "" + property string track: mpris2Model.currentPlayer?.track + + + function mediaToggle() { + mpris2Model.currentPlayer.PlayPause(); + } + function mediaPrev() { + mpris2Model.currentPlayer.Previous(); + + } + function mediaNext() { + mpris2Model.currentPlayer.Next(); + } + + Mpris.Mpris2Model { + id: mpris2Model + } +} diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.desktop b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.desktop new file mode 100644 index 00000000..05b7802d --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.desktop @@ -0,0 +1,20 @@ +[Desktop Entry] +Encoding=UTF-8 + +Name=Music Minimal +Comment=minimalist widget, with information about the track being played, based on the NowPlaylis widget by nhilistdev +Icon=applications-multimedia +Type=Service + +X-Plasma-API=declarativeappletscript +X-Plasma-MainScript=ui/main.qml + +X-KDE-PluginInfo-Author=zayronxio and nhilistdev +X-KDE-PluginInfo-Category=Multimedia +X-KDE-PluginInfo-Name=org.kde.MinimalMusic +X-KDE-PluginInfo-License=GPLv3 +X-KDE-PluginInfo-Version=2.0 +X-Plasma-StandAloneApp=true +X-KDE-PluginInfo-Website=https://github.com/zayronxio/MinimalMusic-plasma +X-Plasma-Provides=org.kde.plasma.multimediacontrols +X-KDE-ServiceTypes=Plasma/Applet diff --git a/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.json b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.json new file mode 100644 index 00000000..432f07e0 --- /dev/null +++ b/kde/plasma/plasmoids/org.kde.MinimalMusic.P6/metadata.json @@ -0,0 +1,23 @@ +{ + "KPlugin": { + "Authors": [ + { + "Name": "zayronxio" + } + ], + "Name": "Music Minimal", + "Id": "org.kde.MinimalMusic.P6", + "Description": "minimalist widget, with information about the track being played, based on the NowPlaylis widget by nhilistdev", + "Category": "Multimedia", + "Icon": "applications-multimedia", + "EnabledByDefault": true, + "License": "GPL-3.0+", + "ServiceTypes": [ + "Plasma/Applet" + ], + "Version": "2.0", + "Website": "" + }, + "X-Plasma-API-Minimum-Version": "6.0", + "X-Plasma-MainScript": "ui/main.qml" +} diff --git a/lone-files/plasma-org.kde.plasma.desktop-appletsrc b/lone-files/plasma-org.kde.plasma.desktop-appletsrc index 0a29d7fd..73fef85d 100644 --- a/lone-files/plasma-org.kde.plasma.desktop-appletsrc +++ b/lone-files/plasma-org.kde.plasma.desktop-appletsrc @@ -308,7 +308,7 @@ immutability=1 plugin=org.kde.plasma.cameraindicator [Containments][48][Applets][74][Configuration] -PreloadWeight=55 +PreloadWeight=70 [Containments][48][Applets][75] immutability=1 @@ -325,14 +325,14 @@ immutability=1 plugin=org.kde.plasma.battery [Containments][48][Applets][88][Configuration] -PreloadWeight=97 +PreloadWeight=0 [Containments][48][Applets][89] immutability=1 plugin=org.kde.plasma.brightness [Containments][48][Applets][89][Configuration] -PreloadWeight=34 +PreloadWeight=0 [Containments][48][Applets][91] immutability=1 @@ -342,17 +342,17 @@ plugin=org.kde.plasma.bluetooth PreloadWeight=44 [Containments][48][ConfigDialog] -DialogHeight=540 -DialogWidth=720 +DialogHeight=570 +DialogWidth=760 [Containments][48][Configuration] PreloadWeight=26 [Containments][48][General] extraItems=org.kde.plasma.clipboard,org.kde.plasma.devicenotifier,org.kde.plasma.notifications,org.kde.plasma.volume,org.kde.plasma.cameraindicator,org.kde.plasma.printmanager,org.kde.plasma.battery,org.kde.plasma.bluetooth,org.kde.plasma.brightness -hiddenItems=chrome_status_icon_1,org.kde.plasma.printmanager,org.kde.plasma.brightness +hiddenItems=org.kde.plasma.printmanager,org.kde.plasma.brightness knownItems=org.kde.plasma.battery,org.kde.plasma.clipboard,org.kde.plasma.devicenotifier,org.kde.plasma.manage-inputmethod,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardlayout,org.kde.plasma.volume,org.kde.plasma.networkmanagement,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.kscreen,org.kde.plasma.vault,org.kde.plasma.brightness,org.kde.plasma.cameraindicator,org.kde.plasma.printmanager -shownItems=vlc,org.kde.plasma.volume,org.kde.plasma.clipboard,org.kde.plasma.devicenotifier,org.kde.plasma.battery,org.kde.plasma.cameraindicator,steam +shownItems=vlc,org.kde.plasma.volume,org.kde.plasma.clipboard,org.kde.plasma.devicenotifier,org.kde.plasma.battery,org.kde.plasma.cameraindicator,steam,revolt-desktop1,chrome_status_icon_1 [Containments][8] activityId= @@ -487,10 +487,10 @@ PreloadWeight=18 extraItems=org.kde.plasma.battery,org.kde.plasma.clipboard,org.kde.plasma.devicenotifier,org.kde.plasma.manage-inputmethod,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardlayout,org.kde.plasma.volume,org.kde.plasma.networkmanagement,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.kscreen,org.kde.plasma.vault,org.kde.plasma.brightness,org.kde.plasma.cameraindicator,org.kde.plasma.printmanager knownItems=org.kde.plasma.battery,org.kde.plasma.clipboard,org.kde.plasma.devicenotifier,org.kde.plasma.manage-inputmethod,org.kde.plasma.mediacontroller,org.kde.plasma.notifications,org.kde.plasma.keyboardlayout,org.kde.plasma.volume,org.kde.plasma.networkmanagement,org.kde.plasma.keyboardindicator,org.kde.plasma.bluetooth,org.kde.kscreen,org.kde.plasma.vault,org.kde.plasma.brightness,org.kde.plasma.cameraindicator,org.kde.plasma.printmanager -[Containments][87] -ItemGeometries-1600x900= +[Containments][88] +ItemGeometries-2560x1440= ItemGeometriesHorizontal= -activityId=6e15e692-c8e1-41eb-a913-fc1802af9796 +activityId=d7d15086-7d92-470b-924f-df8f497fbac9 formfactor=0 immutability=1 lastScreen=0 @@ -498,6 +498,23 @@ location=0 plugin=org.kde.plasma.folder wallpaperplugin=org.kde.image +[Containments][88][General] +ToolBoxButtonState=topcenter +ToolBoxButtonX=586 + +[Containments][89] +activityId=d7d15086-7d92-470b-924f-df8f497fbac9 +formfactor=0 +immutability=1 +lastScreen=1 +location=0 +plugin=org.kde.plasma.folder +wallpaperplugin=org.kde.image + +[Containments][89][ConfigDialog] +DialogHeight=570 +DialogWidth=760 + [ScreenMapping] itemsOnDisabledScreens= screenMapping= diff --git a/qt6ct/qt6ct.conf b/qt6ct/qt6ct.conf index c3cc462c..48d85590 100644 --- a/qt6ct/qt6ct.conf +++ b/qt6ct/qt6ct.conf @@ -1,13 +1,13 @@ [Appearance] color_scheme_path=/usr/share/qt6ct/colors/airy.conf custom_palette=false -icon_theme=BeautySolar +icon_theme=TokyoNight-SE standard_dialogs=default style=kvantum-dark [Fonts] -fixed="Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" -general="Sans Serif,9,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" +fixed="Jost,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" +general="Jost,10,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" [Interface] activate_item_on_single_click=1 @@ -25,7 +25,7 @@ underline_shortcut=0 wheel_scroll_lines=3 [SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3\x96\0\0\x3\xeb\0\0\0\0\0\0\0\0\0\0\x3\x96\0\0\x3\xeb\0\0\0\x1\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x3\x96\0\0\x3\xeb) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x5s\0\0\0\0\0\0\0\0\0\0\x4\xff\0\0\x5\x9f\0\0\0\0\x2\0\0\0\n\0\0\0\0\0\0\0\0\0\0\0\x4\xe2\0\0\x5s) [Troubleshooting] force_raster_widgets=1