Update
|
|
@ -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.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 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.
|
||||||
|
|
@ -0,0 +1,181 @@
|
||||||
|
/*
|
||||||
|
SPDX-FileCopyrightText: 2013 Aurélien Gâteau <agateau@kde.org>
|
||||||
|
SPDX-FileCopyrightText: 2013-2015 Eike Hein <hein@kde.org>
|
||||||
|
SPDX-FileCopyrightText: 2017 Ivan Cukic <ivan.cukic@kde.org>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2014 by Eike Hein <hein@kde.org> *
|
||||||
|
* *
|
||||||
|
* 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: "config/ConfigGeneral.qml"
|
||||||
|
}
|
||||||
|
ConfigCategory {
|
||||||
|
name: i18n("Lists and grids")
|
||||||
|
icon: "view-list-details"
|
||||||
|
source: "config/ListAndGrid.qml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
|
||||||
|
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
|
||||||
|
<kcfgfile name=""/>
|
||||||
|
|
||||||
|
<group name="General">
|
||||||
|
<entry name="icon" type="String">
|
||||||
|
<label>The name of the icon to use for the compact representation (e.g. on a small panel).</label>
|
||||||
|
<default>start-here-kde-symbolic</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="useCustomButtonImage" type="Bool">
|
||||||
|
<label>Whether to use a custom image instead of an icon in the compact representation (e.g. on a small panel).</label>
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="customButtonImage" type="Url">
|
||||||
|
<label>The URL of the custtom image to use instead of an icon in the compact representation (e.g. on a small panel).</label>
|
||||||
|
<default></default>
|
||||||
|
</entry>
|
||||||
|
<entry name="activationIndicator" type="Bool">
|
||||||
|
<label>Shows an indicator underneath the launcher's icon when the launcher is opened.</label>
|
||||||
|
<default>true</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="indicatorColor" type="Color">
|
||||||
|
<label>Color of the indicator.</label>
|
||||||
|
<default>#2164C9</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="enableGreeting" type="Bool">
|
||||||
|
<label>Enable the greeting.</label>
|
||||||
|
<default>true</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="pinnedModel" type="Int">
|
||||||
|
<label>Main applications Page</label>
|
||||||
|
<default>0</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="defaultPage" type="Int">
|
||||||
|
<label>Default Page</label>
|
||||||
|
<default>0</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="customGreeting" type="String">
|
||||||
|
<label>Custom greeting Text</label>
|
||||||
|
<default></default>
|
||||||
|
</entry>
|
||||||
|
<entry name="launcherPosition" type="Int">
|
||||||
|
<label>Where is the launcher supposed to open? 1: Auto (Bottom or Top panel) 2: Bottom or top center 3: Screen center</label>
|
||||||
|
<default>0</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="floating" type="Bool">
|
||||||
|
<label>Gives the launcher some breathing room.</label>
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="enableGlow" type="Bool">
|
||||||
|
<label>Gives the launcher elements some glow.</label>
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="glowColor" type="Int">
|
||||||
|
<label>Color of the glow</label>
|
||||||
|
<default>0</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="compactListItems" type="Bool">
|
||||||
|
<label>Show list items in a compact format</label>
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="showItemsInGrid" type="Bool">
|
||||||
|
<label>Show list items in a compact format</label>
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="extraRunners" type="StringList">
|
||||||
|
<label>The plugin id's of additional KRunner plugins to use. Only used if useExtraRunners is true.</label>
|
||||||
|
<default>shell,bookmarks,baloosearch,locations</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="useSystemFontSettings" type="Bool">
|
||||||
|
<label>Uses system font settings instead of themes's default.</label>
|
||||||
|
<default>false</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="appsIconSize" type="Enum">
|
||||||
|
<label>Favorites apps icon size</label>
|
||||||
|
<default>2</default>
|
||||||
|
</entry>
|
||||||
|
<entry name="numberColumns" type="Int">
|
||||||
|
<label>Number of columns to favorites apps grid</label>
|
||||||
|
<default>6</default>
|
||||||
|
</entry>
|
||||||
|
</group>
|
||||||
|
</kcfg>
|
||||||
|
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
SPDX-FileCopyrightText: 2013 Aurélien Gâteau <agateau@kde.org>
|
||||||
|
SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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.Controls 2.15
|
||||||
|
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: allApps
|
||||||
|
|
||||||
|
property QtObject allAppsModel: rootModel.modelForRow(2)
|
||||||
|
|
||||||
|
property var currentStateIndex: Plasmoid.configuration.defaultPage
|
||||||
|
|
||||||
|
property bool showItemsInGrid: plasmoid.configuration.showItemsInGrid
|
||||||
|
|
||||||
|
property Component preferredAppsViewComponent: showItemsInGrid ? applicationsGridViewComponent : applicationsListViewComponent
|
||||||
|
|
||||||
|
property alias viewItem: appViewLoader.item
|
||||||
|
|
||||||
|
property var appsCategoriesList: {
|
||||||
|
|
||||||
|
var categories = [];
|
||||||
|
var categoryName;
|
||||||
|
var categoryIcon;
|
||||||
|
|
||||||
|
for (var i = 2; i < rootModel.count; 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
|
||||||
|
});
|
||||||
|
}
|
||||||
|
allApps.allAppsModel = rootModel.modelForRow(2)
|
||||||
|
return categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateModels() {
|
||||||
|
allApps.allAppsModel = rootModel.modelForRow(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateShowedModel(index){
|
||||||
|
viewItem.model = rootModel.modelForRow(index);
|
||||||
|
viewItem.currentIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function incrementCurrentStateIndex() {
|
||||||
|
currentStateIndex +=1;
|
||||||
|
if (currentStateIndex > appsCategoriesList.length - 1) {
|
||||||
|
currentStateIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decrementCurrentStateIndex() {
|
||||||
|
currentStateIndex -=1;
|
||||||
|
if (currentStateIndex < 0) {
|
||||||
|
currentStateIndex = appsCategoriesList.length - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetCurrentStateIndex() {
|
||||||
|
currentStateIndex = plasmoid.configuration.defaultPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentCategory(){
|
||||||
|
return appsCategoriesList[currentStateIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
function reset(){
|
||||||
|
currentStateIndex = plasmoid.configuration.defaultPage
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: root
|
||||||
|
function onVisibleChanged() {
|
||||||
|
currentStateIndex = plasmoid.configuration.defaultPage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: appViewLoader
|
||||||
|
// Explicitly set the size of the
|
||||||
|
// Loader to the parent item's size
|
||||||
|
anchors.fill: parent
|
||||||
|
sourceComponent: preferredAppsViewComponent
|
||||||
|
active: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: applicationsListViewComponent
|
||||||
|
AppListView {
|
||||||
|
id: appList
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
showSectionSeparator: false
|
||||||
|
model: allAppsModel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: applicationsGridViewComponent
|
||||||
|
|
||||||
|
AppGridView {
|
||||||
|
id: grid
|
||||||
|
anchors.fill: parent
|
||||||
|
model: allAppsModel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,237 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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
|
||||||
|
|
||||||
|
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 PC3
|
||||||
|
import QtQuick.Layouts 1.15
|
||||||
|
import QtQuick.Controls 2.15
|
||||||
|
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
GridView {
|
||||||
|
id: grid
|
||||||
|
|
||||||
|
property bool movedWithKeyboard: false
|
||||||
|
property bool movedWithWheel: false
|
||||||
|
|
||||||
|
property bool showScrollBar: true
|
||||||
|
readonly property int columns: plasmoid.configuration.numberColumns
|
||||||
|
|
||||||
|
focus: true
|
||||||
|
clip: true
|
||||||
|
currentIndex: count > 0 ? 0 : -1
|
||||||
|
interactive: height < contentHeight
|
||||||
|
reuseItems: true
|
||||||
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
// default keyboard navigation doesn't allow focus reasons to be used
|
||||||
|
// and eats up/down key events when at the beginning or end of the list.
|
||||||
|
keyNavigationEnabled: false
|
||||||
|
keyNavigationWraps: false
|
||||||
|
|
||||||
|
highlightMoveDuration: 0
|
||||||
|
|
||||||
|
cellWidth: root.cellSizeWidth
|
||||||
|
cellHeight: root.cellSizeHeight
|
||||||
|
|
||||||
|
highlight: Highlight {
|
||||||
|
hideBg: plasmoid.configuration.enableGlow
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: FavoriteItem {
|
||||||
|
id: favitem
|
||||||
|
triggerModel: grid.model
|
||||||
|
}
|
||||||
|
|
||||||
|
move: normalTransition
|
||||||
|
moveDisplaced: normalTransition
|
||||||
|
|
||||||
|
Transition {
|
||||||
|
id: normalTransition
|
||||||
|
NumberAnimation {
|
||||||
|
duration: Kirigami.Units.shortDuration
|
||||||
|
properties: "x, y"
|
||||||
|
easing.type: Easing.OutCubic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PC3.ScrollBar.vertical: PC3.ScrollBar {
|
||||||
|
id: verticalScrollBar
|
||||||
|
parent: grid
|
||||||
|
z: 2
|
||||||
|
height: grid.height
|
||||||
|
anchors.right: parent.right
|
||||||
|
visible: grid.showScrollBar
|
||||||
|
}
|
||||||
|
|
||||||
|
Kirigami.WheelHandler {
|
||||||
|
id: wheelHandler
|
||||||
|
target: grid
|
||||||
|
filterMouseEvents: true
|
||||||
|
// `20 * Qt.styleHints.wheelScrollLines` is the default speed.
|
||||||
|
horizontalStepSize: 20 * Qt.styleHints.wheelScrollLines
|
||||||
|
verticalStepSize: 20 * Qt.styleHints.wheelScrollLines
|
||||||
|
|
||||||
|
onWheel: wheel => {
|
||||||
|
grid.movedWithWheel = true
|
||||||
|
grid.movedWithKeyboard = false
|
||||||
|
movedWithWheelTimer.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: root
|
||||||
|
function onVisibleChanged() {
|
||||||
|
if (!root.visible) {
|
||||||
|
grid.currentIndex = 0
|
||||||
|
grid.positionViewAtBeginning()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to block hover events temporarily after using keyboard navigation.
|
||||||
|
// If you have one hand on the touch pad or mouse and another hand on the keyboard,
|
||||||
|
// it's easy to accidentally reset the highlight/focus position to the mouse position.
|
||||||
|
Timer {
|
||||||
|
id: movedWithKeyboardTimer
|
||||||
|
interval: 200
|
||||||
|
onTriggered: grid.movedWithKeyboard = false
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: movedWithWheelTimer
|
||||||
|
interval: 200
|
||||||
|
onTriggered: grid.movedWithWheel = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function focusCurrentItem(event, focusReason) {
|
||||||
|
currentItem.forceActiveFocus(focusReason)
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
|
||||||
|
Keys.onPressed: event => {
|
||||||
|
const targetX = currentItem ? currentItem.x : contentX
|
||||||
|
let targetY = currentItem ? currentItem.y : contentY
|
||||||
|
let targetIndex = currentIndex
|
||||||
|
// supports mirroring
|
||||||
|
const atLeft = currentIndex % columns === (Qt.application.layoutDirection == Qt.RightToLeft ? columns - 1 : 0)
|
||||||
|
// at the beginning of a line
|
||||||
|
const isLeading = currentIndex % columns === 0
|
||||||
|
// at the top of a given column and in the top row
|
||||||
|
const atTop = currentIndex < columns
|
||||||
|
// supports mirroring
|
||||||
|
const atRight = currentIndex % columns === (Qt.application.layoutDirection == Qt.RightToLeft ? 0 : columns - 1)
|
||||||
|
// at the end of a line
|
||||||
|
const isTrailing = currentIndex % columns === columns - 1
|
||||||
|
// at bottom of a given column, not necessarily in the last row
|
||||||
|
let atBottom = currentIndex >= count - columns
|
||||||
|
// Implements the keyboard navigation described in https://www.w3.org/TR/wai-aria-practices-1.2/#grid
|
||||||
|
if (count > 1) {
|
||||||
|
switch (event.key) {
|
||||||
|
case Qt.Key_Left: if (!atLeft && !searchBar.textField.activeFocus) {
|
||||||
|
moveCurrentIndexLeft()
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_H: if (!atLeft && !searchBar.textField.activeFocus && event.modifiers & Qt.ControlModifier) {
|
||||||
|
moveCurrentIndexLeft()
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Up: if (!atTop) {
|
||||||
|
moveCurrentIndexUp()
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_K: if (!atTop && event.modifiers & Qt.ControlModifier) {
|
||||||
|
moveCurrentIndexUp()
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Right: if (!atRight && !searchBar.textField.activeFocus) {
|
||||||
|
moveCurrentIndexRight()
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_L: if (!atRight && !searchBar.textField.activeFocus && event.modifiers & Qt.ControlModifier) {
|
||||||
|
moveCurrentIndexRight()
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Down: if (!atBottom) {
|
||||||
|
moveCurrentIndexDown()
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_J: if (!atBottom && event.modifiers & Qt.ControlModifier) {
|
||||||
|
moveCurrentIndexDown()
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Home: if (event.modifiers === Qt.ControlModifier && currentIndex !== 0) {
|
||||||
|
currentIndex = 0
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} else if (!isLeading) {
|
||||||
|
targetIndex -= currentIndex % columns
|
||||||
|
currentIndex = Math.max(targetIndex, 0)
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_End: if (event.modifiers === Qt.ControlModifier && currentIndex !== count - 1) {
|
||||||
|
currentIndex = count - 1
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} else if (!isTrailing) {
|
||||||
|
targetIndex += columns - 1 - (currentIndex % columns)
|
||||||
|
currentIndex = Math.min(targetIndex, count - 1)
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_PageUp: if (!atTop) {
|
||||||
|
targetY = targetY - height + 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
// TODO: Find a more efficient, but accurate way to do this
|
||||||
|
while (targetIndex === -1) {
|
||||||
|
targetY += 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
}
|
||||||
|
currentIndex = Math.max(targetIndex, 0)
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_PageDown: if (!atBottom) {
|
||||||
|
targetY = targetY + height - 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
// TODO: Find a more efficient, but accurate way to do this
|
||||||
|
while (targetIndex === -1) {
|
||||||
|
targetY -= 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
}
|
||||||
|
currentIndex = Math.min(targetIndex, count - 1)
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Return:
|
||||||
|
/* Fall through*/
|
||||||
|
case Qt.Key_Enter:
|
||||||
|
grid.currentItem.trigger();
|
||||||
|
grid.currentItem.forceActiveFocus(Qt.ShortcutFocusReason);
|
||||||
|
event.accepted = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
movedWithKeyboard = event.accepted
|
||||||
|
if (movedWithKeyboard) {
|
||||||
|
movedWithKeyboardTimer.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,244 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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 PC3
|
||||||
|
import QtQuick.Layouts 1.15
|
||||||
|
import QtQuick.Controls 2.15
|
||||||
|
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listView
|
||||||
|
|
||||||
|
property real availableWidth: listView.width - verticalScrollBar.width
|
||||||
|
|
||||||
|
property bool showSectionSeparator: true
|
||||||
|
|
||||||
|
// This helps to prevent list focus back to cursor position when search changes
|
||||||
|
property var interceptedPosition: null
|
||||||
|
property bool blockingHoverFocus: false
|
||||||
|
|
||||||
|
// This helps to prevent focus getting back to cursor position when navigating through the list
|
||||||
|
property bool movedWithKeyboard: false
|
||||||
|
property bool movedWithWheel: false
|
||||||
|
|
||||||
|
Accessible.role: Accessible.List
|
||||||
|
|
||||||
|
focus: true
|
||||||
|
clip: true
|
||||||
|
currentIndex: count > 0 ? 0 : -1
|
||||||
|
interactive: height < contentHeight
|
||||||
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
// default keyboard navigation doesn't allow focus reasons to be used
|
||||||
|
// and eats up/down key events when at the beginning or end of the list.
|
||||||
|
keyNavigationEnabled: false
|
||||||
|
keyNavigationWraps: false
|
||||||
|
// This is actually needed. The highlight will animate from thin to wide otherwise.
|
||||||
|
highlightResizeDuration: 0
|
||||||
|
highlightMoveDuration: 50
|
||||||
|
highlight: Highlight{}
|
||||||
|
delegate: AppListViewDelegate {
|
||||||
|
triggerModel: listView.model
|
||||||
|
width: listView.availableWidth
|
||||||
|
}
|
||||||
|
|
||||||
|
move: normalTransition
|
||||||
|
moveDisplaced: normalTransition
|
||||||
|
|
||||||
|
Transition {
|
||||||
|
id: normalTransition
|
||||||
|
NumberAnimation {
|
||||||
|
duration: Kirigami.Units.shortDuration
|
||||||
|
properties: "x, y"
|
||||||
|
easing.type: Easing.OutCubic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
property: showSectionSeparator ? "group" : "nosection"
|
||||||
|
criteria: ViewSection.FullString
|
||||||
|
delegate: PlasmaExtras.ListSectionHeader {
|
||||||
|
required property string section
|
||||||
|
width: listView.availableWidth
|
||||||
|
text: section
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PC3.ScrollBar.vertical: PC3.ScrollBar {
|
||||||
|
id: verticalScrollBar
|
||||||
|
parent: listView
|
||||||
|
z: 2
|
||||||
|
height: listView.height
|
||||||
|
anchors.right: parent.right
|
||||||
|
}
|
||||||
|
|
||||||
|
Kirigami.WheelHandler {
|
||||||
|
target: listView
|
||||||
|
filterMouseEvents: true
|
||||||
|
// `20 * Qt.styleHints.wheelScrollLines` is the default speed.
|
||||||
|
horizontalStepSize: 20 * Qt.styleHints.wheelScrollLines
|
||||||
|
verticalStepSize: 20 * Qt.styleHints.wheelScrollLines
|
||||||
|
|
||||||
|
onWheel: wheel => {
|
||||||
|
listView.movedWithWheel = true
|
||||||
|
listView.movedWithKeyboard = false
|
||||||
|
movedWithWheelTimer.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: root
|
||||||
|
function onVisibleChanged() {
|
||||||
|
if (!root.visible) {
|
||||||
|
listView.currentIndex = 0
|
||||||
|
listView.positionViewAtBeginning()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to block hover events temporarily after using keyboard navigation.
|
||||||
|
// If you have one hand on the touch pad or mouse and another hand on the keyboard,
|
||||||
|
// it's easy to accidentally reset the highlight/focus position to the mouse position.
|
||||||
|
Timer {
|
||||||
|
id: movedWithKeyboardTimer
|
||||||
|
interval: 200
|
||||||
|
onTriggered: listView.movedWithKeyboard = false
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: movedWithWheelTimer
|
||||||
|
interval: 200
|
||||||
|
onTriggered: listView.movedWithWheel = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function focusCurrentItem(event, focusReason) {
|
||||||
|
currentItem.forceActiveFocus(focusReason)
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
|
||||||
|
Keys.onPressed: event => {
|
||||||
|
const targetX = currentItem ? currentItem.x : contentX
|
||||||
|
let targetY = currentItem ? currentItem.y : contentY
|
||||||
|
let targetIndex = currentIndex
|
||||||
|
const atFirst = currentIndex === 0
|
||||||
|
const atLast = currentIndex === count - 1
|
||||||
|
if (count >= 1) {
|
||||||
|
switch (event.key) {
|
||||||
|
case Qt.Key_Up: if (!atFirst) {
|
||||||
|
decrementCurrentIndex()
|
||||||
|
|
||||||
|
if (currentItem.isSeparator) {
|
||||||
|
decrementCurrentIndex()
|
||||||
|
}
|
||||||
|
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_K: if (!atFirst && event.modifiers & Qt.ControlModifier) {
|
||||||
|
decrementCurrentIndex()
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Down: if (!atLast) {
|
||||||
|
incrementCurrentIndex()
|
||||||
|
|
||||||
|
if (currentItem.isSeparator) {
|
||||||
|
incrementCurrentIndex()
|
||||||
|
}
|
||||||
|
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_J: if (!atLast && event.modifiers & Qt.ControlModifier) {
|
||||||
|
incrementCurrentIndex()
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Home: if (!atFirst) {
|
||||||
|
currentIndex = 0
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_End: if (!atLast) {
|
||||||
|
currentIndex = count - 1
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_PageUp: if (!atFirst) {
|
||||||
|
targetY = targetY - height + 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
// TODO: Find a more efficient, but accurate way to do this
|
||||||
|
while (targetIndex === -1) {
|
||||||
|
targetY += 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
}
|
||||||
|
currentIndex = Math.max(targetIndex, 0)
|
||||||
|
focusCurrentItem(event, Qt.BacktabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_PageDown: if (!atLast) {
|
||||||
|
targetY = targetY + height - 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
// TODO: Find a more efficient, but accurate way to do this
|
||||||
|
while (targetIndex === -1) {
|
||||||
|
targetY -= 1
|
||||||
|
targetIndex = indexAt(targetX, targetY)
|
||||||
|
}
|
||||||
|
currentIndex = Math.min(targetIndex, count - 1)
|
||||||
|
focusCurrentItem(event, Qt.TabFocusReason)
|
||||||
|
} break
|
||||||
|
case Qt.Key_Return:
|
||||||
|
/* Fall through*/
|
||||||
|
case Qt.Key_Enter:
|
||||||
|
listView.currentItem.trigger();
|
||||||
|
listView.currentItem.forceActiveFocus(Qt.ShortcutFocusReason);
|
||||||
|
event.accepted = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
movedWithKeyboard = event.accepted
|
||||||
|
if (movedWithKeyboard) {
|
||||||
|
movedWithKeyboardTimer.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Connections {
|
||||||
|
target: blockHoverFocusHandler
|
||||||
|
enabled: blockHoverFocusHandler.enabled && !listView.interceptedPosition
|
||||||
|
function onPointChanged() {
|
||||||
|
listView.interceptedPosition = blockHoverFocusHandler.point.position
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: blockHoverFocusHandler
|
||||||
|
enabled: blockHoverFocusHandler.enabled && listView.interceptedPosition && listView.blockingHoverFocus
|
||||||
|
function onPointChanged() {
|
||||||
|
if (blockHoverFocusHandler.point.position === listView.interceptedPosition) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
listView.blockingHoverFocus = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HoverHandler {
|
||||||
|
id: blockHoverFocusHandler
|
||||||
|
enabled: (!listView.interceptedPosition || listView.blockingHoverFocus)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,207 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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 QtQuick.Templates as T
|
||||||
|
import org.kde.plasma.plasmoid
|
||||||
|
|
||||||
|
import "../code/tools.js" as Tools
|
||||||
|
|
||||||
|
T.ItemDelegate {
|
||||||
|
id: allItem
|
||||||
|
|
||||||
|
property bool compact: Plasmoid.configuration.compactListItems
|
||||||
|
|
||||||
|
property int itemHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding)
|
||||||
|
|
||||||
|
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
|
||||||
|
implicitContentWidth + leftPadding + rightPadding)
|
||||||
|
implicitHeight: itemHeight
|
||||||
|
leftPadding: compact ? 5 : 8
|
||||||
|
rightPadding: compact ? 5 : 8
|
||||||
|
bottomPadding: compact ? 5 : 8
|
||||||
|
topPadding: compact ? 5 : 8
|
||||||
|
|
||||||
|
property bool isDraging: false
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: RowLayout {
|
||||||
|
id: row
|
||||||
|
spacing: 8
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: icon
|
||||||
|
implicitWidth: compact ? Kirigami.Units.iconSizes.smallMedium : Kirigami.Units.iconSizes.medium
|
||||||
|
implicitHeight: implicitWidth
|
||||||
|
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
|
||||||
|
|
||||||
|
source: model.decoration // || root.icon.name || root.icon.source
|
||||||
|
}
|
||||||
|
|
||||||
|
GridLayout {
|
||||||
|
id: gridLayout
|
||||||
|
|
||||||
|
// readonly property color textColor: root.iconAndLabelsShouldlookSelected ? Kirigami.Theme.highlightedTextColor : Kirigami.Theme.textColor
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
rows: allItem.compact ? 1 : 2
|
||||||
|
columns: allItem.compact ? 2 : 1
|
||||||
|
rowSpacing: 0
|
||||||
|
columnSpacing: Kirigami.Units.largeSpacing
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: label
|
||||||
|
Layout.fillWidth: !descriptionLabel.visible
|
||||||
|
Layout.maximumWidth: allItem.width - allItem.leftPadding - allItem.rightPadding - icon.width - row.spacing
|
||||||
|
// Layout.preferredHeight: {
|
||||||
|
// if (root.isCategoryListItem) {
|
||||||
|
// return root.compact ? implicitHeight : Math.round(implicitHeight * 1.5);
|
||||||
|
// }
|
||||||
|
// if (!root.compact && !descriptionLabel.visible) {
|
||||||
|
// return implicitHeight + descriptionLabel.implicitHeight
|
||||||
|
// }
|
||||||
|
// return implicitHeight;
|
||||||
|
// }
|
||||||
|
text: ("name" in model ? model.name : model.display)
|
||||||
|
textFormat: Text.PlainText
|
||||||
|
elide: Text.ElideRight
|
||||||
|
wrapMode: Text.NoWrap
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
// maximumLineCount: root.isMultilineText ? Infinity : 1
|
||||||
|
color: main.textColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: descriptionLabel
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: text
|
||||||
|
// {
|
||||||
|
// let isApplicationSearchResult = root.model?.group === "Applications" || root.model?.group === "System Settings"
|
||||||
|
// let isSearchResultWithDescription = root.isSearchResult && (Plasmoid.configuration?.appNameFormat > 1 || !isApplicationSearchResult)
|
||||||
|
// return text.length > 0 && (isSearchResultWithDescription || (text !== label.text && !root.isCategoryListItem && Plasmoid.configuration?.appNameFormat > 1))
|
||||||
|
// }
|
||||||
|
opacity: 0.75
|
||||||
|
text: model.description
|
||||||
|
textFormat: Text.PlainText
|
||||||
|
font: Kirigami.Theme.smallFont
|
||||||
|
elide: Text.ElideRight
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
horizontalAlignment: allItem.compact ? Text.AlignRight : Text.AlignLeft
|
||||||
|
maximumLineCount: 1
|
||||||
|
color: main.textColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: ma
|
||||||
|
anchors.fill: parent
|
||||||
|
z: parent.z + 1
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
hoverEnabled: !listView.movedWithWheel && !listView.blockingHoverFocus
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
onEntered: {
|
||||||
|
// - When the movedWithKeyboard condition is broken, we do not want to
|
||||||
|
// select the hovered item without moving the mouse.
|
||||||
|
// - Don't highlight separators.
|
||||||
|
// - Don't switch category items on hover if the setting isn't enabled
|
||||||
|
if (listView.movedWithKeyboard) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// forceActiveFocus() touches multiple items, so check for
|
||||||
|
// activeFocus first to be more efficient.
|
||||||
|
if (!listView.activeFocus) {
|
||||||
|
listView.forceActiveFocus(Qt.MouseFocusReason)
|
||||||
|
}
|
||||||
|
// No need to check currentIndex first because it's
|
||||||
|
// built into QQuickListView::setCurrentIndex() already
|
||||||
|
listView.currentIndex = index
|
||||||
|
}
|
||||||
|
onPositionChanged: {
|
||||||
|
isDraging = pressed
|
||||||
|
if (pressed){
|
||||||
|
if ("pluginName" in model) {
|
||||||
|
dragHelper.startDrag(kicker, model.url, model.decoration,
|
||||||
|
"text/x-plasmoidservicename", model.pluginName);
|
||||||
|
} else {
|
||||||
|
dragHelper.startDrag(kicker, model.url, model.decoration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ActionMenu {
|
||||||
|
id: actionMenu
|
||||||
|
|
||||||
|
onActionClicked: {
|
||||||
|
visualParent.actionTriggered(actionId, actionArgument);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2013-2014 by Eike Hein <hein@kde.org> *
|
||||||
|
* Copyright (C) 2021 by Prateek SU <pankajsunal123@gmail.com> *
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
height: 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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,206 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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.extras as PlasmaExtras
|
||||||
|
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 var triggerModel
|
||||||
|
|
||||||
|
width: root.cellSizeWidth
|
||||||
|
height: root.cellSizeHeight
|
||||||
|
|
||||||
|
signal itemActivated(int index, string actionId, string argument)
|
||||||
|
signal actionTriggered(string actionId, variant actionArgument)
|
||||||
|
signal aboutToShowActionMenu(variant actionMenu)
|
||||||
|
|
||||||
|
property bool isDraging: false
|
||||||
|
|
||||||
|
property bool hasActionList: ((model.favoriteId !== null)
|
||||||
|
|| (("hasActionList" in model) && (model.hasActionList !== null)))
|
||||||
|
|
||||||
|
function openActionMenu(visualParent, x, y) {
|
||||||
|
aboutToShowActionMenu(actionMenu);
|
||||||
|
actionMenu.visualParent = visualParent;
|
||||||
|
actionMenu.open(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
function trigger() {
|
||||||
|
triggerModel.trigger(index, "", null);
|
||||||
|
root.toggle()
|
||||||
|
}
|
||||||
|
|
||||||
|
onAboutToShowActionMenu: actionMenu => {
|
||||||
|
const actionList = (model.hasActionList !== null) ? model.actionList : [];
|
||||||
|
Tools.fillActionMenu(i18n, actionMenu, actionList, globalFavorites, model.favoriteId);
|
||||||
|
}
|
||||||
|
onActionTriggered: (actionId, actionArgument) => {
|
||||||
|
if (Tools.triggerAction(triggerModel, model.index, actionId, actionArgument) === true) {
|
||||||
|
kicker.expanded = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: appicon
|
||||||
|
y: (2 * highlightItemSvg.margins.top)
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
width: root.iconSize
|
||||||
|
height: width
|
||||||
|
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
|
||||||
|
left: parent.left
|
||||||
|
right: parent.right
|
||||||
|
topMargin: Kirigami.Units.smallSpacing
|
||||||
|
leftMargin: Kirigami.Units.smallSpacing
|
||||||
|
rightMargin: Kirigami.Units.smallSpacing
|
||||||
|
}
|
||||||
|
textFormat: Text.PlainText
|
||||||
|
elide: Text.ElideMiddle
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
maximumLineCount: 2
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
|
||||||
|
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: (focus)
|
||||||
|
PropertyChanges { target: appIconGlow; opacity: 1}
|
||||||
|
PropertyChanges { target: appNameGlow; opacity: 1}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "default"; when: (!focus)
|
||||||
|
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: !grid.movedWithWheel
|
||||||
|
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 {
|
||||||
|
trigger();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
onReleased: {
|
||||||
|
isDraging: false
|
||||||
|
}
|
||||||
|
onEntered: {
|
||||||
|
// - When the movedWithKeyboard condition is broken, we do not want to
|
||||||
|
// select the hovered item without moving the mouse.
|
||||||
|
// - Don't highlight separators.
|
||||||
|
// - Don't switch category items on hover if the setting isn't enabled
|
||||||
|
if (grid.movedWithKeyboard) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// forceActiveFocus() touches multiple items, so check for
|
||||||
|
// activeFocus first to be more efficient.
|
||||||
|
if (!grid.activeFocus) {
|
||||||
|
grid.forceActiveFocus(Qt.MouseFocusReason)
|
||||||
|
}
|
||||||
|
// No need to check currentIndex first because it's
|
||||||
|
// built into QQuickListView::setCurrentIndex() already
|
||||||
|
grid.currentIndex = index
|
||||||
|
}
|
||||||
|
|
||||||
|
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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UserAvatar {
|
||||||
|
id: avatarFrame
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: avatarWidth
|
||||||
|
height: avatarWidth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,199 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import Qt5Compat.GraphicalEffects
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property var textSize
|
||||||
|
readonly property var textWidth: nameLabel.width
|
||||||
|
Text {
|
||||||
|
id: nameLabel
|
||||||
|
text: plasmoid.configuration.enableGreeting && plasmoid.configuration.customGreeting ? plasmoid.configuration.customGreeting : plasmoid.configuration.enableGreeting ? i18n("Hi, ") + kuser.fullName : i18n("%1@%2", kuser.loginName, kuser.host)
|
||||||
|
color: textColor
|
||||||
|
font.family: textFont
|
||||||
|
font.pixelSize: textSize
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,151 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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.core as PlasmaCore
|
||||||
|
import QtQuick
|
||||||
|
import org.kde.kcmutils as KCM
|
||||||
|
|
||||||
|
import org.kde.plasma.private.kicker as Kicker
|
||||||
|
import org.kde.plasma.extras as PlasmaExtras
|
||||||
|
import org.kde.plasma.components as PC3
|
||||||
|
import org.kde.kitemmodels as KItemModels
|
||||||
|
import org.kde.plasma.plasmoid
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property var iconSize
|
||||||
|
width: iconSize * 3.55
|
||||||
|
height: iconSize
|
||||||
|
|
||||||
|
Kicker.SystemModel {
|
||||||
|
id: systemModel
|
||||||
|
favoritesModel: kicker.systemFavorites
|
||||||
|
}
|
||||||
|
|
||||||
|
component FilteredModel : KItemModels.KSortFilterProxyModel {
|
||||||
|
sourceModel: systemModel
|
||||||
|
|
||||||
|
function systemFavoritesContainsRow(sourceRow, sourceParent) {
|
||||||
|
const FavoriteIdRole = sourceModel.KItemModels.KRoleNames.role("favoriteId");
|
||||||
|
const favoriteId = sourceModel.data(sourceModel.index(sourceRow, 0, sourceParent), FavoriteIdRole);
|
||||||
|
return String(Plasmoid.configuration.systemFavorites).includes(favoriteId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function trigger(index) {
|
||||||
|
const sourceIndex = mapToSource(this.index(index, 0));
|
||||||
|
systemModel.trigger(sourceIndex.row, "", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
Plasmoid.configuration.valueChanged.connect((key, value) => {
|
||||||
|
if (key === "systemFavorites") {
|
||||||
|
invalidateFilter();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FilteredModel {
|
||||||
|
id: filteredButtonsModel
|
||||||
|
filterRowCallback: (sourceRow, sourceParent) =>
|
||||||
|
systemFavoritesContainsRow(sourceRow, sourceParent)
|
||||||
|
}
|
||||||
|
|
||||||
|
FilteredModel {
|
||||||
|
id: filteredMenuItemsModel
|
||||||
|
filterRowCallback: root.shouldCollapseButtons
|
||||||
|
? null /*i.e. keep all rows*/
|
||||||
|
: (sourceRow, sourceParent) => !systemFavoritesContainsRow(sourceRow, sourceParent)
|
||||||
|
}
|
||||||
|
|
||||||
|
PC3.RoundButton {
|
||||||
|
id: settingsButton
|
||||||
|
visible: true
|
||||||
|
flat: true
|
||||||
|
height: iconSize * 1.5
|
||||||
|
width: height
|
||||||
|
anchors.left: parent.left
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: settingsImage
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.fill: parent
|
||||||
|
source: Qt.resolvedUrl("icons/feather/stngs.svg")
|
||||||
|
isMask: true
|
||||||
|
color: main.textColor
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
KCM.KCMLauncher.openSystemSettings("kcm_landingpage")
|
||||||
|
root.toggle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PC3.RoundButton {
|
||||||
|
id: leaveButton
|
||||||
|
Accessible.role: Accessible.ButtonMenu
|
||||||
|
anchors.right: parent.right
|
||||||
|
flat: true
|
||||||
|
height: iconSize * 1.5
|
||||||
|
width: height
|
||||||
|
visible: true
|
||||||
|
// Make it look pressed while the menu is open
|
||||||
|
down: contextMenu.status === PlasmaExtras.Menu.Open || pressed
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: powerImage
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.fill: parent
|
||||||
|
source: Qt.resolvedUrl("icons/feather/pwr.svg")
|
||||||
|
isMask: true
|
||||||
|
color: Kirigami.Theme.textColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Keys.onLeftPressed: event => {
|
||||||
|
if (Qt.application.layoutDirection == Qt.LeftToRight) {
|
||||||
|
nextItemInFocusChain(false).forceActiveFocus(Qt.BacktabFocusReason)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Keys.onRightPressed: event => {
|
||||||
|
if (Qt.application.layoutDirection == Qt.RightToLeft) {
|
||||||
|
nextItemInFocusChain(false).forceActiveFocus(Qt.BacktabFocusReason)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onPressed: contextMenu.openRelative()
|
||||||
|
}
|
||||||
|
|
||||||
|
Instantiator {
|
||||||
|
model: filteredMenuItemsModel
|
||||||
|
delegate: PlasmaExtras.MenuItem {
|
||||||
|
required property int index
|
||||||
|
required property var model
|
||||||
|
|
||||||
|
text: model.display
|
||||||
|
icon: model.decoration
|
||||||
|
onClicked: filteredMenuItemsModel.trigger(index)
|
||||||
|
}
|
||||||
|
onObjectAdded: (index, object) => contextMenu.addMenuItem(object)
|
||||||
|
onObjectRemoved: (index, object) => contextMenu.removeMenuItem(object)
|
||||||
|
}
|
||||||
|
|
||||||
|
PlasmaExtras.Menu {
|
||||||
|
id: contextMenu
|
||||||
|
visualParent: leaveButton
|
||||||
|
placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
import QtQuick
|
||||||
|
import org.kde.ksvg as KSvg
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
import Qt5Compat.GraphicalEffects
|
||||||
|
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: highlight
|
||||||
|
/*!
|
||||||
|
This property holds whether the control is hovered.
|
||||||
|
|
||||||
|
This is set automatically when used in a ListView and GridView.
|
||||||
|
*/
|
||||||
|
property bool hovered: ListView.view !== null || GridView.view !== null
|
||||||
|
|
||||||
|
/*!
|
||||||
|
This property holds whether the highlight has a pressed appearance.
|
||||||
|
*/
|
||||||
|
property bool pressed: false
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\qmlproperty int Highlight::marginHints
|
||||||
|
|
||||||
|
This property holds the margin hints used by the background.
|
||||||
|
*/
|
||||||
|
property alias marginHints: background.margins
|
||||||
|
|
||||||
|
/*!
|
||||||
|
This property holds whether the item is active. True by default. Set it to
|
||||||
|
false to visually mark an item that's in the "current item" or "selected"
|
||||||
|
state but is not currently being hovered.
|
||||||
|
*/
|
||||||
|
property bool active: true
|
||||||
|
|
||||||
|
/*!
|
||||||
|
This property holds whether the item should not show a background. False by default. Set it to
|
||||||
|
true to visually hide the background, mainly used when glow is enabled in plasmoid config
|
||||||
|
*/
|
||||||
|
property bool hideBg: false
|
||||||
|
|
||||||
|
width: {
|
||||||
|
const view = ListView.view;
|
||||||
|
return view ? view.width - view.leftMargin - view.rightMargin : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
radius: 10
|
||||||
|
z: -20
|
||||||
|
color: "transparent"
|
||||||
|
clip: true
|
||||||
|
|
||||||
|
// apply rounded corners mask
|
||||||
|
layer.enabled: true
|
||||||
|
layer.effect: OpacityMask {
|
||||||
|
maskSource: Rectangle {
|
||||||
|
x: highlight.x; y: highlight.y
|
||||||
|
width: highlight.width
|
||||||
|
height: highlight.height
|
||||||
|
radius: highlight.radius
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KSvg.FrameSvgItem {
|
||||||
|
id: background
|
||||||
|
|
||||||
|
// anchors.fill: parent
|
||||||
|
width: highlight.width + highlight.radius
|
||||||
|
height: highlight.height + highlight.radius
|
||||||
|
anchors.centerIn: parent
|
||||||
|
|
||||||
|
opacity: highlight.hideBg ? 0 : 1
|
||||||
|
|
||||||
|
imagePath: "widgets/viewitem"
|
||||||
|
prefix: {
|
||||||
|
if (highlight.pressed) {
|
||||||
|
return highlight.hovered ? 'selected+hover' : 'selected';
|
||||||
|
}
|
||||||
|
|
||||||
|
return highlight.hovered ? 'hover' : 'normal';
|
||||||
|
}
|
||||||
|
|
||||||
|
Behavior on opacity {
|
||||||
|
enabled: Kirigami.Units.veryShortDuration > 0
|
||||||
|
NumberAnimation {
|
||||||
|
duration: Kirigami.Units.veryShortDuration
|
||||||
|
easing.type: Easing.OutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,376 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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
|
||||||
|
|
||||||
|
import "js/colorType.js" as ColorType
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: main
|
||||||
|
property bool searching: (searchBar.textField.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 bool isDarkTheme: ColorType.isDark(bgColor)
|
||||||
|
property color contrastBgColor: isDarkTheme ? Qt.rgba(255, 255, 255, 0.15) : Qt.rgba(255, 255, 255, 0.25)
|
||||||
|
|
||||||
|
property int pinnedModel: plasmoid.configuration.pinnedModel
|
||||||
|
|
||||||
|
KCoreAddons.KUser {
|
||||||
|
id: kuser
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateStartpage(){
|
||||||
|
appList.currentStateIndex = plasmoid.configuration.defaultPage
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload() {
|
||||||
|
searchBar.textField.clear()
|
||||||
|
appList.reset()
|
||||||
|
}
|
||||||
|
function reset(){
|
||||||
|
showAllApps = false;
|
||||||
|
searchBar.textField.clear();
|
||||||
|
appList.reset();
|
||||||
|
headerLabelRow.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
onPinnedModelChanged: headerLabelRow.reset()
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: backdrop
|
||||||
|
x: 0
|
||||||
|
y: isTop ? 125 : 90
|
||||||
|
width: main.width
|
||||||
|
height: isTop ? main.height - y - Kirigami.Units.largeSpacing : 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: 110
|
||||||
|
visible: root.visible && !isTop ? true : root.visible && plasmoid.configuration.floating ? true : false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Power & Settings
|
||||||
|
RowLayout {
|
||||||
|
id: headerBar
|
||||||
|
width: main.width
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
UserAvatar {
|
||||||
|
width: 80
|
||||||
|
height: width
|
||||||
|
visible: !floatingAvatar.visible
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.horizontalCenterOffset: width / 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Header {
|
||||||
|
id: powerSettings
|
||||||
|
iconSize: 20
|
||||||
|
Layout.fillHeight: false
|
||||||
|
Layout.alignment: Qt.AlignRight | Qt.AlignTop
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Greeting
|
||||||
|
Greeting {
|
||||||
|
id: greeting
|
||||||
|
visible: true//floatingAvatar.visible
|
||||||
|
x: main.width / 2 - textWidth / 2 //This centeres the Text
|
||||||
|
y: main.isTop ? 95 : 50
|
||||||
|
textSize: 20
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fvorites / All apps label
|
||||||
|
ColumnLayout {
|
||||||
|
|
||||||
|
anchors.top: backdrop.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
|
||||||
|
spacing: 2
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: headerLabelRow
|
||||||
|
visible: !searching
|
||||||
|
|
||||||
|
function reset() {
|
||||||
|
if(showAllApps) {
|
||||||
|
var currentCategory = appList.getCurrentCategory();
|
||||||
|
mainLabelGrid.text = currentCategory.name;
|
||||||
|
sortingImage.source = currentCategory.icon;
|
||||||
|
appList.updateShowedModel(currentCategory.index);
|
||||||
|
} else {
|
||||||
|
mainLabelGrid.text = pinnedModel == 0 ? i18n("Favorite Apps") : i18n("Recent Apps");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: headerLabel
|
||||||
|
source: Qt.resolvedUrl("icons/feather/star.svg")
|
||||||
|
visible: !main.showAllApps
|
||||||
|
Layout.preferredHeight: 15
|
||||||
|
Layout.preferredWidth: 15
|
||||||
|
Layout.fillHeight: false
|
||||||
|
isMask: true
|
||||||
|
color: main.textColor
|
||||||
|
}
|
||||||
|
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: sortingImage
|
||||||
|
Layout.preferredHeight: 15
|
||||||
|
Layout.preferredWidth: 15
|
||||||
|
Layout.fillHeight: false
|
||||||
|
visible: main.showAllApps
|
||||||
|
}
|
||||||
|
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
id: mainLabelGrid
|
||||||
|
font.family: textFont
|
||||||
|
font.pointSize: textSize
|
||||||
|
Layout.fillWidth: true
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
hoverEnabled: true
|
||||||
|
enabled: showAllApps && !searching
|
||||||
|
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
|
||||||
|
onClicked: {
|
||||||
|
if (mouse.button == Qt.LeftButton) { appList.incrementCurrentStateIndex() }
|
||||||
|
else if (mouse.button == Qt.RightButton) { appList.decrementCurrentStateIndex() }
|
||||||
|
else if (mouse.button == Qt.MiddleButton) { appList.resetCurrentStateIndex() }
|
||||||
|
headerLabelRow.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show all app buttons
|
||||||
|
PlasmaComponents.Button {
|
||||||
|
id: allAppsButton
|
||||||
|
text: showAllApps ? i18n("Back") : i18n("All apps")
|
||||||
|
flat: false
|
||||||
|
|
||||||
|
topPadding: 6
|
||||||
|
bottomPadding: topPadding
|
||||||
|
leftPadding: 10
|
||||||
|
rightPadding: 10
|
||||||
|
|
||||||
|
visible: !searching
|
||||||
|
|
||||||
|
// icon.name: showAllApps ? "go-previous" : "go-next"
|
||||||
|
icon.height: 15
|
||||||
|
icon.width: icon.height
|
||||||
|
|
||||||
|
font.pointSize: textSize
|
||||||
|
font.family: textFont
|
||||||
|
|
||||||
|
LayoutMirroring.enabled: true
|
||||||
|
LayoutMirroring.childrenInherit: !showAllApps
|
||||||
|
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
showAllApps = !showAllApps;
|
||||||
|
headerLabelRow.reset();
|
||||||
|
searchBar.textField.forceActiveFocus(Qt.BacktabFocusReason);
|
||||||
|
}
|
||||||
|
background: Rectangle {
|
||||||
|
id: btnBg
|
||||||
|
color: main.contrastBgColor
|
||||||
|
border.width: 1
|
||||||
|
border.color: main.contrastBgColor
|
||||||
|
radius: height / 2
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: bgMask
|
||||||
|
width: parent.width
|
||||||
|
height: parent.height
|
||||||
|
radius: height / 2
|
||||||
|
border.width: 1
|
||||||
|
visible: plasmoid.configuration.enableGlow && !searching
|
||||||
|
}
|
||||||
|
Item {
|
||||||
|
visible: plasmoid.configuration.enableGlow && !searching
|
||||||
|
anchors.fill: bgMask
|
||||||
|
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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//All apps button shadow
|
||||||
|
DropShadow {
|
||||||
|
anchors.fill: btnBg
|
||||||
|
cached: true
|
||||||
|
horizontalOffset: 0
|
||||||
|
verticalOffset: 0
|
||||||
|
radius: 11.0
|
||||||
|
samples: 16
|
||||||
|
color: glowColor1
|
||||||
|
source: btnBg
|
||||||
|
visible: plasmoid.configuration.enableGlow && !searching
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: headerLabelRow.reset()
|
||||||
|
}
|
||||||
|
Item {
|
||||||
|
visible: !appList.visible && !searching
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
}
|
||||||
|
|
||||||
|
PinnedApps{
|
||||||
|
id: pinnedApps
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.leftMargin: scrollBarMetrics.width / 2 // Centers the grid due to not scrollbar here
|
||||||
|
Layout.preferredHeight: root.cellSizeHeight*3
|
||||||
|
Keys.priority: Keys.AfterItem
|
||||||
|
Keys.forwardTo: searchBar.textField
|
||||||
|
|
||||||
|
visible: !appList.visible && !searching
|
||||||
|
}
|
||||||
|
|
||||||
|
//List of Apps
|
||||||
|
AllAppsList{
|
||||||
|
id: appList
|
||||||
|
state: "hidden"
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
Keys.priority: Keys.AfterItem
|
||||||
|
Keys.forwardTo: searchBar.textField
|
||||||
|
|
||||||
|
visible: opacity > 0
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "visible"; when: (showAllApps && !searching)
|
||||||
|
PropertyChanges { target: appList; opacity: 1.0 }
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hidden"; when: (!showAllApps || searching)
|
||||||
|
PropertyChanges { target: appList; opacity: 0.0}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
transitions: [
|
||||||
|
Transition {
|
||||||
|
to: "visible"
|
||||||
|
PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart}
|
||||||
|
},
|
||||||
|
Transition {
|
||||||
|
to: "hidden"
|
||||||
|
PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
RunnerList {
|
||||||
|
id: runnerList
|
||||||
|
model: runnerModel
|
||||||
|
state: "hidden"
|
||||||
|
visible: opacity > 0
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
|
||||||
|
Keys.priority: Keys.AfterItem
|
||||||
|
Keys.forwardTo: searchBar.textField
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "visible"; when: (searching)
|
||||||
|
PropertyChanges { target: runnerList; opacity: 1.0 }
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "hidden"; when: (!searching)
|
||||||
|
PropertyChanges { target: runnerList; opacity: 0.0}
|
||||||
|
}]
|
||||||
|
transitions: [
|
||||||
|
Transition {
|
||||||
|
to: "visible"
|
||||||
|
PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart}
|
||||||
|
},
|
||||||
|
Transition {
|
||||||
|
to: "hidden"
|
||||||
|
PropertyAnimation {properties: 'opacity'; duration: 100; easing.type: Easing.OutQuart}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
visible: !appList.visible && !searching
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.fillHeight: true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search Bar
|
||||||
|
|
||||||
|
SearchBar {
|
||||||
|
id: searchBar
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.preferredHeight: 45
|
||||||
|
Layout.maximumHeight: Layout.preferredHeight
|
||||||
|
Keys.priority: Keys.AfterItem
|
||||||
|
Keys.forwardTo: searching ? runnerList : showAllApps ? appList.viewItem : pinnedApps
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,261 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2014 by Weng Xuetian <wengxt@gmail.com> *
|
||||||
|
* Copyright (C) 2013-2017 by Eike Hein <hein@kde.org> *
|
||||||
|
* Copyright (C) 2021 by Prateek SU <pankajsunal123@gmail.com> *
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
PlasmaCore.Dialog {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
objectName: "popupWindow"
|
||||||
|
flags: Qt.WindowStaysOnTopHint
|
||||||
|
|
||||||
|
location: Plasmoid.configuration.floating || Plasmoid.configuration.launcherPosition == 2 ? "Floating" : Plasmoid.location
|
||||||
|
hideOnWindowDeactivate: true
|
||||||
|
|
||||||
|
Plasmoid.status: root.visible ? PlasmaCore.Types.RequiresAttentionStatus : PlasmaCore.Types.PassiveStatus
|
||||||
|
|
||||||
|
property int iconSize: {
|
||||||
|
switch(Plasmoid.configuration.appsIconSize){
|
||||||
|
case 0: return Kirigami.Units.iconSizes.smallMedium;
|
||||||
|
case 1: return Kirigami.Units.iconSizes.medium;
|
||||||
|
case 2: return Kirigami.Units.iconSizes.large;
|
||||||
|
case 3: return Kirigami.Units.iconSizes.huge;
|
||||||
|
default: return 64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
property int cellSizeHeight: iconSize
|
||||||
|
+ Kirigami.Units.gridUnit * 2
|
||||||
|
+ (2 * Math.max(highlightItemSvg.margins.top + highlightItemSvg.margins.bottom,
|
||||||
|
highlightItemSvg.margins.left + highlightItemSvg.margins.right))
|
||||||
|
property int cellSizeWidth: cellSizeHeight //+ Kirigami.Units.gridUnit
|
||||||
|
|
||||||
|
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 = kicker.screenGeometry;
|
||||||
|
//
|
||||||
|
// 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);
|
||||||
|
// }
|
||||||
|
|
||||||
|
function popupPosition(width, height) {
|
||||||
|
var screenAvail = kicker.availableScreenRect;
|
||||||
|
var screen = kicker.screenGeometry;
|
||||||
|
|
||||||
|
// var offset = 0
|
||||||
|
var offset = Kirigami.Units.smallSpacing * 2;
|
||||||
|
|
||||||
|
// 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 panelH = kicker.height
|
||||||
|
var panelW = kicker.width
|
||||||
|
|
||||||
|
var appletTopLeft = parent.mapToGlobal(0, 0);
|
||||||
|
var appletBottomLeft = parent.mapToGlobal(0, parent.height);
|
||||||
|
|
||||||
|
switch (Plasmoid.configuration.launcherPosition) {
|
||||||
|
case 0:
|
||||||
|
switch (plasmoid.location) {
|
||||||
|
case PlasmaCore.Types.BottomEdge:
|
||||||
|
var y = appletTopLeft.y - height - offset
|
||||||
|
var x = appletTopLeft.x
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PlasmaCore.Types.TopEdge:
|
||||||
|
x = appletTopLeft.x < screen.width - width ? appletTopLeft.x + panelW - Kirigami.Units.gridUnit / 3 : screen.width - width;
|
||||||
|
y = appletTopLeft.y + kicker.height + Kirigami.Units.gridUnit
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PlasmaCore.Types.LeftEdge:
|
||||||
|
x = appletTopLeft.x + panelW + Kirigami.Units.gridUnit / 2;
|
||||||
|
y = appletTopLeft.y < screen.height - height ? appletTopLeft.y : appletTopLeft.y - height + iconUser.height / 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PlasmaCore.Types.RightEdge:
|
||||||
|
x = appletTopLeft.x - width - Kirigami.Units.gridUnit / 2;
|
||||||
|
y = appletTopLeft.y < screen.height - height ? appletTopLeft.y : screen.height - height - Kirigami.Units.gridUnit / 5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
horizMidPoint = screen.x + (screen.width / 2);
|
||||||
|
vertMidPoint = screen.y + (screen.height / 2);
|
||||||
|
x = horizMidPoint - width / 2;
|
||||||
|
// y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.gridUnit;
|
||||||
|
// y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.gridUnit / 2;
|
||||||
|
y = screen.y + screen.height - height - offset - panelH - Kirigami.Units.largeSpacing * 1.5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
horizMidPoint = screen.x + (screen.width / 2);
|
||||||
|
vertMidPoint = screen.y + (screen.height / 2);
|
||||||
|
x = horizMidPoint - width / 2;
|
||||||
|
y = vertMidPoint - height / 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Qt.point(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
FocusScope {
|
||||||
|
id: fs
|
||||||
|
focus: true
|
||||||
|
Layout.minimumWidth: (root.cellSizeWidth * Plasmoid.configuration.numberColumns) + scrollBarMetrics.width + innerPadding*2
|
||||||
|
Layout.minimumHeight: 550 * 1
|
||||||
|
Layout.maximumWidth: Layout.minimumWidth
|
||||||
|
Layout.maximumHeight: Layout.minimumHeight
|
||||||
|
|
||||||
|
// We want the MainView to have an uniform margin through different plasma themes
|
||||||
|
property real innerPadding: 15
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: mainItem
|
||||||
|
x: - dialogSvg.margins.left
|
||||||
|
y: - dialogSvg.margins.top
|
||||||
|
width: parent.width + dialogSvg.margins.left + dialogSvg.margins.right
|
||||||
|
height: parent.height + dialogSvg.margins.top + dialogSvg.margins.bottom
|
||||||
|
|
||||||
|
MainView {
|
||||||
|
id: main
|
||||||
|
width: mainItem.width - (fs.innerPadding*2)
|
||||||
|
height: mainItem.height - (fs.innerPadding*2)
|
||||||
|
x: fs.innerPadding
|
||||||
|
y: fs.innerPadding
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Keys.onPressed: event => {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
import QtQuick 2.12
|
||||||
|
import QtQuick.Controls 2.15
|
||||||
|
|
||||||
|
import QtQuick.Layouts 1.0
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
AppGridView {
|
||||||
|
property QtObject recentAppsModel: rootModel.modelForRow(0);
|
||||||
|
showScrollBar: false
|
||||||
|
|
||||||
|
model: main.pinnedModel == 0 ? globalFavorites : recentAppsModel
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
recentAppsModel = rootModel.modelForRow(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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 org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
AppListView {
|
||||||
|
id: searchList
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
anchors.fill: parent
|
||||||
|
width: searchList.width - (Kirigami.Units.gridUnit * 4)
|
||||||
|
|
||||||
|
active: searchList.count === 0
|
||||||
|
visible: active
|
||||||
|
asynchronous: true
|
||||||
|
|
||||||
|
sourceComponent: PlasmaExtras.PlaceholderMessage {
|
||||||
|
id: emptyHint
|
||||||
|
|
||||||
|
iconName: "edit-none"
|
||||||
|
opacity: 0
|
||||||
|
text: i18nc("@info:status", "No matches")
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: runnerModel
|
||||||
|
function onQueryFinished() {
|
||||||
|
showAnimation.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
id: showAnimation
|
||||||
|
duration: Kirigami.Units.longDuration
|
||||||
|
easing.type: Easing.OutCubic
|
||||||
|
property: "opacity"
|
||||||
|
target: emptyHint
|
||||||
|
to: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: runnerModel
|
||||||
|
function onQueryChanged() {
|
||||||
|
runnerList.model = runnerModel.modelForRow(0)
|
||||||
|
runnerList.blockingHoverFocus = true
|
||||||
|
runnerList.interceptedPosition = null
|
||||||
|
runnerList.currentIndex = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import QtQuick.Controls
|
||||||
|
import org.kde.kirigami as Kirigami
|
||||||
|
|
||||||
|
import org.kde.plasma.plasmoid 2.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
|
||||||
|
radius: 10
|
||||||
|
color: main.contrastBgColor
|
||||||
|
|
||||||
|
property alias textField: textField
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: 0
|
||||||
|
Kirigami.Icon {
|
||||||
|
id: searchIcon
|
||||||
|
Layout.preferredWidth: 21
|
||||||
|
Layout.preferredHeight: 21
|
||||||
|
Layout.margins: 10
|
||||||
|
source: Qt.resolvedUrl('icons/feather/search.svg')
|
||||||
|
isMask: true
|
||||||
|
color: main.textColor
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: textField
|
||||||
|
Layout.fillHeight: true
|
||||||
|
Layout.fillWidth: true
|
||||||
|
font.pointSize: 12
|
||||||
|
|
||||||
|
placeholderText: i18n("Search...")
|
||||||
|
background: Rectangle{
|
||||||
|
color: "transparent"
|
||||||
|
}
|
||||||
|
focus: true
|
||||||
|
onTextChanged: {
|
||||||
|
textField.forceActiveFocus(Qt.ShortcutFocusReason)
|
||||||
|
runnerModel.query = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
Keys.onPressed: event => {
|
||||||
|
if (event.key == Qt.Key_Escape) {
|
||||||
|
event.accepted = true;
|
||||||
|
if (searching) {
|
||||||
|
clear();
|
||||||
|
} else {
|
||||||
|
root.toggle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
import QtQuick 2.12
|
||||||
|
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
|
||||||
|
|
||||||
|
Item {
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,301 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* Copyright (C) 2013-2014 by Eike Hein <hein@kde.org> *
|
||||||
|
* Copyright (C) 2021 by Prateek SU <pankajsunal123@gmail.com> *
|
||||||
|
* Copyright (C) 2022 by Friedrich Schriewer <friedrich.schriewer@gmx.net> *
|
||||||
|
* *
|
||||||
|
* 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_pinnedModel: pinnedModel.currentIndex
|
||||||
|
|
||||||
|
property alias cfg_customGreeting: customGreeting.text
|
||||||
|
property alias cfg_floating: floating.checked
|
||||||
|
property alias cfg_launcherPosition: launcherPosition.currentIndex
|
||||||
|
|
||||||
|
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.selectedColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
Item {
|
||||||
|
Kirigami.FormData.isSection: true
|
||||||
|
}
|
||||||
|
ComboBox {
|
||||||
|
id: pinnedModel
|
||||||
|
Kirigami.FormData.label: i18n("Pinned applications Page:")
|
||||||
|
model: [
|
||||||
|
i18n("Favorites (Default)"),
|
||||||
|
i18n("Recent Applications")
|
||||||
|
]
|
||||||
|
}
|
||||||
|
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: useSystemFontSettings
|
||||||
|
Kirigami.FormData.label: i18n("Use system font settings")
|
||||||
|
text: i18n("Enabled")
|
||||||
|
checked: Plasmoid.configuration.useSystemFontSettings
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.15
|
||||||
|
import org.kde.plasma.plasmoid 2.0
|
||||||
|
import org.kde.kcmutils as KCM
|
||||||
|
import org.kde.kirigami 2.3 as Kirigami
|
||||||
|
|
||||||
|
KCM.SimpleKCM {
|
||||||
|
|
||||||
|
property alias cfg_compactListItems: compactListItems.checked
|
||||||
|
property alias cfg_showItemsInGrid: showItemsInGrid.checked
|
||||||
|
property alias cfg_appsIconSize: appsIconSize.currentIndex
|
||||||
|
property alias cfg_numberColumns: numberColumns.value
|
||||||
|
|
||||||
|
Kirigami.FormLayout {
|
||||||
|
CheckBox {
|
||||||
|
id: compactListItems
|
||||||
|
Kirigami.FormData.label: i18n("Lists:")
|
||||||
|
text: i18n("Compact list items")
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: showItemsInGrid
|
||||||
|
Kirigami.FormData.label: i18n("All applications view:")
|
||||||
|
text: i18n("show items in grid")
|
||||||
|
}
|
||||||
|
|
||||||
|
ComboBox {
|
||||||
|
id: appsIconSize
|
||||||
|
Kirigami.FormData.label: i18n("Grid icon size:")
|
||||||
|
model: [i18n("Small"),i18n("Medium"),i18n("Large"), i18n("Huge")]
|
||||||
|
}
|
||||||
|
|
||||||
|
SpinBox{
|
||||||
|
id: numberColumns
|
||||||
|
|
||||||
|
from: 4
|
||||||
|
to: 6
|
||||||
|
Kirigami.FormData.label: i18n("Number of columns in grid")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-code"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="code.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview8"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<polyline
|
||||||
|
points="16 18 22 12 16 6"
|
||||||
|
id="polyline2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<polyline
|
||||||
|
points="8 6 2 12 8 18"
|
||||||
|
id="polyline4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-file-text"
|
||||||
|
version="1.1"
|
||||||
|
id="svg12"
|
||||||
|
sodipodi:docname="file-text.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs16" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview14"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1032"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg12" />
|
||||||
|
<path
|
||||||
|
d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"
|
||||||
|
id="path2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<polyline
|
||||||
|
points="14 2 14 8 20 8"
|
||||||
|
id="polyline4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="16"
|
||||||
|
y1="13"
|
||||||
|
x2="8"
|
||||||
|
y2="13"
|
||||||
|
id="line6"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="16"
|
||||||
|
y1="17"
|
||||||
|
x2="8"
|
||||||
|
y2="17"
|
||||||
|
id="line8"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<polyline
|
||||||
|
points="10 9 9 9 8 9"
|
||||||
|
id="polyline10"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-globe"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="globe.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs12" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview10"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg8" />
|
||||||
|
<circle
|
||||||
|
cx="12"
|
||||||
|
cy="12"
|
||||||
|
r="10"
|
||||||
|
id="circle2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="2"
|
||||||
|
y1="12"
|
||||||
|
x2="22"
|
||||||
|
y2="12"
|
||||||
|
id="line4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"
|
||||||
|
id="path6"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,59 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-image"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="image.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs12" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview10"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg8" />
|
||||||
|
<rect
|
||||||
|
x="3"
|
||||||
|
y="3"
|
||||||
|
width="18"
|
||||||
|
height="18"
|
||||||
|
rx="2"
|
||||||
|
ry="2"
|
||||||
|
id="rect2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<circle
|
||||||
|
cx="8.5"
|
||||||
|
cy="8.5"
|
||||||
|
r="1.5"
|
||||||
|
id="circle4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<polyline
|
||||||
|
points="21 15 16 10 5 21"
|
||||||
|
id="polyline6"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-power"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="power.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview8"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="876"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="180"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<path
|
||||||
|
d="M18.36 6.64a9 9 0 1 1-12.73 0"
|
||||||
|
id="path2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="12"
|
||||||
|
y1="2"
|
||||||
|
x2="12"
|
||||||
|
y2="12"
|
||||||
|
id="line4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-search"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="search.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview8"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="11.961905"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1032"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<circle
|
||||||
|
cx="11"
|
||||||
|
cy="11"
|
||||||
|
id="circle2"
|
||||||
|
r="8"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="21"
|
||||||
|
y1="21"
|
||||||
|
x2="16.65"
|
||||||
|
y2="16.65"
|
||||||
|
id="line4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-star"
|
||||||
|
version="1.1"
|
||||||
|
id="svg4"
|
||||||
|
sodipodi:docname="star.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs8" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview6"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1032"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg4" />
|
||||||
|
<polygon
|
||||||
|
points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
|
||||||
|
id="polygon2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,50 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-settings"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="settings.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview8"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="876"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="180"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<circle
|
||||||
|
cx="12"
|
||||||
|
cy="12"
|
||||||
|
r="3"
|
||||||
|
id="circle2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"
|
||||||
|
id="path4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-tool"
|
||||||
|
version="1.1"
|
||||||
|
id="svg4"
|
||||||
|
sodipodi:docname="tool.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs8" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview6"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg4" />
|
||||||
|
<path
|
||||||
|
d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"
|
||||||
|
id="path2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="feather feather-trash-2"
|
||||||
|
version="1.1"
|
||||||
|
id="svg10"
|
||||||
|
sodipodi:docname="trash-2.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs14" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview12"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg10" />
|
||||||
|
<polyline
|
||||||
|
points="3 6 5 6 21 6"
|
||||||
|
id="polyline2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"
|
||||||
|
id="path4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="10"
|
||||||
|
y1="11"
|
||||||
|
x2="10"
|
||||||
|
y2="17"
|
||||||
|
id="line6"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="14"
|
||||||
|
y1="11"
|
||||||
|
x2="14"
|
||||||
|
y2="17"
|
||||||
|
id="line8"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
|
|
@ -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.
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
version="1.1"
|
||||||
|
id="svg22"
|
||||||
|
sodipodi:docname="cpu.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs26" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview24"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg22" />
|
||||||
|
<rect
|
||||||
|
x="4"
|
||||||
|
y="4"
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
rx="2"
|
||||||
|
ry="2"
|
||||||
|
id="rect2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<rect
|
||||||
|
x="9"
|
||||||
|
y="9"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
id="rect4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="9"
|
||||||
|
y1="1"
|
||||||
|
x2="9"
|
||||||
|
y2="4"
|
||||||
|
id="line6"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="15"
|
||||||
|
y1="1"
|
||||||
|
x2="15"
|
||||||
|
y2="4"
|
||||||
|
id="line8"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="9"
|
||||||
|
y1="20"
|
||||||
|
x2="9"
|
||||||
|
y2="23"
|
||||||
|
id="line10"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="15"
|
||||||
|
y1="20"
|
||||||
|
x2="15"
|
||||||
|
y2="23"
|
||||||
|
id="line12"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="20"
|
||||||
|
y1="9"
|
||||||
|
x2="23"
|
||||||
|
y2="9"
|
||||||
|
id="line14"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="20"
|
||||||
|
y1="14"
|
||||||
|
x2="23"
|
||||||
|
y2="14"
|
||||||
|
id="line16"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="1"
|
||||||
|
y1="9"
|
||||||
|
x2="4"
|
||||||
|
y2="9"
|
||||||
|
id="line18"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="1"
|
||||||
|
y1="14"
|
||||||
|
x2="4"
|
||||||
|
y2="14"
|
||||||
|
id="line20"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
|
|
@ -0,0 +1,97 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
version="1.1"
|
||||||
|
id="svg18"
|
||||||
|
sodipodi:docname="film.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs22" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview20"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg18" />
|
||||||
|
<rect
|
||||||
|
x="2"
|
||||||
|
y="2"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
rx="2.18"
|
||||||
|
ry="2.18"
|
||||||
|
id="rect2"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="7"
|
||||||
|
y1="2"
|
||||||
|
x2="7"
|
||||||
|
y2="22"
|
||||||
|
id="line4"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="17"
|
||||||
|
y1="2"
|
||||||
|
x2="17"
|
||||||
|
y2="22"
|
||||||
|
id="line6"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="2"
|
||||||
|
y1="12"
|
||||||
|
x2="22"
|
||||||
|
y2="12"
|
||||||
|
id="line8"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="2"
|
||||||
|
y1="7"
|
||||||
|
x2="7"
|
||||||
|
y2="7"
|
||||||
|
id="line10"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="2"
|
||||||
|
y1="17"
|
||||||
|
x2="7"
|
||||||
|
y2="17"
|
||||||
|
id="line12"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="17"
|
||||||
|
y1="17"
|
||||||
|
x2="22"
|
||||||
|
y2="17"
|
||||||
|
id="line14"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
<line
|
||||||
|
x1="17"
|
||||||
|
y1="7"
|
||||||
|
x2="22"
|
||||||
|
y2="7"
|
||||||
|
id="line16"
|
||||||
|
style="stroke:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="flask-conical.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs12" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview10"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="5.0857143"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg8" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
d="M 10,1 A 1,1 0 0 0 9,2 V 9.7636719 L 3.8261719,20.101562 C 3.174232,21.398629 4.1748637,23.010141 5.6269531,23 H 18.373047 c 1.452089,0.01014 2.452721,-1.601371 1.800781,-2.898438 v -0.002 L 15,9.7636719 V 2 A 1,1 0 0 0 14,1 1,1 0 0 0 13,2 v 8 a 1.0001,1.0001 0 0 0 0.105469,0.447266 l 5.28125,10.550781 a 1.0001,1.0001 0 0 0 0,0.002 1.0001,1.0001 0 0 0 -0.0059,0 H 5.6191406 a 1.0001,1.0001 0 0 0 -0.00586,0 1.0001,1.0001 0 0 0 0,-0.002 L 10.894531,10.447266 A 1.0001,1.0001 0 0 0 11,10 V 2 A 1,1 0 0 0 10,1 Z"
|
||||||
|
id="path2" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
d="m 8.5,1 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 7 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z"
|
||||||
|
id="path4" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
d="m 7,15 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 10 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z"
|
||||||
|
id="path6" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="currentColor"
|
||||||
|
stroke="none"
|
||||||
|
stroke-width="0"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="gamepad-2.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs12" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview10"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="15.638095"
|
||||||
|
inkscape:cy="12.495238"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg8" />
|
||||||
|
<path
|
||||||
|
d="M6 10a1 1 0 0 0-1 1 1 1 0 0 0 1 1h4a1 1 0 0 0 1-1 1 1 0 0 0-1-1z"
|
||||||
|
id="path2"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="M8 8a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1 1 1 0 0 0 1-1V9a1 1 0 0 0-1-1zM15 11a1 1 0 0 0-1 1 1 1 0 0 0 1 1h.01a1 1 0 0 0 1-1 1 1 0 0 0-1-1zM18 9a1 1 0 0 0-1 1 1 1 0 0 0 1 1h.01a1 1 0 0 0 1-1 1 1 0 0 0-1-1z"
|
||||||
|
id="path4"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
d="M6.68 4a5.013 5.013 0 0 0-4.973 4.486v.002l-.014.117a1 1 0 0 0-.002.018c-.04.338-.21 1.772-.373 3.318C1.156 13.488 1 15.098 1 16c0 2.197 1.803 4 4 4 1.333 0 2.207-.793 2.707-1.293l1.414-1.414A.999.999 0 0 1 9.828 17h4.344c.265 0 .52.105.707.293l1.414 1.414c.5.5 1.374 1.293 2.707 1.293 2.197 0 4-1.803 4-4 0-.903-.156-2.514-.318-4.06a239.334 239.334 0 0 0-.373-3.317 1 1 0 0 0-.004-.02l-.012-.115v-.002A5.012 5.012 0 0 0 17.32 4zm0 2h10.64a2.987 2.987 0 0 1 2.983 2.693 1 1 0 0 0 .002.014c.003.027.007.085.02.174.041.347.21 1.749.368 3.267.16 1.528.307 3.21.307 3.852 0 1.116-.884 2-2 2-.667 0-.793-.207-1.293-.707l-1.414-1.414A3.001 3.001 0 0 0 14.172 15H9.828c-.795 0-1.559.317-2.121.879l-1.414 1.414c-.5.5-.626.707-1.293.707-1.116 0-2-.884-2-2 0-.642.146-2.323.307-3.852.159-1.52.327-2.923.369-3.27l.002-.017c.009-.071.014-.128.017-.156a1 1 0 0 0 .002-.012A2.987 2.987 0 0 1 6.68 6z"
|
||||||
|
id="path6"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
version="1.1"
|
||||||
|
id="svg4"
|
||||||
|
sodipodi:docname="paperclip.svg"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs8" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview6"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="26.25"
|
||||||
|
inkscape:cx="12.019048"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="992"
|
||||||
|
inkscape:window-x="1600"
|
||||||
|
inkscape:window-y="24"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg4" />
|
||||||
|
<path
|
||||||
|
style="color:#000000;fill:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
d="M 16.015625,0.32421875 C 14.737949,0.24906105 13.362296,0.73340705 12.242188,1.8535156 L 3.0527344,11.042969 c -1.5917746,1.591774 -2.25307446,3.496569 -2.14843752,5.27539 0.10463692,1.778822 0.93005392,3.410523 2.14843752,4.628907 1.2183835,1.218383 2.8500848,2.0438 4.6289062,2.148437 1.7788215,0.104637 3.6836164,-0.556663 5.2753904,-2.148437 l 9.189453,-9.189453 a 1,1 0 0 0 0,-1.414063 1,1 0 0 0 -1.414062,0 l -9.189453,9.189453 C 10.304747,20.771425 9.0268781,21.171848 7.7988281,21.099609 6.5707782,21.027371 5.3709112,20.437317 4.4667969,19.533203 3.5626826,18.629089 2.9726291,17.429222 2.9003906,16.201172 2.8281521,14.973122 3.2285755,13.695253 4.4667969,12.457031 L 13.65625,3.2675781 c 0.766555,-0.7665554 1.515283,-0.9900249 2.242188,-0.9472656 0.726904,0.042759 1.453541,0.3969009 2.003906,0.9472656 0.550364,0.5503647 0.904506,1.2770016 0.947265,2.0039063 0.04276,0.7269047 -0.18071,1.4756321 -0.947265,2.2421875 L 8.703125,16.703125 C 8.4082356,16.998014 8.1906032,17.04453 7.9648437,17.03125 7.7390843,17.01797 7.4837244,16.89974 7.2871094,16.703125 7.0904943,16.50651 6.9722644,16.25115 6.9589844,16.025391 6.9457044,15.799631 6.99222,15.581999 7.2871094,15.287109 L 15.777344,6.8066406 a 1,1 0 0 0 0,-1.4140625 1,1 0 0 0 -1.414063,0 L 5.8730469,13.873047 c -0.6484426,0.648442 -0.9558347,1.493 -0.9101563,2.269531 0.045679,0.776531 0.399272,1.463725 0.9101563,1.974609 0.5108842,0.510885 1.1980784,0.864478 1.9746093,0.910157 0.776531,0.04568 1.6210887,-0.261714 2.2695318,-0.910157 L 19.316406,8.9277344 C 20.436515,7.8076258 20.920861,6.4319731 20.845703,5.1542969 20.770545,3.8766207 20.18104,2.7181495 19.316406,1.8535156 18.451772,0.98888172 17.293301,0.39937645 16.015625,0.32421875 Z"
|
||||||
|
id="path2" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.9 KiB |
|
|
@ -0,0 +1,19 @@
|
||||||
|
function isDark(color) {
|
||||||
|
|
||||||
|
var r = color.r;
|
||||||
|
var g = color.g;
|
||||||
|
var b = color.b;
|
||||||
|
|
||||||
|
// Using the HSP value, determine whether the color is light or dark
|
||||||
|
var colorArray = [r, g , b ].map(v => {
|
||||||
|
if (v <= 0.03928) {
|
||||||
|
return v / 12.92
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.pow((v + 0.055) / 1.055, 2.4)
|
||||||
|
})
|
||||||
|
|
||||||
|
var luminance = 0.2126 * colorArray[0] + 0.7152 * colorArray[1] + 0.0722 * colorArray[2]
|
||||||
|
|
||||||
|
return luminance <= 0.179
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,218 @@
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2014-2015 by Eike Hein <hein@kde.org> *
|
||||||
|
* Copyright (C) 2021 by Prateek SU <pankajsunal123@gmail.com> *
|
||||||
|
* *
|
||||||
|
* 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: false
|
||||||
|
showTopLevelItems: true//!kicker.isDash
|
||||||
|
showRecentApps: true // Plasmoid.configuration.showRecentApps
|
||||||
|
showRecentDocs: true //Plasmoid.configuration.showRecentDocs
|
||||||
|
showPowerSession: false
|
||||||
|
// showRecentContacts: true//Plasmoid.configuration.showRecentContacts
|
||||||
|
// recentOrdering: 1 // Plasmoid.configuration.recentOrdering
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
mergeResults: true
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
KSvg.FrameSvgItem {
|
||||||
|
id: dialogSvg
|
||||||
|
visible: false
|
||||||
|
imagePath: "dialogs/background"
|
||||||
|
}
|
||||||
|
|
||||||
|
PlasmaComponents.Label {
|
||||||
|
id: toolTipDelegate
|
||||||
|
|
||||||
|
width: contentWidth
|
||||||
|
height: contentHeight
|
||||||
|
|
||||||
|
property Item toolTip
|
||||||
|
|
||||||
|
text: (toolTip != null) ? toolTip.text : ""
|
||||||
|
}
|
||||||
|
|
||||||
|
PlasmaComponents.ScrollBar {
|
||||||
|
id: scrollBarMetrics
|
||||||
|
parent: kicker
|
||||||
|
height: kicker.height
|
||||||
|
anchors.right: parent.right
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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/tree/plasma6"
|
||||||
|
},
|
||||||
|
"X-Plasma-Provides": [ "org.kde.plasma.launchermenu" ],
|
||||||
|
"X-Plasma-API-Minimum-Version": "6.0"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
With KDE Frameworks v5.37 and above, translations are bundled with the `*.plasmoid` file downloaded from the store.
|
||||||
|
|
||||||
|
## Install Translations
|
||||||
|
|
||||||
|
Run `sh ./build --restartplasma`.
|
||||||
|
|
||||||
|
## New Translations
|
||||||
|
|
||||||
|
1. Copy the `template.pot` file and name it your locale's code (Eg: `en`/`de`/`fr`) with the extension `.po`. Then fill out all the `msgstr ""`.
|
||||||
|
|
||||||
|
## Scripts
|
||||||
|
|
||||||
|
* `sh ./merge` will parse the `i18n()` calls in the `*.qml` files and write it to the `template.pot` file. Then it will merge any changes into the `*.po` language files.
|
||||||
|
* `sh ./build` will convert the `*.po` files to it's binary `*.mo` version and move it to `contents/locale/...` which will bundle the translations in the `*.plasmoid` without needing the user to manually install them.
|
||||||
|
* `sh ./plasmoidlocaletest` will run `./build` then `plasmoidviewer` (part of `plasma-sdk`).
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
* https://zren.github.io/kde/docs/widget/#translations-i18n
|
||||||
|
* https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems
|
||||||
|
* https://api.kde.org/frameworks/ki18n/html/prg_guide.html
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
* https://l10n.kde.org/stats/gui/trunk-kf5/team/fr/plasma-desktop/
|
||||||
|
* https://github.com/psifidotos/nowdock-plasmoid/tree/master/po
|
||||||
|
* https://github.com/kotelnik/plasma-applet-redshift-control/tree/master/translations
|
||||||
|
|
||||||
|
## Status
|
||||||
|
| Locale | Lines | % Done|
|
||||||
|
|----------|---------|-------|
|
||||||
|
| Template | 65 | |
|
||||||
|
| de | 30/65 | 46% |
|
||||||
|
| fr | 30/65 | 46% |
|
||||||
|
| id | 30/65 | 46% |
|
||||||
|
| nl | 30/65 | 46% |
|
||||||
|
| ru | 63/65 | 96% |
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/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="AndromedaLauncher"
|
||||||
|
widgetName="${plasmoidName##*.}" # Strip namespace
|
||||||
|
website="https://github.com/EliverLara/AndromedaLauncher/tree/plasma6"
|
||||||
|
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
|
||||||
|
|
@ -0,0 +1,308 @@
|
||||||
|
# Translation of MMcK Launcher in German
|
||||||
|
# Copyright (C) 2022
|
||||||
|
# This file is distributed under the same license as the MMcK Launcher package.
|
||||||
|
# Friedrich Schriewer <friedrich.schriewer@gmx.net>, 2022.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: mmcklauncher\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://github.com/EliverLara/AndromedaLauncher/tree/plasma6\n"
|
||||||
|
"POT-Creation-Date: 2025-11-02 20:07+0500\n"
|
||||||
|
"PO-Revision-Date: 2022-03-07 20:42+0000\n"
|
||||||
|
"Last-Translator: Friedrich Schriewer <friedrich.schriewer@gmx.net>\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"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Remove from Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Add to Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On All Activities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On the Current Activity"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Show in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Allgemein"
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "Lists and grids"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Icon:"
|
||||||
|
msgstr "Ikone:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Open icon chooser dialog"
|
||||||
|
msgid "Choose…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Reset icon to default"
|
||||||
|
msgid "Clear Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator:"
|
||||||
|
msgstr "Statusanzeige:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr "Eingeschaltet"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator Color:"
|
||||||
|
msgstr "Farbe der Statusanzeige:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Please choose a color"
|
||||||
|
msgstr "Bitte wählen Sie eine Farbe"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Greeting:"
|
||||||
|
msgstr "Begrüßung:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Custom Greeting Text:"
|
||||||
|
msgstr "Benutzerdefinierte Begrüßung:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "No custom greeting set"
|
||||||
|
msgstr "Keine Begrüßung gesetzt"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow color:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Purple (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Red"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Launcher Positioning:"
|
||||||
|
msgstr "Startmenü Position:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Standard"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Horizontal Center"
|
||||||
|
msgstr "Horizontal zentriert"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Screen Center"
|
||||||
|
msgstr "Bildschirmmitte"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Floating"
|
||||||
|
msgstr "Schwebend"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Screen Edge (0 is Default):"
|
||||||
|
msgstr "Versatz Bildschirmkante (0 ist Standard):"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Panel (0 is Default):"
|
||||||
|
msgstr "Versatz Leiste (0 ist Standard):"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Pinned applications Page:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Favorites (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Recent Applications"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default Page:"
|
||||||
|
msgstr "Startseite:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "All Applications (Default)"
|
||||||
|
msgstr "Alle Anwendungen (Standard)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Developement"
|
||||||
|
msgstr "Entwicklung"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Spiele"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Graphics"
|
||||||
|
msgstr "Grafik"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Internet"
|
||||||
|
msgstr "Internet"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Multimedia"
|
||||||
|
msgstr "Multimedia"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Office"
|
||||||
|
msgstr "Büro"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Science & Math"
|
||||||
|
msgstr "Wissenschaft & Mathematik"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Einstellungen"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "System"
|
||||||
|
msgstr "System"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Utilities"
|
||||||
|
msgstr "Werkzeuge"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Lost & Found"
|
||||||
|
msgstr "Fundsachen"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Use system font settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Lists:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Compact list items"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "All applications view:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "show items in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Grid icon size:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Small"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Medium"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Large"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Number of columns in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "Hi, "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "%1@%2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/main.qml
|
||||||
|
msgid "Edit Applications…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Favorite Apps"
|
||||||
|
msgstr "Favoriten"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Recent Apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Back"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "All apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/RunnerList.qml
|
||||||
|
msgctxt "@info:status"
|
||||||
|
msgid "No matches"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/SearchBar.qml
|
||||||
|
msgid "Search..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Power Off"
|
||||||
|
#~ msgstr "Herunterfahren"
|
||||||
|
|
||||||
|
#~ msgid "All"
|
||||||
|
#~ msgstr "Alle"
|
||||||
|
|
||||||
|
#~ 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"
|
||||||
|
|
@ -0,0 +1,308 @@
|
||||||
|
# Translation of MMcK Launcher in French
|
||||||
|
# Copyright (C) 2022
|
||||||
|
# This file is distributed under the same license as the MMcK Launcher package.
|
||||||
|
# Augustin Laurent <augustin.lrt2@icloud.com>, 2022.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: mmcklauncher\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://github.com/EliverLara/AndromedaLauncher/tree/plasma6\n"
|
||||||
|
"POT-Creation-Date: 2025-11-02 20:07+0500\n"
|
||||||
|
"PO-Revision-Date: 2022-08-07 HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: ugustin Laurent <augustin.lrt2@icloud.com>\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"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Remove from Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Add to Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On All Activities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On the Current Activity"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Show in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Général"
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "Lists and grids"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Icon:"
|
||||||
|
msgstr "Icône:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Open icon chooser dialog"
|
||||||
|
msgid "Choose…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Reset icon to default"
|
||||||
|
msgid "Clear Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator:"
|
||||||
|
msgstr "Indicateur:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr "Activé"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator Color:"
|
||||||
|
msgstr "Couleur de l'indicateur:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Please choose a color"
|
||||||
|
msgstr "Veuillez choisir une couleur"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Greeting:"
|
||||||
|
msgstr "Message d'acceuil:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Custom Greeting Text:"
|
||||||
|
msgstr "Texte d'acceuil personnalisé :"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "No custom greeting set"
|
||||||
|
msgstr "Aucun message d'accueil personnalisé défini"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow color:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Purple (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Red"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Launcher Positioning:"
|
||||||
|
msgstr "Positionnement du lanceur:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Défaut"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Horizontal Center"
|
||||||
|
msgstr "Centre horizontal"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Screen Center"
|
||||||
|
msgstr "Centre de l'écran"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Floating"
|
||||||
|
msgstr "Flottant"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Screen Edge (0 is Default):"
|
||||||
|
msgstr "Décalage par rapport au bord de l'écran (0 est la valeur par défaut):"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Panel (0 is Default):"
|
||||||
|
msgstr "Décalage par rapport à la barre de tâche (0 est la valeur par défaut):"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Pinned applications Page:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Favorites (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Recent Applications"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default Page:"
|
||||||
|
msgstr "Page par défaut:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "All Applications (Default)"
|
||||||
|
msgstr "Toutes les applications (par défaut)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Developement"
|
||||||
|
msgstr "Développement"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Jeux"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Graphics"
|
||||||
|
msgstr "Graphisme"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Internet"
|
||||||
|
msgstr "Internet"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Multimedia"
|
||||||
|
msgstr "Multimédia"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Office"
|
||||||
|
msgstr "Office"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Science & Math"
|
||||||
|
msgstr "Sciences & Math"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Réglages"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "System"
|
||||||
|
msgstr "Système"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Utilities"
|
||||||
|
msgstr "Utilitaires"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Lost & Found"
|
||||||
|
msgstr "Lost & Found"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Use system font settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Lists:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Compact list items"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "All applications view:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "show items in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Grid icon size:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Small"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Medium"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Large"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Number of columns in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "Hi, "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "%1@%2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/main.qml
|
||||||
|
msgid "Edit Applications…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Favorite Apps"
|
||||||
|
msgstr "Applications préférées"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Recent Apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Back"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "All apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/RunnerList.qml
|
||||||
|
msgctxt "@info:status"
|
||||||
|
msgid "No matches"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/SearchBar.qml
|
||||||
|
msgid "Search..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Power Off"
|
||||||
|
#~ msgstr "Éteindre"
|
||||||
|
|
||||||
|
#~ msgid "All"
|
||||||
|
#~ msgstr "Tout"
|
||||||
|
|
||||||
|
#~ 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"
|
||||||
|
|
@ -0,0 +1,308 @@
|
||||||
|
# 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/EliverLara/AndromedaLauncher/tree/plasma6\n"
|
||||||
|
"POT-Creation-Date: 2025-11-02 20:07+0500\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"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Remove from Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Add to Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On All Activities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On the Current Activity"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Show in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Umum"
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "Lists and grids"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Icon:"
|
||||||
|
msgstr "Ikon:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Open icon chooser dialog"
|
||||||
|
msgid "Choose…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Reset icon to default"
|
||||||
|
msgid "Clear Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator:"
|
||||||
|
msgstr "Indkator:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr "Diaktifkan"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator Color:"
|
||||||
|
msgstr "Warna Indikator"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Please choose a color"
|
||||||
|
msgstr "Silahkan pilih sebuah warna"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Greeting:"
|
||||||
|
msgstr "Sapaan:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Custom Greeting Text:"
|
||||||
|
msgstr "Teks Sapaan Kustom:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "No custom greeting set"
|
||||||
|
msgstr "Tidak ada spaan kustom yang diatur"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow color:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Purple (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Red"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Launcher Positioning:"
|
||||||
|
msgstr "Pemosisian Peluncur:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Default"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Horizontal Center"
|
||||||
|
msgstr "Tengah Horizontal"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Screen Center"
|
||||||
|
msgstr "Di Tengah Layar"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Floating"
|
||||||
|
msgstr "Mengambang"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Screen Edge (0 is Default):"
|
||||||
|
msgstr "Offset Tepian Layar (0 = Default)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Panel (0 is Default):"
|
||||||
|
msgstr "Offset Panel (0 = Default)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Pinned applications Page:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Favorites (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Recent Applications"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default Page:"
|
||||||
|
msgstr "Halaman Bawaan"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "All Applications (Default)"
|
||||||
|
msgstr "Semua Aplikasi (Default)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Developement"
|
||||||
|
msgstr "Pengembangan"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Permainan"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Graphics"
|
||||||
|
msgstr "Grafis"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Internet"
|
||||||
|
msgstr "Intenet"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Multimedia"
|
||||||
|
msgstr "Multimedia"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Office"
|
||||||
|
msgstr "Kantor"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Science & Math"
|
||||||
|
msgstr "Sains & Matematika"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Pengaturan"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "System"
|
||||||
|
msgstr "Sistem"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Utilities"
|
||||||
|
msgstr "Alat"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Lost & Found"
|
||||||
|
msgstr "Hilang & Ditemukan"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Use system font settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Lists:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Compact list items"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "All applications view:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "show items in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Grid icon size:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Small"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Medium"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Large"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Number of columns in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "Hi, "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "%1@%2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/main.qml
|
||||||
|
msgid "Edit Applications…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Favorite Apps"
|
||||||
|
msgstr "Aplikasi Favorit"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Recent Apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Back"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "All apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/RunnerList.qml
|
||||||
|
msgctxt "@info:status"
|
||||||
|
msgid "No matches"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/SearchBar.qml
|
||||||
|
msgid "Search..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Power Off"
|
||||||
|
#~ msgstr "Matikan Daya"
|
||||||
|
|
||||||
|
#~ msgid "All"
|
||||||
|
#~ msgstr "Semua"
|
||||||
|
|
||||||
|
#~ 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"
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# Version: 22
|
||||||
|
|
||||||
|
# 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="AndromedaLauncher"
|
||||||
|
widgetName="${plasmoidName##*.}" # Strip namespace
|
||||||
|
website="https://github.com/EliverLara/AndromedaLauncher/tree/plasma6"
|
||||||
|
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"
|
||||||
|
|
||||||
|
# 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}" \
|
||||||
|
-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"
|
||||||
|
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
|
||||||
|
|
||||||
|
compendiumArg=""
|
||||||
|
if [ ! -z "$COMPENDIUM_DIR" ]; then
|
||||||
|
langCode=`basename "${cat%.*}"`
|
||||||
|
compendiumPath=`realpath "$COMPENDIUM_DIR/compendium-${langCode}.po"`
|
||||||
|
if [ -f "$compendiumPath" ]; then
|
||||||
|
echo "compendiumPath=$compendiumPath"
|
||||||
|
compendiumArg="--compendium=$compendiumPath"
|
||||||
|
fi
|
||||||
|
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 \
|
||||||
|
${compendiumArg} \
|
||||||
|
-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"
|
||||||
|
|
||||||
|
#---
|
||||||
|
# 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"
|
||||||
|
|
@ -0,0 +1,310 @@
|
||||||
|
# Translation of MMcK Launcher in LANGUAGE
|
||||||
|
# Copyright (C) 2022
|
||||||
|
# This file is distributed under the same license as the MMcK Launcher package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: mmcklauncher\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://github.com/EliverLara/AndromedaLauncher/tree/"
|
||||||
|
"plasma6\n"
|
||||||
|
"POT-Creation-Date: 2025-11-02 20:07+0500\n"
|
||||||
|
"PO-Revision-Date: 2022-03-08 13:20+0100\n"
|
||||||
|
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\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"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Remove from Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Add to Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On All Activities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On the Current Activity"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Show in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Algemeen"
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "Lists and grids"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Icon:"
|
||||||
|
msgstr "Pictogram:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Open icon chooser dialog"
|
||||||
|
msgid "Choose…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Reset icon to default"
|
||||||
|
msgid "Clear Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator:"
|
||||||
|
msgstr "Indicator:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr "Ingeschakeld"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator Color:"
|
||||||
|
msgstr "Indicatorkleur:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Please choose a color"
|
||||||
|
msgstr "Kies een kleur"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Greeting:"
|
||||||
|
msgstr "Begroeting:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Custom Greeting Text:"
|
||||||
|
msgstr "Eigen tekst:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "No custom greeting set"
|
||||||
|
msgstr "Geen eigen tekst ingesteld"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow color:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Purple (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Red"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Launcher Positioning:"
|
||||||
|
msgstr "Startmenu openen op locatie:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "Standaard"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Horizontal Center"
|
||||||
|
msgstr "Midden (horizontaal)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Screen Center"
|
||||||
|
msgstr "Midden van scherm"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Floating"
|
||||||
|
msgstr "Zweven"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Screen Edge (0 is Default):"
|
||||||
|
msgstr "Ruimte vanaf schermrand (standaard: 0)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Panel (0 is Default):"
|
||||||
|
msgstr "Ruimte vanaf paneel (standaard: 0)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Pinned applications Page:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Favorites (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Recent Applications"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default Page:"
|
||||||
|
msgstr "Startpagina:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "All Applications (Default)"
|
||||||
|
msgstr "Alle programma's (standaard)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Developement"
|
||||||
|
msgstr "Ontwikkeling"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Games"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Graphics"
|
||||||
|
msgstr "Grafisch"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Internet"
|
||||||
|
msgstr "Internet"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Multimedia"
|
||||||
|
msgstr "Multimedia"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Office"
|
||||||
|
msgstr "Kantoor"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Science & Math"
|
||||||
|
msgstr "Wetenschap"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Instellingen"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "System"
|
||||||
|
msgstr "Systeem"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Utilities"
|
||||||
|
msgstr "Hulpmiddelen"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Lost & Found"
|
||||||
|
msgstr "Overig"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Use system font settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Lists:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Compact list items"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "All applications view:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "show items in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Grid icon size:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Small"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Medium"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Large"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Number of columns in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "Hi, "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "%1@%2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/main.qml
|
||||||
|
msgid "Edit Applications…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Favorite Apps"
|
||||||
|
msgstr "Favorieten"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Recent Apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Back"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "All apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/RunnerList.qml
|
||||||
|
msgctxt "@info:status"
|
||||||
|
msgid "No matches"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/SearchBar.qml
|
||||||
|
msgid "Search..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Power Off"
|
||||||
|
#~ msgstr "Uitschakelen"
|
||||||
|
|
||||||
|
#~ msgid "All"
|
||||||
|
#~ msgstr "Alles"
|
||||||
|
|
||||||
|
#~ 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"
|
||||||
|
|
@ -0,0 +1,181 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Version 9
|
||||||
|
# Requires plasmoidviewer v5.13.0
|
||||||
|
|
||||||
|
function checkIfLangInstalled {
|
||||||
|
if [ -x "$(command -v dpkg)" ]; then
|
||||||
|
dpkg -l ${1} >/dev/null 2>&1 || ( \
|
||||||
|
echo -e "${1} not installed.\nInstalling now before continuing.\n" \
|
||||||
|
; sudo apt install ${1} \
|
||||||
|
) || ( \
|
||||||
|
echo -e "\nError trying to install ${1}\nPlease run 'sudo apt install ${1}'\n" \
|
||||||
|
; exit 1 \
|
||||||
|
)
|
||||||
|
elif [ -x "$(command -v pacman)" ]; then
|
||||||
|
# TODO: run `locale -a` and check if the locale is enabled.
|
||||||
|
if false; then
|
||||||
|
# https://wiki.archlinux.org/index.php/Locale
|
||||||
|
# Uncomment the locale in /etc/locale.gen
|
||||||
|
# Then run `locale-gen`
|
||||||
|
echo -e "\nPlease install this locale in System Settings first.\n"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "\nPackage manager not recognized. If the widget is not translated, please install the package '${1}'\n"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
langInput="${1}"
|
||||||
|
lang=""
|
||||||
|
languagePack=""
|
||||||
|
|
||||||
|
if [[ "$langInput" =~ ":" ]]; then # String contains a colon so assume it's a locale code.
|
||||||
|
lang="${langInput}"
|
||||||
|
IFS=: read -r l1 l2 <<< "${lang}"
|
||||||
|
languagePack="language-pack-${l2}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# https://stackoverflow.com/questions/3191664/list-of-all-locales-and-their-short-codes/28357857#28357857
|
||||||
|
declare -a langArr=(
|
||||||
|
"af_ZA:af:Afrikaans (South Africa)"
|
||||||
|
"ak_GH:ak:Akan (Ghana)"
|
||||||
|
"am_ET:am:Amharic (Ethiopia)"
|
||||||
|
"ar_EG:ar:Arabic (Egypt)"
|
||||||
|
"as_IN:as:Assamese (India)"
|
||||||
|
"az_AZ:az:Azerbaijani (Azerbaijan)"
|
||||||
|
"be_BY:be:Belarusian (Belarus)"
|
||||||
|
"bem_ZM:bem:Bemba (Zambia)"
|
||||||
|
"bg_BG:bg:Bulgarian (Bulgaria)"
|
||||||
|
"bo_IN:bo:Tibetan (India)"
|
||||||
|
"bs_BA:bs:Bosnian (Bosnia and Herzegovina)"
|
||||||
|
"ca_ES:ca:Catalan (Spain)"
|
||||||
|
"chr_US:ch:Cherokee (United States)"
|
||||||
|
"cs_CZ:cs:Czech (Czech Republic)"
|
||||||
|
"cy_GB:cy:Welsh (United Kingdom)"
|
||||||
|
"da_DK:da:Danish (Denmark)"
|
||||||
|
"de_DE:de:German (Germany)"
|
||||||
|
"el_GR:el:Greek (Greece)"
|
||||||
|
"es_MX:es:Spanish (Mexico)"
|
||||||
|
"et_EE:et:Estonian (Estonia)"
|
||||||
|
"eu_ES:eu:Basque (Spain)"
|
||||||
|
"fa_IR:fa:Persian (Iran)"
|
||||||
|
"ff_SN:ff:Fulah (Senegal)"
|
||||||
|
"fi_FI:fi:Finnish (Finland)"
|
||||||
|
"fo_FO:fo:Faroese (Faroe Islands)"
|
||||||
|
"fr_CA:fr:French (Canada)"
|
||||||
|
"ga_IE:ga:Irish (Ireland)"
|
||||||
|
"gl_ES:gl:Galician (Spain)"
|
||||||
|
"gu_IN:gu:Gujarati (India)"
|
||||||
|
"gv_GB:gv:Manx (United Kingdom)"
|
||||||
|
"ha_NG:ha:Hausa (Nigeria)"
|
||||||
|
"he_IL:he:Hebrew (Israel)"
|
||||||
|
"hi_IN:hi:Hindi (India)"
|
||||||
|
"hr_HR:hr:Croatian (Croatia)"
|
||||||
|
"hu_HU:hu:Hungarian (Hungary)"
|
||||||
|
"hy_AM:hy:Armenian (Armenia)"
|
||||||
|
"id_ID:id:Indonesian (Indonesia)"
|
||||||
|
"ig_NG:ig:Igbo (Nigeria)"
|
||||||
|
"is_IS:is:Icelandic (Iceland)"
|
||||||
|
"it_IT:it:Italian (Italy)"
|
||||||
|
"ja_JP:ja:Japanese (Japan)"
|
||||||
|
"ka_GE:ka:Georgian (Georgia)"
|
||||||
|
"kk_KZ:kk:Kazakh (Kazakhstan)"
|
||||||
|
"kl_GL:kl:Kalaallisut (Greenland)"
|
||||||
|
"km_KH:km:Khmer (Cambodia)"
|
||||||
|
"kn_IN:kn:Kannada (India)"
|
||||||
|
"ko_KR:ko:Korean (South Korea)"
|
||||||
|
"ko_KR:ko:Korean (South Korea)"
|
||||||
|
"lg_UG:lg:Ganda (Uganda)"
|
||||||
|
"lt_LT:lt:Lithuanian (Lithuania)"
|
||||||
|
"lv_LV:lv:Latvian (Latvia)"
|
||||||
|
"mg_MG:mg:Malagasy (Madagascar)"
|
||||||
|
"mk_MK:mk:Macedonian (Macedonia)"
|
||||||
|
"ml_IN:ml:Malayalam (India)"
|
||||||
|
"mr_IN:mr:Marathi (India)"
|
||||||
|
"ms_MY:ms:Malay (Malaysia)"
|
||||||
|
"mt_MT:mt:Maltese (Malta)"
|
||||||
|
"my_MM:my:Burmese (Myanmar [Burma])"
|
||||||
|
"nb_NO:nb:Norwegian Bokmål (Norway)"
|
||||||
|
"ne_NP:ne:Nepali (Nepal)"
|
||||||
|
"nl_NL:nl:Dutch (Netherlands)"
|
||||||
|
"nn_NO:nn:Norwegian Nynorsk (Norway)"
|
||||||
|
"om_ET:om:Oromo (Ethiopia)"
|
||||||
|
"or_IN:or:Oriya (India)"
|
||||||
|
"pa_PK:pa:Punjabi (Pakistan)"
|
||||||
|
"pl_PL:pl:Polish (Poland)"
|
||||||
|
"ps_AF:ps:Pashto (Afghanistan)"
|
||||||
|
"pt_BR:pt:Portuguese (Brazil)"
|
||||||
|
"ro_RO:ro:Romanian (Romania)"
|
||||||
|
"ru_RU:ru:Russian (Russia)"
|
||||||
|
"rw_RW:rw:Kinyarwanda (Rwanda)"
|
||||||
|
"si_LK:si:Sinhala (Sri Lanka)"
|
||||||
|
"sk_SK:sk:Slovak (Slovakia)"
|
||||||
|
"sl_SI:sl:Slovenian (Slovenia)"
|
||||||
|
"so_SO:so:Somali (Somalia)"
|
||||||
|
"sq_AL:sq:Albanian (Albania)"
|
||||||
|
"sr_RS:sr:Serbian (Serbia)"
|
||||||
|
"sv_SE:sv:Swedish (Sweden)"
|
||||||
|
"sw_KE:sw:Swahili (Kenya)"
|
||||||
|
"ta_IN:ta:Tamil (India)"
|
||||||
|
"te_IN:te:Telugu (India)"
|
||||||
|
"th_TH:th:Thai (Thailand)"
|
||||||
|
"ti_ER:ti:Tigrinya (Eritrea)"
|
||||||
|
"to_TO:to:Tonga (Tonga)"
|
||||||
|
"tr_TR:tr:Turkish (Turkey)"
|
||||||
|
"uk_UA:uk:Ukrainian (Ukraine)"
|
||||||
|
"ur_IN:ur:Urdu (India)"
|
||||||
|
"uz_UZ:uz:Uzbek (Uzbekistan)"
|
||||||
|
"vi_VN:vi:Vietnamese (Vietnam)"
|
||||||
|
"yo_NG:yo:Yoruba (Nigeria)"
|
||||||
|
"yo_NG:yo:Yoruba (Nigeria)"
|
||||||
|
"yue_HK:yu:Cantonese (Hong Kong)"
|
||||||
|
"zh_CN:zh:Chinese (China)"
|
||||||
|
"zu_ZA:zu:Zulu (South Africa)"
|
||||||
|
)
|
||||||
|
|
||||||
|
for i in "${langArr[@]}"; do
|
||||||
|
IFS=: read -r l1 l2 l3 <<< "$i"
|
||||||
|
if [ "$langInput" == "$l2" ]; then
|
||||||
|
lang="${l1}:${l2}"
|
||||||
|
languagePack="language-pack-${l2}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$lang" ]; then
|
||||||
|
echo "plasmoidlocaletest doesn't recognize the language '$lang'"
|
||||||
|
echo "Eg:"
|
||||||
|
scriptcmd='sh ./plasmoidlocaletest'
|
||||||
|
for i in "${langArr[@]}"; do
|
||||||
|
IFS=: read -r l1 l2 l3 <<< "$i"
|
||||||
|
echo " ${scriptcmd} ${l2} | ${l3}"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
echo "Or use a the full locale code:"
|
||||||
|
echo " ${scriptcmd} ar_EG:ar"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=: read -r l1 l2 <<< "${lang}"
|
||||||
|
l1="${l1}.UTF-8"
|
||||||
|
|
||||||
|
# Check if language is installed
|
||||||
|
if [ ! -z "$languagePack" ]; then
|
||||||
|
if [ "$lang" == "zh_CN:zh" ]; then languagePack="language-pack-zh-hans"
|
||||||
|
fi
|
||||||
|
|
||||||
|
checkIfLangInstalled "$languagePack" || exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "LANGUAGE=\"${lang}\""
|
||||||
|
echo "LANG=\"${l1}\""
|
||||||
|
|
||||||
|
scriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
packageDir="${scriptDir}/.."
|
||||||
|
|
||||||
|
# Build local translations for plasmoidviewer
|
||||||
|
sh "${scriptDir}/build"
|
||||||
|
|
||||||
|
LANGUAGE="${lang}" LANG="${l1}" LC_TIME="${l1}" QML_DISABLE_DISK_CACHE=true plasmoidviewer -a "$packageDir" -l topedge -f horizontal -x 0 -y 0
|
||||||
|
|
@ -0,0 +1,281 @@
|
||||||
|
# Translation of AndromedaLauncher in ru
|
||||||
|
# Copyright (C) 2025
|
||||||
|
# This file is distributed under the same license as the AndromedaLauncher package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: AndromedaLauncher\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://github.com/EliverLara/AndromedaLauncher/tree/plasma6\n"
|
||||||
|
"POT-Creation-Date: 2025-11-02 20:07+0500\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Remove from Favorites"
|
||||||
|
msgstr "Удалить из избранных"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Add to Favorites"
|
||||||
|
msgstr "Добавить в избранные"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On All Activities"
|
||||||
|
msgstr "На всех активностях"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On the Current Activity"
|
||||||
|
msgstr "На текущей активности"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Show in Favorites"
|
||||||
|
msgstr "Показать в избранных"
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "General"
|
||||||
|
msgstr "Общие"
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "Lists and grids"
|
||||||
|
msgstr "Списки и сетки"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Icon:"
|
||||||
|
msgstr "Иконка"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Open icon chooser dialog"
|
||||||
|
msgid "Choose…"
|
||||||
|
msgstr "Выбрать…"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Reset icon to default"
|
||||||
|
msgid "Clear Icon"
|
||||||
|
msgstr "Очистить иконку"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator:"
|
||||||
|
msgstr "Индикатор:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr "Разрешено"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator Color:"
|
||||||
|
msgstr "Цвет индикатора"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Please choose a color"
|
||||||
|
msgstr "Пожалуйста выберите цвет"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Greeting:"
|
||||||
|
msgstr "Приветствие"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Custom Greeting Text:"
|
||||||
|
msgstr "Тектс приветствия:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "No custom greeting set"
|
||||||
|
msgstr "Ничего не задано в приветствии"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow"
|
||||||
|
msgstr "Сияние"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow color:"
|
||||||
|
msgstr "Цвет сияния"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Purple (Default)"
|
||||||
|
msgstr "Пурпурный (по-умолчанию)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr "Синий"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Red"
|
||||||
|
msgstr "Красный"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Launcher Positioning:"
|
||||||
|
msgstr "Позиция меню"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default"
|
||||||
|
msgstr "По-умолчанию"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Horizontal Center"
|
||||||
|
msgstr "Центр по горизонтали"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Screen Center"
|
||||||
|
msgstr "Центр экрана"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Floating"
|
||||||
|
msgstr "Плавающее"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Screen Edge (0 is Default):"
|
||||||
|
msgstr "Сдвиг от края экрана (0 по-умолчанию):"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Panel (0 is Default):"
|
||||||
|
msgstr "Сдвиг от панели (0 по-умолчанию):"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Pinned applications Page:"
|
||||||
|
msgstr "Страница с закрепленными приложениями"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Favorites (Default)"
|
||||||
|
msgstr "Избранные (по-умолчанию)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Recent Applications"
|
||||||
|
msgstr "Последние приложения"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default Page:"
|
||||||
|
msgstr "Страница по-умолчанию"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "All Applications (Default)"
|
||||||
|
msgstr "Все приложения (по-умолчанию)"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Developement"
|
||||||
|
msgstr "Разработка"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Games"
|
||||||
|
msgstr "Игры"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Graphics"
|
||||||
|
msgstr "Графика"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Internet"
|
||||||
|
msgstr "Интернет"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Multimedia"
|
||||||
|
msgstr "Мультимедиа"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Office"
|
||||||
|
msgstr "Офис"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Science & Math"
|
||||||
|
msgstr "Наука и математика"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr "Настройки"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "System"
|
||||||
|
msgstr "Система"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Utilities"
|
||||||
|
msgstr "Утилиты"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Lost & Found"
|
||||||
|
msgstr "Потеряное и найденое"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Use system font settings"
|
||||||
|
msgstr "Использовать системные настройки шрифта"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Lists:"
|
||||||
|
msgstr "Списки:"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Compact list items"
|
||||||
|
msgstr "Компактный список элементов"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "All applications view:"
|
||||||
|
msgstr "Вид всех приложений"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "show items in grid"
|
||||||
|
msgstr "Показать элементы сеткой"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Grid icon size:"
|
||||||
|
msgstr "Размер сетки иконок"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Small"
|
||||||
|
msgstr "Маленький"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Medium"
|
||||||
|
msgstr "Средний"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Large"
|
||||||
|
msgstr "Большой"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr "Огромный"
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Number of columns in grid"
|
||||||
|
msgstr "Количество столбцов в сетке"
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "Hi, "
|
||||||
|
msgstr "Привет, "
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "%1@%2"
|
||||||
|
msgstr "%1@%2"
|
||||||
|
|
||||||
|
#: ../contents/ui/main.qml
|
||||||
|
msgid "Edit Applications…"
|
||||||
|
msgstr "Редактировать приложения"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Favorite Apps"
|
||||||
|
msgstr "Избранные приложения"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Recent Apps"
|
||||||
|
msgstr "Последние приложения"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Back"
|
||||||
|
msgstr "Назад"
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "All apps"
|
||||||
|
msgstr "Все приложения"
|
||||||
|
|
||||||
|
#: ../contents/ui/RunnerList.qml
|
||||||
|
msgctxt "@info:status"
|
||||||
|
msgid "No matches"
|
||||||
|
msgstr "Нет совпадений"
|
||||||
|
|
||||||
|
#: ../contents/ui/SearchBar.qml
|
||||||
|
msgid "Search..."
|
||||||
|
msgstr "Искать..."
|
||||||
|
|
@ -0,0 +1,281 @@
|
||||||
|
# Translation of AndromedaLauncher in LANGUAGE
|
||||||
|
# Copyright (C) 2025
|
||||||
|
# This file is distributed under the same license as the AndromedaLauncher package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: AndromedaLauncher\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://github.com/EliverLara/AndromedaLauncher/tree/plasma6\n"
|
||||||
|
"POT-Creation-Date: 2025-11-02 20:07+0500\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Remove from Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Add to Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On All Activities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "On the Current Activity"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/code/tools.js
|
||||||
|
msgid "Show in Favorites"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "General"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/config/config.qml
|
||||||
|
msgid "Lists and grids"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Icon:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Open icon chooser dialog"
|
||||||
|
msgid "Choose…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgctxt "@item:inmenu Reset icon to default"
|
||||||
|
msgid "Clear Icon"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Indicator Color:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Please choose a color"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Greeting:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Custom Greeting Text:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "No custom greeting set"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Glow color:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Purple (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Blue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Red"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Launcher Positioning:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Horizontal Center"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Screen Center"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Floating"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Screen Edge (0 is Default):"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Offset Panel (0 is Default):"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Pinned applications Page:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Favorites (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Recent Applications"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Default Page:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "All Applications (Default)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Developement"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Games"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Graphics"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Internet"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Multimedia"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Office"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Science & Math"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Utilities"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Lost & Found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ConfigGeneral.qml
|
||||||
|
msgid "Use system font settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Lists:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Compact list items"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "All applications view:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "show items in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Grid icon size:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Small"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Medium"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Large"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Huge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/config/ListAndGrid.qml
|
||||||
|
msgid "Number of columns in grid"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "Hi, "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/Greeting.qml
|
||||||
|
msgid "%1@%2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/main.qml
|
||||||
|
msgid "Edit Applications…"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Favorite Apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Recent Apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "Back"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/MainView.qml
|
||||||
|
msgid "All apps"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/RunnerList.qml
|
||||||
|
msgctxt "@info:status"
|
||||||
|
msgid "No matches"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../contents/ui/SearchBar.qml
|
||||||
|
msgid "Search..."
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,661 @@
|
||||||
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
Developers that use our General Public Licenses protect your rights
|
||||||
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
|
you this License which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
|
A secondary benefit of defending all users' freedom is that
|
||||||
|
improvements made in alternate versions of the program, if they
|
||||||
|
receive widespread use, become available for other developers to
|
||||||
|
incorporate. Many developers of free software are heartened and
|
||||||
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
|
The GNU Affero General Public License is designed specifically to
|
||||||
|
ensure that, in such cases, the modified source code becomes available
|
||||||
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
|
An older license, called the Affero General Public License and
|
||||||
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
|
this license.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the work with which it is combined will remain governed by version
|
||||||
|
3 of the GNU General Public License.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published
|
||||||
|
by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If your software can interact with users remotely through a computer
|
||||||
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
|
interface could display a "Source" link that leads users to an archive
|
||||||
|
of the code. There are many ways you could offer source, and different
|
||||||
|
solutions will be better for different programs; see section 13 for the
|
||||||
|
specific requirements.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
# melawy-plasma-plasmoid-AndromedaLauncher
|
||||||
|
AndromedaLauncher plasmoid
|
||||||
|
|
||||||
|
### Donate
|
||||||
|
[Tinkoff](https://www.tinkoff.ru/rm/fadeeva.valeriya96/9bLRi79066)
|
||||||
|
|
||||||
|
[YooMoney](https://yoomoney.ru/to/4100115921160758)
|
||||||
|
|
||||||
|
Etherium 0x981FBf878fe451BDB83BEaF68078394d4B13213f
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ "$UID" != 0 ]]; then
|
||||||
|
echo "USER NOT ROOT"
|
||||||
|
sudo $0
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
echo "USER IS ROOT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PWD=$(dirname $0)
|
||||||
|
|
||||||
|
THEME_PATH="/usr/share/plasma/plasmoids"
|
||||||
|
|
||||||
|
if [[ ! -d "$THEME_PATH" ]];then
|
||||||
|
mkdir -p "$THEME_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
THEME_NAME="AndromedaLauncher"
|
||||||
|
|
||||||
|
rm -rf $THEME_PATH/$THEME_NAME
|
||||||
|
|
||||||
|
cp -vrf --remove-destination --no-dereference --preserve=links "$PWD/$THEME_NAME" "$THEME_PATH/"
|
||||||