--- /dev/null
+#clang-format/tidy
+7481371ef05cd137ef6daabad478e2ae410541d8
+1c38b1a4234efee41486e8babdac100fc6605d67
+c2fa7d9fe178344c2e07921a5bafaf1dae80edf5
--- /dev/null
+# Ignore the following files
+*~
+*.[oa]
+*.diff
+*.kate-swp
+*.kdev4
+.kdev_include_paths
+*.kdevelop.pcs
+*.moc
+*.moc.cpp
+*.orig
+*.user
+.*.swp
+.swp.*
+Doxyfile
+Makefile
+avail
+random_seed
+/build*/
+CMakeLists.txt.user*
+*.unc-backup*
+.cmake/
+/.clang-format
+/compile_commands.json
+.clangd
+.idea
+/cmake-build*
+.cache
--- /dev/null
+cmake_minimum_required(VERSION 3.16)
+
+set(KF_VERSION "5.86.0") # handled by release scripts
+set(KF_DEP_VERSION "5.86.0") # handled by release scripts
+project(KDeclarative VERSION ${KF_VERSION})
+
+# Dependencies
+include(FeatureSummary)
+find_package(ECM 5.86.0 NO_MODULE)
+set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules")
+feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)
+
+set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
+
+set(REQUIRED_QT_VERSION 5.15.2)
+
+find_package(Qt5 ${REQUIRED_QT_VERSION} NO_MODULE REQUIRED Qml Quick Gui)
+include(KDEInstallDirs)
+include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE)
+include(KDECMakeSettings)
+include(KDEGitCommitHooks)
+
+find_package(KF5Config ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5I18n ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5IconThemes ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5KIO ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5WidgetsAddons ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5WindowSystem ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5GlobalAccel ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5GuiAddons ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5Package ${KF_DEP_VERSION} REQUIRED)
+find_package(KF5Notifications ${KF_DEP_VERSION} REQUIRED)
+
+#########################################################################
+
+add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x050f02)
+add_definitions(-DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x055100)
+
+#add_definitions(-Wno-deprecated)
+
+# Includes
+
+include(ECMGenerateExportHeader)
+include(ECMSetupVersion)
+include(ECMGenerateHeaders)
+include(CMakePackageConfigHelpers)
+include(ECMAddQch)
+
+set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].")
+
+option(BUILD_EXAMPLES "Build and install examples." OFF)
+option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF)
+add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)")
+
+
+# ECM setup
+ecm_setup_version(
+ PROJECT
+ VARIABLE_PREFIX KDECLARATIVE
+ VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kdeclarative_version.h"
+ PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5DeclarativeConfigVersion.cmake"
+ SOVERSION 5)
+
+# Subdirectories
+add_definitions(-DTRANSLATION_DOMAIN=\"kdeclarative5\")
+ki18n_install(po)
+
+find_package(epoxy)
+set_package_properties(epoxy PROPERTIES DESCRIPTION "libepoxy"
+ URL "https://github.com/anholt/libepoxy"
+ TYPE OPTIONAL
+ PURPOSE "OpenGL dispatch library"
+ )
+
+set(HAVE_EPOXY 0)
+if(epoxy_FOUND)
+ set(HAVE_EPOXY 1)
+endif()
+add_subdirectory(src)
+if (BUILD_TESTING)
+ add_subdirectory(autotests)
+ add_subdirectory(tests)
+endif()
+
+# Create a Config.cmake and a ConfigVersion.cmake file and install them
+set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Declarative")
+
+if (BUILD_QCH)
+ ecm_install_qch_export(
+ TARGETS KF5Declarative_QCH
+ FILE KF5DeclarativeQchTargets.cmake
+ DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+ COMPONENT Devel
+ )
+ set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF5DeclarativeQchTargets.cmake\")")
+endif()
+
+configure_package_config_file(
+ "${CMAKE_CURRENT_SOURCE_DIR}/KF5DeclarativeConfig.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/KF5DeclarativeConfig.cmake"
+ INSTALL_DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+)
+
+install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/KF5DeclarativeConfig.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/KF5DeclarativeConfigVersion.cmake"
+ DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+ COMPONENT Devel
+)
+
+install(EXPORT
+ KF5DeclarativeTargets
+ DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+ FILE KF5DeclarativeTargets.cmake
+ NAMESPACE KF5::
+ COMPONENT Devel
+)
+
+install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/kdeclarative_version.h"
+ DESTINATION "${KDE_INSTALL_INCLUDEDIR_KF5}"
+ COMPONENT Devel
+)
+
+feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
+
+if(KF5Config_FOUND AND KF5I18n_FOUND AND KF5IconThemes_FOUND AND KF5KIO_FOUND)
+ message("Dependencies for libkdeclarative found: it will be built")
+else()
+ message("In order to build libkdeclarative you need KF5Config, KF5I18n, KF5IconThemes and KF5KIO")
+endif()
+
+if(KF5I18n_FOUND AND KF5WidgetsAddons_FOUND AND KF5WindowSystem_FOUND AND KF5GlobalAccel_FOUND AND KF5KIO_FOUND AND KF5GuiAddons_FOUND)
+ message("Dependencies for KQuickControls found: it will be built")
+else()
+ message("In order to build KQuickControls you need KF5I18n, KF5WidgetsAddons, KF5WindowSystem, KF5GlobalAccel, KF5KIO and KF5GuiAddons")
+endif()
+
+if(KF5CoreAddons_FOUND)
+ message("Dependencies for KCoreAddons QML bindings found; it will be built")
+else()
+ message("In order to build KCoreAddons QML bindings you need KCoreAddons")
+endif()
+
+
+kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT)
--- /dev/null
+@PACKAGE_INIT@
+
+include(CMakeFindDependencyMacro)
+find_dependency(Qt5Quick "@REQUIRED_QT_VERSION@")
+find_dependency(KF5Config "@KF_DEP_VERSION@")
+find_dependency(KF5CoreAddons "@KF_DEP_VERSION@")
+find_dependency(KF5Package "@KF_DEP_VERSION@")
+
+include("${CMAKE_CURRENT_LIST_DIR}/KF5DeclarativeTargets.cmake")
+@PACKAGE_INCLUDE_QCHTARGETS@
--- /dev/null
+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.
+
+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 an idea of what it does.>
+
+Copyright (C)< yyyy> <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.
--- /dev/null
+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.
+
+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 an idea of what it does.>
+
+Copyright (C) <yyyy> <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.
--- /dev/null
+GNU GENERAL PUBLIC LICENSE
+
+Version 3, 29 June 2007
+
+Copyright © 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 General Public License is a free, copyleft license for software and
+other kinds of works.
+
+The licenses for most software and other practical works are designed to take
+away your freedom to share and change the works. By contrast, the GNU General
+Public License is intended to guarantee your freedom to share and change all
+versions of a program--to make sure it remains free software for all its users.
+We, the Free Software Foundation, use the GNU General Public License for most
+of our software; it applies also to any other work released this way by its
+authors. You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom
+to distribute copies of free software (and charge for them if you wish), that
+you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs, and that you know you
+can do these things.
+
+To protect your rights, we need to prevent others from denying you these rights
+or asking you to surrender the rights. Therefore, you have certain responsibilities
+if you distribute copies of the software, or if you modify it: responsibilities
+to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must pass on to the recipients the same freedoms that you received.
+You must make sure that they, too, receive or can get the source code. And
+you must show them these terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps: (1) assert
+copyright on the software, and (2) offer you this License giving you legal
+permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains that
+there is no warranty for this free software. For both users' and authors'
+sake, the GPL requires that modified versions be marked as changed, so that
+their problems will not be attributed erroneously to authors of previous versions.
+
+Some devices are designed to deny users access to install or run modified
+versions of the software inside them, although the manufacturer can do so.
+This is fundamentally incompatible with the aim of protecting users' freedom
+to change the software. The systematic pattern of such abuse occurs in the
+area of products for individuals to use, which is precisely where it is most
+unacceptable. Therefore, we have designed this version of the GPL to prohibit
+the practice for those products. If such problems arise substantially in other
+domains, we stand ready to extend this provision to those domains in future
+versions of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents. States
+should not allow patents to restrict development and use of software on general-purpose
+computers, but in those that do, we wish to avoid the special danger that
+patents applied to a free program could make it effectively proprietary. To
+prevent this, the GPL assures that patents cannot be used to render the program
+non-free.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+"Copyright" also means copyright-like laws that apply to other kinds of works,
+such as semiconductor masks.
+
+"The Program" refers to any copyrightable work licensed under this License.
+Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals
+or organizations.
+
+To "modify" a work means to copy from or adapt all or part of the work in
+a fashion requiring copyright permission, other than the making of an exact
+copy. The resulting work is called a "modified version" of the earlier work
+or a work "based on" the earlier work.
+
+A "covered work" means either the unmodified Program or a work based on the
+Program.
+
+To "propagate" a work means to do anything with it that, without permission,
+would make you directly or secondarily liable for infringement under applicable
+copyright law, except executing it on a computer or modifying a private copy.
+Propagation includes copying, distribution (with or without modification),
+making available to the public, and in some countries other activities as
+well.
+
+To "convey" a work means any kind of propagation that enables other parties
+to make or receive copies. Mere interaction with a user through a computer
+network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays "Appropriate Legal Notices" to the
+extent that it includes a convenient and prominently visible feature that
+(1) displays an appropriate copyright notice, and (2) tells the user that
+there is no warranty for the work (except to the extent that warranties are
+provided), that licensees may convey the work under this License, and how
+to view a copy of this License. If the interface presents a list of user commands
+or options, such as a menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+The "source code" for a work means the preferred form of the work for making
+modifications to it. "Object code" means any non-source form of a work.
+
+A "Standard Interface" means an interface that either is an official standard
+defined by a recognized standards body, or, in the case of interfaces specified
+for a particular programming language, one that is widely used among developers
+working in that language.
+
+The "System Libraries" of an executable work include anything, other than
+the work as a whole, that (a) is included in the normal form of packaging
+a Major Component, but which is not part of that Major Component, and (b)
+serves only to enable use of the work with that Major Component, or to implement
+a Standard Interface for which an implementation is available to the public
+in source code form. A "Major Component", in this context, means a major essential
+component (kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to produce
+the work, or an object code interpreter used to run it.
+
+The "Corresponding Source" for a work in object code form means all the source
+code needed to generate, install, and (for an executable work) run the object
+code and to modify the work, including scripts to control those activities.
+However, it does not include the work's System Libraries, or general-purpose
+tools or generally available free programs which are used unmodified in performing
+those activities but which are not part of the work. For example, Corresponding
+Source includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically linked
+subprograms that the work is specifically designed to require, such as by
+intimate data communication or control flow between those subprograms and
+other parts of the work.
+
+The Corresponding Source need not include anything that users can regenerate
+automatically from other parts of the Corresponding Source.
+
+ The Corresponding Source for a work in source code form is that same work.
+
+ 2. Basic Permissions.
+
+All rights granted under this License are granted for the term of copyright
+on the Program, and are irrevocable provided the stated conditions are met.
+This License explicitly affirms your unlimited permission to run the unmodified
+Program. The output from running a covered work is covered by this License
+only if the output, given its content, constitutes a covered work. This License
+acknowledges your rights of fair use or other equivalent, as provided by copyright
+law.
+
+You may make, run and propagate covered works that you do not convey, without
+conditions so long as your license otherwise remains in force. You may convey
+covered works to others for the sole purpose of having them make modifications
+exclusively for you, or provide you with facilities for running those works,
+provided that you comply with the terms of this License in conveying all material
+for which you do not control copyright. Those thus making or running the covered
+works for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of your copyrighted
+material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the conditions
+stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological measure
+under any applicable law fulfilling obligations under article 11 of the WIPO
+copyright treaty adopted on 20 December 1996, or similar laws prohibiting
+or restricting circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid circumvention
+of technological measures to the extent such circumvention is effected by
+exercising rights under this License with respect to the covered work, and
+you disclaim any intention to limit operation or modification of the work
+as a means of enforcing, against the work's users, your or third parties'
+legal rights to forbid circumvention of technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you receive
+it, in any medium, provided that you conspicuously and appropriately publish
+on each copy an appropriate copyright notice; keep intact all notices stating
+that this License and any non-permissive terms added in accord with section
+7 apply to the code; keep intact all notices of the absence of any warranty;
+and give all recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and you
+may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to produce
+it from the Program, in the form of source code under the terms of section
+4, provided that you also meet all of these conditions:
+
+a) The work must carry prominent notices stating that you modified it, and
+giving a relevant date.
+
+b) The work must carry prominent notices stating that it is released under
+this License and any conditions added under section 7. This requirement modifies
+the requirement in section 4 to "keep intact all notices".
+
+c) You must license the entire work, as a whole, under this License to anyone
+who comes into possession of a copy. This License will therefore apply, along
+with any applicable section 7 additional terms, to the whole of the work,
+and all its parts, regardless of how they are packaged. This License gives
+no permission to license the work in any other way, but it does not invalidate
+such permission if you have separately received it.
+
+d) If the work has interactive user interfaces, each must display Appropriate
+Legal Notices; however, if the Program has interactive interfaces that do
+not display Appropriate Legal Notices, your work need not make them do so.
+
+A compilation of a covered work with other separate and independent works,
+which are not by their nature extensions of the covered work, and which are
+not combined with it such as to form a larger program, in or on a volume of
+a storage or distribution medium, is called an "aggregate" if the compilation
+and its resulting copyright are not used to limit the access or legal rights
+of the compilation's users beyond what the individual works permit. Inclusion
+of a covered work in an aggregate does not cause this License to apply to
+the other parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of sections
+4 and 5, provided that you also convey the machine-readable Corresponding
+Source under the terms of this License, in one of these ways:
+
+a) Convey the object code in, or embodied in, a physical product (including
+a physical distribution medium), accompanied by the Corresponding Source fixed
+on a durable physical medium customarily used for software interchange.
+
+b) Convey the object code in, or embodied in, a physical product (including
+a physical distribution medium), accompanied by a written offer, valid for
+at least three years and valid for as long as you offer spare parts or customer
+support for that product model, to give anyone who possesses the object code
+either (1) a copy of the Corresponding Source for all the software in the
+product that is covered by this License, on a durable physical medium customarily
+used for software interchange, for a price no more than your reasonable cost
+of physically performing this conveying of source, or (2) access to copy the
+Corresponding Source from a network server at no charge.
+
+c) Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source. This alternative is allowed only
+occasionally and noncommercially, and only if you received the object code
+with such an offer, in accord with subsection 6b.
+
+d) Convey the object code by offering access from a designated place (gratis
+or for a charge), and offer equivalent access to the Corresponding Source
+in the same way through the same place at no further charge. You need not
+require recipients to copy the Corresponding Source along with the object
+code. If the place to copy the object code is a network server, the Corresponding
+Source may be on a different server (operated by you or a third party) that
+supports equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source. Regardless
+of what server hosts the Corresponding Source, you remain obligated to ensure
+that it is available for as long as needed to satisfy these requirements.
+
+e) Convey the object code using peer-to-peer transmission, provided you inform
+other peers where the object code and Corresponding Source of the work are
+being offered to the general public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded from
+the Corresponding Source as a System Library, need not be included in conveying
+the object code work.
+
+A "User Product" is either (1) a "consumer product", which means any tangible
+personal property which is normally used for personal, family, or household
+purposes, or (2) anything designed or sold for incorporation into a dwelling.
+In determining whether a product is a consumer product, doubtful cases shall
+be resolved in favor of coverage. For a particular product received by a particular
+user, "normally used" refers to a typical or common use of that class of product,
+regardless of the status of the particular user or of the way in which the
+particular user actually uses, or expects or is expected to use, the product.
+A product is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent the
+only significant mode of use of the product.
+
+"Installation Information" for a User Product means any methods, procedures,
+authorization keys, or other information required to install and execute modified
+versions of a covered work in that User Product from a modified version of
+its Corresponding Source. The information must suffice to ensure that the
+continued functioning of the modified object code is in no case prevented
+or interfered with solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or specifically
+for use in, a User Product, and the conveying occurs as part of a transaction
+in which the right of possession and use of the User Product is transferred
+to the recipient in perpetuity or for a fixed term (regardless of how the
+transaction is characterized), the Corresponding Source conveyed under this
+section must be accompanied by the Installation Information. But this requirement
+does not apply if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has been installed
+in ROM).
+
+The requirement to provide Installation Information does not include a requirement
+to continue to provide support service, warranty, or updates for a work that
+has been modified or installed by the recipient, or for the User Product in
+which it has been modified or installed. Access to a network may be denied
+when the modification itself materially and adversely affects the operation
+of the network or violates the rules and protocols for communication across
+the network.
+
+Corresponding Source conveyed, and Installation Information provided, in accord
+with this section must be in a format that is publicly documented (and with
+an implementation available to the public in source code form), and must require
+no special password or key for unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+"Additional permissions" are terms that supplement the terms of this License
+by making exceptions from one or more of its conditions. Additional permissions
+that are applicable to the entire Program shall be treated as though they
+were included in this License, to the extent that they are valid under applicable
+law. If additional permissions apply only to part of the Program, that part
+may be used separately under those permissions, but the entire Program remains
+governed by this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove any
+additional permissions from that copy, or from any part of it. (Additional
+permissions may be written to require their own removal in certain cases when
+you modify the work.) You may place additional permissions on material, added
+by you to a covered work, for which you have or can give appropriate copyright
+permission.
+
+Notwithstanding any other provision of this License, for material you add
+to a covered work, you may (if authorized by the copyright holders of that
+material) supplement the terms of this License with terms:
+
+a) Disclaiming warranty or limiting liability differently from the terms of
+sections 15 and 16 of this License; or
+
+b) Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices displayed
+by works containing it; or
+
+c) Prohibiting misrepresentation of the origin of that material, or requiring
+that modified versions of such material be marked in reasonable ways as different
+from the original version; or
+
+d) Limiting the use for publicity purposes of names of licensors or authors
+of the material; or
+
+e) Declining to grant rights under trademark law for use of some trade names,
+trademarks, or service marks; or
+
+f) Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with contractual
+assumptions of liability to the recipient, for any liability that these contractual
+assumptions directly impose on those licensors and authors.
+
+All other non-permissive additional terms are considered "further restrictions"
+within the meaning of section 10. If the Program as you received it, or any
+part of it, contains a notice stating that it is governed by this License
+along with a term that is a further restriction, you may remove that term.
+If a license document contains a further restriction but permits relicensing
+or conveying under this License, you may add to a covered work material governed
+by the terms of that license document, provided that the further restriction
+does not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must place,
+in the relevant source files, a statement of the additional terms that apply
+to those files, or a notice indicating where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the form
+of a separately written license, or stated as exceptions; the above requirements
+apply either way.
+
+ 8. Termination.
+
+You may not propagate or modify a covered work except as expressly provided
+under this License. Any attempt otherwise to propagate or modify it is void,
+and will automatically terminate your rights under this License (including
+any patent licenses granted under the third paragraph of section 11).
+
+However, if you cease all violation of this License, then your license from
+a particular copyright holder is reinstated (a) provisionally, unless and
+until the copyright holder explicitly and finally terminates your license,
+and (b) permanently, if the copyright holder fails to notify you of the violation
+by some reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated permanently
+if the copyright holder notifies you of the violation by some reasonable means,
+this is the first time you have received notice of violation of this License
+(for any work) from that copyright holder, and you cure the violation prior
+to 30 days after your receipt of the notice.
+
+Termination of your rights under this section does not terminate the licenses
+of parties who have received copies or rights from you under this License.
+If your rights have been terminated and not permanently reinstated, you do
+not qualify to receive new licenses for the same material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run a copy
+of the Program. Ancillary propagation of a covered work occurring solely as
+a consequence of using peer-to-peer transmission to receive a copy likewise
+does not require acceptance. However, nothing other than this License grants
+you permission to propagate or modify any covered work. These actions infringe
+copyright if you do not accept this License. Therefore, by modifying or propagating
+a covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically receives
+a license from the original licensors, to run, modify and propagate that work,
+subject to this License. You are not responsible for enforcing compliance
+by third parties with this License.
+
+An "entity transaction" is a transaction transferring control of an organization,
+or substantially all assets of one, or subdividing an organization, or merging
+organizations. If propagation of a covered work results from an entity transaction,
+each party to that transaction who receives a copy of the work also receives
+whatever licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the Corresponding
+Source of the work from the predecessor in interest, if the predecessor has
+it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the rights
+granted or affirmed under this License. For example, you may not impose a
+license fee, royalty, or other charge for exercise of rights granted under
+this License, and you may not initiate litigation (including a cross-claim
+or counterclaim in a lawsuit) alleging that any patent claim is infringed
+by making, using, selling, offering for sale, or importing the Program or
+any portion of it.
+
+ 11. Patents.
+
+A "contributor" is a copyright holder who authorizes use under this License
+of the Program or a work on which the Program is based. The work thus licensed
+is called the contributor's "contributor version".
+
+A contributor's "essential patent claims" are all patent claims owned or controlled
+by the contributor, whether already acquired or hereafter acquired, that would
+be infringed by some manner, permitted by this License, of making, using,
+or selling its contributor version, but do not include claims that would be
+infringed only as a consequence of further modification of the contributor
+version. For purposes of this definition, "control" includes the right to
+grant patent sublicenses in a manner consistent with the requirements of this
+License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent
+license under the contributor's essential patent claims, to make, use, sell,
+offer for sale, import and otherwise run, modify and propagate the contents
+of its contributor version.
+
+In the following three paragraphs, a "patent license" is any express agreement
+or commitment, however denominated, not to enforce a patent (such as an express
+permission to practice a patent or covenant not to sue for patent infringement).
+To "grant" such a patent license to a party means to make such an agreement
+or commitment not to enforce a patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license, and the
+Corresponding Source of the work is not available for anyone to copy, free
+of charge and under the terms of this License, through a publicly available
+network server or other readily accessible means, then you must either (1)
+cause the Corresponding Source to be so available, or (2) arrange to deprive
+yourself of the benefit of the patent license for this particular work, or
+(3) arrange, in a manner consistent with the requirements of this License,
+to extend the patent license to downstream recipients. "Knowingly relying"
+means you have actual knowledge that, but for the patent license, your conveying
+the covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that country
+that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or arrangement,
+you convey, or propagate by procuring conveyance of, a covered work, and grant
+a patent license to some of the parties receiving the covered work authorizing
+them to use, propagate, modify or convey a specific copy of the covered work,
+then the patent license you grant is automatically extended to all recipients
+of the covered work and works based on it.
+
+A patent license is "discriminatory" if it does not include within the scope
+of its coverage, prohibits the exercise of, or is conditioned on the non-exercise
+of one or more of the rights that are specifically granted under this License.
+You may not convey a covered work if you are a party to an arrangement with
+a third party that is in the business of distributing software, under which
+you make payment to the third party based on the extent of your activity of
+conveying the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by you
+(or copies made from those copies), or (b) primarily for and in connection
+with specific products or compilations that contain the covered work, unless
+you entered into that arrangement, or that patent license was granted, prior
+to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any implied
+license or other defenses to infringement that may otherwise be available
+to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or otherwise)
+that contradict the conditions of this License, they do not excuse you from
+the conditions of this License. If you cannot convey a covered work so as
+to satisfy simultaneously your obligations under this License and any other
+pertinent obligations, then as a consequence you may not convey it at all.
+For example, if you agree to terms that obligate you to collect a royalty
+for further conveying from those to whom you convey the Program, the only
+way you could satisfy both those terms and this License would be to refrain
+entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have permission to
+link or combine any covered work with a work licensed under version 3 of the
+GNU Affero General Public License into a single combined work, and to convey
+the resulting work. The terms of this License will continue to apply to the
+part which is the covered work, but the special requirements of the GNU Affero
+General Public License, section 13, concerning interaction through a network
+will apply to the combination as such.
+
+ 14. Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of the
+GNU General Public License from time to time. Such new versions will be similar
+in spirit to the present version, but may differ in detail to address new
+problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies
+that a certain numbered version of the GNU General Public License "or any
+later version" applies to it, you have the option of following the terms and
+conditions either of that numbered version or of any later version published
+by the Free Software Foundation. If the Program does not specify a version
+number of the GNU General Public License, you may choose any version ever
+published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions of
+the GNU General Public License can be used, that proxy's public statement
+of acceptance of a version permanently authorizes you to choose that version
+for the Program.
+
+Later license versions may give you additional or different permissions. However,
+no additional obligations are imposed on any author or copyright holder as
+a result of your choosing to follow a later version.
+
+ 15. Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
+PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+ 16. Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM
+AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO
+USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided above cannot
+be given local legal effect according to their terms, reviewing courts shall
+apply local law that most closely approximates an absolute waiver of all civil
+liability in connection with the Program, unless a warranty or assumption
+of liability accompanies a copy of the Program in return for a fee. END OF
+TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively state the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+<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 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short notice like
+this when it starts in an interactive mode:
+
+<program> Copyright (C) <year> <name of author>
+
+This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+
+This is free software, and you are welcome to redistribute it under certain
+conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands might
+be different; for a GUI interface, you would use an "about box".
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary. For
+more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.
+
+The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General Public
+License instead of this License. But first, please read <https://www.gnu.org/
+licenses /why-not-lgpl.html>.
--- /dev/null
+GNU LIBRARY GENERAL PUBLIC LICENSE
+
+Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc.
+
+51 Franklin St, 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.
+
+[This is the first released version of the library GPL. It is numbered 2 because
+it goes with version 2 of the ordinary GPL.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public Licenses are intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.
+
+This license, the Library General Public License, applies to some specially
+designated Free Software Foundation software, and to any other libraries whose
+authors decide to use it. You can use it for your libraries, 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 library, or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for
+a fee, you must give the recipients all the rights that we gave you. You must
+make sure that they, too, receive or can get the source code. If you link
+a program with the library, you must provide complete object files to the
+recipients so that they can relink them with the library, after making changes
+to the library and recompiling it. And you must show them these terms so they
+know their rights.
+
+Our method of protecting your rights has two steps: (1) copyright the library,
+and (2) offer you this license which gives you legal permission to copy, distribute
+and/or modify the library.
+
+Also, for each distributor's protection, we want to make certain that everyone
+understands that there is no warranty for this free library. If the library
+is modified by someone else and passed on, we want its recipients to know
+that what they have is not the original version, 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 companies distributing free software will individually
+obtain patent licenses, thus in effect transforming the program into proprietary
+software. To prevent this, we have made it clear that any patent must be licensed
+for everyone's free use or not licensed at all.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU
+General Public License, which was designed for utility programs. This license,
+the GNU Library General Public License, applies to certain designated libraries.
+This license is quite different from the ordinary one; be sure to read it
+in full, and don't assume that anything in it is the same as in the ordinary
+license.
+
+The reason we have a separate public license for some libraries is that they
+blur the distinction we usually make between modifying or adding to a program
+and simply using it. Linking a program with a library, without changing the
+library, is in some sense simply using the library, and is analogous to running
+a utility program or application program. However, in a textual and legal
+sense, the linked executable is a combined work, a derivative of the original
+library, and the ordinary General Public License treats it as such.
+
+Because of this blurred distinction, using the ordinary General Public License
+for libraries did not effectively promote software sharing, because most developers
+did not use the libraries. We concluded that weaker conditions might promote
+sharing better.
+
+However, unrestricted linking of non-free programs would deprive the users
+of those programs of all benefit from the free status of the libraries themselves.
+This Library General Public License is intended to permit developers of non-free
+programs to use free libraries, while preserving your freedom as a user of
+such programs to change the free libraries that are incorporated in them.
+(We have not seen how to achieve this as regards changes in header files,
+but we have achieved it as regards changes in the actual functions of the
+Library.) The hope is that this will lead to faster development of free libraries.
+
+The precise terms and conditions for copying, distribution and modification
+follow. Pay close attention to the difference between a "work based on the
+library" and a "work that uses the library". The former contains code derived
+from the library, while the latter only works together with the library.
+
+Note that it is possible for a library to be covered by the ordinary General
+Public License rather than by this special one.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library which contains a
+notice placed by the copyright holder or other authorized party saying it
+may be distributed under the terms of this Library General Public License
+(also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared
+so as to be conveniently linked with application programs (which use some
+of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has
+been distributed under these terms. A "work based on the Library" means either
+the Library or any derivative work under copyright law: that is to say, a
+work containing the Library or a portion of it, either verbatim or with modifications
+and/or translated straightforwardly into another language. (Hereinafter, translation
+is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications
+to it. For a library, 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 library.
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running a program
+using the Library is not restricted, and output from such a program is covered
+only if its contents constitute a work based on the Library (independent of
+the use of the Library in a tool for writing it). Whether that is true depends
+on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with
+the Library.
+
+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 Library or any portion of it,
+thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+b) You must cause the files modified to carry prominent notices stating that
+you changed the files and the date of any change.
+
+c) You must cause the whole of the work to be licensed at no charge to all
+third parties under the terms of this License.
+
+d) If a facility in the modified Library refers to a function or a table of
+data to be supplied by an application program that uses the facility, other
+than as an argument passed when the facility is invoked, then you must make
+a good faith effort to ensure that, in the event an application does not supply
+such function or table, the facility still operates, and performs whatever
+part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose
+that is entirely well-defined independent of the application. Therefore, Subsection
+2d requires that any application-supplied function or table used by this function
+must be optional: if the application does not supply it, the square root function
+must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Library, 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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library with
+the Library (or with a work based on the Library) on a volume of a storage
+or distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License
+instead of this License to a given copy of the Library. To do this, you must
+alter all the notices that refer to this License, so that they refer to the
+ordinary GNU General Public License, version 2, instead of to this License.
+(If a newer version than version 2 of the ordinary GNU General Public License
+has appeared, then you can specify that version instead if you wish.) Do not
+make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy,
+so the ordinary GNU General Public License applies to all subsequent copies
+and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library
+into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of
+it, under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you 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.
+
+If distribution of 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 satisfies the requirement to distribute the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but
+is designed to work with the Library by being compiled or linked with it,
+is called a "work that uses the Library". Such a work, in isolation, is not
+a derivative work of the Library, and therefore falls outside the scope of
+this License.
+
+However, linking a "work that uses the Library" with the Library creates an
+executable that is a derivative of the Library (because it contains portions
+of the Library), rather than a "work that uses the library". The executable
+is therefore covered by this License. Section 6 states terms for distribution
+of such executables.
+
+When a "work that uses the Library" uses material from a header file that
+is part of the Library, the object code for the work may be a derivative work
+of the Library even though the source code is not. Whether this is true is
+especially significant if the work can be linked without the Library, or if
+the work is itself a library. The threshold for this to be true is not precisely
+defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts
+and accessors, and small macros and small inline functions (ten lines or less
+in length), then the use of the object file is unrestricted, regardless of
+whether it is legally a derivative work. (Executables containing this object
+code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute
+the object code for the work under the terms of Section 6. Any executables
+containing that work also fall under Section 6, whether or not they are linked
+directly with the Library itself.
+
+6. As an exception to the Sections above, you may also compile or link a "work
+that uses the Library" with the Library to produce a work containing portions
+of the Library, and distribute that work under terms of your choice, provided
+that the terms permit modification of the work for the customer's own use
+and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library
+is used in it and that the Library and its use are covered by this License.
+You must supply a copy of this License. If the work during execution displays
+copyright notices, you must include the copyright notice for the Library among
+them, as well as a reference directing the user to the copy of this License.
+Also, you must do one of these things:
+
+a) Accompany the work with the complete corresponding machine-readable source
+code for the Library including whatever changes were used in the work (which
+must be distributed under Sections 1 and 2 above); and, if the work is an
+executable linked with the Library, with the complete machine-readable "work
+that uses the Library", as object code and/or source code, so that the user
+can modify the Library and then relink to produce a modified executable containing
+the modified Library. (It is understood that the user who changes the contents
+of definitions files in the Library will not necessarily be able to recompile
+the application to use the modified definitions.)
+
+b) Accompany the work with a written offer, valid for at least three years,
+to give the same user the materials specified in Subsection 6a, above, for
+a charge no more than the cost of performing this distribution.
+
+c) If distribution of the work is made by offering access to copy from a designated
+place, offer equivalent access to copy the above specified materials from
+the same place.
+
+d) Verify that the user has already received a copy of these materials or
+that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must
+include any data and utility programs needed for reproducing the executable
+from it. 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.
+
+It may happen that this requirement contradicts the license restrictions of
+other proprietary libraries that do not normally accompany the operating system.
+Such a contradiction means you cannot use both them and the Library together
+in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side
+in a single library together with other library facilities not covered by
+this License, and distribute such a combined library, provided that the separate
+distribution of the work based on the Library and of the other library facilities
+is otherwise permitted, and provided that you do these two things:
+
+a) Accompany the combined library with a copy of the same work based on the
+Library, uncombined with any other library facilities. This must be distributed
+under the terms of the Sections above.
+
+b) Give prominent notice with the combined library of the fact that part of
+it is a work based on the Library, and explaining where to find the accompanying
+uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library
+except as expressly provided under this License. Any attempt otherwise to
+copy, modify, sublicense, link with, or distribute the Library 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.
+
+9. 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
+Library or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the Library
+(or any work based on the Library), you indicate your acceptance of this License
+to do so, and all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library),
+the recipient automatically receives a license from the original licensor
+to copy, distribute, link with or modify the Library 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.
+
+11. 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 Library at all. For example, if a
+patent license would not permit royalty-free redistribution of the Library
+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 Library.
+
+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.
+
+12. If the distribution and/or use of the Library is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Library 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.
+
+13. The Free Software Foundation may publish revised and/or new versions of
+the Library 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 Library 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
+Library does not specify a license version number, you may choose any version
+ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs
+whose distribution conditions are incompatible with these, 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
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
+"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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+If you develop a new library, and you want it to be of the greatest possible
+use to the public, we recommend making it free software that everyone can
+redistribute and change. You can do so by permitting redistribution under
+these terms (or, alternatively, under the terms of the ordinary General Public
+License).
+
+To apply these terms, attach the following notices to the library. 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 library's name and an idea of what it does.
+
+Copyright (C) year name of author
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Library General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+This library 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 Library General Public License for more
+details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; if not, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the library, if necessary. Here
+is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+
+the library `Frob' (a library for tweaking knobs) written
+
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+
+Ty Coon, President of Vice
+
+That's all there is to it!
--- /dev/null
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 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.
+
+[This is the first released version of the Lesser GPL. It also counts as the
+successor of the GNU Library Public License, version 2, hence the version
+number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public Licenses are intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially
+designated software packages--typically libraries--of the Free Software Foundation
+and other authors who decide to use it. You can use it too, but we suggest
+you first think carefully about whether this license or the ordinary General
+Public License is the better strategy to use in any particular case, based
+on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that
+you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors
+to deny you these rights or to ask you to surrender these rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of
+the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for
+a fee, you must give the recipients all the rights that we gave you. You must
+make sure that they, too, receive or can get the source code. If you link
+other code with the library, you must provide complete object files to the
+recipients, so that they can relink them with the library after making changes
+to the library and recompiling it. And you must show them these terms so they
+know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library,
+and (2) we offer you this license, which gives you legal permission to copy,
+distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no
+warranty for the free library. Also, if the library is modified by someone
+else and passed on, the recipients should know that what they have is not
+the original version, so that the original author's reputation will not be
+affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free
+program. We wish to make sure that a company cannot effectively restrict the
+users of a free program by obtaining a restrictive license from a patent holder.
+Therefore, we insist that any patent license obtained for a version of the
+library must be consistent with the full freedom of use specified in this
+license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU
+General Public License. This license, the GNU Lesser General Public License,
+applies to certain designated libraries, and is quite different from the ordinary
+General Public License. We use this license for certain libraries in order
+to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared
+library, the combination of the two is legally speaking a combined work, a
+derivative of the original library. The ordinary General Public License therefore
+permits such linking only if the entire combination fits its criteria of freedom.
+The Lesser General Public License permits more lax criteria for linking other
+code with the library.
+
+We call this license the "Lesser" General Public License because it does Less
+to protect the user's freedom than the ordinary General Public License. It
+also provides other free software developers Less of an advantage over competing
+non-free programs. These disadvantages are the reason we use the ordinary
+General Public License for many libraries. However, the Lesser license provides
+advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the
+widest possible use of a certain library, so that it becomes a de-facto standard.
+To achieve this, non-free programs must be allowed to use the library. A more
+frequent case is that a free library does the same job as widely used non-free
+libraries. In this case, there is little to gain by limiting the free library
+to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs
+enables a greater number of people to use a large body of free software. For
+example, permission to use the GNU C Library in non-free programs enables
+many more people to use the whole GNU operating system, as well as its variant,
+the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users'
+freedom, it does ensure that the user of a program that is linked with the
+Library has the freedom and the wherewithal to run that program using a modified
+version of the Library.
+
+The precise terms and conditions for copying, distribution and modification
+follow. Pay close attention to the difference between a "work based on the
+library" and a "work that uses the library". The former contains code derived
+from the library, whereas the latter must be combined with the library in
+order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program
+which contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Lesser General
+Public License (also called "this License"). Each licensee is addressed as
+"you".
+
+A "library" means a collection of software functions and/or data prepared
+so as to be conveniently linked with application programs (which use some
+of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has
+been distributed under these terms. A "work based on the Library" means either
+the Library or any derivative work under copyright law: that is to say, a
+work containing the Library or a portion of it, either verbatim or with modifications
+and/or translated straightforwardly into another language. (Hereinafter, translation
+is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications
+to it. For a library, 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 library.
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running a program
+using the Library is not restricted, and output from such a program is covered
+only if its contents constitute a work based on the Library (independent of
+the use of the Library in a tool for writing it). Whether that is true depends
+on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with
+the Library.
+
+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 Library or any portion of it,
+thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+b) You must cause the files modified to carry prominent notices stating that
+you changed the files and the date of any change.
+
+c) You must cause the whole of the work to be licensed at no charge to all
+third parties under the terms of this License.
+
+d) If a facility in the modified Library refers to a function or a table of
+data to be supplied by an application program that uses the facility, other
+than as an argument passed when the facility is invoked, then you must make
+a good faith effort to ensure that, in the event an application does not supply
+such function or table, the facility still operates, and performs whatever
+part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose
+that is entirely well-defined independent of the application. Therefore, Subsection
+2d requires that any application-supplied function or table used by this function
+must be optional: if the application does not supply it, the square root function
+must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Library, 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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library with
+the Library (or with a work based on the Library) on a volume of a storage
+or distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License
+instead of this License to a given copy of the Library. To do this, you must
+alter all the notices that refer to this License, so that they refer to the
+ordinary GNU General Public License, version 2, instead of to this License.
+(If a newer version than version 2 of the ordinary GNU General Public License
+has appeared, then you can specify that version instead if you wish.) Do not
+make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy,
+so the ordinary GNU General Public License applies to all subsequent copies
+and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library
+into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of
+it, under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you 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.
+
+If distribution of 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 satisfies the requirement to distribute the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but
+is designed to work with the Library by being compiled or linked with it,
+is called a "work that uses the Library". Such a work, in isolation, is not
+a derivative work of the Library, and therefore falls outside the scope of
+this License.
+
+However, linking a "work that uses the Library" with the Library creates an
+executable that is a derivative of the Library (because it contains portions
+of the Library), rather than a "work that uses the library". The executable
+is therefore covered by this License. Section 6 states terms for distribution
+of such executables.
+
+When a "work that uses the Library" uses material from a header file that
+is part of the Library, the object code for the work may be a derivative work
+of the Library even though the source code is not. Whether this is true is
+especially significant if the work can be linked without the Library, or if
+the work is itself a library. The threshold for this to be true is not precisely
+defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts
+and accessors, and small macros and small inline functions (ten lines or less
+in length), then the use of the object file is unrestricted, regardless of
+whether it is legally a derivative work. (Executables containing this object
+code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute
+the object code for the work under the terms of Section 6. Any executables
+containing that work also fall under Section 6, whether or not they are linked
+directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work
+that uses the Library" with the Library to produce a work containing portions
+of the Library, and distribute that work under terms of your choice, provided
+that the terms permit modification of the work for the customer's own use
+and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library
+is used in it and that the Library and its use are covered by this License.
+You must supply a copy of this License. If the work during execution displays
+copyright notices, you must include the copyright notice for the Library among
+them, as well as a reference directing the user to the copy of this License.
+Also, you must do one of these things:
+
+a) Accompany the work with the complete corresponding machine-readable source
+code for the Library including whatever changes were used in the work (which
+must be distributed under Sections 1 and 2 above); and, if the work is an
+executable linked with the Library, with the complete machine-readable "work
+that uses the Library", as object code and/or source code, so that the user
+can modify the Library and then relink to produce a modified executable containing
+the modified Library. (It is understood that the user who changes the contents
+of definitions files in the Library will not necessarily be able to recompile
+the application to use the modified definitions.)
+
+b) Use a suitable shared library mechanism for linking with the Library. A
+suitable mechanism is one that (1) uses at run time a copy of the library
+already present on the user's computer system, rather than copying library
+functions into the executable, and (2) will operate properly with a modified
+version of the library, if the user installs one, as long as the modified
+version is interface-compatible with the version that the work was made with.
+
+c) Accompany the work with a written offer, valid for at least three years,
+to give the same user the materials specified in Subsection 6a, above, for
+a charge no more than the cost of performing this distribution.
+
+d) If distribution of the work is made by offering access to copy from a designated
+place, offer equivalent access to copy the above specified materials from
+the same place.
+
+e) Verify that the user has already received a copy of these materials or
+that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must
+include any data and utility programs needed for reproducing the executable
+from it. However, as a special exception, the materials to be 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.
+
+It may happen that this requirement contradicts the license restrictions of
+other proprietary libraries that do not normally accompany the operating system.
+Such a contradiction means you cannot use both them and the Library together
+in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side
+in a single library together with other library facilities not covered by
+this License, and distribute such a combined library, provided that the separate
+distribution of the work based on the Library and of the other library facilities
+is otherwise permitted, and provided that you do these two things:
+
+a) Accompany the combined library with a copy of the same work based on the
+Library, uncombined with any other library facilities. This must be distributed
+under the terms of the Sections above.
+
+b) Give prominent notice with the combined library of the fact that part of
+it is a work based on the Library, and explaining where to find the accompanying
+uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library
+except as expressly provided under this License. Any attempt otherwise to
+copy, modify, sublicense, link with, or distribute the Library 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.
+
+9. 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
+Library or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the Library
+(or any work based on the Library), you indicate your acceptance of this License
+to do so, and all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library),
+the recipient automatically receives a license from the original licensor
+to copy, distribute, link with or modify the Library 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 with this License.
+
+11. 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 Library at all. For example, if a
+patent license would not permit royalty-free redistribution of the Library
+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 Library.
+
+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.
+
+12. If the distribution and/or use of the Library is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Library 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.
+
+13. The Free Software Foundation may publish revised and/or new versions of
+the Lesser 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 Library 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
+Library does not specify a license version number, you may choose any version
+ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs
+whose distribution conditions are incompatible with these, 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
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
+"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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+If you develop a new library, and you want it to be of the greatest possible
+use to the public, we recommend making it free software that everyone can
+redistribute and change. You can do so by permitting redistribution under
+these terms (or, alternatively, under the terms of the ordinary General Public
+License).
+
+To apply these terms, attach the following notices to the library. 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 library's name and an idea of what it does. >
+
+Copyright (C) < year > < name of author >
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 2.1 of the License, or (at your option)
+any later version.
+
+This library 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 Lesser General Public License for more
+details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this library; 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.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the library, if necessary. Here
+is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+
+the library `Frob' (a library for tweaking knobs) written
+
+by James Random Hacker.
+
+< signature of Ty Coon > , 1 April 1990
+
+Ty Coon, President of Vice
+
+That's all there is to it!
--- /dev/null
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 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.
+
+[This is the first released version of the Lesser GPL. It also counts as the
+successor of the GNU Library Public License, version 2, hence the version
+number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public Licenses are intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially
+designated software packages--typically libraries--of the Free Software Foundation
+and other authors who decide to use it. You can use it too, but we suggest
+you first think carefully about whether this license or the ordinary General
+Public License is the better strategy to use in any particular case, based
+on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that
+you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors
+to deny you these rights or to ask you to surrender these rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of
+the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for
+a fee, you must give the recipients all the rights that we gave you. You must
+make sure that they, too, receive or can get the source code. If you link
+other code with the library, you must provide complete object files to the
+recipients, so that they can relink them with the library after making changes
+to the library and recompiling it. And you must show them these terms so they
+know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library,
+and (2) we offer you this license, which gives you legal permission to copy,
+distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no
+warranty for the free library. Also, if the library is modified by someone
+else and passed on, the recipients should know that what they have is not
+the original version, so that the original author's reputation will not be
+affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free
+program. We wish to make sure that a company cannot effectively restrict the
+users of a free program by obtaining a restrictive license from a patent holder.
+Therefore, we insist that any patent license obtained for a version of the
+library must be consistent with the full freedom of use specified in this
+license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU
+General Public License. This license, the GNU Lesser General Public License,
+applies to certain designated libraries, and is quite different from the ordinary
+General Public License. We use this license for certain libraries in order
+to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared
+library, the combination of the two is legally speaking a combined work, a
+derivative of the original library. The ordinary General Public License therefore
+permits such linking only if the entire combination fits its criteria of freedom.
+The Lesser General Public License permits more lax criteria for linking other
+code with the library.
+
+We call this license the "Lesser" General Public License because it does Less
+to protect the user's freedom than the ordinary General Public License. It
+also provides other free software developers Less of an advantage over competing
+non-free programs. These disadvantages are the reason we use the ordinary
+General Public License for many libraries. However, the Lesser license provides
+advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the
+widest possible use of a certain library, so that it becomes a de-facto standard.
+To achieve this, non-free programs must be allowed to use the library. A more
+frequent case is that a free library does the same job as widely used non-free
+libraries. In this case, there is little to gain by limiting the free library
+to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs
+enables a greater number of people to use a large body of free software. For
+example, permission to use the GNU C Library in non-free programs enables
+many more people to use the whole GNU operating system, as well as its variant,
+the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users'
+freedom, it does ensure that the user of a program that is linked with the
+Library has the freedom and the wherewithal to run that program using a modified
+version of the Library.
+
+The precise terms and conditions for copying, distribution and modification
+follow. Pay close attention to the difference between a "work based on the
+library" and a "work that uses the library". The former contains code derived
+from the library, whereas the latter must be combined with the library in
+order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program
+which contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Lesser General
+Public License (also called "this License"). Each licensee is addressed as
+"you".
+
+A "library" means a collection of software functions and/or data prepared
+so as to be conveniently linked with application programs (which use some
+of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has
+been distributed under these terms. A "work based on the Library" means either
+the Library or any derivative work under copyright law: that is to say, a
+work containing the Library or a portion of it, either verbatim or with modifications
+and/or translated straightforwardly into another language. (Hereinafter, translation
+is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications
+to it. For a library, 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 library.
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running a program
+using the Library is not restricted, and output from such a program is covered
+only if its contents constitute a work based on the Library (independent of
+the use of the Library in a tool for writing it). Whether that is true depends
+on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with
+the Library.
+
+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 Library or any portion of it,
+thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+b) You must cause the files modified to carry prominent notices stating that
+you changed the files and the date of any change.
+
+c) You must cause the whole of the work to be licensed at no charge to all
+third parties under the terms of this License.
+
+d) If a facility in the modified Library refers to a function or a table of
+data to be supplied by an application program that uses the facility, other
+than as an argument passed when the facility is invoked, then you must make
+a good faith effort to ensure that, in the event an application does not supply
+such function or table, the facility still operates, and performs whatever
+part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose
+that is entirely well-defined independent of the application. Therefore, Subsection
+2d requires that any application-supplied function or table used by this function
+must be optional: if the application does not supply it, the square root function
+must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Library, 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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library with
+the Library (or with a work based on the Library) on a volume of a storage
+or distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License
+instead of this License to a given copy of the Library. To do this, you must
+alter all the notices that refer to this License, so that they refer to the
+ordinary GNU General Public License, version 2, instead of to this License.
+(If a newer version than version 2 of the ordinary GNU General Public License
+has appeared, then you can specify that version instead if you wish.) Do not
+make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy,
+so the ordinary GNU General Public License applies to all subsequent copies
+and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library
+into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of
+it, under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you 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.
+
+If distribution of 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 satisfies the requirement to distribute the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but
+is designed to work with the Library by being compiled or linked with it,
+is called a "work that uses the Library". Such a work, in isolation, is not
+a derivative work of the Library, and therefore falls outside the scope of
+this License.
+
+However, linking a "work that uses the Library" with the Library creates an
+executable that is a derivative of the Library (because it contains portions
+of the Library), rather than a "work that uses the library". The executable
+is therefore covered by this License. Section 6 states terms for distribution
+of such executables.
+
+When a "work that uses the Library" uses material from a header file that
+is part of the Library, the object code for the work may be a derivative work
+of the Library even though the source code is not. Whether this is true is
+especially significant if the work can be linked without the Library, or if
+the work is itself a library. The threshold for this to be true is not precisely
+defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts
+and accessors, and small macros and small inline functions (ten lines or less
+in length), then the use of the object file is unrestricted, regardless of
+whether it is legally a derivative work. (Executables containing this object
+code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute
+the object code for the work under the terms of Section 6. Any executables
+containing that work also fall under Section 6, whether or not they are linked
+directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work
+that uses the Library" with the Library to produce a work containing portions
+of the Library, and distribute that work under terms of your choice, provided
+that the terms permit modification of the work for the customer's own use
+and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library
+is used in it and that the Library and its use are covered by this License.
+You must supply a copy of this License. If the work during execution displays
+copyright notices, you must include the copyright notice for the Library among
+them, as well as a reference directing the user to the copy of this License.
+Also, you must do one of these things:
+
+a) Accompany the work with the complete corresponding machine-readable source
+code for the Library including whatever changes were used in the work (which
+must be distributed under Sections 1 and 2 above); and, if the work is an
+executable linked with the Library, with the complete machine-readable "work
+that uses the Library", as object code and/or source code, so that the user
+can modify the Library and then relink to produce a modified executable containing
+the modified Library. (It is understood that the user who changes the contents
+of definitions files in the Library will not necessarily be able to recompile
+the application to use the modified definitions.)
+
+b) Use a suitable shared library mechanism for linking with the Library. A
+suitable mechanism is one that (1) uses at run time a copy of the library
+already present on the user's computer system, rather than copying library
+functions into the executable, and (2) will operate properly with a modified
+version of the library, if the user installs one, as long as the modified
+version is interface-compatible with the version that the work was made with.
+
+c) Accompany the work with a written offer, valid for at least three years,
+to give the same user the materials specified in Subsection 6a, above, for
+a charge no more than the cost of performing this distribution.
+
+d) If distribution of the work is made by offering access to copy from a designated
+place, offer equivalent access to copy the above specified materials from
+the same place.
+
+e) Verify that the user has already received a copy of these materials or
+that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must
+include any data and utility programs needed for reproducing the executable
+from it. However, as a special exception, the materials to be 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.
+
+It may happen that this requirement contradicts the license restrictions of
+other proprietary libraries that do not normally accompany the operating system.
+Such a contradiction means you cannot use both them and the Library together
+in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side
+in a single library together with other library facilities not covered by
+this License, and distribute such a combined library, provided that the separate
+distribution of the work based on the Library and of the other library facilities
+is otherwise permitted, and provided that you do these two things:
+
+a) Accompany the combined library with a copy of the same work based on the
+Library, uncombined with any other library facilities. This must be distributed
+under the terms of the Sections above.
+
+b) Give prominent notice with the combined library of the fact that part of
+it is a work based on the Library, and explaining where to find the accompanying
+uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library
+except as expressly provided under this License. Any attempt otherwise to
+copy, modify, sublicense, link with, or distribute the Library 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.
+
+9. 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
+Library or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the Library
+(or any work based on the Library), you indicate your acceptance of this License
+to do so, and all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library),
+the recipient automatically receives a license from the original licensor
+to copy, distribute, link with or modify the Library 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 with this License.
+
+11. 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 Library at all. For example, if a
+patent license would not permit royalty-free redistribution of the Library
+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 Library.
+
+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.
+
+12. If the distribution and/or use of the Library is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Library 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.
+
+13. The Free Software Foundation may publish revised and/or new versions of
+the Lesser 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 Library 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
+Library does not specify a license version number, you may choose any version
+ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs
+whose distribution conditions are incompatible with these, 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
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
+"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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+If you develop a new library, and you want it to be of the greatest possible
+use to the public, we recommend making it free software that everyone can
+redistribute and change. You can do so by permitting redistribution under
+these terms (or, alternatively, under the terms of the ordinary General Public
+License).
+
+To apply these terms, attach the following notices to the library. 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 library's name and an idea of what it does.>
+
+Copyright (C) <year> <name of author>
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Lesser General Public License as published by the Free
+Software Foundation; either version 2.1 of the License, or (at your option)
+any later version.
+
+This library 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 Lesser General Public License for more
+details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this library; 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.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the library, if necessary. Here
+is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+
+the library `Frob' (a library for tweaking knobs) written
+
+by James Random Hacker.
+
+< signature of Ty Coon > , 1 April 1990
+
+Ty Coon, President of Vice
+
+That's all there is to it!
--- /dev/null
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 3, 29 June 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.
+
+This version of the GNU Lesser General Public License incorporates the terms
+and conditions of version 3 of the GNU General Public License, supplemented
+by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+
+
+As used herein, "this License" refers to version 3 of the GNU Lesser General
+Public License, and the "GNU GPL" refers to version 3 of the GNU General Public
+License.
+
+
+
+"The Library" refers to a covered work governed by this License, other than
+an Application or a Combined Work as defined below.
+
+
+
+An "Application" is any work that makes use of an interface provided by the
+Library, but which is not otherwise based on the Library. Defining a subclass
+of a class defined by the Library is deemed a mode of using an interface provided
+by the Library.
+
+
+
+A "Combined Work" is a work produced by combining or linking an Application
+with the Library. The particular version of the Library with which the Combined
+Work was made is also called the "Linked Version".
+
+
+
+The "Minimal Corresponding Source" for a Combined Work means the Corresponding
+Source for the Combined Work, excluding any source code for portions of the
+Combined Work that, considered in isolation, are based on the Application,
+and not on the Linked Version.
+
+
+
+The "Corresponding Application Code" for a Combined Work means the object
+code and/or source code for the Application, including any data and utility
+programs needed for reproducing the Combined Work from the Application, but
+excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+You may convey a covered work under sections 3 and 4 of this License without
+being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+If you modify a copy of the Library, and, in your modifications, a facility
+refers to a function or data to be supplied by an Application that uses the
+facility (other than as an argument passed when the facility is invoked),
+then you may convey a copy of the modified version:
+
+a) under this License, provided that you make a good faith effort to ensure
+that, in the event an Application does not supply the function or data, the
+facility still operates, and performs whatever part of its purpose remains
+meaningful, or
+
+b) under the GNU GPL, with none of the additional permissions of this License
+applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+The object code form of an Application may incorporate material from a header
+file that is part of the Library. You may convey such object code under terms
+of your choice, provided that, if the incorporated material is not limited
+to numerical parameters, data structure layouts and accessors, or small macros,
+inline functions and templates (ten or fewer lines in length), you do both
+of the following:
+
+a) Give prominent notice with each copy of the object code that the Library
+is used in it and that the Library and its use are covered by this License.
+
+b) Accompany the object code with a copy of the GNU GPL and this license document.
+
+ 4. Combined Works.
+
+You may convey a Combined Work under terms of your choice that, taken together,
+effectively do not restrict modification of the portions of the Library contained
+in the Combined Work and reverse engineering for debugging such modifications,
+if you also do each of the following:
+
+a) Give prominent notice with each copy of the Combined Work that the Library
+is used in it and that the Library and its use are covered by this License.
+
+b) Accompany the Combined Work with a copy of the GNU GPL and this license
+document.
+
+c) For a Combined Work that displays copyright notices during execution, include
+the copyright notice for the Library among these notices, as well as a reference
+directing the user to the copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+0) Convey the Minimal Corresponding Source under the terms of this License,
+and the Corresponding Application Code in a form suitable for, and under terms
+that permit, the user to recombine or relink the Application with a modified
+version of the Linked Version to produce a modified Combined Work, in the
+manner specified by section 6 of the GNU GPL for conveying Corresponding Source.
+
+1) Use a suitable shared library mechanism for linking with the Library. A
+suitable mechanism is one that (a) uses at run time a copy of the Library
+already present on the user's computer system, and (b) will operate properly
+with a modified version of the Library that is interface-compatible with the
+Linked Version.
+
+e) Provide Installation Information, but only if you would otherwise be required
+to provide such information under section 6 of the GNU GPL, and only to the
+extent that such information is necessary to install and execute a modified
+version of the Combined Work produced by recombining or relinking the Application
+with a modified version of the Linked Version. (If you use option 4d0, the
+Installation Information must accompany the Minimal Corresponding Source and
+Corresponding Application Code. If you use option 4d1, you must provide the
+Installation Information in the manner specified by section 6 of the GNU GPL
+for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+You may place library facilities that are a work based on the Library side
+by side in a single library together with other library facilities that are
+not Applications and are not covered by this License, and convey such a combined
+library under terms of your choice, if you do both of the following:
+
+a) Accompany the combined library with a copy of the same work based on the
+Library, uncombined with any other library facilities, conveyed under the
+terms of this License.
+
+b) Give prominent notice with the combined library that part of it is a work
+based on the Library, and explaining where to find the accompanying uncombined
+form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+The Free Software Foundation may publish revised and/or new versions of the
+GNU Lesser 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 Library as you
+received it specifies that a certain numbered version of the GNU Lesser General
+Public License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that published version or of
+any later version published by the Free Software Foundation. If the Library
+as you received it does not specify a version number of the GNU Lesser General
+Public License, you may choose any version of the GNU Lesser General Public
+License ever published by the Free Software Foundation.
+
+If the Library as you received it specifies that a proxy can decide whether
+future versions of the GNU Lesser General Public License shall apply, that
+proxy's public statement of acceptance of any version is permanent authorization
+for you to choose that version for the Library.
--- /dev/null
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 3 of
+the license or (at your option) at any later version that is
+accepted by the membership of KDE e.V. (or its successor
+approved by the membership of KDE e.V.), which shall act as a
+proxy as defined in Section 14 of version 3 of the license.
+
+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.
--- /dev/null
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 3 of the license or (at your option) any later version
+that is accepted by the membership of KDE e.V. (or its successor
+approved by the membership of KDE e.V.), which shall act as a
+proxy as defined in Section 6 of version 3 of the license.
+
+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.
--- /dev/null
+Commercial License Usage
+Licensees holding valid commercial Qt licenses may use this file in
+accordance with the commercial license agreement provided with the
+Software or, alternatively, in accordance with the terms contained in
+a written agreement between you and The Qt Company. For licensing terms
+and conditions see https://www.qt.io/terms-conditions. For further
+information use the contact form at https://www.qt.io/contact-us.
--- /dev/null
+MIT License Copyright (c) <year> <copyright holders>
+
+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 (including the next
+paragraph) 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.
--- /dev/null
+The Qt Company Qt LGPL Exception version 1.1
+
+As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that:
+
+ (i) the header files of the Library have not been modified; and
+
+ (ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and
+
+ (iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1.
+
+Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to
+
+ (i) numerical parameters;
+
+ (ii) data structure layouts;
+
+ (iii) accessors; and
+
+ (iv) small macros, templates and inline functions of five lines or less in length.
+
+Furthermore, you are not required to apply this additional permission to a modified version of the Library.
--- /dev/null
+# KDeclarative
+
+Integration of QML and KDE work spaces
+
+## Introduction
+
+KDeclarative provides integration of QML and KDE work spaces.
+It's comprises two parts: a library used by the C++ part of your application
+to intergrate QML with KDE Frameworks specific features, and a series of
+QML imports that offer bindings to some of the Frameworks.
+
+## KDeclarative library
+
+KDeclarative exposes 3 namespaced classes: KDeclarative::KDeclarative, KDeclarative::QmlObject, KDeclarative::ConfigPropertyMap
+
+### KDeclarative::KDeclarative
+
+The KDeclarative class is used to manipulate the QQmlEngine instance used by
+the application and to get some information about the platform,
+that influences the behavior of the QML components.
+
+Full documentation in KDeclarative::KDeclarative
+
+### KDeclarative::QmlObject
+
+An object that instantiates an entire QML context, with its own declarative engine.
+
+Full documentation in KDeclarative::QmlObject
+
+### KDeclarative::ConfigPropertyMap
+
+An object that (optionally) automatically saves changes in a
+property map to a configuration object (e.g. a KConfig file).
+
+Full documentation in KDeclarative::ConfigPropertyMap
--- /dev/null
+INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/..")
+
+include(ECMAddTests)
+
+find_package(Qt5Test REQUIRED)
+
+ecm_add_test(columnproxymodeltest.cpp
+ ../src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.cpp
+ TEST_NAME fullmodelaccesstest
+ LINK_LIBRARIES Qt5::Gui Qt5::Test)
+
+ecm_add_test(quickviewsharedengine.cpp
+ util.cpp
+ TEST_NAME quickviewsharedengine
+ LINK_LIBRARIES Qt5::Quick KF5::QuickAddons Qt5::Test)
+
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "columnproxymodeltest.h"
+#include "../src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.h"
+#include <QAbstractItemModelTester>
+#include <QSignalSpy>
+#include <QStandardItemModel>
+#include <QTest>
+
+QTEST_MAIN(ColumnProxyModelTest)
+
+void ColumnProxyModelTest::testInit()
+{
+ qRegisterMetaType<QModelIndex>("QModelIndex");
+
+ ColumnProxyModel *listify = new ColumnProxyModel;
+ QSignalSpy spy(listify, SIGNAL(rowsInserted(QModelIndex, int, int)));
+
+ new QAbstractItemModelTester(listify, listify);
+ QStandardItemModel *m = new QStandardItemModel(listify);
+ listify->setRootIndex(QModelIndex());
+ listify->setSourceModel(m);
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ QStandardItem *item = new QStandardItem(QStringLiteral("lalalal"));
+ item->appendRow(new QStandardItem(QStringLiteral("lelele")));
+ item->appendRow(new QStandardItem(QStringLiteral("lelele")));
+ m->appendRow(item);
+ item->appendRow(new QStandardItem(QStringLiteral("lelele")));
+
+ QCOMPARE(listify->rowCount(), 5);
+ QCOMPARE(spy.count(), 5);
+
+ ColumnProxyModel *listifyB = new ColumnProxyModel;
+ new QAbstractItemModelTester(listifyB, listifyB);
+ listifyB->setSourceModel(m);
+ QCOMPARE(listifyB->rowCount(), 5);
+
+ ColumnProxyModel *listifyC = new ColumnProxyModel;
+ new QAbstractItemModelTester(listifyC, listifyC);
+ listifyC->setRootIndex(item->index());
+ QCOMPARE(listifyC->rowCount(), 3);
+
+ delete listify;
+ delete listifyB;
+ delete listifyC;
+}
+
+void ColumnProxyModelTest::testSet()
+{
+ ColumnProxyModel listify;
+ QSignalSpy spy(&listify, SIGNAL(rowsInserted(QModelIndex, int, int)));
+
+ new QAbstractItemModelTester(&listify, &listify);
+ QStandardItemModel *m = new QStandardItemModel(&listify);
+ listify.setRootIndex(QModelIndex());
+ listify.setSourceModel(m);
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ m->appendRow(new QStandardItem(QStringLiteral("lalalal")));
+ QStandardItem *item = new QStandardItem(QStringLiteral("lalalal"));
+ item->appendRow(new QStandardItem(QStringLiteral("lelele")));
+ item->appendRow(new QStandardItem(QStringLiteral("lelele")));
+ m->appendRow(item);
+ item->appendRow(new QStandardItem(QStringLiteral("lelele")));
+
+ const QString newString = QStringLiteral("fu");
+ QModelIndex changeIndex = listify.indexAt(0);
+ listify.setData(changeIndex, QVariant::fromValue(newString), Qt::DisplayRole);
+ QCOMPARE(changeIndex.data(Qt::DisplayRole).toString(), newString);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef COLUMNPROXYMODELTEST_H
+#define COLUMNPROXYMODELTEST_H
+
+#include <QObject>
+
+class ColumnProxyModelTest : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void testInit();
+ void testSet();
+};
+
+#endif
--- /dev/null
+import QtQuick 2.0
+Item {
+ width: 200
+ height: 200
+}
--- /dev/null
+/*
+ This file is part of the test suite of the Qt Toolkit.
+ SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) <http://www.qt-project.org/legal>
+
+ SPDX-License-Identifier: LGPL-2.1-only WITH Qt-LGPL-exception-1.1 OR LGPL-3.0-only WITH Qt-LGPL-exception-1.1 OR LicenseRef-Qt-Commercial
+*/
+
+#include "util.h"
+#include <QDebug>
+#include <QQmlComponent>
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQuickItem>
+#include <QQuickView>
+#include <QSignalSpy>
+#include <QTest>
+#include <QWindow>
+#include <quickviewsharedengine.h>
+
+class QuickViewSharedEngineTest : public QQmlDataTest
+{
+ Q_OBJECT
+public:
+ QuickViewSharedEngineTest();
+
+private Q_SLOTS:
+ void resizemodeitem();
+ void errors();
+ void engine();
+};
+
+QuickViewSharedEngineTest::QuickViewSharedEngineTest()
+{
+}
+
+void QuickViewSharedEngineTest::resizemodeitem()
+{
+ QWindow window;
+ window.setGeometry(0, 0, 400, 400);
+
+ KQuickAddons::QuickViewSharedEngine *view = new KQuickAddons::QuickViewSharedEngine(&window);
+ QVERIFY(view);
+ view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeRootObjectToView);
+ QCOMPARE(QSize(0, 0), view->initialSize());
+ view->setSource(testFileUrl("resizemodeitem.qml"));
+ QQuickItem *item = qobject_cast<QQuickItem *>(view->rootObject());
+ QVERIFY(item);
+ window.show();
+
+ view->showNormal();
+
+ // initial size from root object
+ QCOMPARE(item->width(), 200.0);
+ QCOMPARE(item->height(), 200.0);
+ QCOMPARE(view->size(), QSize(200, 200));
+ QCOMPARE(view->size(), view->sizeHint());
+ QCOMPARE(view->size(), view->initialSize());
+
+ // size update from view
+ view->resize(QSize(80, 100));
+
+ QTRY_COMPARE(item->width(), 80.0);
+ QCOMPARE(item->height(), 100.0);
+ QCOMPARE(view->size(), QSize(80, 100));
+ QCOMPARE(view->size(), view->sizeHint());
+
+ view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeViewToRootObject);
+
+ // size update from view disabled
+ view->resize(QSize(60, 80));
+ QCOMPARE(item->width(), 80.0);
+ QCOMPARE(item->height(), 100.0);
+ QTest::qWait(50);
+ QCOMPARE(view->size(), QSize(60, 80));
+
+ // size update from root object
+ item->setWidth(250);
+ item->setHeight(350);
+ QCOMPARE(item->width(), 250.0);
+ QCOMPARE(item->height(), 350.0);
+ QTRY_COMPARE(view->size(), QSize(250, 350));
+ QCOMPARE(view->size(), QSize(250, 350));
+ QCOMPARE(view->size(), view->sizeHint());
+
+ // reset window
+ window.hide();
+ delete view;
+ view = new KQuickAddons::QuickViewSharedEngine(&window);
+ QVERIFY(view);
+ view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeViewToRootObject);
+ view->setSource(testFileUrl("resizemodeitem.qml"));
+ item = qobject_cast<QQuickItem *>(view->rootObject());
+ QVERIFY(item);
+ window.show();
+
+ view->showNormal();
+
+ // initial size for root object
+ QCOMPARE(item->width(), 200.0);
+ QCOMPARE(item->height(), 200.0);
+ QCOMPARE(view->size(), view->sizeHint());
+ QCOMPARE(view->size(), view->initialSize());
+
+ // size update from root object
+ item->setWidth(80);
+ item->setHeight(100);
+ QCOMPARE(item->width(), 80.0);
+ QCOMPARE(item->height(), 100.0);
+ QTRY_COMPARE(view->size(), QSize(80, 100));
+ QCOMPARE(view->size(), QSize(80, 100));
+ QCOMPARE(view->size(), view->sizeHint());
+
+ // size update from root object disabled
+ view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeRootObjectToView);
+ item->setWidth(60);
+ item->setHeight(80);
+ QCOMPARE(view->width(), 80);
+ QCOMPARE(view->height(), 100);
+ QCOMPARE(QSize(item->width(), item->height()), view->sizeHint());
+
+ // size update from view
+ view->resize(QSize(200, 300));
+ QTRY_COMPARE(item->width(), 200.0);
+ QCOMPARE(item->height(), 300.0);
+ QCOMPARE(view->size(), QSize(200, 300));
+ QCOMPARE(view->size(), view->sizeHint());
+
+ delete view;
+
+ // if we set a specific size for the view then it should keep that size
+ // for SizeRootObjectToView mode.
+ view = new KQuickAddons::QuickViewSharedEngine(&window);
+ view->resize(300, 300);
+ view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeRootObjectToView);
+ QCOMPARE(QSize(0, 0), view->initialSize());
+ view->setSource(testFileUrl("resizemodeitem.qml"));
+ qWarning() << "bbb" << view->size();
+ view->resize(300, 300);
+ qWarning() << "ccc" << view->size();
+ item = qobject_cast<QQuickItem *>(view->rootObject());
+ QVERIFY(item);
+
+ view->showNormal();
+ QTest::qWait(50);
+
+ // initial size from root object
+ QCOMPARE(item->width(), 300.0);
+ QCOMPARE(item->height(), 300.0);
+ QCOMPARE(view->size(), QSize(300, 300));
+ QCOMPARE(view->size(), view->sizeHint());
+ QCOMPARE(view->initialSize(), QSize(200, 200)); // initial object size
+
+ delete view;
+}
+
+void QuickViewSharedEngineTest::errors()
+{
+ KQuickAddons::QuickViewSharedEngine *view = new KQuickAddons::QuickViewSharedEngine;
+ QVERIFY(view);
+ QQmlTestMessageHandler messageHandler;
+ view->setSource(testFileUrl("error1.qml"));
+ QCOMPARE(view->status(), QQmlComponent::Error);
+ QCOMPARE(view->errors().count(), 1);
+ delete view;
+}
+
+void QuickViewSharedEngineTest::engine()
+{
+ // test if engines are actually shared
+ // test if the engine gets deleted when the last view dies
+ KQuickAddons::QuickViewSharedEngine *view = new KQuickAddons::QuickViewSharedEngine();
+ QQmlEngine *engine = view->engine();
+
+ KQuickAddons::QuickViewSharedEngine *view2 = new KQuickAddons::QuickViewSharedEngine();
+ QQmlEngine *engine2 = view2->engine();
+
+ QCOMPARE(engine, engine2);
+ QSignalSpy engineDestroyedSpy(engine, &QObject::destroyed);
+
+ delete view;
+ delete view2;
+
+ QCOMPARE(engineDestroyedSpy.count(), 1);
+}
+
+QTEST_MAIN(QuickViewSharedEngineTest)
+
+#include "quickviewsharedengine.moc"
--- /dev/null
+/*
+ This file is part of the test suite of the Qt Toolkit.
+ SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) <http://www.qt-project.org/legal>
+
+ SPDX-License-Identifier: LGPL-2.1-only WITH Qt-LGPL-exception-1.1 OR LGPL-3.0-only WITH Qt-LGPL-exception-1.1 OR LicenseRef-Qt-Commercial
+*/
+
+#include "util.h"
+
+#include <QMutexLocker>
+#include <QQmlComponent>
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQmlError>
+#include <QTest>
+#include <QTextStream>
+
+QQmlDataTest *QQmlDataTest::m_instance = nullptr;
+
+QQmlDataTest::QQmlDataTest()
+ : m_dataDirectory(QFINDTESTDATA("data"))
+ , m_dataDirectoryUrl(QUrl::fromLocalFile(m_dataDirectory + QLatin1Char('/')))
+{
+ m_instance = this;
+}
+
+QQmlDataTest::~QQmlDataTest()
+{
+ m_instance = nullptr;
+}
+
+void QQmlDataTest::initTestCase()
+{
+ QVERIFY2(!m_dataDirectory.isEmpty(), "'data' directory not found");
+ m_directory = QFileInfo(m_dataDirectory).absolutePath();
+ QVERIFY2(QDir::setCurrent(m_directory), qPrintable(QLatin1String("Could not chdir to ") + m_directory));
+}
+
+QString QQmlDataTest::testFile(const QString &fileName) const
+{
+ if (m_directory.isEmpty()) {
+ qFatal("QQmlDataTest::initTestCase() not called.");
+ }
+ QString result = m_dataDirectory;
+ result += QLatin1Char('/');
+ result += fileName;
+ return result;
+}
+
+QByteArray QQmlDataTest::msgComponentError(const QQmlComponent &c, const QQmlEngine *engine /* = 0 */)
+{
+ QString result;
+ const QList<QQmlError> errors = c.errors();
+ QTextStream str(&result);
+ str << "Component '" << c.url().toString() << "' has " << errors.size() << " errors: '";
+ for (int i = 0; i < errors.size(); ++i) {
+ if (i) {
+ str << ", '";
+ }
+ str << errors.at(i).toString() << '\'';
+ }
+ if (!engine) {
+ if (QQmlContext *context = c.creationContext()) {
+ engine = context->engine();
+ }
+ }
+ if (engine) {
+ str << " Import paths: (" << engine->importPathList().join(QLatin1String(", ")) << ") Plugin paths: ("
+ << engine->pluginPathList().join(QLatin1String(", ")) << ')';
+ }
+ return result.toLocal8Bit();
+}
+
+Q_GLOBAL_STATIC(QMutex, qQmlTestMessageHandlerMutex)
+
+QQmlTestMessageHandler *QQmlTestMessageHandler::m_instance = nullptr;
+
+void QQmlTestMessageHandler::messageHandler(QtMsgType, const QMessageLogContext &, const QString &message)
+{
+ QMutexLocker locker(qQmlTestMessageHandlerMutex());
+ if (QQmlTestMessageHandler::m_instance) {
+ QQmlTestMessageHandler::m_instance->m_messages.push_back(message);
+ }
+}
+
+QQmlTestMessageHandler::QQmlTestMessageHandler()
+{
+ QMutexLocker locker(qQmlTestMessageHandlerMutex());
+ Q_ASSERT(!QQmlTestMessageHandler::m_instance);
+ QQmlTestMessageHandler::m_instance = this;
+ m_oldHandler = qInstallMessageHandler(messageHandler);
+}
+
+QQmlTestMessageHandler::~QQmlTestMessageHandler()
+{
+ QMutexLocker locker(qQmlTestMessageHandlerMutex());
+ Q_ASSERT(QQmlTestMessageHandler::m_instance);
+ qInstallMessageHandler(m_oldHandler);
+ QQmlTestMessageHandler::m_instance = nullptr;
+}
--- /dev/null
+/*
+ This file is part of the test suite of the Qt Toolkit.
+ SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) <http://www.qt-project.org/legal>
+
+ SPDX-License-Identifier: LGPL-2.1-only WITH Qt-LGPL-exception-1.1 OR LGPL-3.0-only WITH Qt-LGPL-exception-1.1 OR LicenseRef-Qt-Commercial
+*/
+
+#ifndef QQMLTESTUTILS_H
+#define QQMLTESTUTILS_H
+
+#include <QObject>
+#include <QStringList>
+#include <QUrl>
+
+QT_FORWARD_DECLARE_CLASS(QQmlComponent)
+QT_FORWARD_DECLARE_CLASS(QQmlEngine)
+
+/* Base class for tests with data that are located in a "data" subfolder. */
+
+class QQmlDataTest : public QObject
+{
+ Q_OBJECT
+public:
+ QQmlDataTest();
+ virtual ~QQmlDataTest();
+
+ QString testFile(const QString &fileName) const;
+ inline QString testFile(const char *fileName) const
+ {
+ return testFile(QLatin1String(fileName));
+ }
+ inline QUrl testFileUrl(const QString &fileName) const
+ {
+ return QUrl::fromLocalFile(testFile(fileName));
+ }
+ inline QUrl testFileUrl(const char *fileName) const
+ {
+ return testFileUrl(QLatin1String(fileName));
+ }
+
+ inline QString dataDirectory() const
+ {
+ return m_dataDirectory;
+ }
+ inline QUrl dataDirectoryUrl() const
+ {
+ return m_dataDirectoryUrl;
+ }
+ inline QString directory() const
+ {
+ return m_directory;
+ }
+
+ static inline QQmlDataTest *instance()
+ {
+ return m_instance;
+ }
+
+ static QByteArray msgComponentError(const QQmlComponent &, const QQmlEngine *engine = nullptr);
+
+public Q_SLOTS:
+ virtual void initTestCase();
+
+private:
+ static QQmlDataTest *m_instance;
+
+ const QString m_dataDirectory;
+ const QUrl m_dataDirectoryUrl;
+ QString m_directory;
+};
+
+class QQmlTestMessageHandler
+{
+ Q_DISABLE_COPY(QQmlTestMessageHandler)
+public:
+ QQmlTestMessageHandler();
+ ~QQmlTestMessageHandler();
+
+ const QStringList &messages() const
+ {
+ return m_messages;
+ }
+ const QString messageString() const
+ {
+ return m_messages.join(QLatin1Char('\n'));
+ }
+
+ void clear()
+ {
+ m_messages.clear();
+ }
+
+private:
+ static void messageHandler(QtMsgType, const QMessageLogContext &, const QString &message);
+
+ static QQmlTestMessageHandler *m_instance;
+ QStringList m_messages;
+ QtMessageHandler m_oldHandler;
+};
+
+#endif // QQMLTESTUTILS_H
--- /dev/null
+### KApiDox Project-specific Overrides File
+
+# define so that deprecated API is not skipped
+PREDEFINED += \
+ "KDECLARATIVE_ENABLE_DEPRECATED_SINCE(x, y)=1" \
+ "KDECLARATIVE_BUILD_DEPRECATED_SINCE(x, y)=1" \
+ "KDECLARATIVE_DEPRECATED_VERSION(x, y, t)=" \
+ "KDECLARATIVE_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)=" \
+ "QUICKADDONS_ENABLE_DEPRECATED_SINCE(x, y)=1" \
+ "QUICKADDONS_BUILD_DEPRECATED_SINCE(x, y)=1" \
+ "QUICKADDONS_DEPRECATED_VERSION(x, y, t)="
--- /dev/null
+maintainer: mart
+description: Provides integration of QML and KDE Frameworks
+tier: 3
+type: functional
+platforms:
+ - name: Linux
+ - name: FreeBSD
+ - name: Windows
+ - name: macOS
+ note: The supported remote Urls depends from what runtime kio slaves plugins are installed
+portingAid: false
+deprecated: false
+release: true
+libraries:
+ - qmake: KDeclarative
+ cmake: "KF5::Declarative"
+cmakename: KF5Declarative
+
+public_lib: true
+group: Frameworks
+subgroup: Tier 3
--- /dev/null
+# UTF-8 test:äëïöü
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4 stable\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2006-01-12 16:33+0200\n"
+"Last-Translator: JUANITA FRANZ <JUANITA.FRANZ@VR-WEB.DE>\n"
+"Language-Team: AFRIKAANS <translate-discuss-af@lists.sourceforge.net>\n"
+"Language: af\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"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Frikkie Thirion,Juanita Franz "
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "frix@expertron.co.za,juanita.franz@vr-web.de "
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definieër die program skrif tipe."
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+#| msgid "Input file"
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Invoer lêer"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Geen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Kortpad"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflik met Standaard Program Kortpad"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Die '%1' sleutel kombinasie is alreeds toegekan aan die standaard aksie "
+"\"%2\" geallokeer.\n"
+"Wil jy dit eerder aan die nuwe aksie allokeer?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reassign"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ongeldige sertifikaat!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Arabic
+# translation of kdelibs4.po to
+# Copyright (C) 2001-2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+# Isam Bayazidi <bayazidi@arabeyes.org>, 2001,2003.
+# Sayed Jaffer Al-Mosawi <mosawi@arabeyes.org>, 2002.
+# Hicham Amaoui <amaoui@wanadoo.fr>, 2002.
+# Youcef Rabah Rahal <rahal@arabeyes.org>, 2003.
+# Ahmad M. Zawawi <azawawi@emirates.net.ae>, 2004.
+# Mohammed Gamal <f2c2001@yahoo.com>, 2004.
+# Usamah Ali Al-Maqdad <msareehi@kacst.edu.sa>, 2004.
+# Munzir Taha <munzir@kacst.edu.sa>, 2004.
+# Mohamed SAAD <metehyi@free.fr>, 2006.
+# Khaled Hosny <khaledhosny@eglug.org>, 2007.
+# Youssef Chahibi <chahibi@gmail.com>, 2007.
+# zayed <zayed.alsaidi@gmail.com>, 2008, 2009.
+# Zayed Al-Saidi <zayed.alsaidi@gmail.com>, 2009, 2021.
+# hanny <hannysabbagh@hotmail.com>, 2012.
+# Abderrahim Kitouni <a.kitouni@gmail.com>, 2012.
+# Safa Alfulaij <safaalfulaij@hotmail.com>, 2013, 2017, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-07-13 23:06+0400\n"
+"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
+"Language-Team: ar\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+"X-Generator: Lokalize 21.07.70\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "زايد السعيدي,محمد هاني صباغ,صفا الفليج"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"zayed.alsaidi@gmail.com,hannysabbagh@hotmail.com,safa1996alfulaij@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "صدفة تطبيقات «حزمتك» لِQML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "اسم التطبيق الفريد (إلزامي)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "اعرض المساعدة السياقية"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "الدخل"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "بلا"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"انقر الزر ثمّ أدخل الاختصار الذي تريد في البرنامج.\n"
+"فمثلًا إن أردت Ctrl+A: أبقِ مفتاح Ctrl مضغوطًا واضغط A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "اختصار محجوز"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"مفتاح F12 محجوز في «وندوز»، لذا لا يمكن استخدامه كاختصار عمومي.\n"
+"رجاءً اختر غيره."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "تضارب مع اختصار تطبيق قياسي"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"تجميعة الأزرار ’%1‘ يستخدمها الإجراء القياسي ”%2“ أيضًا، والذي تستخدمه بعض "
+"التطبيقات.\n"
+"أمتأكّد من استخدامه كاختصار عمومي أيضًا؟"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "أعد التعيين"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "حزمة غير صالحة '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "لا يوجد ملف QML"
--- /dev/null
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Amitakhya Phukan <aphukan@fedoraproject.org>, 2008.
+# Amitakhya Phukan <অমিতাক্ষ ফুকন>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4_as\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2008-12-26 15:19+0530\n"
+"Last-Translator: Amitakhya Phukan <অমিতাক্ষ ফুকন>\n"
+"Language-Team: Assamese <fedora-trans-as@redhat.com>\n"
+"Language: as\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: Lokalize 0.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "অমিতাক্ষ ফুকন"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "aphukan@fedoraproject.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "অনুপ্ৰয়োগৰ আখৰ নিৰ্ধাৰিত কৰা হয়"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "নিবেশ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "শূণ্য"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "নতুন ৱেব চমু পথ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "অনুপ্ৰয়োগৰ মানপ্ৰাপ্ত চমু পথৰ সৈতে দ্বন্দ্ব"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "পুনঃ নিৰ্ধাৰণ"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "অবৈধ ফ্লেগ"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kdeclarative package.
+#
+# Xəyyam <xxmn77@gmail.com>, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 14:48+0400\n"
+"Last-Translator: Kheyyam Gojayev <xxmn77@gmail.com>\n"
+"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
+"Language: az\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: Lokalize 21.04.0\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Xəyyam Qocayev"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "xxmn77@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML tətbiqi üzlüyü"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Tətbiqin unikal adı (məcburidir)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Kontekst kömək menyusunu göstərmək"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Daxil et"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Heç biri"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Bu Düyməyə basın və tətbiqdə istədiyiniz qısa yolu daxil edin\n"
+"Məsələn Ctrl+A: Ctrl basın saxlayın və A sıxın"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Qısayolun rezerv olunması"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Windows -üçün saxlanılan F12 düyməsi qlobal qısayolu üçün istifadə oluna "
+"bilməz.\n"
+"Z'hm't olmasa başqa birini seçin"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Tətbiqin Standart Qısayolları ilə ziddiyyət"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Bəzi tətbiqlərdə istifadə olunan %1 düyməsinin kombinasiyası həmçinin "
+"standart %2 fəaliyyəti üçün istifadə olunur.\n"
+"Doğrudanmı Sİz bu kombinasiyanı qlobal qısayol kimi götərmək istəyirsiniz?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Yenisini təyin et"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Xətalı KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "QML faylı mövcud deyil"
--- /dev/null
+# translation of kdelibs4.po to Belarusian
+# translation of kdelibs4.po to
+#
+# Eugene Zelenko <greendeath@mail.ru>, 2002-2004.
+# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2006.
+# Darafei Praliaskouski <komzpa@licei2.com>, 2007.
+# Komяpa <symbol@me.by>, 2007.
+# Komяpa <komzpa@gmail.com>, 2007.
+# Darafei Praliaskoski <komzpa@gmail.com>, 2007.
+# Darafei Praliaskouski <komzpa@gmail.com>, 2008, 2009.
+# Siarhei Liantsevich <serzh.by@gmail.com>, 2008.
+# kom <me@komzpa.net>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-09-06 15:21+0300\n"
+"Last-Translator: Darafei Praliaskouski <komzpa@gmail.com>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Дарафей Праляскоўскі"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "komzpa@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "вызначае шрыфт праграмы"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Увод"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Няма"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Скарот"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Канфліктуе з стандартным скаротам праграмы"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+#| msgid ""
+#| "The '%1' key combination has already been allocated to the standard "
+#| "action \"%2\" that many applications use.\n"
+#| "You cannot use it for global shortcuts for this reason."
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Клавіша '%1' ужо прывязана да стандартнага дзеяння \"%2\", якім карыстаюцца "
+"шмат праграмаў.\n"
+"Вы не можаце пераназначыць яе."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Пераназначыць"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid Filenames"
+msgid "Invalid KPackage '%1'"
+msgstr "Недапушчальныя назвы файлаў"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Belarusian Latin
+# Copyright (C) 2008 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kdelibs4 package.
+#
+# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2008-08-30 01:10+0300\n"
+"Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n"
+"Language-Team: Belarusian Latin <i18n@mova.org>\n"
+"Language: be@latin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Ihar Hračyška"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "ihar.hrachyshka@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "aznačaje šryft aplikacyi"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Uvod"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Niama"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Novy sieciŭny skarot"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Niazhoda z zvyčajnym klavijaturnym skarotam aplikacyi"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Spałučeńnie klavišaŭ „%1” taksama pryviazanaje da standartnaha dziejańnia "
+"„%2”, jakim karystajucca niekatoryja aplikacyi.\n"
+"Ci ty sapraŭdy chočaš zrabić hetaje spałučeńnie paŭsiudnym?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Pieraviažy"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "niapravilnyja ŭłaścivaści"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Zlatko Popov <zlatkopopov@fsa-bg.org>, 2006, 2007, 2008, 2009.
+# Yasen Pramatarov <yasen@lindeas.com>, 2009, 2010, 2011, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-07-23 01:52+0300\n"
+"Last-Translator: Yasen Pramatarov <yasen@lindeas.com>\n"
+"Language-Team: Bulgarian <dict@ludost.net>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Ясен Праматаров,Радостин Раднев,Златко Попов"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "yasen@lindeas.com,radnev@yahoo.com,zlatkopopov@fsa-bg.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "задаване на шрифта за програмата"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Въведени данни"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Без"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Запазен бърз клавиш"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Конфликт с програмна клавишна комбинация"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Клавишната комбинация \"%1\" вече е зададена за действието \"%2\".\n"
+"Искате ли да я използвате и като глобален бърз клавиш."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Прехвърляне"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Неправилен запис."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Bengali (Bangla) translation of kdelibs4.
+# Copyright (C) 2009, Free Software Foundation, Inc.
+# translation of kdelibs4.po to Bengali
+# Copyright (C) 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+# Deepayan Sarkar,,, <deepayan.sarkar@gmail.com>, 2003.
+# Deepayan Sarkar <deepayan.sarkar@gmail.com>, 2003, 2004, 2005.
+# Deepayan Sarkar <deepayan.sarkar@gmail.com>, 2006, 2008, 2009..
+# Deepayan Sarkar <deepayan.sarkar@gmail.com>, 2009, 2010, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-07-16 14:27+0530\n"
+"Last-Translator: Deepayan Sarkar <deepayan.sarkar@gmail.com>\n"
+"Language-Team: American English <kde-translation@bengalinux.org>\n"
+"Language: bn\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: Lokalize 1.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "দীপায়ন সরকার"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "deepayan.sarkar@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "অ্যাপলিকেশনে ব্যবহৃত ফন্ট নির্ধারণ করে"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ইনপুট"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "কিছু না"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "অন্য কাজের জন্য নির্দিষ্ট শর্টকাট"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "স্ট্যাণ্ডার্ড অ্যাপলিকেশন শর্টকাটের সঙ্গে বিরোধ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+" '%1' মূখ্য সম্মিলন প্রমাণ ক্রিয়া\"%2\"এর জন্য ও ব্যবহার করা হয় যে কিছু অ্যাপলিকেশন "
+"ব্যবহার করো।\n"
+"আপনি কি ভাল হিসেবে একটি সার্বিক শর্টকাট হিসেবে এইটি ব্যবহার করতে সত্যি চাও?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, fuzzy, kde-format
+msgid "Reassign"
+msgstr "Reassign"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "অবৈধ বস্তু।"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Bengali INDIA
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Runa Bhattacharjee <runabh@gmail.com>, 2007.
+# Runa Bhattacharjee <runab@redhat.com>, 2008, 2009.
+# Runa Bhattacharjee <runab@fedoraproject.org>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-12-28 14:35+0530\n"
+"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
+"Language-Team: Bengali INDIA <anubad@lists.ankur.org.in>\n"
+"Language: bn_IN\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: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "রুণা ভট্টাচার্য্য"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "runabh@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "অ্যাপ্লিকেশন ফন্ট নির্ধারিত করা হয়"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ইনপুট"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "শূণ্য"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "সংরক্ষিত শর্ট-কাট"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "অ্যাপ্লিকেশনের প্রমিত শর্ট-কাটের সাথে দ্বন্দ্ব"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "পুনরায় নির্ধারণ"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "অবৈধ ফ্ল্যাগ"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# KDE breton translation
+# Copyright (C) 1998-2001 Free Software Foundation, Inc.
+# Jañ-Mai Drapier <jan-mai.drapier@mail.dotcom.fr>, 1998
+# Thierry Vignaud <tvignaud@mandriva.com>, 2001-2005
+# $Id$
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4-1.1\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2007-10-15 22:19+0200\n"
+"Last-Translator: Jañ-Mai Drapier <jan-mai.drapier@mail.dotcom.fr>\n"
+"Language-Team: Brezhoneg <Suav.Icb@wanadoo.fr>\n"
+"Language: br\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"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Thierry Vignaud, Jañ-Mai Drapier"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "tvignaud@mandriva.com, jdrapier@club-internet.fr"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Kas ur bostel da ratreer an arload"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Restr enkas"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ebet"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Berradennoù"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Ar blokad stokelloù %1 zo bet derannet c'hoazh d'an obererezh standard "
+"« %2 ».\n"
+"Diuzit mar plij ur blokad stokelloù dieil."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, fuzzy, kde-format
+msgid "Reassign"
+msgstr "Rusianeg"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Install Script Package"
+msgid "Invalid KPackage '%1'"
+msgstr "Staliañ ur pakad urzhiaoueg"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to bosanski
+# Marko Rosic <roske@kde.org.yu>, 2003.
+# Toplica Tanaskovic <toptan@kde.org.yu>, 2003, 2004, 2005.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+# Dalibor Djuric <dalibor.djuric@mozilla-srbija.org>, 2009, 2010.
+# Dalibor Djuric <daliborddjuric@gmail.com>, 2010.
+# KDE 4 <megaribi@epn.ba>, 2011.
+# Bosnian translation of kdelibs4
+# Initially converted from translation of kdelibs4.po by
+# Samir Ribić <Samir.ribic@etf.unsa.ba>
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-12-21 17:26+0000\n"
+"Last-Translator: Ademovic Saudin <sademovic1@etf.unsa.ba>\n"
+"Language-Team: bosanski <bs@li.org>\n"
+"Language: bs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Launchpad (build 16872)\n"
+"X-Launchpad-Export-Date: 2013-12-22 05:52+0000\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Samir Ribić,Ademovic Saudin,Vedran Ljubovic"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "samir.ribic@etf.unsa.ba,sademovic1@etf.unsa.ba,vljubovic@smartnet.ba"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definiše font programa"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ulaz"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "nijedna"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Kliknite na dugme, pa unesite prečicu kao što biste u programu.\n"
+"Primjer za Ctrl+A: držite taster Ctrl i pritisnite A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervisana prečica"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Taster F12 je rezervisan na Windowsu, pa se ne može koristiti kao globalna "
+"prečica.\n"
+"Izaberite neku drugu."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Sukob sa standardnom programskom prečicom"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinacija tastera '%1' već je dodijeljena standardnoj radnji „%2“, koju "
+"koriste neki programi.\n"
+"Želite li zaista da je koristite i kao globalnu prečicu?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Ponovo dodijeli"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Loša stavka."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5.po to Catalan
+# Copyright (C) 1998-2021 This_file_is_part_of_KDE
+# This file is distributed under the license LGPL version 2.1 or
+# version 3 or later versions approved by the membership of KDE e.V.
+#
+# Sebastià Pla i Sanz <sps@sastia.com>, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007.
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2003, 2006, 2011, 2012, 2013, 2014, 2020, 2021.
+# Albert Astals Cid <aacid@kde.org>, 2004, 2005, 2007.
+# Josep Ma. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2019, 2020.
+# Robert Millan <rmh@aybabtu.com>, 2009.
+# Orestes Mas <orestes@tsc.upc.edu>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 08:43+0200\n"
+"Last-Translator: Antoni Bella Pérez <antonibella5@yahoo.com>\n"
+"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 20.12.3\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Accelerator-Marker: &\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Sebastià Pla i Sanz"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sps@sastia.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Intèrpret d'aplicació en QML del KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "El nom únic de l'aplicació (obligatori)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Mostra l'ajuda contextual"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Cap"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Cliqueu en el botó, llavors introduïu la drecera com ho faríeu en el "
+"programa.\n"
+"Exemple per a «Ctrl+a»: manteniu premuda la tecla «Ctrl» mentre premeu la "
+"«A»."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Drecera reservada"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"La tecla «F12» està reservada a Windows, no es pot usar com a drecera "
+"global.\n"
+"Si us plau, seleccioneu-ne una altra."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflicte amb una drecera estàndard d'aplicació"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"La combinació de tecla «%1» ja s'ha assignat a l'acció estàndard «%2» que "
+"usen algunes aplicacions.\n"
+"Esteu segur que també voleu usar-la com a drecera global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reassigna"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage «%1» no vàlid"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "No s'ha proporcionat cap fitxer QML"
--- /dev/null
+# Translation of kdeclarative5.po to Catalan (Valencian)
+# Copyright (C) 1998-2019 This_file_is_part_of_KDE
+# This file is distributed under the license LGPL version 2.1 or
+# version 3 or later versions approved by the membership of KDE e.V.
+#
+# Sebastià Pla i Sanz <sps@sastia.com>, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007.
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2003, 2006, 2011, 2012, 2013, 2014.
+# Albert Astals Cid <aacid@kde.org>, 2004, 2005, 2007.
+# Josep Ma. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2019.
+# Robert Millan <rmh@aybabtu.com>, 2009.
+# Orestes Mas <orestes@tsc.upc.edu>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2019-02-04 20:27+0100\n"
+"Last-Translator: Josep Ma. Ferrer <txemaq@gmail.com>\n"
+"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
+"Language: ca@valencia\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Accelerator-Marker: &\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Sebastià Pla i Sanz"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sps@sastia.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Intèrpret d'aplicació QML del KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "El nom únic de l'aplicació (obligatori)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Cap"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Cliqueu en el botó, llavors introduïu la drecera com ho faríeu en el "
+"programa.\n"
+"Exemple per Ctrl+A: premeu la tecla Ctrl mentre premeu la «A»."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Drecera reservada"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"La tecla F12 està reservada en el Windows, no es pot utilitzar com a drecera "
+"global.\n"
+"Per favor, seleccioneu-ne una altra."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflicte amb la drecera estàndard de l'aplicació"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"La combinació de tecla «%1» ja s'ha assignat a l'acció estàndard «%2» que "
+"usen algunes aplicacions.\n"
+"Esteu segur que també voleu usar-la com a drecera global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reassigna"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Qırımtatarca (Qırım Türkçesi)
+# Copyright (C) 2008 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kdelibs package.
+#
+# Reşat SABIQ <tilde.birlik@gmail.com>, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-02-12 23:29-0600\n"
+"Last-Translator: Reşat SABIQ <tilde.birlik@gmail.com>\n"
+"Language-Team: Qırımtatarca (Qırım Türkçesi)\n"
+"Language: crh\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: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Reşat SABIQ"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "tilde.birlik@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "uyğulamanıñ urufatını belgiley"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Kirdi"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "İç biri"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Yañı İnternet Qısqa-yolu"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Standart Uyğulama Qısqa-yolunen Çatışma"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' tuş kombinatsiyası bazı uyğulamalarnıñ qullanğanı standart \"%2\" ameli "
+"içün de qullanılır.\n"
+"Onı kerçekten de umumiy qısqa-yol olaraq ta qullanmağa isteysiñizmi?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Kene-tayinle"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "keçersiz bayraqlar"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Lukáš Tinkl <lukas@kde.org>, 2010, 2011, 2012.
+# Vít Pelčák <vit@pelcak.org>, 2011, 2012, 2013, 2014, 2015, 2019, 2020.
+# Tomáš Chvátal <tomas.chvatal@gmail.com>, 2012, 2013.
+# Vit Pelcak <vpelcak@suse.cz>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-13 13:39+0200\n"
+"Last-Translator: Vit Pelcak <vpelcak@suse.cz>\n"
+"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Lokalize 21.04.0\n"
+"X-Language: cs_CZ\n"
+"X-Source-Language: en_US\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Vít Pelčák"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "vit@pelcak.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Shell aplikace KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Unikátní název aplikace (povinné)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Zobrazit kontextovou nápovědu"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Vstup"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Žádná"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klikněte na tlačítko a poté zadejte zkratku, kterou si přejete v programu.\n"
+"Příklad pro Ctrl+A: držte klávesu Ctrl a stiskněte A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervovaná klávesová zkratka"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Klávesa F12 je na Windows rezervována a nelze ji tedy použít jako globální.\n"
+"Vyberte prosím jinou."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt se standardní zkratkou aplikace"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Klávesová kombinace '%1' již byla přiřazena standardní činnosti \"%2\", "
+"kterou mnoho aplikací využívá.\n"
+"Opravdu si ji přejete použít jako globální klávesovou zkratku?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Přeřadit"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Neplatný KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Nebyl poskytnut soubor QML"
--- /dev/null
+# translation of kdelibs4.po to Kaszëbsczi
+#
+# Michôł Òstrowsczi <michol@linuxcsb.org>, 2006, 2007, 2008, 2009.
+# Mark Kwidzińsczi <mark@linuxcsb.org>, 2006, 2007, 2008, 2009.
+# Mark Kwidzińśczi <mark@linuxcsb.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-12-04 22:09+0100\n"
+"Last-Translator: Mark Kwidzińśczi <mark@linuxcsb.org>\n"
+"Language-Team: Kaszëbsczi <i18n-csb@linuxcsb.org>\n"
+"Language: csb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2)\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Michôł Òstrowsczi, Mark Kwidzińsczi"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "michol@linuxcsb.org, mark@linuxcsb.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "òpisëwô fònt programë"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Nowô skrodzënô"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Felëjë"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Nowô sécowô skrodzëna"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Zwada ze sztandardową skrodzëną programë"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Zestawienié klawiszów '%1' òstałó przëpisóné sztandardowemù dzejaniu \"%2\", "
+"jaczégò brëkùje jinszô aplikacëjô.\n"
+"Chcesz je pò prôwdze przëpisac do globalnëch skrodzrnów?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Przëpiszë"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "lëché fanë"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Cyfieithiad o kdelibs4.po i Cymraeg
+# translation of kdelibs4.po to Cymraeg
+# Translation of kdelibs4.po to Cymraeg
+# Translation of clearfuzzytest.po to Cymraeg
+# translation of clearfuzzytest.po to Cymraeg
+# translation of clearfuzzy.po to Cymraeg
+# KDE yn Gymraeg.
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+# www.kyfieithu.co.uk <kyfieithu@dotmon.com>, 2003.
+# Kgyfieithu <kyfieithu@dotmon.com>, 2003.
+# KGyfieithu <kyfieithu@dotmon.com>, 2003.
+# KD at KGyfieithu <kyfieithu@dotmon.com>, 2003, 2004.
+# Kyfieithu <kyfieithu@dotmon.com>, 2004.
+# Kevin Donnelly <kevin@dotmon.com>, 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2005-01-28 17:54+0000\n"
+"Last-Translator: Kevin Donnelly <kevin@dotmon.com>\n"
+"Language-Team: Cymraeg\n"
+"Language: cy\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9\n"
+"\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "KD wrth KGyfieithu"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kyfieithu@dotmon.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "diffinio wynebfath y cymhwysiad"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+#| msgid "Input file"
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ffeil fewnbwn"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Dim"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Byrlwybr"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Croestyniad efo Byrlwybr Cymhwysiad Arferol"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Mae cyfuniad bysell '%1' wedi ei dyrannu yn barod i'r weithred safonol "
+"\"%2\".\n"
+"Ydych eisiau ei ail-neilltuo o'r weithred yna i'r un gyfredol?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, fuzzy, kde-format
+msgid "Reassign"
+msgstr "Rwsieg"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Tystysgrif annilys!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Martin Schlander <mschlander@opensuse.org>, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020.
+# Keld Simonsen <keld@keldix.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-01-30 19:42+0100\n"
+"Last-Translator: Martin Schlander <mschlander@opensuse.org>\n"
+"Language-Team: Danish <kde-i18n-doc@kde.org>\n"
+"Language: da\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: Lokalize 18.12.3\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Erik Kjær Pedersen,Martin Schlander,Keld Simonsen"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "erik@binghamton.edu,mschlander@opensuse.org,keld@keldix.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage skal til QML-programmer"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Programmets unikke navn (obligatorisk)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Input"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ingen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Tryk på knappen, angiv så genvejen ligesom du vil gøre i programmet.\n"
+"Eksempel med Ctrl+A, hold Ctrl-tasten nede og tryk A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reserveret genvej"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12-tasten er reserveret på Windows, og kan derfor ikke bruges som en global "
+"genvej.\n"
+"Vælg venligst en anden."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt med programmets standardgenvejstast"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Tastekombinationen \"%1\" bruges allerede til standardhandlingen \"%2\" som "
+"mange programmer benytter.\n"
+"Vil du bruge den som en global genvej også?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Tilknyt igen"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ugyldig KPackage \"%1\""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Ingen QML-fil angivet"
--- /dev/null
+# Thomas Diehl <thd@kde.org>, 2002, 2003, 2004, 2005.
+# Stefan Winter <swinter@kde.org>, 2004.
+# Thomas Fischer <thomas.fischer@t-fischer.net>, 2004.
+# Stephan Johach <hunsum@gmx.de>, 2004, 2005, 2006, 2007.
+# Georg Schuster <gschuster@utanet.at>, 2005.
+# Thomas Reitelbach <tr@erdfunkstelle.de>, 2005, 2006, 2007, 2008, 2009.
+# Burkhard Lück <lueck@hube-lueck.de>, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020, 2021.
+# Frederik Schwarzer <schwarzer@kde.org>, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
+# Johannes Obermayr <johannesobermayr@gmx.de>, 2010.
+# Panagiotis Papadopoulos <pano_90@gmx.net>, 2010.
+# Rolf Eike Beer <kde@opensource.sf-tec.de>, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 08:22+0200\n"
+"Last-Translator: Burkhard Lück <lueck@hube-lueck.de>\n"
+"Language-Team: German <kde-i18n-de@kde.org>\n"
+"Language: de\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"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Thomas Reitelbach, Stephan Johach, Thomas Diehl"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "tr@erdfunkstelle.de, hunsum@gmx.de, thd@kde.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage-QML-Anwendungs-Shell"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Der eindeutige Name der Anwendung (erforderlich)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Kontexthilfe anzeigen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Eingabe"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Keiner"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klicken Sie auf den Knopf und drücken Sie dann die Tasten für den Kurzbefehl "
+"auf der Tastatur.\n"
+"Beispielsweise für Strg+A: Halten Sie die Strg-Taste gedrückt und drücken "
+"Sie dann „A“."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reservierter Kurzbefehl"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Die Taste „F12“ ist unter Windows reserviert, kann also nicht als globaler "
+"Kurzbefehl verwendet werden.\n"
+"Bitte wählen Sie eine andere Taste."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt mit Standard-Kurzbefehl des Programms"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Die Tastenkombination „%1“ ist bereits der Standard-Aktion „%2“ zugeordnet, "
+"die von einigen Anwendungen benutzt wird.\n"
+"Möchten Sie sie wirklich als globales Tastenkürzel verwenden?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Neu zuordnen"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ungültiges KPackage „%1“"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Keine QML-Datei angegeben"
--- /dev/null
+# translation of kdelibs4.po to Greek
+# translation of kdelibs4.po to
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# Last MAJOR revision (whole file) (29-03-2003 - Stergios Dramis).
+#
+# Dimitris Kamenopoulos <d.kamenopoulos@mail.ntua.gr>, 2000-2002.
+# Stergios Dramis <sdramis@egnatia.ee.auth.gr>, 2002-2004.
+# Κώστας Μπουκουβάλας <quantis@hellug.gr>, 2005.
+# Spiros Georgaras <sngeorgaras@otenet.gr>, 2005, 2006, 2007, 2008.
+# Toussis Manolis <manolis@koppermind.homelinux.org>, 2006, 2007, 2008, 2009.
+# Spiros Georgaras <sng@hellug.gr>, 2007, 2008.
+# Σπύρος Γεωργαράς <sngeorgaras@otenet.gr>, 2008.
+# Petros <pvidalis@gmail.com>, 2009.
+# Petros Vidalis <p_vidalis@hotmail.com>, 2010, 2011.
+# Dimitrios Glentadakis <dglent@gmail.com>, 2010, 2011, 2012, 2013, 2014.
+# nikos, 2011.
+# Stelios <sstavra@gmail.com>, 2012, 2013, 2015, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-06-13 13:07+0300\n"
+"Last-Translator: Stelios <sstavra@gmail.com>\n"
+"Language-Team: Greek <kde-i18n-el@kde.org>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 20.04.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Σπύρος Γεωργαράς, Τούσης Μανώλης, Πέτρος Βιδάλης"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sng@hellug.gr, manolis@koppermind.homelinux.org, p_vidalis@hotmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML κέλυφος εφαρμογής"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Το μοναδικό όνομα της εφαρμογής (υποχρεωτικό)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Εμφάνιση σχετικής βοήθειας"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Είσοδος"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Καμία"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Πατήστε το κουμπί, έπειτα εισάγετε την συντόμευση που επιθυμείτε στο "
+"πρόγραμμα.\n"
+"Παράδειγμα για Ctrl+A: κρατήστε πατημένο το Ctrl και πιέστε το A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Δεσμευμένη συντόμευση"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Το πλήκτρο F12 είναι δεσμευμένο στα Windows και δεν μπορεί χρησιμοποιηθεί "
+"για καθολική συντόμευση.\n"
+"Παρακαλώ επιλέξτε μία άλλη."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Σύγκρουση με πρότυπη συντόμευση εφαρμογής"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Ο συνδυασμός πλήκτρων « %1 » χρησιμοποιείται ήδη για την τυπική ενέργεια « "
+"%2 » η οποία είναι σε χρήση από διάφορες εφαρμογές.\n"
+"Επιθυμείτε πραγματικά τη χρήση της ως καθολική συντόμευση επίσης;"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Επανάθεση"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Μη έγκυρο KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Δεν δόθηκε QML αρχείο"
--- /dev/null
+# translation of kdelibs4.po to British English
+# Malcolm Hunter <malcolm.hunter@gmx.co.uk>, 2002,2003,2004, 2005, 2006, 2007, 2008, 2009.
+# Jonathan Riddell <kde-en-gb@jriddell.org>, 2003.
+# Andrew Coles <andrew_coles@yahoo.co.uk>, 2004, 2005, 2009, 2010.
+# Steve Allewell <steve.allewell@gmail.com>, 2014, 2015, 2019, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-06-12 14:30+0100\n"
+"Last-Translator: Steve Allewell <steve.allewell@gmail.com>\n"
+"Language-Team: British English <kde-l10n-en_gb@kde.org>\n"
+"Language: en_GB\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: Lokalize 21.04.1\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Andrew Coles"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "andrew_coles@yahoo.co.uk"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML application shell"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "The unique name of the application (mandatory)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Show Contextual Help"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Input"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "None"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reserved Shortcut"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflict with Standard Application Shortcut"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reassign"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Invalid KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "No QML file provided"
--- /dev/null
+# translation of kdelibs4.po to Esperanto
+# Esperantaj mesaĝoj por "kdelibs"
+# Copyright (C) 1998,2002, 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#
+# Minuskloj: ĉ ĝ ĵ ĥ ŝ ŭ Majuskloj: Ĉ Ĝ Ĵ Ĥ Ŝ Ŭ
+#
+# Wolfram Diestel <wolfram@steloj.de>, 1998.
+# Heiko Evermann <heiko@evermann.de>, 2002, 2003.
+# Matthias Peick <matthias@peick.de>, 2004, 2005.
+# Oliver Kellogg <okellogg@users.sourceforge.net>,2007.
+# Cindy McKee <cfmckee@gmail.com>, 2007, 2008.
+# Axel Rousseau <axel@esperanto-jeunes.org>, 2009.
+# Michael Moroni <michael.moroni@mailoo.org>, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-05-22 12:30+0200\n"
+"Last-Translator: Michael Moroni <michael.moroni@mailoo.org>\n"
+"Language-Team: Esperanto <kde-i18n-doc@kde.org>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Matthias Peick, Oliver Kellogg, Cindy McKee, Axel Rousseau, Michael Moroni"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"matthias@peick.de, okellogg@users.sourceforge.net, cfmckee@gmail.com, "
+"axel@esperanto-jeunes.org, michael.moroni@mailoo.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "difinas la tiparon de la aplikaĵo"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Enigo"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nenio"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervita Klavkombino"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikto kun defaŭlta aplikaĵa klavokombino"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+#| msgid ""
+#| "The '%1' key combination has already been allocated to the standard "
+#| "action \"%2\" that many applications use.\n"
+#| "You cannot use it for global shortcuts for this reason."
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"La klavkombino '%1' jam estas ligita al la norma ago \"%2\" kiun uzas multaj "
+"aplikaĵoj.\n"
+"Tial vi ne rajtas uzi ĝin por ĉieaj mallongigoj."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reatribui"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Nevalida ero."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Spanish
+# Translation of kdelibs4 to Spanish
+# Copyright (C) 2000-2007
+#
+# Pablo de Vicente <vicente@oan.es>, 2000-2002,2003, 2004.
+# Pablo de Vicente <vicnte@oan.es>, 2003.
+# Pablo de Vicente <p.devicente@wanadoo.es>, 2004, 2005.
+# Eloy Cuadra <ecuadra@eloihr.net>, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020, 2021.
+# Pablo de Vicente <pablo.devicente@gmail.com>, 2005, 2006, 2007.
+# Enrique Matias Sanchez (aka Quique) <cronopios@gmail.com>, 2007.
+# Jaime Robles <jaime@kde.org>, 2007.
+# Javier Viñal <fjvinal@gmail.com>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 16:14+0200\n"
+"Last-Translator: Eloy Cuadra <ecuadra@eloihr.net>\n"
+"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"First-Translator: Boris Wesslowski <Boris@Wesslowski.com>\n"
+"X-Generator: Lokalize 21.04.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Eloy Cuadra"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "ecuadra@eloihr.net"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Entorno de aplicación QML de KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "El nombre único de la aplicación (obligatorio)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Mostrar ayuda de contexto"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ninguna"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Pulse sobre el botón e introduzca a continuación el acceso rápido que desee "
+"para el programa.\n"
+"Ejemplo para «Ctrl+A»: mantenga pulsada la tecla «Ctrl» y luego pulse «A»."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Acceso rápido reservado"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"La tecla F12 está reservada en Windows y no se puede usar como acceso rápido "
+"global.\n"
+"Seleccione otra tecla."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflicto con el acceso rápido de la aplicación estándar"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"La combinación de teclas «%1» ya está asignada a la acción estándar «%2», "
+"que es usada por algunas aplicaciones.\n"
+"¿Realmente quiere usarla también como acceso rápido global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reasignar"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage «%1» no válido"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "No se ha proporcionado ningún archivo QML"
--- /dev/null
+# translation of kdelibs4.po to Estonian
+# Copyright (C) 1999-2004, 2005, 2006, 2009 Free Software Foundation, Inc.
+#
+# Hasso Tepper <hasso@kde.org>, 1999-2004, 2005, 2006.
+# Marek Laane <bald@smail.ee>, 2003-2009.
+# Peeter Russak <pezz@tkwcy.ee>, 2005.
+# Marek Laane <bald@smail.ee>, 2009, 2010, 2011, 2012, 2014, 2016, 2019, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-01-08 10:59+0200\n"
+"Last-Translator: Marek Laane <qiilaq69@gmail.com>\n"
+"Language-Team: Estonian <kde-et@lists.linux.ee>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 19.08.1\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Marek Laane"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "qiilaq69@mail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage'i QML rakenduse kest"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Rakenduse unikaalne nimi (kohustuslik)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Sisend"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Puudub"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klõpsa nupule ja sisesta meelepärane kiirklahv.\n"
+"Näide Ctrl+A kohta: hoia all Ctrl-klahvi ja vajuta klahvi A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reserveeritud kiirklahv"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Klahv F12 on reserveeritud Windowsile ja seda ei saa kasutada globaalse "
+"kiirklahvina.\n"
+"Palun vali mõni muu klahv."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt rakenduse standardse kiirklahviga"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Klahvikombinatsioon '%1' on juba kasutusel standardseks toiminguks \"%2\", "
+"mida kasutavad mitmed rakendused.\n"
+"Kas soovid seda kasutada ka globaalse kiirklahvina?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Asenda"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Vigane KPackage \"%1\""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "QML-faili pole antud"
--- /dev/null
+# Translation for kdeclarative5.po to Euskara/Basque (eu).
+# Copyright (C) 1999-2017, Free Software Foundation, Inc.
+# Copyright (C) 2018-2021, This file is copyright:
+# This file is distributed under the same license as the kdeclarative package.
+# KDE Euskaratzeko proiektuaren arduraduna <xalba@ni.eus>.
+#
+# Translators:
+# Marcos <marcos@euskalgnu.org>, 2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+# Ion Gaztañaga <igaztanaga@gmail.com>, 2005.
+# Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>, 2009.
+# Iñigo Salvador Azurmendi <xalba@ni.eus>, 2010, 2011, 2012, 2013, 2014, 2017, 2019, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-07-17 16:57+0200\n"
+"Last-Translator: Iñigo Salvador Azurmendi <xalba@ni.eus>\n"
+"Language-Team: Basque <kde-i18n-eu@kde.org>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 21.04.3\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Marcos,Ion Gaztañaga,Iñigo Salvador Azurmendi"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "marcos@euskalgnu.org,igaztanaga@gmail.com,xalba@ni.eus"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML aplikazioaren shell"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Aplikazioaren izen esklusiboa (nahitaezkoa)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Erakutsi testuinguru-laguntza"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Egin tekla konbinazioa"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Bat ere ez"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klik egin botoian, ondoren sartu lasterbidea programan egingo zenukeen "
+"moduan.\n"
+"Adibidez Ktrl+A: sakatuta mantendu Ktrl tekla eta sakatu A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Lasterbide erreserbatua"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 tekla erreserbatuta dago Windows-en, beraz ezin da erabili lasterbide "
+"orokor gisa.\n"
+"Mesedez hautatu beste bat."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Aplikazioaren lasterbide estandarrekin gatazkan"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' tekla-konbinazioa \"%2\" ekintza estandarrekin erabiltzen da. Aplikazio "
+"askok erabiltzen dute tekla-konbinazio hau.\n"
+"Benetan erabili nahi duzu laster-tekla orokor gisa?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Lotu"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage baliogabea '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Ez da QML fitxategirik hornitu"
--- /dev/null
+# translation of kdelibs4.po to Persian
+# Nazanin Kazemi <kazemi@itland.ir>, 2006, 2007.
+# Mahdi Foladgar <foladgar@itland.ir>, 2006.
+# Nasim Daniarzadeh <daniarzadeh@itland.ir>, 2006, 2007.
+# Tahereh Dadkhahfar <dadkhahfar@itland.ir>, 2006.
+# MaryamSadat Razavi <razavi@itland.ir>, 2007.
+# Nooshin Asiaie <asiaie@itland.ir>, 2007.
+# Mohamad Reza Mirdamadi <mohi@linuxshop.ir>, 2009, 2010, 2011, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-06-28 16:40+0430\n"
+"Last-Translator: Mohammad Reza Mirdamadi <mohi@linuxshop.ir>\n"
+"Language-Team: Farsi (Persian) <kde-i18n-fa@kde.org>\n"
+"Language: fa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "محمدرضا میردامادی , نازنین کاظمی , محمد ابراهیم محمدی پناه , سعید تقوی"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"mohi@linuxshop.ir , kazemi@itland.ir , mebrahim@gmail.com , s.taghavi@gmail."
+"com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "قلم کاربرد را تعریف میکند"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ورودی"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "هیچ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "میانبر رزرو شده"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "ناسازگاری با میانبر کاربرد استاندارد"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"کلید ترکیبی »%1« قبلاً به کنش استاندارد »%2« که کاربردهای بسیاری استفاده "
+"میکنند، اختصاص یافته است.\n"
+"نمیتوانید آن را برای میانبرهای سراسری برای این نشست استفاده کنید."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "انتساب مجدد"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid Filenames"
+msgid "Invalid KPackage '%1'"
+msgstr "نام پروندههای نامعتبر"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Finnish messages for kdelibs4.
+# Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kdelibs package.
+# Kim Enkovaara <kim.enkovaara@iki.fi>, 2002,2003, 2005, 2006, 2007.
+# Tapio Kautto <eleknader@phnet.fi>, 2003, 2004.
+# Mikko Ikola <kola@netikka.fi>, 2003.
+# Teemu Rytilahti <teemu.rytilahti@d5k.net>, 2003, 2008.
+# Mikko Ikola <ikola@iki.fi>, 2003.
+# Teemu Rytilahti <teemu.rytilahti@kde-fi.org>, 2003, 2004, 2008.
+# Niklas Laxström <niklas.laxstrom+kdetrans@gmail.com>, 2006, 2007.
+# Joonas Niilola <juippis@roskakori.org>, 2006.
+# Mikko Piippo <piippo@cc.helsinki.fi>, 2007.
+# Teemu Rytilahti <tpr@d5k.net>, 2008.
+# Tommi Nieminen <translator@legisign.org>, 2009, 2010, 2011, 2020.
+# Jorma Karvonen <karvonen.jorma@gmail.com>, 2010.
+# Lasse Liehu <lasse.liehu@gmail.com>, 2006, 2010, 2011, 2012, 2013, 2014, 2015.
+#
+# KDE Finnish translation sprint participants:
+# Author: Artnay
+# Author: Jl
+# Author: Lliehu
+# Author: Niklas Laxström
+# Author: Suhviksi
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-01-17 18:07+0200\n"
+"Last-Translator: Tommi Nieminen <translator@legisign.org>\n"
+"Language-Team: Finnish <kde-i18n-doc@kde.org>\n"
+"Language: fi\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: Lokalize 18.12.3\n"
+"X-POT-Import-Date: 2013-01-13 20:43:21+0000\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Lasse Liehu, Tommi Nieminen"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "lasse.liehu@gmail.com, translator@legisign.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackagen QML-sovelluskuori"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Sovelluksen yksilöllinen nimi (pakollinen)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Yhdistelmä"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ei asetettu"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Napsauta painiketta ja paina sen jälkeen haluamasi pikanäppäin.\n"
+"Esim. Ctrl+A:lle: paina Ctrl-näppäintä, sitten paina A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Varattu pikanäppäin"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12-näppäin on Windowsissa varattu, joten sitä ei voi käyttää "
+"työpöydänlaajuisena pikanäppäimenä.\n"
+"Valitse toinen pikanäppäin."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Ristiriita sovelluksen vakiopikanäppäimen kanssa"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Näppäinyhdistelmä %1 on jo vakiotoiminnon %2 käytössä.\n"
+"Haluatko varmasti käyttää näppäinyhdistelmää myös työpöydänlaajuisena "
+"pikanäppäimenä?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Sijoita uudelleen"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Virheellinen KPackage ”%1”"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "QML-tiedostoa ei annettu"
--- /dev/null
+# translation of kdelibs4.po to Français
+# translation of kdelibs4.po to
+# Matthieu Robin <kde@macolu.org>, 2002,2003, 2004.
+# Robert Jacolin <rjacolin@ifrance.com>, 2003,2004.
+# Gilles Caulier <caulier.gilles@free.fr>, 2003.
+# Gérard Delafond <gerard@delafond.org>, 2003, 2004.
+# Matthieu Robin <kde@macolu.org>, 2004, 2005, 2006.
+# Cedric Pasteur <cedric.pasteur@free.fr>, 2004.
+# Nicolas Ternisien <nicolas.ternisien@gmail.com>, 2004, 2005, 2006, 2007, 2008.
+# Matthieu Robin <matthieu@macolu.org>, 2005.
+# Éric Bischoff <ebischoff@nerim.net>, 2005.
+# Sébastien Renard <Sebastien.Renard@digitalfox.org>, 2006, 2007, 2008.
+# Anne-Marie Mahfouf <annma@kde.org>, 2007, 2008, 2012.
+# Ludovic Grossard <grossard@kde.org>, 2008.
+# Mickael Sibelle <kimael@gmail.com>, 2008.
+# Nicolas Lécureuil <nlecureuil@mandriva.com>, 2010.
+# Joëlle Cornavin <jcorn@free.fr>, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
+# Sebastien Renard <renard@kde.org>, 2013, 2014.
+# Vincent Pinon <vpinon@kde.org>, 2016.
+# Simon Depiets <sdepiets@gmail.com>, 2019, 2020.
+# Xavier Besnard <xavier.besnard@neuf.fr>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-29 08:34+0200\n"
+"Last-Translator: Xavier Besnard <xavier.besnard@neuf.fr>\n"
+"Language-Team: French <kde-francophone@kde.org>\n"
+"Language: fr\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: Lokalize 20.12.3\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Vincent Pinon, Simon Depiets"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "vpinon@kde.org, sdepiets@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Navigateur d'applications QML KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Le nom unique de l'application (obligatoire)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Afficher l'aide contextuelle"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Saisie"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Aucun"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Cliquez sur le bouton puis saisissez le raccourci comme vous le feriez dans "
+"le programme.\n"
+"Exemple pour Ctrl+A : maintenez enfoncée la touche Ctrl et appuyez sur la "
+"touche « A »."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Raccourci réservé"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"La touche F12 étant réservée sous Windows, il n'est pas possible de "
+"l'utiliser pour un raccourci global.\n"
+"Veuillez en choisir une autre."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflit avec un raccourci d'application standard"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"La combinaison de touches « %1 » est aussi employée pour l'action standard "
+"« %2 » que certaines applications utilisent.\n"
+"Voulez-vous vraiment l'employer comme raccourci global également ?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Réaffecter"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage « %1 » non valable"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Aucun fichier QML fourni"
--- /dev/null
+# translation of kdelibs4.po to Nederlands
+# translation of kdelibs4.po to
+# KTranslator Generated File
+# Fryske oersetting fan kdelibs.
+# Copyright (C) 2000,2001,2002,2003 KDE e.v..
+# let op! het bestand bevat ter hoogte van string 2470
+# een gesplitste zinnen die mbv. %1 of %2 weer worden samengevoegd!!
+# Bauke Nicolai <mildaam@hotmail.com>, 2002.
+# KDE-oersetgroep Frysk <frysk@kde.nl>, 2000, 2001, 2002,2003.
+# Rinse de Vries <rinsedevries@kde.nl>, 2004, 2005, 2006, 2007.
+# Berend ytsma <berendy@bigfoot.com>, 2004.
+# Rinse de Vries <RinseDeVries@home.nl>, 2006, 2008.
+# Berend Ytsma <berendy@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2010-07-22 09:48+0100\n"
+"Last-Translator: Berend Ytsma <berendy@gmail.com>\n"
+"Language-Team: nl <kde-i18n-doc@lists.kde.org>\n"
+"Language: fy\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KAider 0.1\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Berend Ytsma"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "Berendy@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definiearret it lettertype foar de applikaasjes"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ynfier"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Gjint"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reservearre fluchtoets"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt mei standert applikaasje-fluchtoets"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"De toetskombinaasje '%1' wurdt ek brûkt foar de standert aksje \"%2\" hokker "
+"troch guon applikaasje brûkt wurdt.\n"
+"Wolle jo it wier ek brûke as in globale fluchtoets?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Opnij tawize"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Unjildige item."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Irish
+# Translation of kdelibs4.po to Irish
+# Copyright (C) 1999,2003,2004 Free Software Foundation, Inc.
+# Sean V. Kelley <s_oceallaigh@yahoo.com>, 1999
+# Séamus Ó Ciardhuáin <seoc at iolfree.ie>, 2003,2004
+# Kevin Scannell <kscanne@gmail.com>, 2004-2009
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2004-12-14 09:11-0600\n"
+"Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"Language: ga\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n < 11 ? "
+"3 : 4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Séamus Ó Ciardhuáin,Kevin Scannell,Sean V. Kelley"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "seoc@iolfree.ie,kscanne@gmail.com,s_oceallaigh@yahoo.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "socraíonn cló an fheidhmchláir"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ionchur"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Gan aicearra"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Cliceáil an cnaipe, ansin cuir isteach an t-aicearra ba mhaith leat sa "
+"ríomhchlár.\n"
+"Mar shampla, le haghaidh Ctrl+a: coinnigh an eochair Ctrl síos agus brúigh "
+"'a'."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Aicearra In Áirithe"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tá an eochair F12 in áirithe ar chóras Windows, agus mar sin ní féidir é a "
+"úsáid mar aicearra comhchoiteann.\n"
+"Roghnaigh ceann eile."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Coimhlint le hAicearra Feidhmchláir Chaighdeánaithe"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Tá '%1' comhcheangailte leis an ngníomh caighdeánach \"%2\" cheana, gníomh a "
+"úsáideann roinnt feidhmchlár.\n"
+"An bhfuil tú cinnte gur mian leat é a úsáid mar aicearra comhchoiteann "
+"freisin?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Athshann"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid certificate"
+msgid "Invalid KPackage '%1'"
+msgstr "Teastas neamhbhailí"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# GunChleoc <fios@foramnagaidhlig.net>, 2014, 2015, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2016-04-30 12:50+0100\n"
+"Last-Translator: GunChleoc <fios@foramnagaidhlig.net>\n"
+"Language-Team: Fòram na Gàidhlig\n"
+"Language: gd\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
+"(n > 2 && n < 20) ? 2 : 3;\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Project-Style: kde\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "GunChleoc"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "fios@foramnagaidhlig.net"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Shell aplacaid KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Ainm sònraichte na h-aplacaid (riatanach)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ion-chur"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Chan eil gin"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Briog air a' phutan agus cuir a-steach an ath-ghoirid an uairsin mar a "
+"dhèanadh tu sa phrògram.\n"
+"Ball-eisimpleir airson \"Ctrl+A\": cum an iuchair \"Ctrl\" sìos agus brùth "
+"air \"A\"."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Ath-ghoirid ghlèidhte"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tha an iuchair F12 glèidhte air Windows agus cha ghabh a cleachdadh 'na h-"
+"ath-ghoirid uile-choitcheann ri linn seo.\n"
+"Feuch an tagh thu tè eile."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Còmhstri le ath-ghoirid thùsail na h-aplacaid"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Thèid na co-iuchraichean \"%1\" a chleachdadh cuideachd airson a' ghnìomha "
+"thùsail \"%2\" a chleachdas cuid a dh'aplacaidean.\n"
+"A bheil thu cinnteach gu bheil thu airson a chleachdadh na ath-ghoirid uile-"
+"choitcheann cuideachd?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Sònraich às ùr"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to galician
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# mvillarino <mvillarino@users.sourceforge.net>, 2007, 2008, 2009.
+# Marce Villarino <mvillarino@kde-espana.es>, 2008, 2009.
+# marce villarino <mvillarino@users.sourceforge.net>, 2009.
+# marce villarino <mvillarino@gmail.com>, 2009.
+# Marce Villarino <mvillarino@kde-espana.es>, 2009, 2010, 2011, 2012.
+# Xosé <xosecalvo@gmail.com>, 2010.
+# Marce Villarino <mvillarino@kde-espana.es>, 2011, 2012, 2013, 2014.
+# Adrián Chaves Fernández <adriyetichaves@gmail.com>, 2015.
+# Adrian Chaves <adrian@chaves.io>, 2018, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2019-10-19 22:29+0200\n"
+"Last-Translator: Adrián Chaves (Gallaecio) <adrian@chaves.io>\n"
+"Language-Team: Galician <proxecto@trasno.gal>\n"
+"Language: gl\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: Lokalize 19.11.70\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Xabier García Feal, marce villarino, Xosé Calvo"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "xosecalvo@gmail.com, mvillarino@gmail.com, proxecto@trasno.gal"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Intérprete de ordes de aplicacións en QML de KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Nome único para a aplicación (obrigatorio)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ningún"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Prema o botón, logo insira o atallo que desexe ter no programa.\n"
+"Exemplo para Ctrl+A: manteña premida a tecla Ctrl e prema A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Atallo reservado"
+
+# skip-rule: PT-2010-window
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"A tecla F12 está reservada en Windows polo que non se pode empregar como "
+"atallo global.\n"
+"Escolla outro."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflito cun atallo estándar de aplicación"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"A combinación de teclas «%1» tamén se usa para a acción estándar «%2» que "
+"usan algunhas aplicacións.\n"
+"Seguro que quere usala tamén como atallo global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reasignar"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid KPackage"
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage incorrecto"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Non se forneceu un ficheiro de QML"
--- /dev/null
+# translation of kdelibs4.po to Gujarati
+# Copyright (C) 2008 This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Kartik Mistry <kartik.mistry@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-11-22 00:01+0530\n"
+"Last-Translator: Kartik Mistry <kartik.mistry@gmail.com>\n"
+"Language-Team: Gujarati <team@utkarsh.org>\n"
+"Language: gu\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: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Kartik Mistry"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kartik.mistry@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "કાર્યક્રમ ફોન્ટ વ્યાખ્યાયિત કરે છે"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ઈનપુટ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "કંઇ નહી"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "નવો વેબ ટુંકાણ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "પ્રમાણભૂત કાર્યક્રમ ટૂંકાણ સાથે તકરાર થાય છે"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' કળ જોડાણ પ્રમાણભૂત ક્રિયા \"%2\" માટે પણ વપરાય છે જે કેટલાક કાર્યક્રમો ઉપયોગ કરે "
+"છે.\n"
+"તમે તેને ખરેખર વૈશ્વિક ટૂંકાણો તરીકે પણ વાપરવા માંગો છો?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "પુનઃસોંપણી"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "અયોગ્ય ફ્લેગો"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Hausa translation for kdelibs strings.
+# Copyright 2009 Adriaan de Groot, Mustapha Abubakar, Ibrahim Dasuna
+# This file is distributed under the same license as the kdelibs package.
+#
+# Adriaan de Groot <groot@kde.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-03-17 11:22+0100\n"
+"Last-Translator: Adriaan de Groot <groot@kde.org>\n"
+"Language-Team: Hausa <kde-i18n-doc@lists.kde.org>\n"
+"Language: ha\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: Lokalize 0.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Mustapha Abubakar,Adriaan de Groot,Ibrahim Dasuna"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ",groot@kde.org,"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr ""
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to hebrew
+# Translation of kdelibs4.po to Hebrew
+# translation of kdelibs4.po to
+# KDE Hebrew Localization Project
+#
+# In addition to the copyright owners of the program
+# which this translation accompanies, this translation is
+# Copyright (C) 1998 Erez Nir <erez-n@actcom.co.il>
+# Copyright (C) 1999-2003 Meni Livne <livne@kde.org>
+#
+# This translation is subject to the same Open Source
+# license as the program which it accompanies.
+#
+# Diego Iastrubni <elcuco@kde.org>, 2003.
+# Diego Iastrubni <elcuco@kde.org>, 2003, 2004.
+# Diego Iastrubni <elcuco@kde.org>, 2005, 2006, 2007, 2008, 2009, 2012, 2014.
+# Meni Livne <livne@kde.org>, 2007.
+# tahmar1900 <tahmar1900@gmail.com>, 2008, 2009.
+# Elkana Bardugo <ttv200@gmail.com>, 2017. #zanata
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2017-05-16 06:49-0400\n"
+"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
+"Language-Team: Hebrew <kde-i18n-doc@kde.org>\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Zanata 3.9.6\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "צוות התרגום של KDE ישראל"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kde-l10n-he@kde.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "מגדיר את הגופן של התכנית"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "קלט"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ללא"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"לחץ על הכפתור, ואז תוכל ליצור קיצור מקשים לשימוש בתוכנית.\n"
+"דוגמא: לקיצור Ctrl+a: לחץ על המקש Ctrl ועל המקש a"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "קיצורי מקשים שמורים"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"מקש ה-F12 הוא מקש שמור בWindows, ולכן אינו יכול לשמש כמקש קיצור גלובלי.אנא "
+"לבחור מקש אחר."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "התנגשות עם קיצור סטנדרטי של ישומים"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"שילוב המקשים \"%1\" כבר הוקצה לפעולה הסטנדרטית \"%2\", בה משתמשות תוכניות "
+"רבות.\n"
+"מסיבה זו אין באפשרותך להשתמש בו עבור קיצורים גלובליים."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "שייך מחדש"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Hindi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Ravishankar Shrivastava <raviratlami@yahoo.com>, 2007.
+# Ravishankar Shrivastava <raviratlami@aol.in>, 2008.
+# G Karunakar <karunakar@indlinux.org>, 2009, 2010, 2012.
+# Sameer Singh <lumarzeli30@gmail.com>, 2021.
+# Raghavendra Kamath <raghu@raghukamath.com>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-06-29 17:56+0530\n"
+"Last-Translator: Raghavendra Kamath <raghu@raghukamath.com>\n"
+"Language-Team: kde-hindi\n"
+"Language: hi\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: Lokalize 21.04.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "करुणाकर गुंटुपल्ली, समीर सिंह, राघवेंद्र कामत"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "karunakar@indlinux.org, lumarzeli30@gmail.com, raghu@raghukamath.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "केपैकेज क्यूएमएल अनुप्रयोग शेल"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "अनुप्रयोग का अनोखा नाम (अनिवार्य)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "प्रासंगिक मदद दिखाएँ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "इनपुट"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "कुछ नहीं"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"बटन पर क्लिक करें, फिर शॉर्टकट दर्ज करें जैसे आप अनुप्रयोग में आम तौर पर करतें हैं।\n"
+" उदाहरण के तौर पर, Ctrl+A के लिए: Ctrl कुंजी दबाए रखें और A दबाएं।"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "आरक्षित शॉर्टकट"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"एफ़१२ कुंजी, विंडोज़ में आरक्षित रहती है, इसलिए इसका वैश्विक शार्टकट के रूप में उपयोग नहीं हो "
+"सकता।\n"
+"कृपया कोइ अन्य शार्टकट चुनें।"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "मानक अनुप्रयोग शॉर्टकट के परस्पर विरोध में है"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"कुंजी '%1' संयोजन पहले से ही \"%2\" मानक क्रिया के लिए सम्बद्ध है जो कुछ अनुप्रयोगों में "
+"इस्तेमाल किया जाती है।\n"
+"क्या आप इसे वैश्विक शॉर्टकट के रूप में भी सम्बद्ध करना चाहते हैं?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "फिर से आबंटित करें"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "अवैध केपैकेज '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "कोई क्यूएमएल फ़ाईल उपलब्ध नहीं कराई गई"
--- /dev/null
+# translation of kdelibs4.po to Hindi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Ravishankar Shrivastava <raviratlami@yahoo.com>, 2007.
+# Ravishankar Shrivastava <raviratlami@aol.in>, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-02-10 20:44+0530\n"
+"Last-Translator: Ravishankar Shrivastava <raviratlami@aol.in>\n"
+"Language-Team: Hindi <kde-i18n-doc@lists.kde.org>\n"
+"Language: hne\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: Lokalize 0.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "रविसंकर सिरीवास्तव, जी. करूनाकर"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "raviratlami@aol.in,"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "अनुपरयोग फोंट परिभासित करथे "
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "इनपुट"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "कुछ नइ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "नवा वेब सार्टकट"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "प्रामानिक अनुपरयोग सार्टकट के आपसी विरोध मं हे"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"कुंजी '%1' संयोजन पहिली से ही \"%2\" मानक काम बर सम्बद्ध हे जऊन कुछ अनुपरयोग मन मं "
+"उपयोग होथे.\n"
+"का आप मन एला वैस्विक सार्टकट के रूप मं घलोक सम्बद्ध करना चाहथो ?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "फिर से आबंटित करव"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid Filenames"
+msgid "Invalid KPackage '%1'"
+msgstr "अवैध फाइल नाम"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdelibs4 to Croatian
+#
+# Renato Pavicic <renato@translator-shop.org>, 2006.
+# Zarko Pintar <zarko.pintar@gmail.com>, 2009.
+# Marko Dimjasevic <marko@dimjasevic.net>, 2009, 2010, 2011.
+# Andrej Dundović <adundovi@gmail.com>, 2009, 2010.
+# DoDo <DoDoEntertainment@gmail.com>, 2009.
+# Andrej Dundovic <andrej@dundovic.com.hr>, 2009, 2010, 2011.
+# Marko Dimjašević <marko@dimjasevic.net>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2011-07-22 16:08+0200\n"
+"Last-Translator: Marko Dimjašević <marko@dimjasevic.net>\n"
+"Language-Team: Croatian <kde-croatia-list@lists.sourceforge.net>\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.2\n"
+"X-Poedit-Language: Croatian\n"
+"X-Poedit-Country: CROATIA\n"
+"X-Poedit-Bookmarks: 1601,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Renato Pavičić, Žarko Pintar, Marko Dimjašević, Andrej Dundović"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"renato@translator-shop.org, zarko.pintar@gmail.com, marko@dimjasevic.net, "
+"adundovi@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definira pismo aplikacije."
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ulaz"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Bez"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Pritisnite gumb, zatim unesite prečac kao što bi napravili u samom programu."
+"\\ Primjer za Ctrl+a: držite tipku Ctrl i pritisnite a."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervirani prečaci"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tipka F12 rezervirana je na Windowsima i ne može biti korištena kao globalni "
+"prečac.\n"
+"Molim da izaberete drugu tipku."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Sukob sa zadanim prečacem aplikacije"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinacija tipki '%1' već je dodijeljena standardnoj aktivnosti \"%2\" "
+"koju neka aplikacija koristi.\n"
+"Želite li je zaista koristiti kao opći prečac? "
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Prenamjeni"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Neispravna stavka."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Upper Sorbian
+# translation of kdelibs4.po to
+# Copyright (C) 2003,2004, 2005, 2007 Free Software Foundation, Inc.
+# Eduard Werner <e.werner@rz.uni-leipzig.de>, 2003.
+# Prof. Dr. Eduard Werner <e.werner@rz.uni-leipzig.de>, 2003,2004.
+# Eduard Werner <edi.werner@gmx.de>, 2005.
+# Eduard Werner/Edward Wornar <edi.werner@gmx.de>, 2007, 2008.
+# Bianka Šwejdźic <hertn@gmx.de>, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2008-12-19 22:49+0100\n"
+"Last-Translator: Eduard Werner <edi.werner@gmx.de>\n"
+"Language-Team: en_US <kde-i18n-doc@lists.kde.org>\n"
+"Language: hsb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
+"%100==4 ? 2 : 3;\n"
+"X-Generator: KAider 0.1\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Edward Wornar"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "edi.werner@gmx.de"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definuje pismo programa."
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Input"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Žane"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Nowa skrótšenka za web"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt ze standardowym outputom programa"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinacija '%1' je so tež za standardnu akciju '%2' wužiwa, kiž je w "
+"někotrych aplikacijach definowana.\n"
+" Chceće ju woprawdźe tež jako globalnu skrótšenku wužiwać?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Zwjazanje změnić"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "njekorektne opcije"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Kiszel Kristóf <ulysses@kubuntu.org>, 2010.
+# Kristóf Kiszel <ulysses@kubuntu.org>, 2010, 2011, 2012, 2014, 2019.
+# Balázs Úr <urbalazs@gmail.com>, 2012, 2013.
+# Kristof Kiszel <kiszel.kristof@gmail.com>, 2018, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: KDE 4.4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-11-12 21:45+0100\n"
+"Last-Translator: Kristóf Kiszel <kiszel.kristof@gmail.com>\n"
+"Language-Team: Hungarian <kde-l10n-hu@kde.org>\n"
+"Language: hu\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: Lokalize 21.03.70\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Kiszel Kristóf,Szántó Tamás"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "ulysses@kubuntu.org,taszanto@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML alkalmazáshéj"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Az alkalmazás egyedi neve (kötelező)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Bemenet"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nincs"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Kattintson a gombra, majd adja meg a kívánt billentyűkombinációt.\n"
+"Példa Ctrl+A-ra: a Ctrl lenyomva tartása mellett nyomja le az A-t."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Foglalt keresőazonosító"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Az F12 foglalt billentyű a Windowsban, ezért nem használható globális "
+"billentyűparancsban.\n"
+"Válasszon más billentyűt."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Ütközés egy alkalmazásbeli billentyűkombinációval"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"A(z) „%1” billentyűkombináció már hozzá van rendelve a standard „%2” "
+"művelethez.\n"
+"Azt szeretné, hogy ez globális billentyűparancs is legyen?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Igen, az új"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Érvénytelen KPackage: „%1”"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Nincs megadva QML-fájl"
--- /dev/null
+# KDE - kdelibs/kdelibs4.po Armenian translation.
+# Copyright (C) 2005, KDE Armenian translation team.
+#
+# Davit Nikoghosyan <nikdavnik@mail.ru>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-01-31 01:08+0400\n"
+"Last-Translator: Davit <nikdavnik@mail.ru>\n"
+"Language-Team: Armenian Language: hy\n"
+"Language: hy\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Դավիթ Նիկողոսյան"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "nikdavnik@mail.ru"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "որոշում է ծրագրի տառաձևը"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Հիմա"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ընտրված չէ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Սեղմեք կոճակի վրա և մուտքագրեք կոմբինացիան:\n"
+"Օրինակ ` Ctrl+A կոճակների կոմբինացիայի համար սեղմած պահեք Ctrl կոճակը և "
+"սեղմեք A։"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Պահեստավորված կոճակների համադրություն"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Windows F12 կոճակը պաշտպանված է, այդ պատճառով այն չի կարելի օգտագործել "
+"կոճակների գլոբալ կոմբինացիաներում:\n"
+"Ընտրեք կոճակների այլ կոմբինացիա:"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Կոնֆլիկտ ծրագրի ստանդարտ կոճակի հետ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+" %1 ստեղների կոմբինացիան արդեն կապված է «%2» ստանդարտ գործողության հետ, որն "
+"օգտագործվում է մի շարք ծրագրերում։\n"
+"Ուզու՞մ եք օգտագործել այս կոմբինացիան որպես գլոբալ։"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Կապել նորի հետ"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Չհամապատասխանող տարր։"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# g.sora <g.sora@tiscali.it>, 2010, 2011, 2012, 2013, 2014, 2017, 2019, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-11 23:12+0100\n"
+"Last-Translator: Giovanni Sora <g.sora@tiscali.it>\n"
+"Language-Team: Interlingua <kde-i18n-doc@kde.org>\n"
+"Language: ia\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: Lokalize 2.0\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Giovanni Sora"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "g.sora@tiscali.it"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Shell de application QML de KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Il define le nomine unic del application (obligatori)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Monstra adjuta de contexto"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ingresso"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nulle"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Tu pressa sur le button, postea inserta le via breve como tu facerea in le "
+"programma\n"
+"Exemplo per CTRL+A: tu pressa le clave CTRL e pressa A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Via breve reservate"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Le clave F12 es reservate sur Windows, assi non pote usar se como via breve "
+"global.\n"
+"Pro favor tu selectiona un altere."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr ""
+"Conflicto con Standard Application Shortcut (Via Breve de application "
+"standard)"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Le combination de clave '%1' es etiam usate per le action standard \"%2\" "
+"que alicun applicationes usa.\n"
+"Etiam tu vole realmente usar lo como via breve global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reassigna"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Invalide KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Necun file QML fornite"
--- /dev/null
+# Indonesian translations for kdelibs4 package.
+# Copyright (C) 2010 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kdelibs4 package.
+# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010-2014.
+# Wantoyo <wantoyek@gmail.com>, 2017, 2018, 2019, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-01-14 07:27+0700\n"
+"Last-Translator: Wantoyo <wantoyek@gmail.com>\n"
+"Language-Team: Indonesian <kde-i18n-doc@kde.org>\n"
+"Language: id\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: Lokalize 19.12.0\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Andhika Padmawan,Wantoyo"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "andhika.padmawan@gmail.com,wantoyek@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Shell aplikasi KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Nama unik dari aplikasi (mandat)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Input"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nihil"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klik pada tombol, lalu masukkan pintasan seperti yang anda inginkan di "
+"program.\n"
+"Misalnya untuk Ctrl+A: tahan tombol Ctrl lalu tekan A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Pintasan Dipesan"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tombol F12 dipesan di Windows, sehingga tidak dapat digunakan untuk pintasan "
+"global.\n"
+"Silakan pilih yang lain"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflik dengan Pintasan Aplikasi Standar"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinasi tombol '%1' digunakan pula untuk aksi standar \"%2\" yang "
+"digunakan oleh beberapa aplikasi.\n"
+"Anda yakin ingin menggunakannya sebagai pintasan global juga?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Tugaskan Ulang"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage '%1' tidak absah"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Tidak ada file QML yang disediakan"
--- /dev/null
+# translation of kdelibs4.po to Icelandic
+# íslensk þýðing á kdelibs4.po
+# Copyright (C) 1998,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+#
+# Logi Ragnarsson <logi@logi.org>, 1998-2003.
+# Richard Allen <ra@ra.is>, 1998-2004.
+# Pjetur G. Hjaltason <pjetur@pjetur.net>, 2003.
+# Arnar Leósson <leosson@frisurf.no>, 2003, 2005.
+# Sveinn í Felli <sveinki@nett.is>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2016-04-08 22:57+0000\n"
+"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
+"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
+"Language: is\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: Plural-Forms: nplurals=2; plural=n != 1;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Richard Allen, Logi Ragnarsson, Pjetur G. Hjaltason, Arnar Leósson, Svanur "
+"Pálsson, Sveinn í Felli"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"ra@ra.is, logi@logi.org, pjetur@pjetur.net, leosson@frisurf.no, svanur@tern."
+"is, sv1@fellsnet.is"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "skilgreinir letur forritsins"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Inntak"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Engin"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Smelltu á hnappinn, settu síðan inn flýtilykilinn sem þú vilt nota í "
+"forritinu.\n"
+"Til dæmis Ctrl+a: halda niðri 'Ctrl' lyklinum og ýta á 'a'."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Frátekinn flýtilykill"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 lykillinn er frátekinn í Windows og er ekki hægt að nota sem víðværan "
+"flýtilykil.\n"
+"Veldu einhvern annan."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Árekstur við staðlaða fýtilykla forrita"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Lyklasamsetningin '%1' er nú þegar í notkun fyrir stöðluðu aðgerðina \"%2\" "
+"sem mörg forrit nota.\n"
+"Vilt þú í alvörunni nota hana jafnframt sem víðværan flýtilykil?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Endurúthluta"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Ógilt atriði"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Italian
+# Andrea Rizzi <rizzi@kde.org>, 2003, 2004, 2005.
+# Federico Cozzi <federicocozzi@federicocozzi.it>, 2004.
+# Federico Zenith <federico.zenith@member.fsf.org>, 2004, 2008, 2009, 2010, 2011.
+# Andrea Rizzi <Andrea.Rizzi@sns.it>, 2004.
+# Nicola Ruggero <nixprog.adsl@tiscali.it>, 2005, 2006.
+# Nicola Ruggero <nicola@nxnt.org>, 2006, 2007, 2010.
+# Luciano Montanaro <mikelima@cirulla.net>, 2007.
+# Dario Panico <Dareus_Persarumrex@fastwebnet.it>, 2008.
+# Pino Toscano <toscano.pino@tiscali.it>, 2008.
+# Federico Zenith <federico.zenith@member.fsf.org>, 2008, 2012, 2013, 2014, 2015.
+# Innocenzo Ventre <innocenzo.ventre@gmail.com>, 2012.
+# Vincenzo Reale <smart2128vr@gmail.com>, 2014, 2015, 2019, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 16:33+0200\n"
+"Last-Translator: Vincenzo Reale <smart2128vr@gmail.com>\n"
+"Language-Team: Italian <kde-i18n-it@kde.org>\n"
+"Language: it\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: Lokalize 21.04.0\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Vincenzo Reale"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "smart2128vr@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Shell applicazione KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Il nome univoco dell'applicazione (obbligatorio)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Mostra la guida contestuale"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Immissione"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nessuna"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Fai clic sul pulsante, quindi digita la scorciatoia come la vorresti nel "
+"programma.\n"
+"Esempio per Ctrl+A: tieni premuto il tasto Ctrl e premi A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Scorciatoia riservata"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Il tasto F12 è riservato sotto Windows, quindi non può essere usato per una "
+"scorciatoia globale.\n"
+"Scegline un altro."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflitto con una scorciatoia standard delle applicazioni"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"La combinazione di tasti «%1» è anche usata per l'azione standard «%2» che "
+"alcune applicazioni usano.\n"
+"Vuoi veramente usarla anche come scorciatoia globale?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Riassegna"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage «%1» non valido"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Nessun file QML fornito"
--- /dev/null
+# Translation of kdelibs4 into Japanese.
+# This file is distributed under the same license as the kdelibs package.
+# Taiki Komoda <kom@kde.gr.jp>, 2002, 2004, 2006, 2010.
+# Noboru Sinohara <shinobo@leo.bekkoame.ne.jp>, 2004.
+# Toyohiro Asukai <toyohiro@ksmplus.com>, 2004.
+# Kurose Shushi <md81@bird.email.ne.jp>, 2004.
+# AWASHIRO Ikuya <ikuya@oooug.jp>, 2004.
+# Shinichi Tsunoda <tsuno@ngy.1st.ne.jp>, 2005.
+# Yukiko Bando <ybando@k6.dion.ne.jp>, 2006, 2007, 2008, 2009, 2010.
+# Fumiaki Okushi <okushi@kde.gr.jp>, 2006, 2007, 2008, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2011-08-27 14:05-0700\n"
+"Last-Translator: Fumiaki Okushi <okushi@kde.gr.jp>\n"
+"Language-Team: Japanese <kde-jp@kde.org>\n"
+"Language: ja\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-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Generator: Lokalize 1.1\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr ""
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "入力"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "なし"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "予約済みのショートカット"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 は Windows で予約済みになっているため、グローバルショートカットには使えま"
+"せん。\n"
+"他のキーを選択してください。"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "標準アプリケーションショートカットと競合します"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"キーの組み合わせ %1 は、複数のアプリケーションが使用する標準アクション「%2」"
+"に割り当てられています。\n"
+"本当にこれをグローバルショートカットとしても使いますか?|/|キーの組み合わせ "
+"%1 は、複数のアプリケーションが使用する標準アクション「$[~stripAccel "
+"$[~getForm %2 ~full]]」に割り当てられています。\n"
+"本当にこれをグローバルショートカットとしても使いますか?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "割り当て直す"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# KDE3 - Georgian translation of kdelibs4.po
+# Gia Shervashidze <giasher@telenet.ge>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-12-17 02:11+0400\n"
+"Last-Translator: George Machitidze <giomac@gmail.com>\n"
+"Language-Team: Georgian <http://www.gia.ge>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "გია შერვაშიძე"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "giasher@telenet.ge"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "მიუთითებს პროგრამის შრიფტს"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+#| msgid "Input file"
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "შეტანის ფაილი"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "არა"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "მალმხმობი"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "კონფლიქტი პროგრამის სტანდარტულ მალმხმობთან"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"კლავიშების ბმული %1 უკვე გამოიყენება \"%2\" სტანდარტული ქმედებისთვის.\n"
+"გადმოვამისამართო იგი ახალ ქმედებაზე?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "გადამისამართება"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "მცდარი სერთიფიკატი!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Karakh
+#
+# Sairan Kikkarin <sairan@computer.org>, 2005, 2006, 2007, 2008, 2009.
+# Sairan Kikkarin <sairan@computer.org>, 2010, 2011, 2012.
+# Sairan Kikkarin <sairan(at)computer.org>, 2010, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-11-08 01:24+0600\n"
+"Last-Translator: Sairan Kikkarin <sairan@computer.org>\n"
+"Language-Team: Kazakh <kde-i18n-doc@kde.org>\n"
+"Language: kk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+
+#
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Сайран Киккарин"
+
+#
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sairan@computer.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "қолданбаның қаріпін анықтайды"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Енгізу"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Жоқ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Осы батырманы басыңыз да, қалаған тіркесімді келтіріңіз.\n"
+"Мысалы, Ctrl+a: дегенді келтіру үшін 'Ctrl' пернені басып тұрып \n"
+"'a' пернесін басыңыз."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Арналған тіркесімі"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 пернесі Windows-қа арналған, сондықтан жалпы жүйелік тіркесімге "
+"жарамайды.\n"
+"Басқа пернені таңдаңыз."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Қолданбаның стандартты перне тіркесімімен қайшылық"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' деген перне тіркесімі әлден \"%2\" деген стандартты әрекетпен "
+"байланысқан.\n"
+"Оны жалпы жүйелік тіркесімі ретінде пайдаланбақсыз ба?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Ауыстыру"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Жарамсыз нәрсе."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Khmer
+# Khoem Sokhem <khoemsokhem@khmeros.info>, 2008, 2009, 2010, 2011, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-06-27 10:04+0700\n"
+"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
+"Language-Team: Khmer\n"
+"Language: km\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: KBabel 1.11.4\n"
+"X-Language: km-KH\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr " ខឹម សុខែម, ម៉ន ម៉េត, សេង សុត្ថា, ចាន់ សម្បត្តិរតនៈ, សុខ សុភា"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"khoemsokhem@khmeros.info,mornmet@khmeros.info,sutha@khmeros.info,"
+"ratanak@khmeros.info,sophea@khmeros.info"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "កំណត់ពុម្ពអក្សររបស់កម្មវិធី"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "បញ្ចូល"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "គ្មាន"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"ចុចប៊ូតុង បន្ទាប់មកបញ្ចូលផ្លូវកាត់តាមដែលអ្នកចង់បាននៅក្នុងកម្មវិធី ។\n"
+"ឧទាហរណ៍ បញ្ជា(Ctrl)+a ៖ ចុចគ្រាប់ចុចបញ្ជា(Ctrl) ហើយចុច a ។"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "ផ្លូវកាត់ដែលបានបម្រុងទុក"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"គ្រាប់ចុច F12 ត្រូវបានបម្រុងទុកនៅលើវីនដូ ដូច្នេះមិនអាចត្រូវបានប្រើសម្រាប់គ្រាប់ចុចផ្លូវកាត់សកលទេ ។\n"
+"សូមជ្រើសគ្រាប់ចុចផ្លូវកាត់ផ្សេង ។"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "ប៉ះទង្គិចជាមួយនឹងផ្លូវកាត់កម្មវិធីស្តង់ដា"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"បន្សំគ្រាប់ចុច '%1' ក៏ត្រូវកំពុងត្រូវបានប្រើសម្រាប់សកម្មភាពស្តង់ដារ \"%2\" ដែលកម្មវិធីមួយចំនួនប្រើ ។\n"
+"តើអ្នកពិតជាចង់ប្រើវាជាផ្លូវកាត់សកលដែរឬ ?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "ផ្ដល់ឡើងវិញ"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "ធាតុមិនត្រឹមត្រូវ ។"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Kannada
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Umesh Rudrapatna <urudrapatna@yahoo.com>, 2007.
+# Umesh Rudrapatna <umeshrs@gmail.com>, 2007, 2008, 2009.
+# Shankar Prasad <svenkate@redhat.com>, 2008, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2010-06-24 18:32+0530\n"
+"Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
+"Language-Team: kn_IN <kde-i18n-doc@kde.org>\n"
+"Language: kn\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"
+"\n"
+"X-Generator: Lokalize 1.0\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ಉಮೇಶ್ ರುದ್ರಪಟ್ಟಣ, ಸಿದ್ಧಾರೂಢ ಪಿ ಟಿ, ಶಂಕರ ಪ್ರಸಾದ್ ಎಂ ವಿ"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "umeshrs@gmail.com, siddharudh@gmail.com, svenkate@redhat.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "ಅನ್ವಯದ ಲಿಪಿಶೈಲಿಯನ್ನು ನಿರೂಪಿಸುತ್ತದೆ"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ಆದಾನ (ಇನ್ ಪುಟ್)"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ಯಾವುದೂ ಇಲ್ಲ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "ಕಾದಿರಿಸಲಾದ ಸಮೀಪಮಾರ್ಗ (ಶಾರ್ಟ್ ಕಟ್)"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "ಮಾನಕ (standard) ಅನ್ವಯಿಕ ಸಮೀಪಮಾರ್ಗಗಳೊಡನೆ ಕಲಹ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' ಕೀಲಿಕೈ ಹೊಂದಾಣಿಕೆಯು ಅನೇಕ ಅನ್ವಯಿಕಗಳು ಬಳಸುವ ಮಾನಕ (standard) ಕ್ರಿಯೆ \"%2\" ಗೆ "
+"ಈಗಾಗಲೇ ನಿಗದಿಗೊಳಿಸಲಾಗೆದೆ.\n"
+"ನೀವು ನಿಜಕ್ಕೂ ಇದನ್ನು ಸಾರ್ವತ್ರಿಕ ಸಮೀಪಮಾರ್ಗವಾಗಿ ಬಳಸಲಿಚ್ಛಿಸುವಿರೇನು?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "ಮರುನಿಗದಿಗೊಳಿಸು"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "ಅಮಾನ್ಯವಾದ ಅಂಶ."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Korean messages for kdelibs.
+# Copyright (C) Free Software Foundation, Inc.
+# Cho Sung Jae <cho.sungjae@gmail.com>, 2007.
+# Shinjo Park <kde@peremen.name>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-16 21:46+0200\n"
+"Last-Translator: Shinjo Park <kde@peremen.name>\n"
+"Language-Team: Korean <kde-kr@kde.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Lokalize 20.12.3\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "박신조"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kde@peremen.name"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML 프로그램 셸"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "프로그램의 식별 가능한 이름(필수)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "문맥 도움말 표시"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "입력"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "없음"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"단추를 누른 다음 프로그램에 사용할 단축 키를 누르십시오.\n"
+"Ctrl+A를 사용하려면 Ctrl 키를 누르고 A를 누르십시오."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "예약된 바로 가기"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 키는 Windows에서 예약되어 있으므로 전역 단축키로 사용할 수 없습니다.\n"
+"다른 키를 선택하십시오"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "표준 프로그램 단축키와 충돌"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' 키 조합은 많은 프로그램이 사용하는 \"%2\" 표준 동작에 할당되어 있습니"
+"다.\n"
+"그래도 전역 단축키로 사용하시겠습니까?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "재할당"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "잘못된 KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "QML 파일을 지정하지 않았음"
--- /dev/null
+# translation of kdelibs4.po to Kurdish
+# Kurdish translation for kdelibs
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the kdelibs package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2006.
+# Erdal Ronahi <erdal.ronahi@nospam.gmail.com>, 2006, 2008.
+# Erdal Ronahi <erdal.ronahi@nospam.gmail.com>, 2007, 2008, 2009.
+# Amed Çeko Jiyan <amedcj@gmail.com>, 2008.
+# Erdal Ronahî <erdal.ronahi@nospam.gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2010-08-13 15:45+0200\n"
+"Last-Translator: Erdal Ronahî <erdal.ronahi@nospam.gmail.com>\n"
+"Language-Team: Kurdish Team http://pckurd.net\n"
+"Language: ku\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: Virtaal 0.6.1\n"
+"X-Launchpad-Export-Date: 2007-11-26 09:44+0000\n"
+"X-Poedit-Language: Kurdish\n"
+"X-Poedit-Country: Kurdistan\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Erdal Ronahi"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "erdal.ronahi@nospam.gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "curetîpê sepandinê diyar dike"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ketan"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ti yek"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Pêl bişkojkê bikin, paşê jî kurterê têkevnê wek we di bernamê de dikin.\n"
+"Mînak ji bo Ctrl+a: Ctrl pêlêkirî bigirin û pêl a bikin."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Kurteriya Veqetandî"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 di Windowsê de heye, ji ber vê ji bo kurteriyên giştî nayê bikaranîn.\n"
+"Ji kerema xwe yekî din hilbijêrin."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Lihevnekirina Bi Kurteriya Sepana Standard"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Tayînkirina ji nû ve"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Hêmana nederbasdar."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Luxembourgish
+# kevin claude everard <kevin@math.uni-sb.de>, 2005.
+# Michel Ludwig <michel.ludwig@kdemail.net>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2006-06-22 16:29+0200\n"
+"Last-Translator: Michel Ludwig <michel.ludwig@kdemail.net>\n"
+"Language-Team: Luxembourgish <kde-i18n-lb@kde.org>\n"
+"Language: lb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Kevin Claude Everard,Michel Ludwig"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kevin@math.uni-sb.de,miclud@studcs.uni-sb.de"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "Definéiert d'Schrëft vun der Uwendung"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+#| msgid "Input file"
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Quelldatei"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Keng"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Tastekombinatioun"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt mat der Standardkombinatioun vum Programm"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"D'Tastekombinatioun \"%1\" ass scho mat der Standardaktioun \"%2\" verbonn.\n"
+"Wëllt dir trotzdem déi nei Zouuerdnung auswielen?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Nei zouuerdnen"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ongültegen Zertifikat!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Lithuanian
+# Ričardas Čepas <rch@richard.eu.org>, 2002-2004.
+# Donatas Glodenis <dgvirtual@akl.lt>, 2004-2009.
+# Gintautas Miselis <gintautas@miselis.lt>, 2008.
+# Andrius Štikonas <andrius@stikonas.eu>, 2009.
+# Tomas Straupis <tomasstraupis@gmail.com>, 2011.
+# Remigijus Jarmalavičius <remigijus@jarmalavicius.lt>, 2011.
+# Liudas Ališauskas <liudas.alisauskas@gmail.com>, 2011, 2012, 2013, 2014.
+# Liudas Alisauskas <liudas@akmc.lt>, 2013, 2015.
+# Mindaugas Baranauskas <opensuse.lietuviu.kalba@gmail.com>, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-01-11 23:54+0200\n"
+"Last-Translator: Moo\n"
+"Language-Team: lt <kde-i18n-lt@kde.org>\n"
+"Language: lt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n"
+"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n"
+"X-Generator: Poedit 2.0.6\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Moo"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "<>"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML programos apvalkalas"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Unikalus programos pavadinimas (privalomas)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Įvestis"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nėra"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Spustelėkite ant mygtuko, tada įveskite klavišų kombinaciją taip, tarsi "
+"būtumėte programoje.\n"
+"Pavyzdžiui kombinacijai Vald+A: laikykite Vald klavišą ir paspauskite A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervuota klavišų kombinacija"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 klavišas yra rezervuotas Windows sistemoje, taigi negali būti naudojamas "
+"visuotine klavišų kombinacija.\n"
+"Prašome pasirinkti kitą."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konfliktas su standartine programos klavišų kombinacija"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Klavišų kombinacija „%1“ jau priskirta standartiniam veiksmui „%2“, kurį "
+"naudoja kai kurios programos.\n"
+"Ar tikrai norite ją naudoti ir kaip visuotinę sparčiųjų klavišų kombinaciją?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Priskirti iš naujo"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Neteisingas KPackage \"%1\""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Nepateikta jokio QML failo"
--- /dev/null
+# translation of kdelibs4.po to Latvian
+# kdelibs.po tulkojums uz Latviešu valodu
+# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+#
+# Maris Nartiss <maris.nartiss@gmail.com>, 2005.
+# Maris Nartiss <maris.kde@gmail.com>, 2006, 2007, 2008, 2009, 2010, 2011.
+# Linux localization project <viesturs.zarins@mii.lu.lv>, 2007.
+# Viesturs Zarins <viesturs.zarins@mii.lu.lv>, 2007, 2008, 2010.
+# Viesturs Zariņš <viesturs.zarins@mii.lu.lv>, 2009.
+# Einars Sprugis <einars8@gmail.com>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2011-07-06 12:57+0300\n"
+"Last-Translator: Maris Nartiss <maris.kde@gmail.com>\n"
+"Language-Team: Latvian\n"
+"Language: lv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
+"2);\n"
+"X-Launchpad-Export-Date: 2007-11-22 17:44+0000\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Viesturs Zariņš, Māris Nartišs"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "viesturs.zarins@mi.lu.lv, maris.kde@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definē programmas fontu"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ievade"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nav"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Nospiediet pogu, tad ievadiet īsceļu, kuru vēlaties lietot programmā.\n"
+"Piemēram, priekš Ctrl+a: turiet Ctrl taustiņu un tad nospiediet a."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervērts īsceļš"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 taustiņš ir rezervēts Windows operētājsistēmā, tāpēc to nevar izmantot "
+"kā globālu īsceļu.\n"
+"Lūdzu izvēlieties citu taustiņu."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikts ar standarta programmu īsceļu"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Taustiņu kombinācija '%1' jau ir piešķirta standarta darbībai \"%2\", ko "
+"lieto daudzas programmas.\n"
+"Vai jūs tiešām vēlaties to izmantot arī kā globālo īsceļu?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Piešķirt"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Nederīgs vienums."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Hindi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Sangeeta Kumari <sangeeta09@gmail.com>, 2008.
+# Rajesh Ranjan <rajesh672@gmail.com>, 2010.
+# Rajesh Ranjan <rranjan@redhat.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2010-09-24 15:44+0530\n"
+"Last-Translator: Rajesh Ranjan <rranjan@redhat.com>\n"
+"Language-Team: Hindi <fedora-trans-hi@redhat.com>\n"
+"Language: mai\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: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "संगीता कुमारी"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sangeeta09@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "अनुप्रयोग फोन्ट पारिभाषित करैत अछि"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "इनपुट"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "किछु नहि"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "शार्टकट"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "प्रामाणिक अनुप्रयोग शार्टकट केर परस्पर विरोध मे अछि"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"कुंजी '%1' संयोजन पहिने सँ \"%2\" मानक काज क' लेल सम्बद्ध अछि जे किछु अनुप्रयोगसभ मे "
+"इस्तेमाल कएल जाइत अछि.\n"
+"की अहाँ एकरा वैश्विक शार्टकट केर रूपेँ सम्बद्ध कएनाइ चाहैत छी?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "फिनु सँ आबंटित करू"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "अवैध मद."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Macedonian
+#
+# Copyright (C) 2000,2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# Dimitar Indovski <dime@gord.com.mk>
+# Damjan Janevski <miopa@freemail.org.mk>
+# Dragan Sekulovski <d_sekulovski@yahoo.com>
+#
+# Maratonec , 2002.
+# Dragan Bocevski <d_bocevski@hotmail.com>, 2002.
+# Danko Ilik <danko@mindless.com>, 2002,2003.
+# Bozidar Proevski <bobibobi@freemail.com.mk>, 2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+# Danko Ilik <danko@on.net.mk>, 2003.
+# Darko Nikolovski <darkon@macedonia.homelinux.org>, 2003.
+# Ivan Dimitrov <ivan34mk@yahoo.com>, 2003.
+# Magdica Shambevska <magdica@yahoo.com>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2010-01-27 10:39+0100\n"
+"Last-Translator: Bozidar Proevski <bobibobi@freemail.com.mk>\n"
+"Language-Team: Macedonian <mkde-l10n@lists.sourceforge.net>\n"
+"Language: mk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: Plural-Forms: nplurals=3; plural=n%10==1 ? 0 : n%10==2 ? 1 : "
+"2;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Божидар Проевски"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "bobibobi@freemail.com.mk"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "го дефинира фонтот на апликацијата"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Внес"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Нема"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Кликнете на копчето, потоа внесете ја кратенката како што би ја активирале "
+"во некоја програма.\n"
+"На пример за „Ctrl+a“: задржете го притиснато копчето „Ctrl“ и притиснете "
+"„a“."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Резервирана кратенка"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Копчето F12 е резервирано на „Windows“, па не може да се користи како "
+"глобална кратенка.\n"
+"Молам изберете друга."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Конфликт со стандардна кратенка на апликација"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Комбинацијата на копчиња „%1“ исто така се користи за стандардното дејство "
+"“%2“ што го користат некои апликации.\n"
+"Дали навистина сакате да ја користите и како глобална кратенка?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Преповрзи"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "невалидни знаменца"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to
+# Malayalam translation of kdelibs4.
+# Copyright (C) 2007-2010 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kdelibs package.
+# Anoop | അനൂപ് Panavalappil | പനവളപ്പില് <gnuanu@gmail.com>, 2008.
+# ANI PETER|അനി പീറ്റര് <peter.ani@gmail.com>, 2008.
+# Maxin B. John <maxinbjohn@gmail.com>, 2007.
+# Manu S Madhav | മനു എസ് മാധവ് <manusmad@gmail.com>, 2008.
+# Praveen Arimbrathodiyil <pravi.a@gmail.com>, 2007, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2019-12-12 21:03+0000\n"
+"Last-Translator: Vivek KJ Pazhedath <vivekkj2004@gmail.com>\n"
+"Language-Team: SMC <smc.org.in>\n"
+"Language: ml\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"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "പ്രവീണ് അരിമ്പ്രത്തൊടിയില്, അനി പീറ്റര്, മാക്സിന് ജോണ്, അനൂപ് പനവളപ്പില്, മനു എസ് മാധവ്"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "shijualexonline@gmail.com,snalledam@dataone.in,vivekkj2004@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "പ്രയോഗത്തിനുള്ള അക്ഷരസഞ്ചയം നിര്വ്വചിക്കുന്നു "
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ഇന്പുട്ട്"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ഒന്നുമല്ല"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "പറഞ്ഞുവച്ച കുറുക്കുവഴി"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 കീ വിന്ഡോസില് പറഞ്ഞുവച്ചിട്ടുള്ളതായതിനാല് ആഗോള കുറുക്കുവഴിയായി ഉപയോഗിയ്ക്കാന് സാധ്യമല്ല.\n"
+"ദയവായി മറ്റൊരെണ്ണം തെരഞ്ഞെടുക്കൂ."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "നിലവാരത്തിലുള്ള പ്രയോഗ കുറുക്കുവഴിയുമായി പ്രശ്നം"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "വീണ്ടും ഏല്പ്പിക്കുക"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "തെറ്റായ വസ്തു."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to marathi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Sandeep Shedmake <sandeep.shedmake@gmail.com>, 2008, 2009.
+# Chetan Khona <chetan@kompkin.com>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-03-29 16:14+0530\n"
+"Last-Translator: Chetan Khona <chetan@kompkin.com>\n"
+"Language-Team: Marathi <kde-i18n-doc@kde.org>\n"
+"Language: mr\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: Lokalize 1.5\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"संदिप शेडमाके, \n"
+"चेतन खोना"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"sandeep.shedmake@gmail.com, \n"
+"chetan@kompkin.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "अनुप्रयोग फॉन्टचे वर्णन करतो"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "माहिती"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "काहीच नाही"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "आरक्षित शॉर्टकट"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "प्रमाणित अनुप्रयोग शॉर्टकट सह मतभेद"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "पुन्हा नेमणे"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "अवैध वस्तु."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# kdelibs4 Bahasa Melayu (Malay) (ms)
+# Hasbullah bin Pit <sebol@ikhlas.com>, 2003.
+# Muhammad Najmi Ahmad Zabidi <md_najmi@yahoo.com>, 2003.
+# Mohd Nasir bin Che Embee <chadtce@linuxmail.org>, 2003.
+# Muhammad Najmi bin Ahmad Zabidi <najmi.zabidi@gmail.com>, 2006.
+# Sharuzzaman Ahmat Raslan <sharuzzaman@myrealbox.com>, 2006, 2007, 2008, 2009, 2010.
+# Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>, 2010, 2011.
+# Copyright (C) 2008, 2009 K Desktop Environment
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2011-07-16 00:57+0800\n"
+"Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>\n"
+"Language-Team: Malay <kedidiemas@yahoogroups.com>\n"
+"Language: ms\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Sharuzzaman Ahmat Raslan"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sharuzzaman@myrealbox.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "mentakrifkan font aplikasi"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Masukan"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Tiada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klik pada butang, kemudian masukkan pintasan yang anda mahukan dalam "
+"program.\n"
+"Contoh untuk Ctrl+a: pegang kekunci Ctrl dan tekan a."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Pintasan Dikhaskan"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Kekunci F12 adalah dikhaskan pada Windows, jadi tidak boleh digunakan untuk "
+"pintasan global.\n"
+"Sila pilih yang lain."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflik dengan Piawaian Kekunci Pintas Aplikasi"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinasi kekunci '%1' juga telah digunakan untuk tindakan standard \"%2\" "
+"yang digunakan oleh kebanyakan aplikasi.\n"
+"Adakah anda betul-betul hendak menggunakannya sebagai pintasan global juga?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Ulangtugas"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Tidak sah."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5 to Norwegian Bokmål
+#
+# Knut Yrvin <knut.yrvin@gmail.com>, 2002, 2003, 2004, 2005.
+# Bjørn Steensrud <bjornst@skogkatt.homelinux.org>, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015.
+# Eskild Hustvedt <zerodogg@skolelinux.no>, 2004, 2005.
+# Gaute Hvoslef Kvalnes <gaute@verdsveven.com>, 2004, 2005.
+# Axel Bojer <fri_programvare@bojer.no>, 2005, 2006.
+# Nils Kristian Tomren <slx@nilsk.net>, 2005, 2007.
+# Øyvind A. Holm <sunny@sunbase.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2015-04-28 08:55+0200\n"
+"Last-Translator: Bjørn Steensrud <bjornst@skogkatt.homelinux.org>\n"
+"Language-Team: Norwegian Bokmål <l10n-no@lister.huftis.org>\n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Bjørn Steensrud"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "bjornst@skogkatt.homelinux.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML programskall"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Det entydige navnet på programmet (obligatorisk)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Inndata"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ingen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Trykk på knappen, og tast inn snarveien slik du ville gjort det i "
+"programmet.\n"
+"Eksempel for CTRL+A: Hold CTRL-tasten og trykk A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reservert snarvei"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12-tasten er reservert under Windows, så den kan ikke brukes som global "
+"snarvei.\n"
+"Velg en annen tast."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt med en standard programsnarvei"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Tastekombinasjonen «%1» er allerede i bruk for standardhandlinga «%2» som "
+"mange programmer bruker.\n"
+"Er du sikker på at du vil bruke den som en global snarvei også?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Tilordne på nytt"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdelibs4.po to Low Saxon
+# Heiko Evermann <heiko@evermann.de>, 2004.
+# Heiko Evermann <heiko.evermann@gmx.de>, 2004, 2005.
+# Volker Jockheck <volkae@gmx.net>, 2004.
+# Sönke Dibbern <s_dibbern@web.de>, 2004, 2005, 2006, 2007, 2008, 2009, 2014.
+# Manfred Wiese <m.j.wiese@web.de>, 2008, 2009, 2010, 2011, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2014-05-11 00:55+0200\n"
+"Last-Translator: Sönke Dibbern <s_dibbern@web.de>\n"
+"Language-Team: Low Saxon <kde-i18n-nds@kde.org>\n"
+"Language: nds\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Sönke Dibbern, Manfred Wiese"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "s_dibbern@web.de, m.j.wiese@web.de"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "stellt de Schriftoort för't Programm in"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ingaav"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Keen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klick op den Knoop un giff denn de Tastkombinatschoon so in, as Du dat ok "
+"in't Programm deest.\n"
+"Bispill för Strg+A: Holl de Strg-Tast daal un drück denn de A-Tast."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reserveert Tastkombinatschoon"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"De F12-Tast is op Windows reserveert un lett sik nich as globaal "
+"Tastkombinatschoon bruken.\n"
+"Söök bitte en anner ut."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Problem mit'n Standard-Programmkombinatschoon"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"De Kombinatschoon „%1“ höört al de Standardakschoon „%2“ to, de en Reeg "
+"Programmen bruukt.\n"
+"Wullt Du ehr redig as en globaal Tastkombinatschoon bruken?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Nieg toornen"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Leeg Indrag"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Nepali
+# Mahesh Subedi <submanesh@gmail.com>, 2006, 2007.
+# Shiva Prasad Pokharel <pokharelshiva@hotmail.com>, 2006, 2007.
+# shyam krishna ball <shyam@mpp.org.np>, 2006.
+# shyam krishna bal <shyamkrishna_bal@yahoo.com>, 2006, 2007.
+# Shiva Pokharel <shiva@mpp.org.np>, 2007.
+# Nabin Gautam <nabin@mpp.org.np>, 2007.
+# Shiva Prasad Pokharel <pokharelshiv@gmail.com>, 2007.
+# Shyam Krishna Bal <shyamkrishna_bal@yahoo.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2007-11-05 15:41+0545\n"
+"Last-Translator: Shyam Krishna Bal <shyamkrishna_bal@yahoo.com>\n"
+"Language-Team: Nepali <info@mpp.org.np>\n"
+"Language: ne\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: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Mahesh Subedi, श्यामकृष्ण बल, Nabin Gautam"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "submanesh@gmail.com, shyamkrishna_bal@yahoo.com, Nabin@mpp.org.np"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "अनुप्रयोग फन्ट परिभाषित गर्दछ"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "आगत"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "कुनै पनि होइन"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "सर्टकट"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "मानक अनुप्रयोग सर्टकटसँग द्वन्द्व"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+#| msgid ""
+#| "The '%1' key combination has already been allocated to the standard "
+#| "action \"%2\" that many applications use.\n"
+#| "You cannot use it for global shortcuts for this reason."
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' कुञ्जी संयोजन \"%2\" मानक कार्यमा पहिल्यै बाँडफाँट गरिएको छ ।\n"
+"तपाईँ हालको कार्यबाट यसलाई फेरि मानाङ्कन गर्न चाहनुहुन्छ ?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "फेरि मानाङ्कन गर्नुहोस्"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid Filenames"
+msgid "Invalid KPackage '%1'"
+msgstr "अवैध फाइल नाम"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Dutch
+# Copyright (C) 2000,2001,2002,2003, 2004 KDE e.v..
+# KTranslator Generated File
+# Nederlandse vertaling van kdelibs.
+# KDE-vertaalgroep Nederlands <i18n@kde.nl>, 2000, 2001, 2002.
+# Rinse de Vries <rinsedevries@kde.nl>,2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009.
+# Wilbert Berendsen <wbsoft@xs4all.nl>, 2003, 2004.
+# Bram Schoenmakers <bramschoenmakers@kde.nl>, 2004, 2005, 2006, 2007.
+# Tom Albers <tomalbers@kde.nl>, 2004.
+# Sander Koning <sanderkoning@kde.nl>, 2005.
+# Tijmen Baarda <tijmenbaarda@kde.nl>, 2005.
+# Freek de Kruijf <freekdekruijf@kde.nl>, 2008, 2009.
+# Kristof Bal <kristof.bal@gmail.com>, 2008, 2009.
+# Freek de Kruijf <freekdekruijf@kde.nl>, 2009, 2010.
+# Freek de Kruijf <freekdekruijf@kde.nl>, 2010, 2011, 2012.
+# Freek de Kruijf <freekdekruijf@kde.nl>, 2010, 2011, 2013, 2014, 2015, 2019, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 15:10+0200\n"
+"Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
+"Language-Team: Dutch <kde-i18n-nl@kde.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Files: kfarch.cpp kfdird.cpp kfind.cpp kfindtop.cpp kfoptions.cpp kfsave.cpp "
+"kftabdlg.cpp kftypes.cpp kfwin.cpp main.cpp mkfdird.cpp mkfind.cpp\n"
+"X-Generator: Lokalize 21.04.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Rinse de Vries - 2000 t/m 2008,Wilbert Berendsen - 2003; 2004,Bram "
+"Schoenmakers - 2004 t/m 2007,Tom Albers - 2004,Tijmen Baarda - 2005,Sander "
+"Koning - 2005, Freek de Kruijf - 2009 t/m 2021"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"rinsedevries@kde.nl,wbsoft@xs4all.nl,bramschoenmakers@kde.nl,tomalbers@kde."
+"nl,tijmenbaarda@kde.nl,,freekdekruijf@kde.nl"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML toepassingsshell"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "De unieke naam van de toepassingen"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Contextuele hulp tonen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Invoer"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Geen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klik op de knop, voer dan de sneltoets in zoals u zou doen in het "
+"programma.\n"
+"Voorbeeld voor Ctrl+A: houdt de Ctrl-toets in en druk op A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Gereserveerde snelkoppeling"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"De F12-toets is gereserveerd in Windows, en kan dus niet gebruikt worden "
+"voor een globale sneltoets.\n"
+"Graag een andere kiezen."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflict met standaard-sneltoets"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"De toetscombinatie '%1' is reeds toegewezen aan de standaardactie \"%2\". "
+"Deze actie wordt door enkele programma's gebruikt.\n"
+"Wilt u de combinatie ook gebruiken als globale toetsencombinatie?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Opnieuw toewijzen"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ongeldige KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Geen QML-bestand aangeleverd"
--- /dev/null
+# Translation of kdeclarative5 to Norwegian Nynorsk
+#
+# Gaute Hvoslef Kvalnes <gaute@verdsveven.com>, 2003, 2004, 2005, 2006.
+# Håvard Korsvoll <korsvoll@skulelinux.no>, 2003, 2005.
+# Karl Ove Hufthammer <karl@huftis.org>, 2004, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2019, 2020.
+# Eirik U. Birkeland <eirbir@gmail.com>, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-02-16 14:31+0100\n"
+"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
+"Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n"
+"Language: nn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 19.12.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Karl Ove Hufthammer"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "karl@huftis.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Skal for KPackage-QML-program"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Eintydig namn på programmet (obligatorisk)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Inndata"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ingen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Trykk på knappen, og skriv så inn snarvegen du ønskjer å bruka.\n"
+"For eksempel for «Ctrl + A»: Hald inne «Ctrl»-tasten og trykk «A»."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reservert snarveg"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"«F12»-tasten er reservert på Windows, og kan derfor ikkje brukast som ein "
+"global snarveg.\n"
+"Vel ein annan snarvegtast."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt med standardprogramsnarveg"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Tastekombinasjonen «%1» er alt i bruk for standardhandlinga «%2», som nokre "
+"program brukar.\n"
+"Er du sikker på at du likevel vil bruka han som ein global snarveg?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Tilordna på nytt"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ugyldig KPackage «%1»"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Manglar QML-fil"
--- /dev/null
+# translation of kdelibs4.po to Occitan
+# Copyright (C) 2008 This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Yannig Marchegay (Kokoyaya) <yannig@marchegay.org>, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2008-08-06 00:07+0200\n"
+"Last-Translator: \n"
+"Language-Team: Occitan <oc@li.org>\n"
+"Language: oc\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: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Yannig Marchegay (Kokoyaya)"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "yannig@marchegay.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr ""
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Pas cap"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Acorchi"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflicte amb un acorchi clavièr d'aplicacion estandarda"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reatribuir"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid URL"
+msgid "Invalid KPackage '%1'"
+msgstr "URL invalida"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Oriya
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Manoj Kumar Giri <giri.manojkr@gmail.com>, 2008.
+# Manoj Kumar Giri <mgiri@redhat.com>, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-01-02 17:37+0530\n"
+"Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
+"Language-Team: Oriya <oriya-it@googlegroups.com>\n"
+"Language: or\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"
+"\n"
+"\n"
+"\n"
+"\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ମନୋଜ କୁମାର ଗିରି"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "mgiri@redhat.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "ପ୍ରୟୋଗ ଅକ୍ଷରରୂପକୁ ବ୍ୟାଖ୍ୟା କରିଥାଏ"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ନିବେଶ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "କେହିନୁହଁ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "New Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "ନୂତନ ୱେବ ସଂକ୍ଷିପ୍ତ ପଥ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "ମାନକ ପ୍ରୟୋଗ ସଂକ୍ଷିପ୍ତ ପଥ ସହିତ ଦ୍ୱନ୍ଦ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "ପୁନଃ ନିରୂପଣ କରିବା"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "ଅବୈଧ ଚିହ୍ନକଗୁଡିକ"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Punjabi
+# Punjabi translation of kdelibs.
+# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+#
+# Amanpreet Singh Alam <amanlinux@netscape.net>, 2004.
+# Amanpreet Singh Alam <amanlinux@netscpe.net>, 2004.
+# A S Alam <aalam@users.sf.net>, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012.
+# ASB <aalam@users.sf.net>, 2007.
+# Amanpreet Singh Alam <apreet.alam@gmail.com>, 2008.
+# Amanpreet Singh <aalam@users.sf.net>, 2008.
+# Amanpreet Singh Alam <aalam@users.sf.net>, 2008, 2009, 2013, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2014-03-16 23:21-0500\n"
+"Last-Translator: A S Alam <aalam@users.sf.net>\n"
+"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
+"Language: pa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"ਅ.ਸ.ਆਲਮ. ੨੦੦੪-੨੦੧੪\n"
+"http://code.google.com/p/gurmukhi/"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "aalam@users.sf.net"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "ਐਪਲੀਕੇਸ਼ਨ ਫੋਂਟ ਪਰਭਾਸ਼ਿਤ ਕਰੋ"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ਇੰਪੁੱਟ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ਕੋਈ ਨਹੀਂ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "ਰਾਖਵਾਂ ਸ਼ਾਰਟਕੱਟ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 ਨੂੰ ਵਿੰਡੋਜ਼ ਲਈ ਰਾਖਵਾਂ ਰੱਖਿਆ ਗਿਆ ਹੈ, ਇਸਕਰਕੇ ਇਸਨੂੰ ਗਲੋਬਲ ਸ਼ਾਰਟਕੱਟ ਵਜੋਂ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ।\n"
+"ਹੋਰ ਚੁਣੋ ਜੀ।"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "ਸਟੈਂਡਰਡ ਐਪਲੀਕੇਸ਼ਨ ਸ਼ਾਰਟਕੱਟਾਂ ਨਾਲ ਟਕਰਾਅ ਹੋ ਰਿਹਾ ਹੈ।"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"ਸਵਿੱਚ ਕੰਬੀਨੇਸ਼ਨ '%1' ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਸਟੈਂਡਰਡ ਐਕਸ਼ਨ \"%2\" ਲਈ ਜਾਰੀ ਕੀਤਾ ਜਾ ਚੁੱਕਾ ਹੈ, ਜੋ ਕਿ "
+"ਕੁਝ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵਰਤਦੀਆਂ ਹਨ।\n"
+"ਕੀ ਤੁਸੀਂ ਇਸ ਨੂੰ ਗਲੋਬਲ ਸ਼ਾਰਟਕੱਟ ਲਈ ਇਹ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "ਮੁੜ-ਜਾਰੀ"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "ਗਲਤ ਆਈਟਮ।"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Polish
+# translation of kdelibs4.po to
+# Version: $Revision: 685926 $
+# Ostatnie poprawki przed 2.0 Jacek Stolarczyk <jstolarz@kde.org>
+# Jacek Stolarczyk <jstolarz@kde.org>, 2001.
+# Piotr Roszatycki <dexter@debian.org>, 1997-2000.
+# Artur Górniak <artur_gorniak@software.pl>, 2000.
+# Michał Rudolf <mrudolf@kdewebdev.org>, 2002.
+# Michal Rudolf <mrudolf@kdewebdev.org>, 2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+# Krzysztof Lichota <lichota@mimuw.edu.pl>, 2005, 2006.
+# Marta Rybczyńska <kde-i18n@rybczynska.net>, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
+# Michal Rudolf <michal@rudolf.waw.pl>, 2010.
+# Artur Chłond <eugenewolfe@o2.pl>, 2010.
+# Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>, 2011, 2012, 2013, 2014, 2015, 2016, 2019, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-07 20:48+0200\n"
+"Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>\n"
+"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+">\n"
+"X-Generator: Lokalize 20.12.1\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Michał Rudolf, Artur Chłond, Łukasz Wojniłowicz"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "mrudolf@kdewebdev.org, eugenewolfe@o2.pl, lukasz.wojnilowicz@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Powłoka aplikacji QML KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Niepowtarzalna nazwa aplikacji (obowiązkowo)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Pokaż pomoc podręczną"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Nowy skrót"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Brak"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Naciśnij przycisk, a potem wciśnij kombinację, której chcesz użyć w "
+"programie.\n"
+"Na przykład, żeby użyć skrótu Ctrl+A, przytrzymaj klawisz Ctrl i wciśnij A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Skrót zarezerwowany"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Skrót F12 jest zarezerwowany w Windows, więc nie można go użyć jako skrótu "
+"globalnego.\n"
+"Wybierz inny."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt ze standardowym skrótem programu"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinacja klawiszy '%1' została przypisana standardowemu działaniu \"%2\" "
+"używanemu przez wiele programów.\n"
+"Użyć jej także jako skrótu globalnego?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Przypisz ponownie"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Nieprawidłowy KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Nie podano pliku QML"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the Kde package.
+# Zabeeh Khan <zabeehkhan@gmail.com>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2008-08-16 16:01-0800\n"
+"Last-Translator: Zabeeh Khan <zabeehkhan@gmail.com>\n"
+"Language-Team: Pashto <pathanisation@googlegroups.com>\n"
+"Language: ps\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-Poedit-Language: Pashto, Pushto\n"
+"X-Poedit-Country: AFGHANISTAN\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ستاسو نومونه"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "zabeehkhan@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "د کاريال ليکبڼه ټاکي"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ننوتۍ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "هېڅ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "لنډلار"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "د کره کاريال لنډلارې سره ټکر"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "بياټاکل"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid Filenames"
+msgid "Invalid KPackage '%1'"
+msgstr "ناسم دوتنه نومونه"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-08 18:12+0100\n"
+"Last-Translator: José Nuno Pires <zepires@gmail.com>\n"
+"Language-Team: pt <kde-i18n-pt@kde.org>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POFile-IgnoreConsistency: &Discard\n"
+"X-POFile-IgnoreConsistency: Enter\n"
+"X-POFile-IgnoreConsistency: Author\n"
+"X-POFile-IgnoreConsistency: Open &File\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-POFile-Allow: 2\n"
+"X-POFile-IgnoreConsistency: Far\n"
+"X-POFile-SpellExtra: Hspell Koenig KHTML Thaana Telugu KScript Sycoca\n"
+"X-POFile-SpellExtra: artsmessage KDEInit SOCKS kcmkresources\n"
+"X-POFile-SpellExtra: ChavePrivadaFalhou KIOTest Han Thaani Jumaada Hangul\n"
+"X-POFile-SpellExtra: Cherokee Meh KSpell chaveSessao TestWritevCard\n"
+"X-POFile-SpellExtra: Thulatha Javascript Tagbanwa End Tagalog LTR Oriya\n"
+"X-POFile-IgnoreConsistency: H:\n"
+"X-POFile-IgnoreConsistency: Untrusted\n"
+"X-POFile-IgnoreConsistency: Export\n"
+"X-POFile-SpellExtra: Hiragana Backspace Print PgUp Ins\n"
+"X-POFile-SpellExtra: ModificadoresEspaço Yi Lao Return gpg Caps Lock kab\n"
+"X-POFile-SpellExtra: aRts tags Buhid Insert Gurmukhi Malayalam Scroll\n"
+"X-POFile-SpellExtra: Delete Ogham PgDn Kannada Tab Home Katakana SysReq\n"
+"X-POFile-SpellExtra: KConvertTest Khmer OutraOpção Bopomofo\n"
+"X-POFile-SpellExtra: MarcasCombinatórias Enter UmaOpção Devanagari\n"
+"X-POFile-SpellExtra: Hanunoo Sinhala JanelaAutoExemplo Lars Ian help\n"
+"X-POFile-IgnoreConsistency: Try Different\n"
+"X-POFile-IgnoreConsistency: Delete\n"
+"X-POFile-IgnoreConsistency: Comment\n"
+"X-POFile-IgnoreConsistency: &Restore\n"
+"X-POFile-IgnoreConsistency: Reset\n"
+"X-POFile-IgnoreConsistency: 0.1\n"
+"X-POFile-IgnoreConsistency: Forward\n"
+"X-POFile-SpellExtra: Kanbun CTRL Klash Syloti JS Jan TETest QObject\n"
+"X-POFile-SpellExtra: Sebastian Geiser Far kdeinit Weis Mordad Yau Hausmann\n"
+"X-POFile-SpellExtra: execprefix autostart Dirk Nov Elul shanbe Farvardin\n"
+"X-POFile-SpellExtra: KApplication bin tagcloudtest displayname IFrame yo\n"
+"X-POFile-SpellExtra: Aza Adar Sáb dah XIM Sha Sonnet testregression Jamo\n"
+"X-POFile-SpellExtra: Shawwal Bah KConf IPA Hijri Sab Testkhtml Jeroen\n"
+"X-POFile-SpellExtra: QWidget dumps KJSEmbed Arb qttest stderr Kho ban Kha\n"
+"X-POFile-SpellExtra: PathLengthExceeded Tai shn Ago KrossTest Ithnain\n"
+"X-POFile-SpellExtra: klauncher tempfile Aban frame ThreadWeaver Kun yeyo\n"
+"X-POFile-SpellExtra: Buginese Lue Kislev Khamees home Jumma XDG Khordad\n"
+"X-POFile-SpellExtra: Zemberek KAboutData Wijnhout Sivan Saami Method Qua\n"
+"X-POFile-SpellExtra: Molkentin PTY Koivisto onthespot Ord Shvat Jom\n"
+"X-POFile-SpellExtra: KMultiPart Ahad CJK Aspell Tifinagh NoCARoot Tishrey\n"
+"X-POFile-SpellExtra: Up KDXSView ModRunner subtexto aifamily Panj path\n"
+"X-POFile-SpellExtra: NumLock keramik GHNS TestRegressionGui Yek Iyar Ahd\n"
+"X-POFile-SpellExtra: khtmltests Torben QApplication overthespot caption\n"
+"X-POFile-SpellExtra: khtml desktop Ispell QWS create Faure Object Limbu\n"
+"X-POFile-SpellExtra: KLauncher Sauer Hijjah Myanmar NEC BCC Fev Kelly\n"
+"X-POFile-SpellExtra: Jumee Stephan TestRegression Knoll frames HOME Jum\n"
+"X-POFile-SpellExtra: DISPLAY KNewStuff Awal Rajab pt plastik InvalidHost\n"
+"X-POFile-SpellExtra: kdemain STDOUT Jun Jul Kulow Yaum pa Chahar widgets\n"
+"X-POFile-SpellExtra: man KUnitTest pm KDEPIM TAB Waldo CL CC Balinês\n"
+"X-POFile-SpellExtra: Nagri Kangxi QLayout qtplugininstance regression\n"
+"X-POFile-SpellExtra: multipart Jalali Phags Set servname nograb\n"
+"X-POFile-SpellExtra: International Frame CGIs Stylesheet Library Sex Seg\n"
+"X-POFile-SpellExtra: KDontChangeTheHostName SO toner Yijing Peter Out\n"
+"X-POFile-SpellExtra: InvalidCA Le Khmeres Tevet Ordibehesht Anton am al\n"
+"X-POFile-SpellExtra: Tir Tuebingen Esf Abr ini KLocale KiB WMNET Dingbats\n"
+"X-POFile-SpellExtra: InvalidPurpose kdehelp id Glagolitic factory Esfand\n"
+"X-POFile-SpellExtra: Nisan kjs ErrorReadingRoot MiB Copta Shanbe Xvfb\n"
+"X-POFile-SpellExtra: client Mai Bastian document config TiB Jones AC\n"
+"X-POFile-SpellExtra: KBuildSycoca Bahman offthespot Mueller Tang ye Thu\n"
+"X-POFile-SpellExtra: Sabt NKo aisocktype mixed Carriage Thl aiflags\n"
+"X-POFile-SpellExtra: Muharram Reinhart Kontact Cantonês Page icon\n"
+"X-POFile-SpellExtra: makekdewidgets ManyColor Heshvan Kross Ith bind Antti\n"
+"X-POFile-SpellExtra: DXS Tamuz Shahrivar sessionId sh KJSCmd Av KLibLoader\n"
+"X-POFile-SpellExtra: Mehr GiB Arbi dograb AssinaturaFalhou prefix\n"
+"X-POFile-SpellExtra: Hexagramas ize AutoAssinado NãoConfiável Qi Down\n"
+"X-POFile-SpellExtra: directory Índicas ise Oxygen info shared share usr\n"
+"X-POFile-IgnoreConsistency: Separate Folders\n"
+"X-POFile-SpellExtra: XDGDATADIRS KTTS Control PrtScr Hyper Sys Win Screen\n"
+"X-POFile-SpellExtra: Req Break AltGr ReadOnly SHM EOF Re abc ABC QPL Kate\n"
+"X-POFile-SpellExtra: Serif Sans KFormula URIs raster opengl favicons Solid\n"
+"X-POFile-SpellExtra: Harald Fernengel KTTSD baseline Resource writeall\n"
+"X-POFile-SpellExtra: Trüg YiB PiB YB ZB EB PB EiB ZiB GB TB KIdleTest\n"
+"X-POFile-SpellExtra: Freddi KIdleTime Cha Āshwin Budhavãra Suk Paush\n"
+"X-POFile-SpellExtra: Shrāvana Somavãra Phālgun Raviãra Phā Māg\n"
+"X-POFile-SpellExtra: Bhādrapad Chaitra Māgh Sukravãra Āshādha\n"
+"X-POFile-SpellExtra: Agrahayana Bud Shr Guruvãra Mañ Gur Vaishākh Jya\n"
+"X-POFile-SpellExtra: Kārtik Agr Jyaishtha Kār Āsh Bhā Rav milisegundo\n"
+"X-POFile-SpellExtra: Āsw Mañgalvã Sanivãra Mayek Ol Saurashtra\n"
+"X-POFile-SpellExtra: Sundanês Viet Lisu Kayah Chiki Lepcha Meetei Cham\n"
+"X-POFile-SpellExtra: Rejang Tham Bamum Pshoment Pas Ptiou Neh Genbot Hamus\n"
+"X-POFile-SpellExtra: Pag Paope Pesnau Pes Hed Magabit Ehu Tahsas Yak Mag\n"
+"X-POFile-SpellExtra: Tob Pef Kou Pam Pao Tequemt Paremhotep Psh nabot\n"
+"X-POFile-SpellExtra: Hathor Pso Kiahk Hat Meo Psa Sene Psabbaton Miy\n"
+"X-POFile-SpellExtra: Pashons Mes LarguraxAltura Kia Qedame Ham Gen Hedar\n"
+"X-POFile-SpellExtra: Parmoute Teq Mesore Nehase Kouji Yakatit Maksegno\n"
+"X-POFile-SpellExtra: Paone Sen Meshir Pagumen Thoout Hamle Epe Mak\n"
+"X-POFile-SpellExtra: Tkyriakē Ehud Tho Qed Pti Psoou Segno Tah Rob\n"
+"X-POFile-SpellExtra: Miyazya Meskerem Tobe Peftoou Epep Tky pastabase Fã\n"
+"X-POFile-SpellExtra: KVTML USD Colaborativos Hunspell Jovie AM PM mails\n"
+"X-POFile-SpellExtra: mbuttonGroup Blog blog np cp nc UTC Mandaico Batak\n"
+"X-POFile-SpellExtra: DQTDECLARATIVEDEBUG QML slot pedro mantê Pocinhas\n"
+"X-POFile-SpellExtra: Reconstrói ii Del iii querê KPackage\n"
+"X-POFile-IgnoreConsistency: Update\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "José Nuno Pires"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "zepires@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Consola de aplicações QML do KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "O nome único da aplicação (obrigatório)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Mostrar a Ajuda de Contexto"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nenhum"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Carregue no botão, depois introduza a combinação de teclas que deseja no "
+"programa.\n"
+"Exemplo para o Ctrl+A: mantenha carregada a tecla Ctrl e depois carregue em "
+"A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Atalho Reservado"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"A tecla F12 está reservada no Windows e não pode ser usada como atalho "
+"global.\n"
+"Por favor, escolha outra qualquer."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflito com o Atalho-Padrão da Aplicação"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"A combinação de teclas '%1' já foi atribuída à acção global \"%2\", que é "
+"usada por algumas aplicações.\n"
+"Deseja mesmo usá-la também como um atalho global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Atribuir de Novo"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage Inválido '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Não foi indicado nenhum ficheiro QML"
--- /dev/null
+# Translation of kdeclarative5.po to Brazilian Portuguese
+# Copyright (C) 2002-2020 This file is copyright:
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Lisiane Sztoltz <lisiane@conectiva.com.br>, 2002, 2003, 2004.
+# Lisiane Sztoltz Teixeira <lisiane@kdemail.net>, 2003, 2004, 2005.
+# Henrique Pinto <stampede@coltec.ufmg.br>, 2003.
+# Marcus Gama <marcus.gama@gmail.com>, 2006.
+# Diniz Bortolotto <diniz.bortolotto@gmail.com>, 2007, 2008.
+# André Marcelo Alvarenga <alvarenga@kde.org>, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020.
+# Luiz Fernando Ranghetti <elchevive@opensuse.org>, 2008, 2009, 2010, 2012, 2019, 2021.
+# Fernando Boaglio <boaglio@kde.org>, 2009.
+# Doutor Zero <doutor.zero@gmail.com>, 2007, 2009.
+# Marcus Vinícius de Andrade Gama <marcus.gama@gmail.com>, 2010, 2012.
+# Aracele Torres <araceletorres@gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-06 14:08-0300\n"
+"Last-Translator: Luiz Fernando Ranghetti <elchevive@opensuse.org>\n"
+"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
+"Language: pt_BR\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: Lokalize 20.04.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "André Marcelo Alvarenga"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "alvarenga@kde.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Console de aplicativos QML do KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "O único nome do aplicativo (obrigatório)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Mostrar ajuda contextual"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Entrada"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nenhum"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Clique no botão e depois informe o atalho como faria no programa.\n"
+"Exemplo para o Ctrl+A: Mantenha pressionada a tecla Ctrl e pressione a tecla "
+"A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Atalho reservado"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"A tecla F12 está reservada no Windows e, por isso, não pode ser usada como "
+"atalho global.\n"
+"Escolha outra tecla."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflito com o atalho padrão do aplicativo"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"A combinação de teclas '%1' está atribuída para a ação padrão \"%2\", usada "
+"por alguns aplicativos.\n"
+"Deseja realmente usá-la como um atalho global?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reatribuir"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage inválido '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Nenhum arquivo QML indicado"
--- /dev/null
+# Traducerea kdelibs4.po în Română
+# Laurenţiu Buzdugan <lbuz@rolix.org>, 2008, 2009.
+# Sergiu Bivol <sergiu@cip.md>, 2008, 2009, 2010.
+# Sergiu Bivol <sergiu@cip.md>, 2010, 2012, 2013, 2014, 2020, 2021.
+# Cristian Oneț <onet.cristian@gmail.com>, 2010, 2011, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-03 15:50+0100\n"
+"Last-Translator: Sergiu Bivol <sergiu@cip.md>\n"
+"Language-Team: Romanian\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+"X-Generator: Lokalize 19.12.3\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Claudiu Costin,Sergiu Bivol,Laurențiu Buzdugan,Cristian Oneț"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ",sergiu@cip.md,lbuz@rolix.org,onet.cristian@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Înveliș pentru aplicații QML KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Denumirea unică a aplicației (obligatoriu)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Arată ajutor contextual"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Introduceți"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Niciuna"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Apăsați butonul, apoi introduceți scurtătura la fel cum ați face în "
+"aplicație.\n"
+"Exemplu pentru Ctrl+A: tineți tasta Ctrl și apăsați A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Scurtătură rezervată"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tasta F12 este rezervată în Windows și nu poate fi utilizată ca accelerator "
+"global.\n"
+"Alegeți alta."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Conflict cu un accelerator standard de aplicație"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Combinația de taste „%1” a fost deja alocată pentru acțiunea globală „%2” pe "
+"care o folosesc unele aplicații.\n"
+"Sigur doriți să o utilizați și pe aceasta ca globală?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Reatribuie"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage nevalid „%1”"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Niciun fișier QML furnizat"
--- /dev/null
+# KDE - kdelibs/kdelibs4.po Russian translation.
+# Copyright (C) 2005, KDE Russian translation team.
+#
+# Denis Perchine <dyp@perchine.com>, 2000.
+# Gregory Mokhin <mok@kde.ru>, 2000, 2004, 2005.
+# Albert R. Valiev <darkstar@altlinux.ru>, 2002, 2008.
+# Leonid Kanter <leon@asplinux.ru>, 2002-2004, 2005, 2008.
+# Andrey Cherepanov <skull@kde.ru>, 2005-2007, 2008, 2009, 2011.
+# Nick Shaforostoff <shaforostoff@kde.ru>, 2004, 2006, 2007, 2008, 2009.
+# Nick Shaforostoff <shafff@ukr.net>, 2009.
+# Alexander Potashev <aspotashev@gmail.com>, 2009, 2010, 2011, 2014, 2015, 2019.
+# Yury G. Kudryashov <urkud.urkud@gmail.com>, 2011.
+# Yuri Efremov <yur.arh@gmail.com>, 2012.
+# Inga Barinova <ingabarinova@gmail.com>, 2012.
+# Julia Dronova <juliette.tux@gmail.com>, 2012.
+# Alexander Lakhin <exclusion@gmail.com>, 2013.
+# Alexander Yavorsky <kekcuha@gmail.com>, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-06-08 16:55+0300\n"
+"Last-Translator: Alexander Yavorsky <kekcuha@gmail.com>\n"
+"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 21.04.1\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Григорий Мохин,Николай Шафоростов,Андрей Черепанов,Леонид Кантер,Альберт "
+"Валиев"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"mok@kde.ru,shaforostoff@kde.ru,skull@kde.ru,leon@asplinux.ru,"
+"darkstar@altlinux.ru"
+
+# BUGME: can we translate KPackage somehow? --aspotashev
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Оболочка для запуска приложений на KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Уникальное имя приложения (обязательно)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Показать контекстную справку"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Сейчас"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Не определена"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Нажмите на кнопке и введите комбинацию клавиш.\n"
+"Например, для комбинации клавиш Ctrl+A зажмите клавишу Ctrl и нажмите A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Зарезервированная комбинация клавиш"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"В Windows клавиша F12 зарезервирована, поэтому её нельзя использовать в "
+"глобальных комбинациях клавиш.\n"
+"Выберите другую комбинацию клавиш."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Конфликт со стандартной клавишей приложения"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Комбинация клавиш %1 уже связана со стандартным действием «%2», используемым "
+"во многих программах.\n"
+"Вы действительно хотите использовать эту комбинацию как глобальную?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Связать с новым"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Неверный пакет KPackage «%1»"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Отсутствует файл QML"
--- /dev/null
+# Translation of kdeclarative5 to Northern Sami
+#
+# Børre Gaup <boerre@skolelinux.no>, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-05-30 23:19+0200\n"
+"Last-Translator: Børre Gaup <boerre@skolelinux.no>\n"
+"Language-Team: Northern Sami <l10n-no@lister.huftis.org>\n"
+"Language: se\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr ""
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Mearrit njuolggobálgá"
+
+# unreviewed-context
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ii mihkkige"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Coahkkal boalu, de deaddil njuolggobálgá nugo áiggut geavahit dan "
+"prográmmas.\n"
+"Ovdamearka dihte Ctrl+a: Doala Ctrl-boalu ja deaddil a."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Várrejuvvon njuolggobálggis"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12-boalus lea erenoamáš mearkkašupmi Windowsis, nu ahte dan ii sáhte "
+"geavahit globálalaš njuolggobálggisin.\n"
+"Válljes eará njuolggobálgá."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikta standardprográmma njuolggobálgáin"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"«%1» boallokombinašuvdna geavahuvvo juo standárdan «%2»-doibmii . Máŋga "
+"prográmma geavahit dan juo.\n"
+"Háliidatgo duođas geavahit dán globála njuolggobálggisin?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Bija ođđasit"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Danishka Navin <danishka@gmail.com>, 2008, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2011-07-25 07:45+0530\n"
+"Last-Translator: Danishka Navin <danishka@gmail.com>\n"
+"Language-Team: Sinhala <danishka@gmail.com>\n"
+"Language: si\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"
+" \n"
+" \n"
+"X-Generator: Lokalize 1.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ඩනිෂ්ක නවින්"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "danishka@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "යෙදුම් අක්ෂර දක්වන්න කරන්න"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ප්රධානය"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "කිසිවක් නැත"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "වෙන් කළ කෙටි මාර්ගය"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "සම්මත වැඩසටහන් කෙටි මඟ සමඟ ගැටේ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' යතුරු සංයෝජනය සමහර වැඩසටහන් භාවිතා කරන \"%2\" සම්මත ක්රියාව සඳහාද භාවිතා කරයි.\n"
+"ඔබට ඇත්ත වශයෙන්ම එය ලෝකව්යාප්ත කෙටි මඟක් වශයෙනුත් භාවිතා කිරීමට අවශ්යද?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "යළි පැවරීම"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "InvalidCA"
+msgid "Invalid KPackage '%1'"
+msgstr "InvalidCA"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Slovak
+# Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>, 2002.
+# Stanislav Visnovsky <visnovsky@kde.org>, 2003, 2004, 2005.
+# Richard Fric <Richard.Fric@kdemail.net>, 2006, 2007, 2010.
+# Michal Gaspar <miguel@portugal.sk>, 2006.
+# Jakub <vatrtj@gmail.com>, 2009.
+# Michal Sulek <misurel@gmail.com>, 2009, 2010, 2011.
+# Richard Frič <Richard.Fric@kdemail.net>, 2011.
+# Roman Paholík <wizzardsk@gmail.com>, 2012, 2013, 2014, 2015.
+# Matej Mrenica <matejm98mthw@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2019-10-10 20:01+0200\n"
+"Last-Translator: Matej Mrenica <matejm98mthw@gmail.com>\n"
+"Language-Team: Slovak <kde-sk@linux.sk>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 19.08.2\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Stanislav Višňovský,Richard Frič,Michal Gašpar,Jakub Vatrt,Michal Šulek"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"visnovsky@kde.org,Richard.Fric@kdemail.net,miguel@portugal.sk,vatrtj@gmail."
+"com,misurel@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Shell KPackage QML aplikácie"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Jedinečný názov pre aplikáciu (povinné)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Vstup"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Žiadna"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Kliknite na tlačidlo a potom zadajte skratku, ktorú chcete použiť v "
+"programe.\n"
+"Príklad pre Ctrl+A: držte klávesu Ctrl a stlačte A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervovaná skratka"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Klávesa F12 je vo Windows rezervovaná, takže nemôže byť použitá pre globálnu "
+"skratku.\n"
+"Prosím vyberte inú."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt so štandardnou skratkou aplikácie"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Klávesová kombinácia '%1' je už používaná pre štandardnú akciu \"%2\", ktorú "
+"používa viacero aplikácií.\n"
+"Naozaj ju chcete použiť ako globálnu klávesovú skratku?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Znovu priradiť"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid KPackage"
+msgid "Invalid KPackage '%1'"
+msgstr "Neplatný KPackage"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Žiadny QML nebol poskytnutý"
--- /dev/null
+# translation of kdelibs4.po to Slovenian
+# Translation of kdelibs4.po to Slovenian
+# KDELIBS translation to Slovenian language
+# $Id: kdelibs4.po 685926 2007-07-10 04:25:11Z scripty $
+# $Source$
+#
+# Copyright (C) 2002,2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+# Roman Maurer <roman.maurer@amis.net>, 2002.
+# Gregor Rakar <gregor.rakar@kiss.uni-lj.si>, 2002,2003.
+# Gregor Rakar <gregor.rakar@kiss.si>, 2003, 2004, 2005.
+# Andrej Vernekar <andrej.vernekar@moj.net>, 2005, 2007, 2008, 2009, 2010.
+# Jure Repinc <jlp@holodeck1.com>, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
+# Andrej Vernekar <andrej.vernerkar@moj.net>, 2008, 2011, 2012.
+# Andrej Mernik <andrejm@ubuntu.si>, 2012, 2013, 2014, 2015.
+# Matjaž Jeran <matjaz.jeran@amis.net>, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-03 07:20+0200\n"
+"Last-Translator: Matjaž Jeran <matjaz.jeran@amis.net>\n"
+"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Translator: Andrej Mernik <andrejm@ubuntu.si>\n"
+"X-Generator: Lokalize 20.08.1\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Roman Maurer,Gregor Rakar,Andrej Vernekar,Jure Repinc,Andrej Mernik,Matjaž "
+"Jeran"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"roman.maurer@amis.net,gregor.rakar@kiss.si,andrej.vernekar@gmail.com,"
+"jlp@holodeck1.com,andrejm@ubuntu.si,matjaz.jeran@amis.net"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Programska lupina KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Edinstveno ime programa (obvezno)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Prikaži kontekstno pomoč"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Vhod"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Brez"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Kliknite gumb in nato vnesite bližnjico, kot bi jo v programu.\n"
+"Primer za Ctrl+A: držite pritisnjeno tipko Ctrl in pritisnite tipko A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervirana bližnjica"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tipka F12 je rezervirana v Windows, zato ne more biti uporabljena za splošno "
+"bližnjico.\n"
+"Izberite drugo."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Spor z običajnimi bližnjicami programov"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Zaporedje tipk »%1« se uporablja tudi pri standardnemu dejanju »%2«, ki \n"
+"ga uporabljajo nekateri programi.\n"
+"Ali ga res želite uporabiti tudi za splošno bližnjico?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Prestavi"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Neveljaven KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Ni datoteke QML"
--- /dev/null
+# Agron Selimaj <as9902613@gmail.com>, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kde4libs\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-01-19 00:20-0500\n"
+"Last-Translator: Agron Selimaj <as9902613@gmail.com>\n"
+"Language-Team: Albanian <sq@li.org>\n"
+"Language: sq\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-Launchpad-Export-Date: 2010-11-24 03:19+0000\n"
+"X-Generator: Lokalize 1.2\n"
+
+#, fuzzy, kde-format
+#| msgid "without name"
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "pa emër"
+
+#, fuzzy, kde-format
+#| msgid "without name"
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "pa emër"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "përkufizon gërmat e programit"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Hyrja"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Asnjë"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Create Web Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Krijo Shkurtore Web-i"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflike me Shkurtoren e Programit Standart"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Ricakto"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "invalid flags"
+msgid "Invalid KPackage '%1'"
+msgstr "flamurë të pavlefshëm"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5.po into Serbian.
+# Marko Rosic <roske@kde.org.yu>, 2003.
+# Toplica Tanaskovic <toptan@kde.org.yu>, 2003, 2004, 2005.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017.
+# Dalibor Djuric <daliborddjuric@gmail.com>, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2020-05-12 03:04+0200\n"
+"PO-Revision-Date: 2017-09-28 17:57+0200\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+"X-Wrapping: fine\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Часлав Илић"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "caslav.ilic@gmx.net"
+
+#: kpackagelauncherqml/main.cpp:43
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "КуМЛ програмска шкољка за KPackage"
+
+#: kpackagelauncherqml/main.cpp:50
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Јединствено име програма (обавезно)"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:58
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Кликните на дугме, па унесите пречицу као што бисте у програму.\n"
+"Пример за Ctrl+A: држите тастер Ctrl и притисните A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:288
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Резервисана пречица"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:289
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Тастер F12 је резервисан на Виндоузу, па се не може користити као глобална "
+"пречица.\n"
+"Изаберите неку другу."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:345
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Сукоб са стандардном програмском пречицом"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:346
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Комбинација тастера %1 већ је додељена стандардној радњи „%2“, коју користе "
+"неки програми.\n"
+"Желите ли заиста да је користите и као глобалну пречицу?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:351
+#, kde-format
+msgid "Reassign"
+msgstr "Поново додели"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:393
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "унесите..."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:400
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ниједна"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:421
+#, kde-format
+msgid "The key you just pressed is not supported by Qt."
+msgstr "КуТ не подржава тастер који сте управо притиснули."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:422
+#, kde-format
+msgid "Unsupported Key"
+msgstr "Неподржани тастер"
+
+#: quickaddons/configmodule.cpp:176
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:182
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5.po into Serbian.
+# Marko Rosic <roske@kde.org.yu>, 2003.
+# Toplica Tanaskovic <toptan@kde.org.yu>, 2003, 2004, 2005.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017.
+# Dalibor Djuric <daliborddjuric@gmail.com>, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2020-05-12 03:04+0200\n"
+"PO-Revision-Date: 2017-09-28 17:57+0200\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr@ijekavian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Часлав Илић"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "caslav.ilic@gmx.net"
+
+#: kpackagelauncherqml/main.cpp:43
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "КуМЛ програмска шкољка за KPackage"
+
+#: kpackagelauncherqml/main.cpp:50
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Јединствено име програма (обавезно)"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:58
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Кликните на дугме, па унесите пречицу као што бисте у програму.\n"
+"Примјер за Ctrl+A: држите тастер Ctrl и притисните A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:288
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Резервисана пречица"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:289
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Тастер F12 је резервисан на Виндоузу, па се не може користити као глобална "
+"пречица.\n"
+"Изаберите неку другу."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:345
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Сукоб са стандардном програмском пречицом"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:346
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Комбинација тастера %1 већ је додијељена стандардној радњи „%2“, коју "
+"користе неки програми.\n"
+"Желите ли заиста да је користите и као глобалну пречицу?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:351
+#, kde-format
+msgid "Reassign"
+msgstr "Поново додијели"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:393
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "унесите..."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:400
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ниједна"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:421
+#, kde-format
+msgid "The key you just pressed is not supported by Qt."
+msgstr "КуТ не подржава тастер који сте управо притиснули."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:422
+#, kde-format
+msgid "Unsupported Key"
+msgstr "Неподржани тастер"
+
+#: quickaddons/configmodule.cpp:176
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:182
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5.po into Serbian.
+# Marko Rosic <roske@kde.org.yu>, 2003.
+# Toplica Tanaskovic <toptan@kde.org.yu>, 2003, 2004, 2005.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017.
+# Dalibor Djuric <daliborddjuric@gmail.com>, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2020-05-12 03:04+0200\n"
+"PO-Revision-Date: 2017-09-28 17:57+0200\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr@ijekavianlatin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Časlav Ilić"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "caslav.ilic@gmx.net"
+
+#: kpackagelauncherqml/main.cpp:43
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "QML programska školjka za KPackage"
+
+#: kpackagelauncherqml/main.cpp:50
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Jedinstveno ime programa (obavezno)"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:58
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Kliknite na dugme, pa unesite prečicu kao što biste u programu.\n"
+"Primjer za Ctrl+A: držite taster Ctrl i pritisnite A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:288
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervisana prečica"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:289
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Taster F12 je rezervisan na Windowsu, pa se ne može koristiti kao globalna "
+"prečica.\n"
+"Izaberite neku drugu."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:345
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Sukob sa standardnom programskom prečicom"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:346
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinacija tastera %1 već je dodijeljena standardnoj radnji „%2“, koju "
+"koriste neki programi.\n"
+"Želite li zaista da je koristite i kao globalnu prečicu?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:351
+#, kde-format
+msgid "Reassign"
+msgstr "Ponovo dodijeli"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:393
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "unesite..."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:400
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "nijedna"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:421
+#, kde-format
+msgid "The key you just pressed is not supported by Qt."
+msgstr "Qt ne podržava taster koji ste upravo pritisnuli."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:422
+#, kde-format
+msgid "Unsupported Key"
+msgstr "Nepodržani taster"
+
+#: quickaddons/configmodule.cpp:176
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:182
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5.po into Serbian.
+# Marko Rosic <roske@kde.org.yu>, 2003.
+# Toplica Tanaskovic <toptan@kde.org.yu>, 2003, 2004, 2005.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017.
+# Dalibor Djuric <daliborddjuric@gmail.com>, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2020-05-12 03:04+0200\n"
+"PO-Revision-Date: 2017-09-28 17:57+0200\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr@latin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Časlav Ilić"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "caslav.ilic@gmx.net"
+
+#: kpackagelauncherqml/main.cpp:43
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "QML programska školjka za KPackage"
+
+#: kpackagelauncherqml/main.cpp:50
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Jedinstveno ime programa (obavezno)"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:58
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Kliknite na dugme, pa unesite prečicu kao što biste u programu.\n"
+"Primer za Ctrl+A: držite taster Ctrl i pritisnite A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:288
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rezervisana prečica"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:289
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Taster F12 je rezervisan na Windowsu, pa se ne može koristiti kao globalna "
+"prečica.\n"
+"Izaberite neku drugu."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:345
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Sukob sa standardnom programskom prečicom"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:346
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Kombinacija tastera %1 već je dodeljena standardnoj radnji „%2“, koju "
+"koriste neki programi.\n"
+"Želite li zaista da je koristite i kao globalnu prečicu?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:351
+#, kde-format
+msgid "Reassign"
+msgstr "Ponovo dodeli"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:393
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "unesite..."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:400
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "nijedna"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:421
+#, kde-format
+msgid "The key you just pressed is not supported by Qt."
+msgstr "Qt ne podržava taster koji ste upravo pritisnuli."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:422
+#, kde-format
+msgid "Unsupported Key"
+msgstr "Nepodržani taster"
+
+#: quickaddons/configmodule.cpp:176
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:182
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Swedish
+# Översättning kdelibs4.po till Svenska
+#
+# Copyright (C) 1997,2002,2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+# Magnus Reftel <d96reftl@dtek.chalmers.se>, 1997.
+# Anders Widell <awl@hem.passagen.se>, 1998-2000.
+# Per Lindström <pelinstr@algonet.se>, 2000.
+# Mattias Newzella <newzella@linux.nu>, 2000, 2001, 2002,2003, 2004, 2005.
+# Stefan Asserhäll <stefan.asserhall@bredband.net>, 2002.
+# Stefan Asserhäll <stefan.asserhall@bredband.net>, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+# Stefan Asserhall <stefan.asserhall@bredband.net>, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020, 2021.
+# Arve Eriksson <031299870@telia.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 08:04+0200\n"
+"Last-Translator: Stefan Asserhäll <stefan.asserhall@bredband.net>\n"
+"Language-Team: Swedish <kde-i18n-doc@kde.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 20.08.1\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Magnus Reftel,Anders Widell,Per Lindström,Mattias Newzella,Stefan Asserhäll"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"d96reftl@dtek.chalmers.se,awl@hem.passagen.se,pelinstr@algonet.se,"
+"newzella@linux.nu,stefan.asserhall@telia.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML-programskal"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Programmets unika namn (krävs)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Visa sammanhangsberoende hjälp"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Inmatning"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ingen"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Klicka på knappen, och skriv därefter in genvägen som du skulle göra i "
+"programmet.\n"
+"Exempel för Ctrl+A: Håll nere Ctrl-tangenten och tryck på A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Reserverad genväg"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Tangenten F12 är reserverad på Windows, och kan inte användas som global "
+"snabbtangent.\n"
+"Välj en annan tangent."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Konflikt med standardsnabbtangenter för program"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Tangentkombinationen '%1' används också för standardåtgärden \"%2\" som "
+"vissa program använder.\n"
+"Vill du verkligen också använda den som global snabbtangent?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Ändra tilldelning"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Ogiltigt KPackage '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Ingen QML-fil tillhandahållen"
--- /dev/null
+# translation of kdelibs4.po to தமிழ்
+# Copyright (C) 2000,2002, 2004, 2007, 2008 Free Software Foundation, Inc.
+#
+# Sivakumar Shanmugasundaram <sshanmu@yahoo.com>, 2000.
+# Thuraiappah Vaseeharan <t_vasee@yahoo.com>, 2000-2001.
+# ம. ஸ்ரீ ராமதாஸ் | Sri Ramadoss M <amachu@yavarkkum.org>, 2007-2012
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-03-25 21:39+0530\n"
+"Last-Translator: Sri Ramadoss M <amachu@yavarkkum.org>\n"
+"Language-Team: Tamil <podhu@madaladal.yavarkkum.org>\n"
+"Language: ta\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: Lokalize 1.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ம. ஸ்ரீ ராமதாஸ்"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "amachu@yavarkkum.org"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "நிரலின் மின்னெழுத்தை வரையறையும்"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "உள்ளீடு"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ஏதுமற்ற"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"பொத்தனைச் சொடுக்கி, நிரலில் நீங்கள் விரும்பும் சுருக்கு வழியை இடவும்.\n"
+"Ctrl+a க்கான உதாரணம்: Ctrl விசையை அழுத்தியபடிய a தட்டவும்"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "ஒதுக்கப்பட்ட சுருக்குவழி"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 விண்டோஸ்க்காக ஒதுக்கப்பட்டுள்ளதுஇ ஆகையால் பொதுவான சுருக்கு வழியாக பயன்படுத்த "
+"முடியாது.\n"
+"எனவே வோறொன்றை தேர்வு செய்யவும்."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "வழக்கமான பயன்பாட்டு சுருக்கு வழியுடன் முரண்"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' விசைக் கூட்டு ஏற்கனவே சில பயன்பாடுகளில் பயன்படுத்தப் படும் \"%2\" செயலுக்காக "
+"பணிக்கப்பட்டுள்ளது. \n"
+"இருப்பினும் இதனைத் தாங்கள் பொது சுருக்குவழியாகவும் பயன்படுத்த விழைகிறீர்களா?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "மீளமர்த்துக"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "செல்லாத உருப்படி."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Telugu
+#
+#
+# Purushottam Boyanapalli <boyanapalli@gmail.com>, 2005.
+# విజయ్ కిరణ్ కముజు <infyquest@gmail.com>, 2007.
+# pavithran <pavithran.s@gmail.com>, 2007.
+# Krishna Babu K <kkrothap@redhat.com>, 2008, 2009.
+# sreekalyanbapatla <sreekalyan3@gmail.com>, 2013.
+# GVS.Giri <gvs.giri@swecha.net>, 2013.
+# Bhuvan Krishna <bhuvan@swecha.org>,2013.
+# Naveen Kandimalla <naveen@swecha.net>,2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-11-04 23:55+0630\n"
+"Last-Translator: Bhuvan Krishna <bhuvan@swecha.org>\n"
+"Language-Team: Telugu <kde-i18n-doc@kde.org>\n"
+"Language: te\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "విజయ్ కిరణ్ కముజు,కృష్ణబాబు కె, భువన్ కృష్ణ, జి వి యస్ గిరి, శ్రీ కళ్యన్న్, ననిన్"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"infyquest@gmail.com,kkrothap@redhat.com,bhuvan@swecha.org,gvs.giri@swecha."
+"net,sreekalyan3@gmail.com,naveen@swecha.net"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "అనువర్తనము అక్షరరూపమును నిర్వచిస్తుంది"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "ఇన్పుట్"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ఏదీ వద్దు"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "నిలిపిఉంచి శీఘ్ర మార్గము"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "ప్రామాణిక కార్యక్రమ శీఘ్రమార్గంతొ ఘర్షణ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "మళ్లి నియమించు"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "వస్తువు నిస్సారం"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Tajik Language
+# Copyright (C) 2004, 2002, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# 2004, 2005, 2006, 2007 infoDev, a World Bank organization.
+# 2004, 2005, 2006, 2007 Khujand Computer Technologies, Inc.
+# 2004, 2005, 2006, 2007 Youth Opportunities, NGO, 2005.
+# Roger Kovacs <rkovacs@khujand.org>, 2003.
+# Thomas Diehl <thd@kde.org>, 2003.
+# Victor Ibragimov <victor.ibragimov@gmail.com>, 2003, 2004, 2005, 2006, 2007, 2008, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2019-12-26 21:21+0500\n"
+"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
+"Language-Team: English <kde-i18n-doc@kde.org>\n"
+"Language: tg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 19.04.3\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Victor Ibragimov"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "victor.ibragimov@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Восити барномаи KPackage QML"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Номи мушаххаси барнома (ҳатмӣ)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Вуруд"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Ҳеҷ чиз"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Тугмаро зер кунед, пас миёнбуреро мисли дар барнома будан ворид намоед.\n"
+"Барои мисол, барои Ctrl+A: тугмаи Ctrl-ро доред ва тугмаи A-ро пахш намоед."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Миёнбури маҳдудшуда"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Тугмаи F12 дар низоми Windows маҳдуд карда шудааст, то ки натавонад барои "
+"миёнбурҳои умумӣ истифода бурда шавад.\n"
+"Лутфан, тугмаи дигареро интихоб намоед."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Ихтилоф бо миёнбурҳои барномавии стандартӣ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Пайвасшавии тугмаи '%1' инчунин барои амали стандартии \"%2\" дар баъзеи "
+"барномаҳо истифода мешавад.\n"
+"Шумо мехоҳед, ки онро низ ҳамчун миёнбури умумӣ истифода баред?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Аз нав таъйин кардан"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid KPackage"
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage беэътибор аст"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Ягон файли QML таъмин карда нашуд"
--- /dev/null
+# translation of kdelibs4.po to Thai
+# Copyright (C) 2003,2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+#
+# Thanomsub Noppaburana <donga_n@yahoo.com>, 2003,2004, 2005.
+# Thanomsub Noppaburana <donga.nb@gmail.com>, 2005, 2008, 2010.
+# Sahachart Anukulkitch <drrider@gmail.com>, 2006, 2007.
+# Narachai Sakorn <narachai@gmail.com>, 2008.
+# Phuwanat Sakornsakolpat <narachai@gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2010-12-31 22:47+0700\n"
+"Last-Translator: Phuwanat Sakornsakolpat <narachai@gmail.com>\n"
+"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
+"Language: th\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ถนอมทรัพย์ นพบูรณ์, สหชาติ อนุกูลกิจ"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "donga.nb@gmail.com, drrider@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "กำหนดแบบอักษรของโปรแกรม"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "กดปุ่มพิมพ์"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "ไม่มี"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"คลิกบนปุ่ม จากนั้นป้อนปุ่มพิมพ์ลัดที่คุณต้องการจะใช้ในโปรแกรม\n"
+"ตัวอย่างเช่น Ctrl+a: กดปุ่มพิมพ์ Ctrl ค้างเอาไว้ ตามด้วยการกดปุมพิมพ์ a"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "ปุ่มพิมพ์ลัดที่ถูกสงวนไว้"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"ปุ่มพิมพ์ F12 นั้นถูกสงวนไว้บนระบบวินโดวส์ "
+"ดังนั้นจึงไม่สามารถนำมาใช้งานเป็นปุ่มพิมพ์ลัดใช้งานส่วนรวมได้\n"
+"โปรดเลือกปุ่มพิมพ์อื่น ๆ"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "เกิดความขัดแย้งกับปุ่มพิมพ์ลัดมาตรฐานของโปรแกรม"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"ปุ่มพิมพ์ลัด '%1' นี้ ถูกจองไว้ใช้งานกับการกระทำมาตรฐาน \"%2\" ซึ่งมีบางโปรแกรมใช้อยู่\n"
+"คุณต้องการจะใช้มันเป็นปุ่มพิมพ์ลัดใช้งานส่วนรวมของมันเช่นกันหรือไม่ ?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "กำหนดใหม่"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "รายการใช้งานไม่ได้"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Turkish
+# translation of kdelibs4.po to
+# Kdelibs Turkish translation file
+# Copyright (C) 2000,2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#
+# Ömer Fadıl USTA <omer_fad@hotmail.com>,1999-2002.
+# Görkem Çetin <gorkem@kde.org>, 2002,2003, 2004.
+# Tuncay YENİAY <tuncayyeniay@mynet.com>,2002.
+# Ayşe Genç <ayse@uludag.org.tr>, 2005.
+# Görkem Çetin <gorkem@kde.org.tr>, 2005.
+# Görkem Çetin <gorkem@gorkemcetin.com>, 2005.
+# Bekir SONAT <cortexbs@yahoo.com>, 2005.
+# Serdar Soytetir <tulliana@gmail.com>, 2007.
+# Serdar Soytetir <tulliana@gmail.com>, 2007, 2008, 2009, 2011.
+# H. İbrahim Güngör <ibrahim@pardus.org.tr>, 2010, 2011.
+# Ozan Çağlayan <ozan@pardus.org.tr>, 2010, 2011.
+# Serdar SOYTETİR <tulliana@gmail.com>, 2010, 2012.
+# Volkan Gezer <volkangezer@gmail.com>, 2013, 2014.
+# Kaan Ozdincer <kaanozdincer@gmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2015-05-19 10:02+0000\n"
+"Last-Translator: Necdet <necdetyucel@gmail.com>\n"
+"Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
+"Language: tr\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: Lokalize 1.4\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Serdar Soytetir, Görkem Çetin, H. İbrahim Güngör, Volkan Gezer"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"tulliana@gmail.com, gorkem@kde.org, ibrahim@pardus.org.tr, volkangezer@gmail."
+"com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML uygulama kabuğu"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Uygulamanın benzersiz ismi (zorunlu)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Girdi"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Hiçbiri"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Düğmeye tıklayın, ardından kısayol tuşlarına basın.\n"
+"Ctrl+A örneği için: Ctrl tuşuna basılı tutun ve A tuşuna basın."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Ayrılmış Kısayol"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 kısayolu Windows üzerinde önceden atanmış olduğundan genel kısayol "
+"olarak kullanılamaz.\n"
+"Lütfen başka bir tuş seçin."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Standart Uygulama Kısayolu ile Çakışma"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' tuş kombinasyonu zaten başka bir uygulamanın \"%2\" eylemine "
+"ayrılmıştı.\n"
+"Bu kombinasyonu şu anki eylem için yeniden atamak ister misiniz?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Yeniden Ata"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Geçersiz öge."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Ainur Shakirov <ainur.shakirov.tt@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2011-11-26 15:12+0400\n"
+"Last-Translator: Ainur Shakirov <ainur.shakirov.tt@gmail.com>\n"
+"Language-Team: Tatar <>\n"
+"Language: tt\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: Lokalize 1.2\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Ainur Shakirov"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "ainur.shakirov.tt@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "кушымтаның хәрефен билгели"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Кертү"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Юк"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Нажмите на кнопке и введите комбинацию клавиш.\n"
+"Например, для комбинации клавиш Ctrl+A зажмите клавишу Ctrl и нажмите A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Зарезервированная комбинация клавиш"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"В Windows клавиша F12 зарезервирована, поэтому её нельзя использовать в "
+"глобальных комбинациях клавиш.\n"
+"Выберите другую комбинацию клавиш."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Стандартлы төймә функциясе белән конфликт"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Комбинация клавиш %1 уже связана со стандартным действием «%2», используемым "
+"во многих программах.\n"
+"Вы действительно хотите использовать эту комбинацию как глобальную?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Яңа белән бәйләү"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Тотылмаган элемент."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Uyghur translation for kdelibs4.
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Sahran <sahran.ug@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2013-09-08 07:05+0900\n"
+"Last-Translator: Gheyret Kenji <gheyret@gmail.com>\n"
+"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
+"Language: ug\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "ئابدۇقادىر ئابلىز, غەيرەت كەنجى"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "sahran.ug@gmail.com, gheyret@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "پروگرامما خەت نۇسخا بەلگىلەش"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "كىرگۈز"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "يوق"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, fuzzy, kde-format
+#| msgid ""
+#| "Click on the button, then enter the shortcut like you would in the "
+#| "program.\n"
+#| "Example for Ctrl+a: hold the Ctrl key and press a."
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"بۇ توپچىنى چېكىپ، ئاندىن بۇ پروگراممىغا تېزلەتمە كىرگۈزۈڭ.\n"
+"مەسىلەن، Ctrl+a يەنى Ctrl كۇنۇپكىسىنى بېسىپ تۇرۇپ ئاندىن a كۇنۇپكا بېسىلىدۇ."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "بەلگىلىنىپ بولغان تېزلەتمە"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 بولسا Windows دا بەلگىلىنىپ بولغان، شۇڭا ئومۇمىيەت تېزلەتمىدە ئىشلەتكىلى "
+"بولمايدۇ\n"
+"باشقا كۇنۇپكا تاللاڭ."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "پروگراممىنىڭ ئۆلچەملىك تېزلەتمىسى بىلەن توقۇنۇشۇپ قالدى"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"بىرىكمە كۇنۇپكا '%1' بىر قانچە پروگراممىلاردا ئۆلچەملىك مەشغۇلات \"%2\" "
+"ئۈچۈن بېكىتىلگەن\n"
+"بۇنى راستلا ئومۇمىيەت تېزلەتمە سۈپىتىدە ئىشلىتەمسىز؟"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "قايتا تەقسىملە"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "ئىناۋەتسىز تۈر."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Translation of kdeclarative5.po to Ukrainian
+# Copyright (C) 2018-2020 This_file_is_part_of_KDE
+# This file is distributed under the license LGPL version 2.1 or
+# version 3 or later versions approved by the membership of KDE e.V.
+#
+# Eugene Onischenko <oneugene@ukr.net>, 2002, 2003, 2004, 2005, 2006.
+# Andriy Rysin <arysin@bcsii.com>, 2002, 2003, 2006, 2007.
+# Ivan Petrouchtchak <fr.ivan@ukrainian-orthodox.org>, 2005, 2006, 2007, 2008.
+# Yuri Chornoivan <yurchor@ukr.net>, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeclarative5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-04-28 09:40+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 20.12.0\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Юрій Чорноіван"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "yurchor@ukr.net"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "QML-оболонка програм KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Унікальна назва програми (обов’язкова)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Показати контекстну довідку"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Ввід"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Немає"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Натисніть кнопку, а потім введіть клавіатурне скорочення, яке ви бажаєте "
+"використовувати у програмі.\n"
+"Наприклад, для Ctrl+A: натисніть клавішу Ctrl, а потім клавішу «A»."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Зарезервоване скорочення"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Клавішу F12 у Windows зарезервовано. Її не можна використовувати для "
+"створення загального клавіатурного скорочення.\n"
+"Будь ласка, оберіть іншу клавішу."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Конфлікт зі скороченнями стандартних програм"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Комбінація клавіш «%1» вже прив'язана до стандартної дії «%2», яку "
+"використовують багато інших програм.\n"
+"Ви дійсно хочете використовувати її також як загальне скорочення?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Перепризначити"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Некоректний KPackage «%1»"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Не надано файла QML"
--- /dev/null
+# translation of kdelibs4.po to Uzbek
+# Mashrab Kuvatov <kmashrab@uni-bremen.de>, 2003, 2004, 2005, 2006, 2008.
+# translation of kdelibs4.po to
+# Copyright (C) 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2008-05-30 17:29+0200\n"
+"Last-Translator: Mashrab Kuvatov <kmashrab@uni-bremen.de>\n"
+"Language-Team: Uzbek <floss-uz-l10n@googlegroups.com>\n"
+"Language: uz\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Mashrab Quvatov"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kmashrab@uni-bremen.de"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "dastur uchun shriftni aniqlaydi"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Kiritish fayli"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Yoʻq"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Tugmalar birikmasi"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Dasturning andoza tugmalar birikmasi bilan muammo"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"\"%1\" tugma birikmasi allaqachon \"%2\" andoza amali bilan bogʻlangan.\n"
+"Uni joriy amal bilan bogʻlashni istaysizmi?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Sertifikat haqiqiy emas!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Uzbek
+# translation of kdelibs4.po to
+# Copyright (C) 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+# Mashrab Kuvatov <kmashrab@uni-bremen.de>, 2003, 2004, 2005, 2006, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2009-10-17 00:34+0200\n"
+"Last-Translator: Mashrab Kuvatov <kmashrab@uni-bremen.de>\n"
+"Language-Team: Uzbek <floss-uz-l10n@googlegroups.com>\n"
+"Language: uz@cyrillic\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Машраб Қуватов"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "kmashrab@uni-bremen.de"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "дастур учун шрифтни аниқлайди"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Киритиш файли"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Йўқ"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Тугмалар бирикмаси"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Дастурнинг андоза тугмалар бирикмаси билан муаммо"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"\"%1\" тугма бирикмаси аллақачон \"%2\" андоза амали билан боғланган.\n"
+"Уни жорий амал билан боғлашни истайсизми?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr ""
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Сертификат ҳақиқий эмас!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# Vietnamese translation for kdelibs.
+# Copyright © 2007 KDE i18n Project for Vietnamese.
+#
+# Clytie Siddall <clytie@riverland.net.au>, 2006-2007.
+# Hoàng Đức Hiếu <hieu.d.hoang@gmail.com>, 2008, 2011.
+# Lê Hoàng Phương <herophuong93@gmail.com>, 2011, 2012.
+# Phu Hung Nguyen <phuhnguyen@disroot.org>, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-05-28 20:40+0200\n"
+"Last-Translator: Phu Hung Nguyen <phuhnguyen@disroot.org>\n"
+"Language-Team: Vietnamese <kde-l10n-vi@kde.org>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Lokalize 20.08.1\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Nguyễn Hùng Phú,Lê Hoàng Phương,Hoàng Đức Hiếu,Clytie Siddall"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"phu.nguyen@kdemail.net,herophuong93@gmail.com,hieu.d.hoang@gmail.com,"
+"clytie@riverland.net.au"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "Hệ vỏ ứng dụng QML KPackage"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "Tên độc nhất của ứng dụng (bắt buộc)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "Hiện trợ giúp theo ngữ cảnh"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Nhập"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Không"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"Bấm nút, sau đó nhập phím tắt bạn muốn dùng.\n"
+"Ví dụ cho Ctrl+A: giữ phím Ctrl và nhấn A."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Phím tắt được đặt trước"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"Phím F12 được đặt trước trên Windows, nên không thể dùng cho một phím tắt "
+"toàn cục được.\n"
+"Vui lòng chọn một phím khác."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Xung đột với phím tắt ứng dụng tiêu chuẩn"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Tổ hợp phím '%1' cũng được dùng cho hành động tiêu chuẩn \"%2\" mà một số "
+"ứng dụng sử dụng.\n"
+"Bạn có thật sự muốn cũng dùng nó như một phím tắt toàn cục?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Gán lại"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "KPackage không hợp lệ '%1'"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "Không nhận được tệp QML nào"
--- /dev/null
+# translation of kdelibs4.po to Walloon
+# Ratournaedje e walon des messaedjes di KDE.
+#
+# Lorint Hendschel <lorint.hendschel@skynet.be>, 2002.
+# Pablo Saratxaga <pablo@walon.org>, 2002-2004, 2007.
+# Jean Cayron <jean.cayron@gmail.com>, 2007, 2008, 2009, 2010, 2011.
+# Jean Cayron <jean.cayron@tele2allin.be>, 2007.
+# Jean Cayron <jean.cayron@base.be>, 2011, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2012-07-04 17:33+0200\n"
+"Last-Translator: Jean Cayron <jean.cayron@base.be>\n"
+"Language-Team: Walloon <linux-wa@walon.org>\n"
+"Language: wa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Walloon\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Lorint Hendschel,Pablo Saratxaga,Djan Cayron"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "laurent.hendschel@skynet.be,pablo@walon.org,jean.cayron@gmail.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "definixh li fonte do programe"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "Intrêye"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Nolu"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "Rascourti rizervé"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Gn a fortcherwaedje avou les rascourtis standårds di l' aplicåcion"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"L' atelêye di tapes « %1 » sieve ossu po l' accion standård « %2 » ki "
+"sacwants programes s' endè siervèt.\n"
+"El voloz vormint eployî po on rascourti globå eto?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "Raroyî"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+#| msgid "Invalid item."
+msgid "Invalid KPackage '%1'"
+msgstr "Mwais cayet."
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to
+# translation of kdelibs4.po to
+# translation of kdelibs4.po to
+# translation of kdelibs4.po to Xhosa
+# K Desktop Environment - kdelibs
+# Copyright (C) 2001 translate.org.za
+# Antoinette Dekeni <antoinette@transalate.org.za>, 2001.
+# Lwandle Mgidlana <lwandle@translate.org.za>, 2002
+# Thelma Lungcuzo <thelma@translate.org.za>, 2002
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2002-12-13 17:20SAST\n"
+"Last-Translator: Lwandle Mgidlana <lwandle@translate.org.za>\n"
+"Language-Team: Xhosa <xhosa@translate.org.za>\n"
+"Language: xh\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0beta2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#, fuzzy, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Igama elitsha lenginginya."
+
+#, fuzzy, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "Igama elitsha lenginginya."
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "ichaza isicelo sohlobo lwamagama."
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "&Igalelo Elisuka"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "Akukho nanye"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "Indlela emfutshane"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "Ungqubano Nesicelo Esisezantsi Sendlela emfutshane"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"Indibaniselwano '%1' yesitshixo sele inikezelwe kwi \"%2\"ntshukumo.\n"
+"Nceda khetha indibaniselwano yesinye isitshixo."
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, fuzzy, kde-format
+msgid "Reassign"
+msgstr "Isirashiya"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "Isiqinisekiso esingasebenziyo!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Chinese Simplified
+# Copyright (C) 2007 Free Software Foundation, Inc.
+#
+# Lie Ex <lilith.ex@gmail.com> 2007-2011.
+# Wang Jian <lark@linux.ustc.edu.cn>, 1998.
+# Sarah Smith <sarahs@redhat.com>, 2002.
+# Xiong Jiang <jxiong@offtopic.org>, 2002,2003,2004.
+# Funda Wang <fundawang@linux.net.cn>, 2002,2003,2004.
+# Liang Qi <cavendish.qi@gmail.com>, 2007.
+# Feng Chao <chaofeng111@qq.com>, 2010, 2012, 2014, 2019, 2020.
+# Ni Hui <shuizhuyuanluo@126.com>, 2010, 2011, 2012.
+# Weng Xuetian <wengxt@gmail.com>, 2011, 2012, 2013, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeorg\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2021-08-30 11:43\n"
+"Last-Translator: \n"
+"Language-Team: Chinese Simplified\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Crowdin-Project: kdeorg\n"
+"X-Crowdin-Project-ID: 269464\n"
+"X-Crowdin-Language: zh-CN\n"
+"X-Crowdin-File: /kf5-trunk/messages/kdeclarative/kdeclarative5.pot\n"
+"X-Crowdin-File-ID: 5567\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "KDE 中国, Feng Chao, Guo Yunhe, Tyson Tan"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"kde-china@kde.org, chaofeng111@qq.com, i@guoyunhe.me, tysontan@tysontan.com"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML 应用程序外壳"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "应用程序唯一名称 (必须)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr "显示相关帮助"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "输入"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "无"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"单击此按钮,然后输入要在该程序中使用的快捷方式。\n"
+"比如 Ctrl+A 就是按住 Ctrl 键不放并按下 A 键。"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "保留快捷方式"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 键是 Windows 的系统保留快捷键,无法用作全局快捷键。\n"
+"请另选一个快捷键。"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "与标准程序快捷键冲突"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"按键组合“%1”与某些程序使用的标准操作“%2”快捷键相同。\n"
+"您仍然想要将它用作全局快捷键吗?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "重新分配"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "无效 KPackage“%1”"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "未提供 QML 文件"
--- /dev/null
+# translation of kdelibs4.po to Chinese (Hong Kong)
+# Chinese (traditional) translation for kdeutils
+# Copyright (C) 2001, 02, 04, 05 Free Software Foundation, Inc.
+#
+# Eric Cheng <ericc@shinewave.com.tw>, unknown.
+#
+# with reference from zh_CN translation (as of 2002-11-08):
+# Chih-Wei Huang <cwhuang@linux.org.tw>, 2001.
+# Kenduest Lee <kenduest@i18n.linux.org.tw>, 2001.
+# Jouston Huang (Huang, Jiun-Jeng) <jouston@housediy.com>, 2002.
+# Kenduest Lee <kenduest@i18n.linux.org.tw>, 2002.
+# Wang Jian <lark@linux.net.cn>, 2002.
+# Anthony Fok <anthony@thizlinux.com>, 2002.
+# Yuan-Chen Cheng <ycheng@slat.org>, 2002.
+# Wang Jian <lark@linux.ustc.edu.cn>, 1998.
+# Funda Wang <fundawang@en2china.com>, 2002.
+# Sarah Smith <sarahs@redhat.com>, 2002.
+# Xiong Jiang <jxiong@offtopic.org>, 2002.
+# Chia-Lin, Kao <acelan@linux.org.tw>, 2004.
+# Stanley Wong <stanley18fan0k@yahoo.com.hk>, 2005.
+# Abel Cheung <abel@oaka.org>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2006-01-04 13:32+0800\n"
+"Last-Translator: Abel Cheung <abel@oaka.org>\n"
+"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
+"Language: zh_HK\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr ""
+"Chih-Wei Huang,Kenduest Lee,Jouston Huang (Jiun-Jeng Huang),Kenduest Lee,"
+"Wang Jian,Anthony Fok,Yuan-Chen Cheng,Wang Jian,Funda Wang,Sarah Smith,Xiong "
+"Jiang,Kao Chia-Lin,Stanley Wong"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr ""
+"cwhuang@linux.org.tw,kenduest@i18n.linux.org.tw,jouston@housediy.com,"
+"kenduest@i18n.linux.org.tw,lark@linux.net.cn,anthony@thizlinux.com,"
+"ycheng@slat.org,lark@linux.ustc.edu.cn,fundawang@en2china.com,sarahs@redhat."
+"com,jxiong@offtopic.org,acelan@linux.org.tw,stanley18fan0k@yahoo.com.hk"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr ""
+
+#: kpackagelauncherqml/main.cpp:38
+#, fuzzy, kde-format
+#| msgid "defines the application font"
+msgid "The unique name of the application (mandatory)"
+msgstr "定義應用程式字型。"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, fuzzy, kde-format
+#| msgid "Input file"
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "輸入檔案"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, fuzzy, kde-format
+#| msgid "None"
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "無"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, fuzzy, kde-format
+#| msgid "Shortcut"
+msgid "Reserved Shortcut"
+msgstr "快速鍵"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "與標準的應用程式快速鍵定義衝突"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, fuzzy, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"'%1' 按鍵組合已配置給標準 \"%2\" 動作。\n"
+"你確定要重新設定此組合鍵給此動作?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "重新指定"
+
+#: quickaddons/configmodule.cpp:164
+#, fuzzy, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "不合法的證書!"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr ""
--- /dev/null
+# translation of kdelibs4.po to Chinese Traditional
+# Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# Eric Cheng <ericc@shinewave.com.tw>, unknown.
+# This file referenced zh_CN translations at 2002.
+# Chih-Wei Huang <cwhuang@linux.org.tw>, 2001.
+# Kenduest Lee <kenduest@i18n.linux.org.tw>, 2001, 2002.
+# Jouston Huang (Huang, Jiun-Jeng) <jouston@housediy.com>, 2002.
+# Chia-Lin, Kao <acelan@linux.org.tw>, 2004.
+# Yuan-Chen Cheng <ycheng@slat.org>, 2002.
+# Goodhorse <franklin@goodhorse.idv.tw>, 2008.
+# Frank Weng (a.k.a. Franklin) <franklin at goodhorse dot idv dot tw>, 2006-2009, 2010.
+# Franklin Weng <franklin@mail.everfocus.com.tw>, 2010, 2011, 2012.
+# Franklin Weng <franklin@goodhorse.idv.tw>, 2010, 2011, 2012, 2013, 2014, 2015.
+# pan93412 <pan93412@gmail.com>, 2019, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdelibs4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2021-06-03 00:14+0000\n"
+"PO-Revision-Date: 2020-01-09 18:07+0800\n"
+"Last-Translator: pan93412 <pan93412@gmail.com>\n"
+"Language-Team: Chinese <zh-l10n@lists.linux.org.tw>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 19.12.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#, kde-format
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Franklin Weng"
+
+#, kde-format
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "franklin@goodhorse.idv.tw"
+
+#: kpackagelauncherqml/main.cpp:30
+#, kde-format
+msgid "KPackage QML application shell"
+msgstr "KPackage QML 應用程式 shell"
+
+#: kpackagelauncherqml/main.cpp:38
+#, kde-format
+msgid "The unique name of the application (mandatory)"
+msgstr "應用程式的名稱(主要)"
+
+#: qmlcontrols/kcmcontrols/qml/ContextualHelpButton.qml:62
+#, kde-format
+msgctxt "@action:button"
+msgid "Show Contextual Help"
+msgstr ""
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:76
+#, kde-format
+msgctxt "What the user inputs now will be taken as the new shortcut"
+msgid "Input"
+msgstr "輸入"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:78
+#, kde-format
+msgctxt "No shortcut defined"
+msgid "None"
+msgstr "無"
+
+#: qmlcontrols/kquickcontrols/KeySequenceItem.qml:93
+#, kde-format
+msgid ""
+"Click on the button, then enter the shortcut like you would in the program.\n"
+"Example for Ctrl+A: hold the Ctrl key and press A."
+msgstr ""
+"點擊此按鍵,並輸入您要在程式裡做的動作。\n"
+"例如 Ctrl+A:按住 Ctrl 鍵並按 A。"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:115
+#, kde-format
+msgid "Reserved Shortcut"
+msgstr "保留的捷徑"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:117
+#, kde-format
+msgid ""
+"The F12 key is reserved on Windows, so cannot be used for a global "
+"shortcut.\n"
+"Please choose another one."
+msgstr ""
+"F12 鍵是 Windows 的保留鍵,無法做為全域捷徑。\n"
+"請另外選一個鍵。"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:171
+#, kde-format
+msgid "Conflict with Standard Application Shortcut"
+msgstr "與標準的應用程式快捷鍵定義衝突"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:173
+#, kde-format
+msgid ""
+"The '%1' key combination is also used for the standard action \"%2\" that "
+"some applications use.\n"
+"Do you really want to use it as a global shortcut as well?"
+msgstr ""
+"%1 組合鍵已經用於許多應用程式會用到的標準動作「%2」了。您確定要使用它做為全域"
+"的快捷鍵嗎?"
+
+#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:179
+#, kde-format
+msgid "Reassign"
+msgstr "重新指定"
+
+#: quickaddons/configmodule.cpp:164
+#, kde-format
+msgid "Invalid KPackage '%1'"
+msgstr "「%1」KPackage 無效"
+
+#: quickaddons/configmodule.cpp:170
+#, kde-format
+msgid "No QML file provided"
+msgstr "未提供 QML 檔案"
--- /dev/null
+if(KF5Config_FOUND AND KF5I18n_FOUND AND KF5IconThemes_FOUND AND KF5KIO_FOUND)
+ add_subdirectory(kdeclarative)
+endif()
+
+add_subdirectory(quickaddons)
+add_subdirectory(qmlcontrols)
+add_subdirectory(kpackagelauncherqml)
+add_subdirectory(calendarevents)
+
+if(BUILD_QCH)
+ ecm_add_qch(
+ KF5Declarative_QCH
+ NAME KDeclarative
+ BASE_NAME KF5Declarative
+ VERSION ${KF_VERSION}
+ ORG_DOMAIN org.kde
+ SOURCES # using only public headers, to cover only public API
+ ${KQuickAddons_QCH_SOURCES}
+ ${KDeclarative_QCH_SOURCES}
+ MD_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md"
+ LINK_QCHS
+ Qt5Qml_QCH
+ KF5Config_QCH
+ KF5Package_QCH
+ INCLUDE_DIRS
+ ${KQuickAddons_QCH_INCLUDE_DIRS}
+ ${KDeclarative_QCH_INCLUDE_DIRS}
+ BLANK_MACROS
+ KDECLARATIVE_EXPORT
+ KDECLARATIVE_DEPRECATED
+ KDECLARATIVE_DEPRECATED_EXPORT
+ "KDECLARATIVE_DEPRECATED_VERSION(x, y, t)"
+ "KDECLARATIVE_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)"
+ QUICKADDONS_EXPORT
+ QUICKADDONS_DEPRECATED
+ QUICKADDONS_DEPRECATED_EXPORT
+ "QUICKADDONS_DEPRECATED_VERSION(x, y, t)"
+ TAGFILE_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
+ QCH_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
+ COMPONENT Devel
+ )
+endif()
--- /dev/null
+#!/bin/sh
+
+# Invoke the extractrc script on all .ui, .rc, and .kcfg files in the sources.
+# The results are stored in a pseudo .cpp file to be picked up by xgettext.
+lst=`find . -name \*.rc -o -name \*.ui -o -name \*.kcfg`
+if [ -n "$lst" ] ; then
+ $EXTRACTRC $lst >> rc.cpp
+fi
+
+# If your framework contains tips-of-the-day, call preparetips as well.
+if [ -f "data/tips" ] ; then
+ ( cd data && $PREPARETIPS > ../tips.cpp )
+fi
+
+# Extract strings from all source files.
+# If your framework depends on KI18n, use $XGETTEXT. If it uses Qt translation
+# system, use $EXTRACT_TR_STRINGS.
+$XGETTEXT `find . -name \*.cpp -o -name \*.h -o -name \*.qml` -o $podir/kdeclarative5.pot
--- /dev/null
+set(calendar-integration_SRCS
+ calendareventsplugin.cpp
+ eventdata_p.cpp
+)
+
+add_library(KF5CalendarEvents SHARED ${calendar-integration_SRCS})
+generate_export_header(KF5CalendarEvents BASE_NAME CalendarEvents)
+add_library(KF5::CalendarEvents ALIAS KF5CalendarEvents)
+
+target_link_libraries(KF5CalendarEvents PUBLIC Qt5::Core)
+
+target_include_directories(KF5CalendarEvents INTERFACE "$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative>")
+set_target_properties(KF5CalendarEvents PROPERTIES VERSION ${KDECLARATIVE_VERSION}
+ SOVERSION ${KDECLARATIVE_SOVERSION}
+ EXPORT_NAME CalendarEvents
+)
+
+install(TARGETS KF5CalendarEvents EXPORT KF5DeclarativeTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
+
+ecm_generate_headers(CalendarEvents_CamelCase_HEADERS
+ HEADER_NAMES
+ CalendarEventsPlugin
+
+ PREFIX CalendarEvents
+ REQUIRED_HEADERS calendareventsplugin.h
+)
+install(FILES ${CalendarEvents_CamelCase_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/CalendarEvents COMPONENT Devel)
+
+install (FILES
+ calendareventsplugin.h
+ ${CMAKE_CURRENT_BINARY_DIR}/calendarevents_export.h
+ DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/calendarevents COMPONENT Devel
+)
--- /dev/null
+@PACKAGE_INIT@
+
+include(CMakeFindDependencyMacro)
+find_dependency(Qt5Core @REQUIRED_QT_VERSION@)
+
+include("${CMAKE_CURRENT_LIST_DIR}/CalendarEventsTargets.cmake")
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Martin Klapetek <mklapetek@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "calendareventsplugin.h"
+
+namespace CalendarEvents
+{
+CalendarEventsPlugin::CalendarEventsPlugin(QObject *parent)
+ : QObject(parent)
+{
+}
+
+CalendarEventsPlugin::~CalendarEventsPlugin()
+{
+}
+
+ShowEventInterface::~ShowEventInterface() = default;
+
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Martin Klapetek <mklapetek@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CALENDAREVENTSPLUGIN_H
+#define CALENDAREVENTSPLUGIN_H
+
+#include <QDateTime>
+#include <QMultiHash>
+#include <QObject>
+#include <QSharedDataPointer>
+
+#include "calendarevents_export.h"
+
+namespace CalendarEvents
+{
+class CALENDAREVENTS_EXPORT EventData
+{
+public:
+ enum EventType {
+ Holiday, // Any holiday
+ Event, // General event
+ Todo, // A Todo item
+ };
+
+ EventData();
+ EventData(const EventData &other);
+ ~EventData();
+
+ EventData &operator=(const EventData &other);
+
+ /**
+ * The start date and time of this event
+ */
+ QDateTime startDateTime() const;
+
+ /**
+ * Set the start date-time of this event
+ *
+ * @param startDateTime the date-time of when the event is starting
+ */
+ void setStartDateTime(const QDateTime &startDateTime);
+
+ /**
+ * The end date and time of this event
+ */
+ QDateTime endDateTime() const;
+
+ /**
+ * Set the end date-time of this event
+ *
+ * @param endDateTime the date-time of when the event is ending
+ */
+ void setEndDateTime(const QDateTime &endDateTime);
+
+ /**
+ * If true, this event goes on the whole day (eg. a holiday)
+ */
+ bool isAllDay() const;
+
+ /**
+ * If set to true, it will be displayed in the Calendar agenda
+ * without any time besides it, marked as "going on all day"
+ *
+ * This is useful for single-day events only, for multiple-day
+ * events, leave to false (default)
+ *
+ * @param isAllDay set to true if the event takes all day, false otherwise
+ * (defaults to false)
+ */
+ void setIsAllDay(bool isAllDay);
+
+ /**
+ * If true, this event won't mark the day in the calendar grid
+ * The main purpose for this flag is to support
+ * namedays, where in some countries the calendars have
+ * different name in them every day. This is just a minor holiday
+ * and as such should not mark the calendar grid, otherwise
+ * the whole grid would be in a different color.
+ */
+ bool isMinor() const;
+
+ /**
+ * If set to true, it won't be marked in the calendar grid
+ *
+ * @param isMinor true if it's a minor event (like a nameday holiday),
+ * false otherwise (defaults to false)
+ */
+ void setIsMinor(bool isMinor);
+
+ /**
+ * Event title
+ */
+ QString title() const;
+
+ /**
+ * Sets the title of the event
+ *
+ * @param title The event title
+ */
+ void setTitle(const QString &title);
+
+ /**
+ * Event description, can provide more details about the event
+ */
+ QString description() const;
+
+ /**
+ * Sets the event description, which allows to add more details
+ * about this event
+ *
+ * @param description The description
+ */
+ void setDescription(const QString &description);
+
+ /**
+ * Type of the current event, eg. a holiday, an event or a todo item
+ */
+ EventType type() const;
+
+ /**
+ * Sets the event type, eg. a holiday, an event or a todo item
+ *
+ * @param type The event type,
+ */
+ void setEventType(EventType type);
+
+ /**
+ * The color that should be used to mark this event with
+ * It comes in the HTML hex format, eg. #AARRGGBB or #RRGGBB
+ */
+ QString eventColor() const;
+
+ /**
+ * This is to support various calendar colors the user might
+ * have configured elsewhere
+ *
+ * @param color The color for this event in the HTML hex format
+ * eg. #AARRGGBB or #RRGGBB (this is passed directly
+ * to QML)
+ */
+ void setEventColor(const QString &color);
+
+ /**
+ * Unique ID of the event
+ */
+ QString uid() const;
+
+ /**
+ * Sets the uid of the event
+ *
+ * This is a mandatory field only if you want to use
+ * the eventModified/eventRemoved signals, otherwise
+ * setting it is optional
+ *
+ * @param uid A unique id, recommended is to use the plugin name as prefix (to keep it unique)
+ */
+ void setUid(const QString &uid);
+
+private:
+ class Private;
+ QSharedDataPointer<Private> d;
+};
+
+class CALENDAREVENTS_EXPORT CalendarEventsPlugin : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit CalendarEventsPlugin(QObject *parent = nullptr);
+ virtual ~CalendarEventsPlugin();
+
+ /**
+ * When this is called, the plugin should load all events data
+ * between those two date ranges. Once the data are ready, it should
+ * just emit the dataReady() signal. The range is usually one month
+ *
+ * @param startDate the start of the range
+ * @param endDate the end of the range
+ */
+ virtual void loadEventsForDateRange(const QDate &startDate, const QDate &endDate) = 0;
+
+Q_SIGNALS:
+ /**
+ * Emitted when the plugin has loaded the events data
+ *
+ * @param data A hash containing a QDate key for the event
+ * in the value, CalendarEvents::EventData, which holds all
+ * the details for the given event
+ * It's a multihash as there can be multiple events
+ * in the same day
+ * For multi-day events, insert just one with the key
+ * being the startdate of the event
+ */
+ void dataReady(const QMultiHash<QDate, CalendarEvents::EventData> &data);
+
+ /**
+ * Should be emitted when there is a modification of an event
+ * that was previously returned via the dataReady() signal
+ *
+ * @param event The modified event data
+ */
+ void eventModified(const CalendarEvents::EventData &modifiedEvent);
+
+ /**
+ * Should be emitted when the plugin removes some event
+ * from its collection
+ *
+ * @param uid The uid of the event that was removed
+ */
+ void eventRemoved(const QString &uid);
+};
+
+/**
+ * Interface for displaying event details
+ *
+ * ShowEventInterface is an additional interface the CalendarEventsPlugin
+ * implementations can implement if they support displaying details about
+ * events (e.g. opening the event in KOrganizer).
+ *
+ * @since 5.61
+ */
+class CALENDAREVENTS_EXPORT ShowEventInterface
+{
+public:
+ virtual ~ShowEventInterface();
+
+ /**
+ * When this is called, the plugin should show a window displaying the
+ * full preview of the event.
+ *
+ * The plugin should return true if the event details can be displayed, false
+ * otherwise.
+ */
+ virtual bool showEvent(const QString &uid) = 0;
+};
+
+}
+
+Q_DECLARE_INTERFACE(CalendarEvents::CalendarEventsPlugin, "org.kde.CalendarEventsPlugin")
+Q_DECLARE_INTERFACE(CalendarEvents::ShowEventInterface, "org.kde.CalendarEventsPlugin.ShowEventInterface")
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Martin Klapetek <mklapetek@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "calendareventsplugin.h"
+
+#include <QSharedData>
+
+class CalendarEvents::EventData::Private : public QSharedData
+{
+public:
+ Private()
+ : isAllDay(false)
+ , isMinor(false)
+ {
+ }
+ Private(const Private &other)
+ : QSharedData(other)
+ {
+ startDateTime = other.startDateTime;
+ endDateTime = other.endDateTime;
+ title = other.title;
+ description = other.description;
+ uid = other.uid;
+ eventColor = other.eventColor;
+ type = other.type;
+ isAllDay = other.isAllDay;
+ isMinor = other.isMinor;
+ }
+ ~Private()
+ {
+ }
+ QDateTime startDateTime; // Start of the event
+ QDateTime endDateTime; // End of the event
+ QString title; // Title of the event
+ QString description; // Additional info of the event
+ QString uid; // An internal event id, useful mostly just for the eventModified/Removed signals
+ QString eventColor; // Optional color of the event in the HTML hex format, eg. #AARRGGBB or #RRGGBB
+ EventType type; // Type of the event
+ bool isAllDay; // True if the event takes all day, then it won't be displayed with any time
+ bool isMinor; // A minor holiday that will not create a colored entry in the calendar
+};
+
+//---------------------------------------------------
+
+namespace CalendarEvents
+{
+EventData::EventData()
+ : d(new Private())
+{
+}
+
+EventData::EventData(const EventData &other)
+ : d(other.d)
+{
+}
+
+EventData::~EventData()
+{
+}
+
+EventData &EventData::operator=(const EventData &other)
+{
+ if (this == &other) {
+ return *this;
+ }
+
+ d = other.d;
+ return *this;
+}
+
+QDateTime EventData::startDateTime() const
+{
+ return d->startDateTime;
+}
+
+void EventData::setStartDateTime(const QDateTime &startDateTime)
+{
+ d->startDateTime = startDateTime;
+}
+
+QDateTime EventData::endDateTime() const
+{
+ return d->endDateTime;
+}
+
+void EventData::setEndDateTime(const QDateTime &endDateTime)
+{
+ d->endDateTime = endDateTime;
+}
+
+bool EventData::isAllDay() const
+{
+ return d->isAllDay;
+}
+
+void EventData::setIsAllDay(bool isAllDay)
+{
+ d->isAllDay = isAllDay;
+}
+
+bool EventData::isMinor() const
+{
+ return d->isMinor;
+}
+
+void EventData::setIsMinor(bool isMinor)
+{
+ d->isMinor = isMinor;
+}
+
+QString EventData::title() const
+{
+ return d->title;
+}
+
+void EventData::setTitle(const QString &title)
+{
+ d->title = title;
+}
+
+QString EventData::description() const
+{
+ return d->description;
+}
+
+void EventData::setDescription(const QString &description)
+{
+ d->description = description;
+}
+
+QString EventData::uid() const
+{
+ return d->uid;
+}
+
+void EventData::setUid(const QString &uid)
+{
+ d->uid = uid;
+}
+
+EventData::EventType EventData::type() const
+{
+ return d->type;
+}
+
+void EventData::setEventType(EventData::EventType type)
+{
+ d->type = type;
+}
+
+QString EventData::eventColor() const
+{
+ return d->eventColor;
+}
+
+void EventData::setEventColor(const QString &color)
+{
+ d->eventColor = color;
+}
+
+}
--- /dev/null
+
+set(kdeclarative_SRCS
+ configpropertymap.cpp
+ qmlobject.cpp
+ qmlobjectsharedengine.cpp
+ kdeclarative.cpp
+ private/kiconprovider.cpp
+)
+if(NOT ANDROID)
+ list(APPEND kdeclarative_SRCS private/kioaccessmanagerfactory.cpp)
+endif()
+
+add_library(KF5Declarative ${kdeclarative_SRCS})
+add_library(KF5::Declarative ALIAS KF5Declarative)
+ecm_generate_export_header(KF5Declarative
+ EXPORT_FILE_NAME ${KDeclarative_BINARY_DIR}/kdeclarative/kdeclarative_export.h
+ BASE_NAME KDeclarative
+ GROUP_BASE_NAME KF
+ VERSION ${KF_VERSION}
+ DEPRECATED_BASE_VERSION 0
+ DEPRECATION_VERSIONS 5.0 5.45 5.75
+ EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
+)
+
+# Apps must include <KDeclarative/File> or <kdeclarative/file.h>
+target_include_directories(KF5Declarative INTERFACE "$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative>")
+
+target_link_libraries(KF5Declarative
+ PUBLIC
+ KF5::ConfigCore # KCoreConfigSkeleton, in ConfigPropertyMap
+ Qt5::Qml
+ KF5::Package
+ PRIVATE
+ Qt5::Quick #QQuickImageProvider
+ KF5::I18n #i18n bindings
+ KF5::KIOWidgets #KIO::AccessManager
+ KF5::IconThemes #KIconProvider
+)
+set(KDeclarative_BUILD_INCLUDE_DIRS ${KDeclarative_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+target_include_directories(KF5Declarative PUBLIC "$<BUILD_INTERFACE:${KDeclarative_BUILD_INCLUDE_DIRS}>")
+
+set_target_properties(KF5Declarative
+ PROPERTIES VERSION ${KDECLARATIVE_VERSION}
+ SOVERSION ${KDECLARATIVE_SOVERSION}
+ EXPORT_NAME Declarative
+)
+
+# Install files
+ecm_generate_headers(KDeclarative_CamelCase_HEADERS
+ HEADER_NAMES
+ KDeclarative
+ QmlObject
+ QmlObjectSharedEngine
+ ConfigPropertyMap
+
+ PREFIX KDeclarative
+ REQUIRED_HEADERS KDeclarative_HEADERS
+)
+install(FILES ${KDeclarative_CamelCase_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/KDeclarative COMPONENT Devel)
+
+install(TARGETS KF5Declarative
+ EXPORT KF5DeclarativeTargets
+ ${KF5_INSTALL_TARGETS_DEFAULT_ARGS}
+)
+
+install(FILES
+ ${KDeclarative_BINARY_DIR}/kdeclarative/kdeclarative_export.h
+ ${KDeclarative_HEADERS}
+ DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/kdeclarative
+ COMPONENT Devel
+)
+
+# make available to ecm_add_qch in parent folder
+set(KDeclarative_QCH_SOURCES ${KDeclarative_HEADERS} PARENT_SCOPE)
+set(KDeclarative_QCH_INCLUDE_DIRS ${KDeclarative_BUILD_INCLUDE_DIRS} PARENT_SCOPE)
+
+include(ECMGeneratePriFile)
+ecm_generate_pri_file(BASE_NAME KDeclarative LIB_NAME KF5Declarative DEPS "qml" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative)
+install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR})
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2013 Marco Martin <notmart@gmail.com>
+ SPDX-FileCopyrightText: 2020 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "configpropertymap.h"
+
+#include <KCoreConfigSkeleton>
+#include <QJSValue>
+#include <QPointer>
+
+#include <functional>
+
+namespace KDeclarative
+{
+class ConfigPropertyMapPrivate
+{
+public:
+ ConfigPropertyMapPrivate(ConfigPropertyMap *map)
+ : q(map)
+ {
+ }
+
+ enum LoadConfigOption {
+ DontEmitValueChanged,
+ EmitValueChanged,
+ };
+
+ void loadConfig(LoadConfigOption option);
+ void writeConfig();
+ void writeConfigValue(const QString &key, const QVariant &value);
+
+ ConfigPropertyMap *q;
+ QPointer<KCoreConfigSkeleton> config;
+ bool updatingConfigValue = false;
+ bool autosave = true;
+ bool notify = false;
+};
+
+ConfigPropertyMap::ConfigPropertyMap(KCoreConfigSkeleton *config, QObject *parent)
+ : QQmlPropertyMap(this, parent)
+ , d(new ConfigPropertyMapPrivate(this))
+{
+ d->config = config;
+
+ // Reload the config only if the change signal has *not* been emitted by ourselves updating the config
+ connect(config, &KCoreConfigSkeleton::configChanged, this, [this]() {
+ if (!d->updatingConfigValue) {
+ d->loadConfig(ConfigPropertyMapPrivate::EmitValueChanged);
+ }
+ });
+ connect(this, &ConfigPropertyMap::valueChanged, this, [this](const QString &key, const QVariant &value) {
+ d->writeConfigValue(key, value);
+ });
+
+ d->loadConfig(ConfigPropertyMapPrivate::DontEmitValueChanged);
+}
+
+ConfigPropertyMap::~ConfigPropertyMap()
+{
+ if (d->autosave) {
+ d->writeConfig();
+ }
+ delete d;
+}
+
+bool KDeclarative::ConfigPropertyMap::isAutosave() const
+{
+ return d->autosave;
+}
+
+void ConfigPropertyMap::setAutosave(bool autosave)
+{
+ d->autosave = autosave;
+}
+
+bool ConfigPropertyMap::isNotify() const
+{
+ return d->notify;
+}
+
+void ConfigPropertyMap::setNotify(bool notify)
+{
+ d->notify = notify;
+}
+
+QVariant ConfigPropertyMap::updateValue(const QString &key, const QVariant &input)
+{
+ Q_UNUSED(key);
+ if (input.userType() == qMetaTypeId<QJSValue>()) {
+ return input.value<QJSValue>().toVariant();
+ }
+ return input;
+}
+
+bool ConfigPropertyMap::isImmutable(const QString &key) const
+{
+ KConfigSkeletonItem *item = d->config.data()->findItem(key);
+ if (item) {
+ return item->isImmutable();
+ }
+
+ return false;
+}
+
+void ConfigPropertyMapPrivate::loadConfig(ConfigPropertyMapPrivate::LoadConfigOption option)
+{
+ if (!config) {
+ return;
+ }
+
+ const auto &items = config.data()->items();
+ for (KConfigSkeletonItem *item : items) {
+ q->insert(item->key() + QStringLiteral("Default"), item->getDefault());
+ q->insert(item->key(), item->property());
+ if (option == EmitValueChanged) {
+ Q_EMIT q->valueChanged(item->key(), item->property());
+ }
+ }
+}
+
+void ConfigPropertyMapPrivate::writeConfig()
+{
+ if (!config) {
+ return;
+ }
+
+ const auto lstItems = config.data()->items();
+ for (KConfigSkeletonItem *item : lstItems) {
+ item->setWriteFlags(notify ? KConfigBase::Notify : KConfigBase::Normal);
+ item->setProperty(q->value(item->key()));
+ }
+
+ if (autosave) {
+ updatingConfigValue = true;
+ config.data()->save();
+ updatingConfigValue = false;
+ }
+}
+
+void ConfigPropertyMapPrivate::writeConfigValue(const QString &key, const QVariant &value)
+{
+ KConfigSkeletonItem *item = config.data()->findItem(key);
+ if (item) {
+ updatingConfigValue = true;
+ item->setWriteFlags(notify ? KConfigBase::Notify : KConfigBase::Normal);
+ item->setProperty(value);
+ if (autosave) {
+ config.data()->save();
+ // why read? read will update KConfigSkeletonItem::mLoadedValue,
+ // allowing a write operation to be performed next time
+ config.data()->read();
+ }
+ updatingConfigValue = false;
+ }
+}
+
+}
+
+#include "moc_configpropertymap.cpp"
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2013 Marco Martin <notmart@gmail.com>
+ SPDX-FileCopyrightText: 2020 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CONFIGPROPERTYMAP_H
+#define CONFIGPROPERTYMAP_H
+
+#include <QQmlPropertyMap>
+
+class KCoreConfigSkeleton;
+
+#include <kdeclarative/kdeclarative_export.h>
+
+namespace KDeclarative
+{
+class ConfigPropertyMapPrivate;
+
+/**
+ * @class KDeclarative::ConfigPropertyMap configpropertymap.h KDeclarative/ConfigPropertyMap
+ *
+ * An object that (optionally) automatically saves changes in a
+ * property map to a configuration object (e.g. a KConfig file).
+ */
+class KDECLARATIVE_EXPORT ConfigPropertyMap : public QQmlPropertyMap
+{
+ Q_OBJECT
+
+public:
+ ConfigPropertyMap(KCoreConfigSkeleton *config, QObject *parent = nullptr);
+ ~ConfigPropertyMap() override;
+
+ /**
+ * Indicates if the map calls save() on the config object on each write or not
+ *
+ * @return true if the map automatically saves (the default), false otherwise
+ * @since 5.65
+ */
+ bool isAutosave() const;
+
+ /**
+ * Allows to set the map into autosave mode or not
+ *
+ * @param autosave the new value for autosaving
+ * @since 5.65
+ */
+ void setAutosave(bool autosave);
+
+ /**
+ * Whether notifications on config changes are enabled. Disabled by default.
+ * @see KConfigBase::Notify
+ * @return true if writes send (dbus) notifications
+ * @since 5.73
+ */
+ bool isNotify() const;
+
+ /**
+ * Enable or disable notifications on config changes.
+ * @see KConfigBase::Notify
+ * @param notify whether to send notifications
+ * @since 5.73
+ */
+ void setNotify(bool notify);
+
+ /**
+ * @brief Whether the value at the given key is immutable
+ *
+ * @return true if the value is immutable, false if it isn't or it doesn't exist
+ */
+ Q_INVOKABLE bool isImmutable(const QString &key) const;
+
+protected:
+ QVariant updateValue(const QString &key, const QVariant &input) override;
+
+private:
+ ConfigPropertyMapPrivate *const d;
+};
+
+}
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "kdeclarative.h"
+#include "private/kdeclarative_p.h"
+#include "private/kiconprovider_p.h"
+#include "private/kioaccessmanagerfactory_p.h"
+#include "qmlobject.h"
+
+#include <QCoreApplication>
+#include <QQmlContext>
+#include <QQmlDebuggingEnabler>
+
+#include <KConfigGroup>
+#include <KSharedConfig>
+
+namespace KDeclarative
+{
+QStringList KDeclarativePrivate::s_runtimePlatform;
+
+KDeclarativePrivate::KDeclarativePrivate()
+ : contextObj(nullptr)
+{
+}
+
+KDeclarative::KDeclarative()
+ : d(new KDeclarativePrivate)
+{
+}
+
+KDeclarative::~KDeclarative()
+{
+ delete d;
+}
+
+void KDeclarative::setDeclarativeEngine(QQmlEngine *engine)
+{
+ if (d->declarativeEngine.data() == engine) {
+ return;
+ }
+ d->declarativeEngine = engine;
+}
+
+QQmlEngine *KDeclarative::declarativeEngine() const
+{
+ return d->declarativeEngine.data();
+}
+
+#if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 0)
+void KDeclarative::initialize()
+{
+}
+#endif
+
+#if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 45)
+void KDeclarative::setupBindings()
+{
+ setupContext();
+ setupEngine(d->declarativeEngine.data());
+}
+#endif
+
+#if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 75)
+void KDeclarative::setupContext()
+{
+ /*Create a context object for the root qml context.
+ in this way we can register global functions, in this case the i18n() family*/
+ if (!d->contextObj) {
+ d->contextObj = new KLocalizedContext(d->declarativeEngine.data());
+ }
+
+ // If the engine is in a qmlObject take the qmlObject rootContext instead of the engine one.
+ if (d->qmlObj) {
+ d->qmlObj->rootContext()->setContextObject(d->contextObj);
+ } else {
+ d->declarativeEngine.data()->rootContext()->setContextObject(d->contextObj);
+ }
+
+ if (!d->translationDomain.isNull()) {
+ d->contextObj->setTranslationDomain(d->translationDomain);
+ }
+}
+#endif
+
+void KDeclarative::setupEngine(QQmlEngine *engine)
+{
+#ifndef Q_OS_ANDROID
+ // get rid of stock network access manager factory
+ QQmlNetworkAccessManagerFactory *factory = engine->networkAccessManagerFactory();
+ engine->setNetworkAccessManagerFactory(nullptr);
+ delete factory;
+ engine->setNetworkAccessManagerFactory(new KIOAccessManagerFactory());
+#endif
+
+ /* Tell the engine to search for platform-specific imports first
+ (so it will "win" in import name resolution).
+ addImportPath adds the path at the beginning, so to honour user's
+ paths we need to traverse the list in reverse order */
+ const QStringList pluginPathList = engine->importPathList();
+
+ const QString target = componentsTarget();
+ if (target != defaultComponentsTarget()) {
+ const QStringList paths = pluginPathList;
+ QStringListIterator it(paths);
+ it.toBack();
+ while (it.hasPrevious()) {
+ QString path = it.previous();
+ path = path.left(path.lastIndexOf(QLatin1Char('/')));
+ engine->addImportPath(path + QStringLiteral("/platformqml/") + target);
+ }
+ }
+
+ // setup ImageProvider for KDE icons
+ engine->addImageProvider(QStringLiteral("icon"), new KIconProvider);
+}
+
+#if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 75)
+void KDeclarative::setTranslationDomain(const QString &translationDomain)
+{
+ d->translationDomain = translationDomain;
+ if (d->contextObj) {
+ d->contextObj->setTranslationDomain(d->translationDomain);
+ }
+}
+#endif
+
+#if KDECLARATIVE_BUILD_DEPRECATED_SINCE(5, 75)
+QString KDeclarative::translationDomain() const
+{
+ return d->translationDomain;
+}
+#endif
+
+void KDeclarative::setupQmlJsDebugger()
+{
+#if QT_CONFIG(qml_debug)
+ if (QCoreApplication::arguments().contains(QLatin1String("-qmljsdebugger"))) {
+ QQmlDebuggingEnabler enabler;
+ }
+#endif
+}
+
+QString KDeclarative::defaultComponentsTarget()
+{
+ return QLatin1String("desktop");
+}
+
+QString KDeclarative::componentsTarget()
+{
+ const QStringList platform = runtimePlatform();
+ if (platform.isEmpty()) {
+ return defaultComponentsTarget();
+ }
+
+ return platform.last();
+}
+
+QStringList KDeclarative::runtimePlatform()
+{
+ if (KDeclarativePrivate::s_runtimePlatform.isEmpty()) {
+ const QString env = QString::fromLocal8Bit(getenv("PLASMA_PLATFORM"));
+ KDeclarativePrivate::s_runtimePlatform = QStringList(env.split(QLatin1Char(':'), Qt::SkipEmptyParts));
+ if (KDeclarativePrivate::s_runtimePlatform.isEmpty()) {
+ KConfigGroup cg(KSharedConfig::openConfig(), "General");
+ KDeclarativePrivate::s_runtimePlatform = cg.readEntry(QStringLiteral("runtimePlatform"), KDeclarativePrivate::s_runtimePlatform);
+ }
+ }
+
+ return KDeclarativePrivate::s_runtimePlatform;
+}
+
+void KDeclarative::setRuntimePlatform(const QStringList &platform)
+{
+ KDeclarativePrivate::s_runtimePlatform = platform;
+}
+
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KDECLARATIVE_H
+#define KDECLARATIVE_H
+
+#include <QQmlEngine>
+
+#include <kdeclarative/kdeclarative_export.h>
+
+#include <QStringList>
+
+class QQmlEngine;
+
+namespace KDeclarative
+{
+class KDeclarativePrivate;
+
+/**
+ * @class KDeclarative::KDeclarative kdeclarative.h <KDeclarative/KDeclarative>
+ *
+ * The KDeclarative class is used to manipulate the QQmlEngine instance used by
+ * the application and to get some information about the platform,
+ * that influences the behavior of the QML components.
+ *
+ * In order to use it, you will need a pointer to a QQmlEngine, and call
+ * `setupEngine(engine)` at least once on the engine.
+ * @code
+ * KDeclarative::KDeclarative::setupEngine(engine); // if not done elsewhere
+ * @endcode
+ *
+ * To setup integration with KI18n's translation methods and thus being able to call
+ * i18n() from anywhere in your QML code., you set a KLocalizedContext from Ki18n
+ * directly like this (since KF 5.17):
+ * @code
+ * KLocalizedContext *localizedContextObject = new KLocalizedContext(engine);
+ * // if not using the global application domain, set custom domain name
+ * localizedContextObject->setTranslationDomain(QStringLiteral("mydomainname"));
+ * engine->rootContext()->setContextObject(localizedContextObject);
+ * @endcode
+ *
+ * In case your code should work with KF versions before 5.17, use these deprecated
+ * calls instead:
+ * @code
+ * KDeclarative::KDeclarative decl;
+ * decl.setDeclarativeEngine(engine);
+ * // if not using the global application domain, set custom domain name
+ * decl.setTranslationDomain(QStringLiteral("mydomainname"));
+ * decl.setupContext();
+ * @endcode
+ *
+ */
+class KDECLARATIVE_EXPORT KDeclarative
+{
+public:
+ explicit KDeclarative();
+ ~KDeclarative();
+
+ KDeclarative(const KDeclarative &) = delete;
+ KDeclarative &operator=(const KDeclarative &) = delete;
+
+#if KDECLARATIVE_ENABLE_DEPRECATED_SINCE(5, 0)
+ /**
+ * @deprecated since 5.0. The method is a no-op now, any call can be simply removed.
+ */
+ KDECLARATIVE_DEPRECATED_VERSION(5, 0, "Is a no-op")
+ void initialize();
+#endif
+
+#if KDECLARATIVE_ENABLE_DEPRECATED_SINCE(5, 45)
+ /**
+ * Call this after setDeclarativeEngine to set the i18n global functions, the runtime platform, etc
+ *
+ * @deprecated since 5.45 use setupContext() and setupEngine()
+ */
+ KDECLARATIVE_DEPRECATED_VERSION(5, 45, "Call setupContext() and setupEngine() independently")
+ void setupBindings();
+#endif
+
+#if KDECLARATIVE_ENABLE_DEPRECATED_SINCE(5, 75)
+ /**
+ * Call this after setDeclarativeEngine to set the i18n global functions.
+ *
+ * @sa setupEngine
+ * @since 5.45
+ * @deprecated Since 5.17 set KLocalizedContext directly, see documentation in KI18n::KLocalizedContext
+ */
+ KDECLARATIVE_DEPRECATED_VERSION_BELATED(5, 75, 5, 17, "set KLocalizedContext directly, see documentation in KI18n::KLocalizedContext")
+ void setupContext();
+#endif
+
+ /**
+ * Assign a specific QQmlEngine to be used in this KDeclarative.
+ *
+ * A KDeclarative object works with a specific QQmlEngine. There
+ * is no default engine, so you **must** call this function with a
+ * non-null pointer to an engine before calling setupBindings()
+ * or setupContext(), which set properties on the engine.
+ *
+ * The KDeclarative object does not take ownership of the engine.
+ *
+ * @param engine the engine to use in this KDeclarative object
+ * @sa setupContext(), setupEngine()
+ * @since 5.0
+ */
+ void setDeclarativeEngine(QQmlEngine *engine);
+ /**
+ * @return the engine assigned to this KDeclarative.
+ * The engine may be a @c nullptr . No ownership is transferred.
+ * @sa setDeclarativeEngine(), setupEngine()
+ * @since 5.0
+ */
+ QQmlEngine *declarativeEngine() const;
+
+#if KDECLARATIVE_ENABLE_DEPRECATED_SINCE(5, 75)
+ /**
+ * Call this method before calling setupContext to install a translation domain for all
+ * i18n global functions. If a translation domain is set all i18n calls delegate to the
+ * matching i18nd calls with the provided translation domain.
+ *
+ * The translationDomain affects all i18n calls including those from imports. Because of
+ * that modules intended to be used as imports should prefer the i18nd variants and set
+ * the translation domain explicitly in each call.
+ *
+ * This method is only required if your declarative usage is inside a library. If it's
+ * in an application there is no need to set the translation domain as the application's
+ * domain can be used.
+ *
+ * @param translationDomain The translation domain to be used for i18n calls.
+ * @since 5.0
+ * @deprecated Since 5.17 use KLocalizedContext::setTranslationDomain
+ */
+ KDECLARATIVE_DEPRECATED_VERSION_BELATED(5, 75, 5, 17, "set via KLocalizedContext::setTranslationDomain")
+ void setTranslationDomain(const QString &translationDomain);
+#endif
+
+#if KDECLARATIVE_ENABLE_DEPRECATED_SINCE(5, 75)
+ /**
+ * @return the translation domain for the i18n calls done in this QML engine
+ * @since 5.0
+ * @deprecated Since 5.17 use KLocalizedContext::translationDomain
+ */
+ KDECLARATIVE_DEPRECATED_VERSION_BELATED(5, 75, 5, 17, "available via KLocalizedContext::translationDomain")
+ QString translationDomain() const;
+#endif
+
+ /**
+ * This method must be called very early at startup time to ensure the
+ * QQuickDebugger is enabled. Ideally it should be called in main(),
+ * after command-line options are defined.
+ * @since 5.0
+ */
+ static void setupQmlJsDebugger();
+
+ /**
+ * @return the runtime platform, e.g. "desktop" or "tablet, touch". The first entry/ies in
+ * the list relate to the platform formfactor and the last is the input method
+ * specialization. If the string is empty, there is no specified runtime platform
+ * and a traditional desktop environment may be assumed
+ * @since 4.10
+ */
+ static QStringList runtimePlatform();
+
+ /**
+ * Sets the runtime platform from now on, globally to the process.
+ * Already loaded QML components won't be affected.
+ * @since 5.0
+ */
+ static void setRuntimePlatform(const QStringList &platform);
+
+ /**
+ * @return the QML components target, based on the runtime platform. e.g. touch or desktop
+ * @since 4.10
+ */
+ static QString componentsTarget();
+
+ /**
+ * @return the default components target; can be used to compare against the returned value
+ * from @see componentsTarget()
+ * @since 4.10
+ */
+ static QString defaultComponentsTarget();
+
+ /**
+ * Setup a QML engine for use with any KDeclarative object.
+ *
+ * This needs to be done only once per QQmlEngine instance. An
+ * engine that is shared between KDeclarative objects only needs
+ * to be setup once. The engine is setup for the component target
+ * (runtime platform) that is configured at the time setupEngine()
+ * is called. The following things are added to the engine:
+ * - a KIOAccessManagerFactory, replacing any existing stock QQmlNetworkAccessManagerFactory
+ * - a QML icon provider, enabling the Image {} element to load images using the scheme "image:/"
+ *
+ * @param engine the engine to setup
+ * @sa setupContext(), componentsTarget()
+ * @since 5.45
+ */
+ static void setupEngine(QQmlEngine *engine);
+
+private:
+ KDeclarativePrivate *const d;
+ friend class QmlObject;
+};
+
+}
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KDECLARATIVE_P_H
+#define KDECLARATIVE_P_H
+
+#include "kdeclarative.h"
+#include "qmlobject.h"
+
+#include <KLocalizedContext>
+#include <QPointer>
+
+namespace KDeclarative
+{
+class KDeclarativePrivate
+{
+public:
+ KDeclarativePrivate();
+
+ QPointer<QQmlEngine> declarativeEngine;
+ QString translationDomain;
+ static QStringList s_runtimePlatform;
+ QPointer<KLocalizedContext> contextObj;
+ QPointer<QmlObject> qmlObj;
+};
+
+}
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Artur Duque de Souza <asouza@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "kiconprovider_p.h"
+
+#include <KIconEffect>
+#include <KIconLoader>
+#include <QIcon>
+#include <QPixmap>
+#include <QSize>
+
+namespace KDeclarative
+{
+KIconProvider::KIconProvider()
+ : QQuickImageProvider(QQuickImageProvider::Pixmap)
+{
+}
+
+QPixmap KIconProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
+{
+ // We need to handle QIcon::state
+ const QStringList source = id.split(QLatin1Char('/'));
+
+ QPixmap pixmap;
+ if (requestedSize.isValid()) {
+ pixmap = QIcon::fromTheme(source.at(0)).pixmap(requestedSize);
+ } else if (size->isValid()) {
+ pixmap = QIcon::fromTheme(source.at(0)).pixmap(*size);
+ } else {
+ pixmap = QIcon::fromTheme(source.at(0)).pixmap(KIconLoader::global()->currentSize(KIconLoader::Desktop));
+ }
+
+ if (source.size() == 2) {
+ KIconEffect *effect = KIconLoader::global()->iconEffect();
+ const QString state(source.at(1));
+ int finalState = KIconLoader::DefaultState;
+
+ if (state == QLatin1String("active")) {
+ finalState = KIconLoader::ActiveState;
+ } else if (state == QLatin1String("disabled")) {
+ finalState = KIconLoader::DisabledState;
+ } else if (state == QLatin1String("last")) {
+ finalState = KIconLoader::LastState;
+ }
+
+ // apply the effect for state
+ pixmap = effect->apply(pixmap, KIconLoader::Desktop, finalState);
+ }
+
+ if (!pixmap.isNull() && size) {
+ *size = pixmap.size();
+ }
+
+ return pixmap;
+}
+
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Artur Duque de Souza <asouza@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef ICON_PROVIDER_H
+#define ICON_PROVIDER_H
+
+#include <QQuickImageProvider>
+
+namespace KDeclarative
+{
+class KIconProvider : public QQuickImageProvider
+{
+public:
+ KIconProvider();
+ QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override;
+};
+
+}
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 Marco Martin <notmart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "kioaccessmanagerfactory_p.h"
+#include <kio/accessmanager.h>
+
+namespace KDeclarative
+{
+KIOAccessManagerFactory::KIOAccessManagerFactory()
+ : QQmlNetworkAccessManagerFactory()
+{
+}
+
+KIOAccessManagerFactory::~KIOAccessManagerFactory()
+{
+}
+
+QNetworkAccessManager *KIOAccessManagerFactory::create(QObject *parent)
+{
+ return new KIO::AccessManager(parent);
+}
+
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 Marco Martin <notmart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KIOACCESSMANAGERFACTORY_H
+#define KIOACCESSMANAGERFACTORY_H
+
+#include <QQmlNetworkAccessManagerFactory>
+
+namespace KDeclarative
+{
+class KIOAccessManagerFactory : public QQmlNetworkAccessManagerFactory
+{
+public:
+ KIOAccessManagerFactory();
+ ~KIOAccessManagerFactory();
+ QNetworkAccessManager *create(QObject *parent) override;
+};
+
+}
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "qmlobject.h"
+#include "private/kdeclarative_p.h"
+
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQmlIncubator>
+#include <QQuickItem>
+#include <QTimer>
+
+#include <KPackage/PackageLoader>
+#include <QDebug>
+#include <kdeclarative.h>
+
+//#include "packageaccessmanagerfactory.h"
+//#include "private/declarative/dataenginebindings_p.h"
+
+namespace KDeclarative
+{
+class QmlObjectIncubator : public QQmlIncubator
+{
+public:
+ QVariantHash m_initialProperties;
+
+protected:
+ void setInitialState(QObject *object) override
+ {
+ QHashIterator<QString, QVariant> i(m_initialProperties);
+ while (i.hasNext()) {
+ i.next();
+ object->setProperty(i.key().toLatin1().data(), i.value());
+ }
+ }
+};
+
+class QmlObjectPrivate
+{
+public:
+ QmlObjectPrivate(QmlObject *parent)
+ : q(parent)
+ , engine(nullptr)
+ , component(nullptr)
+ , delay(false)
+ {
+ executionEndTimer = new QTimer(q);
+ executionEndTimer->setInterval(0);
+ executionEndTimer->setSingleShot(true);
+ QObject::connect(executionEndTimer, SIGNAL(timeout()), q, SLOT(scheduleExecutionEnd()));
+ }
+
+ ~QmlObjectPrivate()
+ {
+ delete incubator.object();
+ }
+
+ void errorPrint(QQmlComponent *component);
+ void execute(const QUrl &source);
+ void scheduleExecutionEnd();
+ void minimumWidthChanged();
+ void minimumHeightChanged();
+ void maximumWidthChanged();
+ void maximumHeightChanged();
+ void preferredWidthChanged();
+ void preferredHeightChanged();
+ void checkInitializationCompleted();
+
+ QmlObject *q;
+
+ QUrl source;
+ QQmlEngine *engine;
+ QmlObjectIncubator incubator;
+ QQmlComponent *component;
+ QTimer *executionEndTimer;
+ KDeclarative kdeclarative;
+ KLocalizedContext *context{nullptr};
+ KPackage::Package package;
+ QQmlContext *rootContext;
+ bool delay : 1;
+};
+
+void QmlObjectPrivate::errorPrint(QQmlComponent *component)
+{
+ QString errorStr = QStringLiteral("Error loading QML file.\n");
+ if (component->isError()) {
+ const QList<QQmlError> errors = component->errors();
+ for (const QQmlError &error : errors) {
+ errorStr +=
+ (error.line() > 0 ? QString(QString::number(error.line()) + QLatin1String(": ")) : QLatin1String("")) + error.description() + QLatin1Char('\n');
+ }
+ }
+ qWarning() << component->url().toString() << '\n' << errorStr;
+}
+
+void QmlObjectPrivate::execute(const QUrl &source)
+{
+ if (source.isEmpty()) {
+ qWarning() << "File name empty!";
+ return;
+ }
+
+ delete component;
+ component = new QQmlComponent(engine, q);
+ QObject::connect(component, &QQmlComponent::statusChanged, q, &QmlObject::statusChanged, Qt::QueuedConnection);
+ delete incubator.object();
+
+ component->loadUrl(source);
+
+ if (delay) {
+ executionEndTimer->start(0);
+ } else {
+ scheduleExecutionEnd();
+ }
+}
+
+void QmlObjectPrivate::scheduleExecutionEnd()
+{
+ if (component->isReady() || component->isError()) {
+ q->completeInitialization();
+ } else {
+ QObject::connect(component, SIGNAL(statusChanged(QQmlComponent::Status)), q, SLOT(completeInitialization()));
+ }
+}
+
+QmlObject::QmlObject(QObject *parent)
+ // cannot do : QmlObject(new QQmlEngine(this), d->engine->rootContext(), parent)
+ : QObject(parent)
+ , d(new QmlObjectPrivate(this))
+
+{
+ d->engine = new QQmlEngine(this);
+ d->rootContext = d->engine->rootContext();
+ d->kdeclarative.setDeclarativeEngine(d->engine);
+ d->kdeclarative.d->qmlObj = this;
+
+ d->context = new KLocalizedContext(this);
+ d->rootContext->setContextObject(d->context);
+ KDeclarative::setupEngine(d->engine);
+}
+
+QmlObject::QmlObject(QQmlEngine *engine, QObject *parent)
+ : QmlObject(engine, engine->rootContext(), parent)
+{
+}
+
+QmlObject::QmlObject(QQmlEngine *engine, QQmlContext *rootContext, QObject *parent)
+ : QmlObject(engine, rootContext, nullptr /*call setupEngine*/, parent)
+{
+}
+
+QmlObject::QmlObject(QQmlEngine *engine, QQmlContext *rootContext, QmlObject *obj, QObject *parent)
+ : QObject(parent)
+ , d(new QmlObjectPrivate(this))
+{
+ if (engine) {
+ d->engine = engine;
+ } else {
+ d->engine = new QQmlEngine(this);
+ }
+
+ if (rootContext) {
+ d->rootContext = rootContext;
+ } else {
+ d->rootContext = d->engine->rootContext();
+ }
+ d->kdeclarative.setDeclarativeEngine(d->engine);
+ d->kdeclarative.d->qmlObj = this;
+
+ d->context = new KLocalizedContext(this);
+ d->rootContext->setContextObject(d->context);
+
+ if (!obj) {
+ KDeclarative::setupEngine(d->engine);
+ }
+}
+
+QmlObject::~QmlObject()
+{
+ // QDeclarativeNetworkAccessManagerFactory *factory = d->engine->networkAccessManagerFactory();
+ // d->engine->setNetworkAccessManagerFactory(0);
+ // delete factory;
+ delete d;
+}
+
+void QmlObject::setTranslationDomain(const QString &translationDomain)
+{
+ d->context->setTranslationDomain(translationDomain);
+}
+
+QString QmlObject::translationDomain() const
+{
+ return d->context->translationDomain();
+}
+
+void QmlObject::setSource(const QUrl &source)
+{
+ d->source = source;
+ d->execute(source);
+}
+
+QUrl QmlObject::source() const
+{
+ return d->source;
+}
+
+void QmlObject::loadPackage(const QString &packageName)
+{
+ d->package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("KPackage/GenericQML"));
+ d->package.setPath(packageName);
+ setSource(QUrl::fromLocalFile(d->package.filePath("mainscript")));
+}
+
+void QmlObject::setPackage(const KPackage::Package &package)
+{
+ d->package = package;
+ setSource(QUrl::fromLocalFile(package.filePath("mainscript")));
+}
+
+KPackage::Package QmlObject::package() const
+{
+ return d->package;
+}
+
+void QmlObject::setInitializationDelayed(const bool delay)
+{
+ d->delay = delay;
+}
+
+bool QmlObject::isInitializationDelayed() const
+{
+ return d->delay;
+}
+
+QQmlEngine *QmlObject::engine()
+{
+ return d->engine;
+}
+
+QObject *QmlObject::rootObject() const
+{
+ if (d->incubator.status() == QQmlIncubator::Loading) {
+ qWarning() << "Trying to use rootObject before initialization is completed, whilst using setInitializationDelayed. Forcing completion";
+ d->incubator.forceCompletion();
+ }
+ return d->incubator.object();
+}
+
+QQmlComponent *QmlObject::mainComponent() const
+{
+ return d->component;
+}
+
+QQmlContext *QmlObject::rootContext() const
+{
+ return d->rootContext;
+}
+
+QQmlComponent::Status QmlObject::status() const
+{
+ if (!d->engine) {
+ return QQmlComponent::Error;
+ }
+
+ if (!d->component) {
+ return QQmlComponent::Null;
+ }
+
+ return QQmlComponent::Status(d->component->status());
+}
+
+void QmlObjectPrivate::checkInitializationCompleted()
+{
+ if (!incubator.isReady() && incubator.status() != QQmlIncubator::Error) {
+ QTimer::singleShot(0, q, SLOT(checkInitializationCompleted()));
+ return;
+ }
+
+ if (!incubator.object()) {
+ errorPrint(component);
+ }
+
+ Q_EMIT q->finished();
+}
+
+void QmlObject::completeInitialization(const QVariantHash &initialProperties)
+{
+ d->executionEndTimer->stop();
+ if (d->incubator.object()) {
+ return;
+ }
+
+ if (!d->component) {
+ qWarning() << "No component for" << source();
+ return;
+ }
+
+ if (d->component->status() != QQmlComponent::Ready || d->component->isError()) {
+ d->errorPrint(d->component);
+ return;
+ }
+
+ d->incubator.m_initialProperties = initialProperties;
+ d->component->create(d->incubator, d->rootContext);
+
+ if (d->delay) {
+ d->checkInitializationCompleted();
+ } else {
+ d->incubator.forceCompletion();
+
+ if (!d->incubator.object()) {
+ d->errorPrint(d->component);
+ }
+ Q_EMIT finished();
+ }
+}
+
+QObject *QmlObject::createObjectFromSource(const QUrl &source, QQmlContext *context, const QVariantHash &initialProperties)
+{
+ QQmlComponent *component = new QQmlComponent(d->engine, this);
+ component->loadUrl(source);
+
+ return createObjectFromComponent(component, context, initialProperties);
+}
+
+QObject *QmlObject::createObjectFromComponent(QQmlComponent *component, QQmlContext *context, const QVariantHash &initialProperties)
+{
+ QmlObjectIncubator incubator;
+ incubator.m_initialProperties = initialProperties;
+ component->create(incubator, context ? context : d->rootContext);
+ incubator.forceCompletion();
+
+ QObject *object = incubator.object();
+
+ if (!component->isError() && object) {
+ // memory management
+ component->setParent(object);
+ // reparent to root object if wasn't specified otherwise by initialProperties
+ if (!initialProperties.contains(QLatin1String("parent"))) {
+ if (qobject_cast<QQuickItem *>(rootObject())) {
+ object->setProperty("parent", QVariant::fromValue(rootObject()));
+ } else {
+ object->setParent(rootObject());
+ }
+ }
+
+ return object;
+
+ } else {
+ d->errorPrint(component);
+ delete object;
+ return nullptr;
+ }
+}
+
+}
+
+#include "moc_qmlobject.cpp"
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef QMLOBJECT_H
+#define QMLOBJECT_H
+
+#include <QObject>
+
+#include <QQmlComponent>
+
+#include <KPackage/Package>
+#include <kdeclarative/kdeclarative_export.h>
+
+class QQmlEngine;
+class QQmlComponent;
+class QQmlContext;
+
+namespace KDeclarative
+{
+class QmlObjectPrivate;
+
+/**
+ * @class KDeclarative::QmlObject qmlobject.h KDeclarative/QmlObject
+ *
+ * @author Marco Martin <mart@kde.org>
+ *
+ * @short An object that instantiates an entire QML context, with its own declarative engine
+ *
+ * KDeclarative::QmlObject provides a class to conveniently use QML based
+ * declarative user interfaces inside Plasma widgets.
+ * A QmlObject corresponds to one QML file (which can include others).
+ * It will have its own QQmlEngine with a single root object,
+ * described in the QML file.
+ */
+class KDECLARATIVE_EXPORT QmlObject : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QUrl source READ source WRITE setSource)
+ Q_PROPERTY(QString translationDomain READ translationDomain WRITE setTranslationDomain)
+ Q_PROPERTY(bool initializationDelayed READ isInitializationDelayed WRITE setInitializationDelayed)
+ Q_PROPERTY(QObject *rootObject READ rootObject)
+ Q_PROPERTY(QQmlComponent::Status status READ status NOTIFY statusChanged)
+
+public:
+ /**
+ * Constructs a new QmlObject
+ *
+ * @param parent the parent of this object
+ */
+ explicit QmlObject(QObject *parent = nullptr);
+
+ /**
+ * Constructs a new QmlObject
+ *
+ * @param engine a QQmlEngine we want to use
+ * @param parent the parent of this object
+ */
+ explicit QmlObject(QQmlEngine *engine, QObject *parent = nullptr);
+
+ /**
+ * Constructs a new QmlObject
+ *
+ * @param engine the QQmlEngine to use
+ * @param rootContext the root context to use for object creation
+ * @param parent the parent of this object
+ */
+ explicit QmlObject(QQmlEngine *engine, QQmlContext *rootContext, QObject *parent = nullptr);
+ ~QmlObject();
+
+ /**
+ * Call this method before calling setupBindings to install a translation domain for all
+ * i18n global functions. If a translation domain is set all i18n calls delegate to the
+ * matching i18nd calls with the provided translation domain.
+ *
+ * The translationDomain affects all i18n calls including those from imports. Because of
+ * that modules intended to be used as imports should prefer the i18nd variants and set
+ * the translation domain explicitly in each call.
+ *
+ * This method is only required if your declarative usage is inside a library. If it's
+ * in an application there is no need to set the translation domain as the application's
+ * domain can be used.
+ *
+ * @param translationDomain The translation domain to be used for i18n calls.
+ * @since 5.0
+ */
+ void setTranslationDomain(const QString &translationDomain);
+
+ /**
+ * @return the translation domain for the i18n calls done in this QML engine
+ * @since 5.0
+ */
+ QString translationDomain() const;
+
+ /**
+ * Sets the path of the QML file to parse and execute
+ *
+ * @param path the absolute path of a QML file
+ */
+ void setSource(const QUrl &source);
+
+ /**
+ * @return the absolute path of the current QML file
+ */
+ QUrl source() const;
+
+ /**
+ * Load the package called packageName, then loads the
+ * mainscript file for that package
+ *
+ * @param packageName the plugin name of the package
+ */
+ void loadPackage(const QString &packageName);
+
+ /**
+ * Sets a package, then loads the
+ * mainscript file for that package
+ *
+ * @param package the package we want to use to provide QML
+ * files to this QML object
+ */
+ void setPackage(const KPackage::Package &package);
+
+ /**
+ * @return the optional package, if any
+ */
+ KPackage::Package package() const;
+
+ /**
+ * Sets whether the execution of the QML file has to be delayed later in the event loop. It has to be called before setQmlPath().
+ * In this case it will be possible to assign new objects in the main engine context
+ * before the main component gets initialized.
+ * In that case it will be possible to access it immediately from the QML code.
+ * The initialization will either be completed automatically asynchronously
+ * or explicitly by calling completeInitialization()
+ *
+ * @param delay if true the initialization of the QML file will be delayed
+ * at the end of the event loop
+ */
+ void setInitializationDelayed(const bool delay);
+
+ /**
+ * @return true if the initialization of the QML file will be delayed
+ * at the end of the event loop
+ */
+ bool isInitializationDelayed() const;
+
+ /**
+ * @return the declarative engine that runs the qml file assigned to this widget.
+ */
+ QQmlEngine *engine();
+
+ /**
+ * @return the root object of the declarative object tree
+ */
+ QObject *rootObject() const;
+
+ /**
+ * @return the main QQmlComponent of the engine
+ */
+ QQmlComponent *mainComponent() const;
+
+ /**
+ * The components's creation context.
+ * @since 5.11
+ */
+ QQmlContext *rootContext() const;
+
+ /**
+ * The component's current status.
+ * @since 5.11
+ */
+ QQmlComponent::Status status() const;
+
+ /**
+ * Creates and returns an object based on the provided url to a Qml file
+ * with the same QQmlEngine and the same root context as the main object,
+ * that will be the parent of the newly created object
+ * @param source url where the QML file is located
+ * @param context The QQmlContext in which we will create the object,
+ * if 0 it will use the engine's root context
+ * @param initialProperties optional properties that will be set on
+ * the object when created (and before Component.onCompleted
+ * gets emitted
+ */
+ QObject *createObjectFromSource(const QUrl &source, QQmlContext *context = nullptr, const QVariantHash &initialProperties = QVariantHash());
+
+ /**
+ * Creates and returns an object based on the provided QQmlComponent
+ * with the same QQmlEngine and the same root context as the admin object,
+ * that will be the parent of the newly created object
+ * @param component the component we want to instantiate
+ * @param context The QQmlContext in which we will create the object,
+ * if 0 it will use the engine's root context
+ * @param initialProperties optional properties that will be set on
+ * the object when created (and before Component.onCompleted
+ * gets emitted
+ */
+ QObject *createObjectFromComponent(QQmlComponent *component, QQmlContext *context = nullptr, const QVariantHash &initialProperties = QVariantHash());
+
+public Q_SLOTS:
+ /**
+ * Finishes the process of initialization.
+ * If isInitializationDelayed() is false, calling this will have no effect.
+ * @param initialProperties optional properties that will be set on
+ * the object when created (and before Component.onCompleted
+ * gets emitted
+ */
+ void completeInitialization(const QVariantHash &initialProperties = QVariantHash());
+
+Q_SIGNALS:
+ /**
+ * Emitted when the parsing and execution of the QML file is terminated
+ */
+ void finished();
+
+ void statusChanged(QQmlComponent::Status);
+
+protected:
+ /**
+ * Constructs a new QmlObject
+ *
+ * @param engine a QQmlEngine we want to use
+ * @param rootContext the root context we want to use for objects creation
+ * @param obj setupEngine is called when this is set to nullptr. This way the creator can
+ * influence if the engine should be initialized or not in case it is shared between
+ * multiple objects (such as QmlObjectSharedEngine)
+ * @param parent the parent of this object
+ * @since 5.45
+ */
+ explicit QmlObject(QQmlEngine *engine, QQmlContext *rootContext, QmlObject *obj, QObject *parent = nullptr);
+
+private:
+ friend class QmlObjectPrivate;
+ QmlObjectPrivate *const d;
+
+ Q_PRIVATE_SLOT(d, void scheduleExecutionEnd())
+ Q_PRIVATE_SLOT(d, void checkInitializationCompleted())
+};
+
+}
+
+#endif // multiple inclusion guard
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "qmlobjectsharedengine.h"
+
+#include <QQmlContext>
+#include <QQmlEngine>
+
+#include <QDebug>
+#include <kdeclarative.h>
+
+namespace KDeclarative
+{
+class QmlObjectSharedEnginePrivate
+{
+public:
+ QmlObjectSharedEnginePrivate()
+ {
+ // ensure the engine is present, then ref it
+ engine();
+ engineRef = s_engine;
+ }
+
+ ~QmlObjectSharedEnginePrivate()
+ {
+ // when the only remaining are out two refs, reset the pointers, causing deletion
+ // when the refcount is 2, we are sure that the only refs are s_engine and our copy
+ // of engineRef
+ if (engineRef.use_count() == 2) {
+ s_engine.reset();
+ }
+ }
+
+ static QQmlEngine *engine()
+ {
+ if (!s_engine) {
+ s_engine = std::make_shared<QQmlEngine>();
+ KDeclarative::setupEngine(s_engine.get());
+ }
+ return s_engine.get();
+ }
+
+ // used to delete it
+ std::shared_ptr<QQmlEngine> engineRef;
+
+ static std::shared_ptr<QQmlEngine> s_engine;
+};
+
+std::shared_ptr<QQmlEngine> QmlObjectSharedEnginePrivate::s_engine = std::shared_ptr<QQmlEngine>();
+
+QmlObjectSharedEngine::QmlObjectSharedEngine(QObject *parent)
+ : QmlObject(QmlObjectSharedEnginePrivate::engine(), new QQmlContext(QmlObjectSharedEnginePrivate::engine()), this /*don't call setupEngine*/, parent)
+ , d(new QmlObjectSharedEnginePrivate())
+{
+ rootContext()->setParent(this);
+}
+
+QmlObjectSharedEngine::~QmlObjectSharedEngine()
+{
+}
+
+}
+
+#include "moc_qmlobjectsharedengine.cpp"
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef QMLOBJECTSHAREDENGINE_H
+#define QMLOBJECTSHAREDENGINE_H
+
+#include <kdeclarative/kdeclarative_export.h>
+#include <kdeclarative/qmlobject.h>
+#include <memory>
+
+namespace KDeclarative
+{
+class QmlObjectSharedEnginePrivate;
+
+/**
+ * @class KDeclarative::QmlObjectSharedEngine qmlobjectsharedengine.h KDeclarative/QmlObjectSharedEngine
+ *
+ * @author Marco Martin <mart@kde.org>
+ *
+ * @short An object that instantiates an entire QML context, with its own declarative engine
+ *
+ * KDeclarative::QmlObjectSharedEngine is a version of QmlObject that ensures only one
+ * QQmlEngine instance exists for the whole application. Objects created by different
+ * instances of QmlObjectSharedEngine will be insulated by having different creation
+ * contexts, accessible by QmlObject::rootContext()
+ */
+class KDECLARATIVE_EXPORT QmlObjectSharedEngine : public QmlObject
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Constructs a new QmlObjectSharedEngine
+ *
+ * @param parent the parent of this object
+ */
+ explicit QmlObjectSharedEngine(QObject *parent = nullptr);
+ ~QmlObjectSharedEngine();
+
+private:
+ friend class QmlObjectSharedEnginePrivate;
+ const std::unique_ptr<QmlObjectSharedEnginePrivate> d;
+};
+
+}
+
+#endif // multiple inclusion guard
--- /dev/null
+
+
+set(kpackagelauncherqml_SRCS
+ main.cpp
+)
+
+add_executable(kpackagelauncherqml ${kpackagelauncherqml_SRCS})
+
+#find_package(ActiveApp REQUIRED)
+
+target_link_libraries(kpackagelauncherqml
+ Qt5::Gui
+ Qt5::Quick
+ Qt5::Widgets #needs a qapplication for the Desktop QtControlsStyle
+ KF5::Declarative
+ KF5::I18n
+ KF5::Package
+ KF5::QuickAddons
+)
+
+install(TARGETS kpackagelauncherqml ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QApplication>
+
+#include <KLocalizedString>
+#include <QCommandLineOption>
+#include <QCommandLineParser>
+#include <QQuickItem>
+
+#include <KAboutData>
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQmlExpression>
+#include <QQmlProperty>
+#include <QQuickWindow>
+#include <QStandardPaths>
+#include <kdeclarative/qmlobject.h>
+#include <kpackage/package.h>
+#include <kpackage/packageloader.h>
+
+int main(int argc, char **argv)
+{
+ QCommandLineParser parser;
+ QApplication app(argc, argv);
+
+ const QString description = i18n("KPackage QML application shell");
+
+ app.setApplicationVersion(QStringLiteral("0.1"));
+ parser.addVersionOption();
+ parser.addHelpOption();
+ parser.setApplicationDescription(description);
+
+ QCommandLineOption appPluginOption(QCommandLineOption(QStringList() << QStringLiteral("a") << QStringLiteral("app"),
+ i18n("The unique name of the application (mandatory)"),
+ QStringLiteral("app")));
+
+ parser.addOption(appPluginOption);
+
+ parser.process(app);
+
+ QString packagePath;
+ if (parser.isSet(appPluginOption)) {
+ packagePath = parser.value(appPluginOption);
+ } else {
+ parser.showHelp(1);
+ }
+
+ // usually we have an ApplicationWindow here, so we do not need to create a window by ourselves
+ KDeclarative::QmlObject obj;
+ obj.setTranslationDomain(packagePath);
+ obj.setInitializationDelayed(true);
+ obj.loadPackage(packagePath);
+ if (!obj.package().isValid()) {
+ qWarning() << "The specified Application package is not valid.";
+ return 1;
+ }
+ obj.engine()->rootContext()->setContextProperty(QStringLiteral("commandlineArguments"), parser.positionalArguments());
+ QVariantMap paths;
+ paths[QStringLiteral("desktop")] = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
+ paths[QStringLiteral("documents")] = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+ paths[QStringLiteral("music")] = QStandardPaths::writableLocation(QStandardPaths::MusicLocation);
+ paths[QStringLiteral("movies")] = QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
+ paths[QStringLiteral("pictures")] = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
+ paths[QStringLiteral("home")] = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
+ obj.engine()->rootContext()->setContextProperty(QStringLiteral("userPaths"), paths);
+ obj.completeInitialization();
+
+ if (!obj.package().metadata().isValid()) {
+ return -1;
+ }
+
+ KPluginMetaData data = obj.package().metadata();
+ // About data
+ KAboutData aboutData(data.pluginId(), data.name(), data.version(), data.description(), KAboutLicense::byKeyword(data.license()).key());
+
+ const auto authors = data.authors();
+ for (auto &author : authors) {
+ aboutData.addAuthor(author.name(), author.task(), author.emailAddress(), author.webAddress(), author.ocsUsername());
+ }
+ // We assume that desktop file in applications dir is named similar as
+ // the pluginId, this is required to get icons working on wayland for example
+ aboutData.setDesktopFileName(data.pluginId());
+
+ KAboutData::setApplicationData(aboutData);
+
+ // The root is not a window?
+ // have to use a normal QQuickWindow since the root item is already created
+ QQuickItem *item = qobject_cast<QQuickItem *>(obj.rootObject());
+ QWindow *window = qobject_cast<QWindow *>(obj.rootObject());
+ if (item) {
+ QQuickWindow view;
+ item->setParentItem(view.contentItem());
+ if (item->implicitWidth() > 0 && item->implicitHeight() > 0) {
+ view.resize(item->implicitWidth(), item->implicitHeight());
+ } else {
+ view.resize(item->width(), item->height());
+ }
+
+ // set anchors
+ QQmlExpression expr(obj.engine()->rootContext(), obj.rootObject(), QStringLiteral("parent"));
+ QQmlProperty prop(obj.rootObject(), QStringLiteral("anchors.fill"));
+ prop.write(expr.evaluate());
+ view.setTitle(obj.package().metadata().name());
+ view.setIcon(QIcon::fromTheme(obj.package().metadata().iconName()));
+
+ // Forward Qt.quit() in QML code to QApplication::quit()
+ QObject::connect(obj.engine(), &QQmlEngine::quit, &app, &QCoreApplication::quit);
+
+ view.show();
+ return app.exec();
+ } else if (window) {
+ window->setTitle(obj.package().metadata().name());
+ window->setIcon(QIcon::fromTheme(obj.package().metadata().iconName()));
+ } else {
+ qWarning() << "The root Qml Item should be either a kind of window or a QQuickItem";
+ return 1;
+ }
+
+ return app.exec();
+}
--- /dev/null
+
+add_subdirectory(draganddrop)
+add_subdirectory(kquickcontrolsaddons)
+add_subdirectory(kcmcontrols)
+add_subdirectory(graphicaleffects)
+
+if(KF5I18n_FOUND AND KF5Config_FOUND AND KF5WidgetsAddons_FOUND AND KF5WindowSystem_FOUND AND KF5GlobalAccel_FOUND AND KF5KIO_FOUND AND KF5GuiAddons_FOUND)
+ add_subdirectory(kquickcontrols)
+endif()
+
+if(KF5CoreAddons_FOUND)
+ add_subdirectory(kcoreaddons)
+endif()
+
+
+if(KF5KIO_FOUND)
+ add_subdirectory(kioplugin)
+endif()
+
+if (KF5WindowSystem_FOUND)
+ add_subdirectory(kwindowsystemplugin)
+endif()
+
+if (KF5Config_FOUND)
+ add_subdirectory(kconfig)
+endif()
--- /dev/null
+project(draganddrop)
+
+set(declarativedragdrop_SRCS
+ draganddropplugin.cpp
+ DeclarativeDragArea.cpp
+ DeclarativeDragDropEvent.cpp
+ DeclarativeDropArea.cpp
+ DeclarativeMimeData.cpp
+ MimeDataWrapper.cpp
+)
+
+add_library(draganddropplugin SHARED ${declarativedragdrop_SRCS})
+target_link_libraries(draganddropplugin
+ Qt5::Core
+ Qt5::Quick
+ Qt5::Qml
+ Qt5::Gui
+)
+
+install(TARGETS draganddropplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/draganddrop)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/draganddrop)
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "DeclarativeDragArea.h"
+#include "DeclarativeMimeData.h"
+
+#include <QDrag>
+#include <QGuiApplication>
+#include <QIcon>
+#include <QMimeData>
+#include <QMouseEvent>
+#include <QPainter>
+#include <QQuickItemGrabResult>
+#include <QQuickWindow>
+#include <QStyleHints>
+
+#include <QDebug>
+
+/*!
+ A DragArea is used to make an item draggable.
+*/
+
+DeclarativeDragArea::DeclarativeDragArea(QQuickItem *parent)
+ : QQuickItem(parent)
+ , m_delegate(nullptr)
+ , m_source(parent)
+ , m_target(nullptr)
+ , m_enabled(true)
+ , m_draggingJustStarted(false)
+ , m_dragActive(false)
+ , m_supportedActions(Qt::MoveAction)
+ , m_defaultAction(Qt::MoveAction)
+ , m_data(new DeclarativeMimeData()) // m_data is owned by us, and we shouldn't pass it to Qt directly
+ // as it will automatically delete it after the drag and drop.
+ , m_pressAndHoldTimerId(0)
+{
+ m_startDragDistance = QGuiApplication::styleHints()->startDragDistance();
+ setAcceptedMouseButtons(Qt::LeftButton);
+ // setFiltersChildEvents(true);
+ setFlag(ItemAcceptsDrops, m_enabled);
+ setFiltersChildMouseEvents(true);
+}
+
+DeclarativeDragArea::~DeclarativeDragArea()
+{
+ if (m_data) {
+ delete m_data;
+ }
+}
+
+/*!
+ The delegate is the item that will be displayed next to the mouse cursor during the drag and drop operation.
+ It usually consists of a large, semi-transparent icon representing the data being dragged.
+*/
+QQuickItem *DeclarativeDragArea::delegate() const
+{
+ return m_delegate;
+}
+
+void DeclarativeDragArea::setDelegate(QQuickItem *delegate)
+{
+ if (m_delegate != delegate) {
+ // qDebug() << " ______________________________________________ " << delegate;
+ m_delegate = delegate;
+ Q_EMIT delegateChanged();
+ }
+}
+void DeclarativeDragArea::resetDelegate()
+{
+ setDelegate(nullptr);
+}
+
+/*!
+ The QML element that is the source of this drag and drop operation. This can be defined to any item, and will
+ be available to the DropArea as event.data.source
+*/
+QQuickItem *DeclarativeDragArea::source() const
+{
+ return m_source;
+}
+
+void DeclarativeDragArea::setSource(QQuickItem *source)
+{
+ if (m_source != source) {
+ m_source = source;
+ Q_EMIT sourceChanged();
+ }
+}
+
+void DeclarativeDragArea::resetSource()
+{
+ setSource(nullptr);
+}
+
+bool DeclarativeDragArea::dragActive() const
+{
+ return m_dragActive;
+}
+
+// target
+QQuickItem *DeclarativeDragArea::target() const
+{
+ // TODO: implement me
+ return nullptr;
+}
+
+// data
+DeclarativeMimeData *DeclarativeDragArea::mimeData() const
+{
+ return m_data;
+}
+
+// startDragDistance
+int DeclarativeDragArea::startDragDistance() const
+{
+ return m_startDragDistance;
+}
+
+void DeclarativeDragArea::setStartDragDistance(int distance)
+{
+ if (distance == m_startDragDistance) {
+ return;
+ }
+
+ m_startDragDistance = distance;
+ Q_EMIT startDragDistanceChanged();
+}
+
+// delegateImage
+QVariant DeclarativeDragArea::delegateImage() const
+{
+ return m_delegateImage;
+}
+
+void DeclarativeDragArea::setDelegateImage(const QVariant &image)
+{
+ if (image.canConvert<QImage>() && image.value<QImage>() == m_delegateImage) {
+ return;
+ }
+
+ if (image.canConvert<QImage>()) {
+ m_delegateImage = image.value<QImage>();
+ } else if (image.canConvert<QString>()) {
+ m_delegateImage = QIcon::fromTheme(image.toString()).pixmap(QSize(48, 48)).toImage();
+ } else {
+ m_delegateImage = image.value<QIcon>().pixmap(QSize(48, 48)).toImage();
+ }
+
+ Q_EMIT delegateImageChanged();
+}
+
+// enabled
+bool DeclarativeDragArea::isEnabled() const
+{
+ return m_enabled;
+}
+void DeclarativeDragArea::setEnabled(bool enabled)
+{
+ if (enabled != m_enabled) {
+ m_enabled = enabled;
+ Q_EMIT enabledChanged();
+ }
+}
+
+// supported actions
+Qt::DropActions DeclarativeDragArea::supportedActions() const
+{
+ return m_supportedActions;
+}
+void DeclarativeDragArea::setSupportedActions(Qt::DropActions actions)
+{
+ if (actions != m_supportedActions) {
+ m_supportedActions = actions;
+ Q_EMIT supportedActionsChanged();
+ }
+}
+
+// default action
+Qt::DropAction DeclarativeDragArea::defaultAction() const
+{
+ return m_defaultAction;
+}
+void DeclarativeDragArea::setDefaultAction(Qt::DropAction action)
+{
+ if (action != m_defaultAction) {
+ m_defaultAction = action;
+ Q_EMIT defaultActionChanged();
+ }
+}
+
+void DeclarativeDragArea::mousePressEvent(QMouseEvent *event)
+{
+ m_pressAndHoldTimerId = startTimer(QGuiApplication::styleHints()->mousePressAndHoldInterval());
+ m_buttonDownPos = event->screenPos();
+ m_draggingJustStarted = true;
+ setKeepMouseGrab(true);
+}
+
+void DeclarativeDragArea::mouseReleaseEvent(QMouseEvent *event)
+{
+ Q_UNUSED(event);
+ killTimer(m_pressAndHoldTimerId);
+ m_pressAndHoldTimerId = 0;
+ m_draggingJustStarted = false;
+ setKeepMouseGrab(false);
+ ungrabMouse();
+}
+
+void DeclarativeDragArea::timerEvent(QTimerEvent *event)
+{
+ if (event->timerId() == m_pressAndHoldTimerId && m_draggingJustStarted && m_enabled) {
+ // Grab delegate before starting drag
+ if (m_delegate) {
+ // Another grab is already in progress
+ if (m_grabResult) {
+ return;
+ }
+ m_grabResult = m_delegate->grabToImage();
+ if (m_grabResult) {
+ connect(m_grabResult.data(), &QQuickItemGrabResult::ready, this, [this]() {
+ startDrag(m_grabResult->image());
+ m_grabResult.reset();
+ });
+ return;
+ }
+ }
+
+ // No delegate or grab failed, start drag immediately
+ startDrag(m_delegateImage);
+ }
+}
+
+void DeclarativeDragArea::mouseMoveEvent(QMouseEvent *event)
+{
+ if (!m_enabled || QLineF(event->screenPos(), m_buttonDownPos).length() < m_startDragDistance) {
+ return;
+ }
+
+ // don't start drags on move for touch events, they'll be handled only by press and hold
+ // reset timer if moved more than m_startDragDistance
+ if (event->source() == Qt::MouseEventSynthesizedByQt) {
+ killTimer(m_pressAndHoldTimerId);
+ m_pressAndHoldTimerId = 0;
+ return;
+ }
+
+ if (m_draggingJustStarted) {
+ // Grab delegate before starting drag
+ if (m_delegate) {
+ // Another grab is already in progress
+ if (m_grabResult) {
+ return;
+ }
+ m_grabResult = m_delegate->grabToImage();
+ if (m_grabResult) {
+ connect(m_grabResult.data(), &QQuickItemGrabResult::ready, this, [this]() {
+ startDrag(m_grabResult->image());
+ m_grabResult.reset();
+ });
+ return;
+ }
+ }
+
+ // No delegate or grab failed, start drag immediately
+ startDrag(m_delegateImage);
+ }
+}
+
+bool DeclarativeDragArea::childMouseEventFilter(QQuickItem *item, QEvent *event)
+{
+ if (!isEnabled()) {
+ return false;
+ }
+
+ switch (event->type()) {
+ case QEvent::MouseButtonPress: {
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ // qDebug() << "press in dragarea";
+ mousePressEvent(me);
+ break;
+ }
+ case QEvent::MouseMove: {
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ // qDebug() << "move in dragarea";
+ mouseMoveEvent(me);
+ break;
+ }
+ case QEvent::MouseButtonRelease: {
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ // qDebug() << "release in dragarea";
+ mouseReleaseEvent(me);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return QQuickItem::childMouseEventFilter(item, event);
+}
+
+void DeclarativeDragArea::startDrag(const QImage &image)
+{
+ grabMouse();
+ m_draggingJustStarted = false;
+
+ QDrag *drag = new QDrag(parent());
+ DeclarativeMimeData *dataCopy = new DeclarativeMimeData(m_data); // Qt will take ownership of this copy and delete it.
+ drag->setMimeData(dataCopy);
+
+ const qreal devicePixelRatio = window() ? window()->devicePixelRatio() : 1;
+ const int imageSize = 48 * devicePixelRatio;
+
+ if (!image.isNull()) {
+ drag->setPixmap(QPixmap::fromImage(image));
+ } else if (mimeData()->hasImage()) {
+ const QImage im = qvariant_cast<QImage>(mimeData()->imageData());
+ drag->setPixmap(QPixmap::fromImage(im));
+ } else if (mimeData()->hasColor()) {
+ QPixmap px(imageSize, imageSize);
+ px.fill(mimeData()->color());
+ drag->setPixmap(px);
+ } else {
+ // Icons otherwise
+ QStringList icons;
+ if (mimeData()->hasText()) {
+ icons << QStringLiteral("text-plain");
+ }
+ if (mimeData()->hasHtml()) {
+ icons << QStringLiteral("text-html");
+ }
+ if (mimeData()->hasUrls()) {
+ for (int i = 0; i < std::min(4, mimeData()->urls().size()); ++i) {
+ icons << QStringLiteral("text-html");
+ }
+ }
+ if (!icons.isEmpty()) {
+ QPixmap pm(imageSize * icons.count(), imageSize);
+ pm.fill(Qt::transparent);
+ QPainter p(&pm);
+ int i = 0;
+ for (const QString &ic : std::as_const(icons)) {
+ p.drawPixmap(QPoint(i * imageSize, 0), QIcon::fromTheme(ic).pixmap(imageSize));
+ i++;
+ }
+ p.end();
+ drag->setPixmap(pm);
+ }
+ }
+
+ // drag->setHotSpot(QPoint(drag->pixmap().width()/2, drag->pixmap().height()/2)); // TODO: Make a property for that
+ // setCursor(Qt::OpenHandCursor); //TODO? Make a property for the cursor
+
+ m_dragActive = true;
+ Q_EMIT dragActiveChanged();
+ Q_EMIT dragStarted();
+
+ Qt::DropAction action = drag->exec(m_supportedActions, m_defaultAction);
+ setKeepMouseGrab(false);
+
+ m_dragActive = false;
+ Q_EMIT dragActiveChanged();
+ Q_EMIT drop(action);
+
+ ungrabMouse();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef DECLARATIVEDRAGAREA_H
+#define DECLARATIVEDRAGAREA_H
+
+#include <QImage>
+#include <QQuickItem>
+#include <QSharedPointer>
+
+class QQmlComponent;
+class DeclarativeMimeData;
+class QQuickItemGrabResult;
+
+class DeclarativeDragArea : public QQuickItem
+{
+ Q_OBJECT
+
+ /**
+ * The delegate is the item that will be displayed next to the mouse cursor during the drag and drop operation.
+ * It usually consists of a large, semi-transparent icon representing the data being dragged.
+ */
+ Q_PROPERTY(QQuickItem *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged RESET resetDelegate)
+
+ /**
+ * The QML element that is the source of the resulting drag and drop operation. This can be defined to any item, and will
+ * be available to the DropArea as event.data.source
+ */
+ Q_PROPERTY(QQuickItem *source READ source WRITE setSource NOTIFY sourceChanged RESET resetSource)
+
+ // TODO: to be implemented
+ Q_PROPERTY(QQuickItem *target READ source NOTIFY targetChanged)
+
+ /**
+ * the mime data of the drag operation
+ * @see DeclarativeMimeData
+ */
+ Q_PROPERTY(DeclarativeMimeData *mimeData READ mimeData CONSTANT)
+
+ /**
+ * If false no drag operation will be generate
+ */
+ Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) // TODO: Should call setAcceptDrops()
+
+ /**
+ * Supported operations, a combination of
+ * Qt.CopyAction
+ * Qt.MoveAction
+ * Qt.LinkAction
+ * Qt.ActionMask
+ * Qt.IgnoreAction
+ * Qt.TargetMoveAction
+ */
+ Q_PROPERTY(Qt::DropActions supportedActions READ supportedActions WRITE setSupportedActions NOTIFY supportedActionsChanged)
+
+ /**
+ * The default action will be performed during a drag when no modificators are pressed.
+ */
+ Q_PROPERTY(Qt::DropAction defaultAction READ defaultAction WRITE setDefaultAction NOTIFY defaultActionChanged)
+
+ /**
+ * distance in pixel after which a drag event will get started
+ */
+ Q_PROPERTY(int startDragDistance READ startDragDistance WRITE setStartDragDistance NOTIFY startDragDistanceChanged)
+
+ /**
+ * an image to be used as delegate. if present overrides the delegate property. in can be either a QImage or a QIcon
+ */
+ Q_PROPERTY(QVariant delegateImage READ delegateImage WRITE setDelegateImage NOTIFY delegateImageChanged)
+
+ /**
+ * Whether a drag currently originates from this drag area.
+ *
+ * @since 5.19
+ */
+ Q_PROPERTY(bool dragActive READ dragActive NOTIFY dragActiveChanged)
+
+public:
+ DeclarativeDragArea(QQuickItem *parent = nullptr);
+ ~DeclarativeDragArea() override;
+
+ QQuickItem *delegate() const;
+ void setDelegate(QQuickItem *delegate);
+ void resetDelegate();
+
+ QVariant delegateImage() const;
+ void setDelegateImage(const QVariant &image);
+ QQuickItem *target() const;
+ QQuickItem *source() const;
+ void setSource(QQuickItem *source);
+ void resetSource();
+
+ bool dragActive() const;
+
+ bool isEnabled() const;
+ void setEnabled(bool enabled);
+
+ int startDragDistance() const;
+ void setStartDragDistance(int distance);
+
+ // supported actions
+ Qt::DropActions supportedActions() const;
+ void setSupportedActions(Qt::DropActions actions);
+
+ // default action
+ Qt::DropAction defaultAction() const;
+ void setDefaultAction(Qt::DropAction action);
+
+ DeclarativeMimeData *mimeData() const;
+
+Q_SIGNALS:
+ void dragStarted();
+ void delegateChanged();
+ void dragActiveChanged();
+ void sourceChanged();
+ void targetChanged();
+ void dataChanged();
+ void enabledChanged();
+ void drop(int action);
+ void supportedActionsChanged();
+ void defaultActionChanged();
+ void startDragDistanceChanged();
+ void delegateImageChanged();
+
+protected:
+ void mouseMoveEvent(QMouseEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
+ void mouseReleaseEvent(QMouseEvent *) override;
+ void timerEvent(QTimerEvent *event) override;
+ bool childMouseEventFilter(QQuickItem *item, QEvent *event) override;
+
+private:
+ void startDrag(const QImage &image);
+
+ QQuickItem *m_delegate;
+ QQuickItem *m_source;
+ QQuickItem *m_target;
+ QSharedPointer<QQuickItemGrabResult> m_grabResult;
+ bool m_enabled;
+ bool m_draggingJustStarted;
+ bool m_dragActive;
+ Qt::DropActions m_supportedActions;
+ Qt::DropAction m_defaultAction;
+ DeclarativeMimeData *const m_data;
+ QImage m_delegateImage;
+ int m_startDragDistance;
+ QPointF m_buttonDownPos;
+ int m_pressAndHoldTimerId;
+};
+
+#endif // DECLARATIVEDRAGAREA_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+ SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "DeclarativeDragDropEvent.h"
+
+DeclarativeDragDropEvent::DeclarativeDragDropEvent(QDropEvent *e, DeclarativeDropArea *parent)
+ : QObject(parent)
+ , m_x(e->pos().x())
+ , m_y(e->pos().y())
+ , m_buttons(e->mouseButtons())
+ , m_modifiers(e->keyboardModifiers())
+ , m_data(nullptr)
+ , m_event(e)
+{
+}
+
+DeclarativeDragDropEvent::DeclarativeDragDropEvent(QDragLeaveEvent *e, DeclarativeDropArea *parent)
+ : QObject(parent)
+ , m_x(0)
+ , m_y(0)
+ , m_buttons(Qt::NoButton)
+ , m_modifiers(Qt::NoModifier)
+ , m_data(nullptr)
+ , m_event(nullptr)
+{
+ Q_UNUSED(e);
+}
+
+void DeclarativeDragDropEvent::accept(int action)
+{
+ m_event->setDropAction(static_cast<Qt::DropAction>(action));
+ // qDebug() << "-----> Accepting event: " << this << m_data.urls() << m_data.text() << m_data.html() << ( m_data.hasColor() ? m_data.color().name() : "
+ // no color");
+ m_event->accept();
+}
+
+void DeclarativeDragDropEvent::ignore()
+{
+ m_event->ignore();
+}
+
+DeclarativeMimeData *DeclarativeDragDropEvent::mimeData()
+{
+ if (!m_data && m_event) {
+ // TODO This should be using MimeDataWrapper eventually, although this is an API break,
+ // so will need to be done carefully.
+ m_data.reset(new DeclarativeMimeData(m_event->mimeData()));
+ }
+ return m_data.data();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef DECLARATIVEDRAGDROPEVENT_H
+#define DECLARATIVEDRAGDROPEVENT_H
+
+#include "DeclarativeDropArea.h"
+#include "DeclarativeMimeData.h"
+#include <QObject>
+
+class DeclarativeDragDropEvent : public QObject
+{
+ Q_OBJECT
+
+ /**
+ * The mouse X position of the event relative to the DropArea that is receiving the event.
+ */
+ Q_PROPERTY(int x READ x)
+
+ /**
+ * The mouse Y position of the event relative to the DropArea that is receiving the event.
+ */
+ Q_PROPERTY(int y READ y)
+
+ /**
+ * The pressed mouse buttons.
+ * A combination of:
+ * Qt.NoButton The button state does not refer to any button (see QMouseEvent::button()).
+ * Qt.LeftButton The left button is pressed, or an event refers to the left button. (The left button may be the right button on left-handed mice.)
+ * Qt.RightButton The right button.
+ * Qt.MidButton The middle button.
+ * Qt.MiddleButton MidButton The middle button.
+ * Qt.XButton1 The first X button.
+ * Qt.XButton2 The second X button.
+ */
+ Q_PROPERTY(int buttons READ buttons)
+
+ /**
+ * Pressed keyboard modifiers, a combination of:
+ * Qt.NoModifier No modifier key is pressed.
+ * Qt.ShiftModifier A Shift key on the keyboard is pressed.
+ * Qt.ControlModifier A Ctrl key on the keyboard is pressed.
+ * Qt.AltModifier An Alt key on the keyboard is pressed.
+ * Qt.MetaModifier A Meta key on the keyboard is pressed.
+ * Qt.KeypadModifier A keypad button is pressed.
+ * Qt.GroupSwitchModifier X11 only. A Mode_switch key on the keyboard is pressed.
+ */
+ Q_PROPERTY(int modifiers READ modifiers)
+
+ /**
+ * The mime data of this operation
+ * @see DeclarativeMimeData
+ */
+ Q_PROPERTY(DeclarativeMimeData *mimeData READ mimeData)
+
+ /**
+ * The possible different kind of action that can be done in the drop, is a combination of:
+ * Qt.CopyAction 0x1 Copy the data to the target.
+ * Qt.MoveAction 0x2 Move the data from the source to the target.
+ * Qt.LinkAction 0x4 Create a link from the source to the target.
+ * Qt.ActionMask 0xff
+ * Qt.IgnoreAction 0x0 Ignore the action (do nothing with the data).
+ * Qt.TargetMoveAction 0x8002 On Windows, this value is used when the ownership of the D&D data should be taken over by the target application, i.e., the
+ * source application should not delete the data. On X11 this value is used to do a move. TargetMoveAction is not used on the Mac.
+ */
+ Q_PROPERTY(Qt::DropActions possibleActions READ possibleActions)
+
+ /**
+ * Default action
+ * @see possibleActions
+ */
+ Q_PROPERTY(Qt::DropAction proposedAction READ proposedAction)
+
+public:
+ DeclarativeDragDropEvent(QDropEvent *e, DeclarativeDropArea *parent = nullptr);
+ DeclarativeDragDropEvent(QDragLeaveEvent *e, DeclarativeDropArea *parent = nullptr);
+
+ int x() const
+ {
+ return m_x;
+ }
+ int y() const
+ {
+ return m_y;
+ }
+ int buttons() const
+ {
+ return m_buttons;
+ }
+ int modifiers() const
+ {
+ return m_modifiers;
+ }
+ DeclarativeMimeData *mimeData();
+ Qt::DropAction proposedAction() const
+ {
+ return m_event->proposedAction();
+ }
+ Qt::DropActions possibleActions() const
+ {
+ return m_event->possibleActions();
+ }
+
+public Q_SLOTS:
+ void accept(int action);
+ void ignore();
+
+private:
+ int m_x;
+ int m_y;
+ Qt::MouseButtons m_buttons;
+ Qt::KeyboardModifiers m_modifiers;
+ QScopedPointer<DeclarativeMimeData> m_data;
+ QDropEvent *m_event;
+};
+
+#endif // DECLARATIVEDRAGDROPEVENT_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "DeclarativeDropArea.h"
+#include "DeclarativeDragDropEvent.h"
+
+DeclarativeDropArea::DeclarativeDropArea(QQuickItem *parent)
+ : QQuickItem(parent)
+ , m_enabled(true)
+ , m_preventStealing(false)
+ , m_temporaryInhibition(false)
+ , m_containsDrag(false)
+{
+ setFlag(ItemAcceptsDrops, m_enabled);
+}
+
+void DeclarativeDropArea::temporaryInhibitParent(bool inhibit)
+{
+ QQuickItem *candidate = parentItem();
+
+ while (candidate) {
+ if (DeclarativeDropArea *da = qobject_cast<DeclarativeDropArea *>(candidate)) {
+ da->m_temporaryInhibition = inhibit;
+ if (inhibit) {
+ Q_EMIT da->dragLeaveEvent(nullptr);
+ }
+ }
+ candidate = candidate->parentItem();
+ }
+}
+
+void DeclarativeDropArea::dragEnterEvent(QDragEnterEvent *event)
+{
+ if (!m_enabled || m_temporaryInhibition) {
+ return;
+ }
+
+ DeclarativeDragDropEvent dde(event, this);
+ event->accept();
+
+ Q_EMIT dragEnter(&dde);
+
+ if (!event->isAccepted()) {
+ return;
+ }
+
+ if (m_preventStealing) {
+ temporaryInhibitParent(true);
+ }
+
+ m_oldDragMovePos = event->pos();
+ setContainsDrag(true);
+}
+
+void DeclarativeDropArea::dragLeaveEvent(QDragLeaveEvent *event)
+{
+ // do it anyways, in the unlikely case m_preventStealing
+ // was changed while drag
+ temporaryInhibitParent(false);
+
+ m_oldDragMovePos = QPoint(-1, -1);
+ DeclarativeDragDropEvent dde(event, this);
+ Q_EMIT dragLeave(&dde);
+ setContainsDrag(false);
+}
+
+void DeclarativeDropArea::dragMoveEvent(QDragMoveEvent *event)
+{
+ if (!m_enabled || m_temporaryInhibition) {
+ event->ignore();
+ return;
+ }
+ event->accept();
+ // if the position we export didn't change, don't generate the move event
+ if (event->pos() == m_oldDragMovePos) {
+ return;
+ }
+
+ m_oldDragMovePos = event->pos();
+ DeclarativeDragDropEvent dde(event, this);
+ Q_EMIT dragMove(&dde);
+}
+
+void DeclarativeDropArea::dropEvent(QDropEvent *event)
+{
+ // do it anyways, in the unlikely case m_preventStealing
+ // was changed while drag, do it after a loop,
+ // so the parent dropevent doesn't get delivered
+ metaObject()->invokeMethod(this, "temporaryInhibitParent", Qt::QueuedConnection, Q_ARG(bool, false));
+
+ m_oldDragMovePos = QPoint(-1, -1);
+
+ if (!m_enabled || m_temporaryInhibition) {
+ return;
+ }
+
+ DeclarativeDragDropEvent dde(event, this);
+ Q_EMIT drop(&dde);
+ setContainsDrag(false);
+}
+
+bool DeclarativeDropArea::isEnabled() const
+{
+ return m_enabled;
+}
+
+void DeclarativeDropArea::setEnabled(bool enabled)
+{
+ if (enabled == m_enabled) {
+ return;
+ }
+
+ m_enabled = enabled;
+ setFlag(ItemAcceptsDrops, m_enabled);
+ Q_EMIT enabledChanged();
+}
+
+bool DeclarativeDropArea::preventStealing() const
+{
+ return m_preventStealing;
+}
+
+void DeclarativeDropArea::setPreventStealing(bool prevent)
+{
+ if (prevent == m_preventStealing) {
+ return;
+ }
+
+ m_preventStealing = prevent;
+ Q_EMIT preventStealingChanged();
+}
+
+void DeclarativeDropArea::setContainsDrag(bool dragging)
+{
+ if (m_containsDrag != dragging) {
+ m_containsDrag = dragging;
+ Q_EMIT containsDragChanged(m_containsDrag);
+ }
+}
+
+bool DeclarativeDropArea::containsDrag() const
+{
+ return m_containsDrag;
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef DECLARATIVEDROPAREA_H
+#define DECLARATIVEDROPAREA_H
+
+#include <QQuickItem>
+
+class DeclarativeDragDropEvent;
+
+class DeclarativeDropArea : public QQuickItem
+{
+ Q_OBJECT
+
+ /**
+ * If false the area will receive no drop events
+ */
+ Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
+
+ /**
+ *
+ */
+ Q_PROPERTY(bool preventStealing READ preventStealing WRITE setPreventStealing NOTIFY preventStealingChanged)
+
+ Q_PROPERTY(bool containsDrag READ containsDrag NOTIFY containsDragChanged)
+
+public:
+ DeclarativeDropArea(QQuickItem *parent = nullptr);
+ bool isEnabled() const;
+ void setEnabled(bool enabled);
+
+ bool preventStealing() const;
+ void setPreventStealing(bool prevent);
+ bool containsDrag() const;
+
+Q_SIGNALS:
+ /**
+ * Emitted when the mouse cursor dragging something enters in the drag area
+ * @param event description of the dragged content
+ * @see DeclarativeDragDropEvent
+ */
+ void dragEnter(DeclarativeDragDropEvent *event);
+
+ /**
+ * Emitted when the mouse cursor dragging something leaves the drag area
+ * @param event description of the dragged content
+ * @see DeclarativeDragDropEvent
+ */
+ void dragLeave(DeclarativeDragDropEvent *event);
+
+ /**
+ * Emitted when the mouse cursor dragging something moves over the drag area
+ * @param event description of the dragged content
+ * @see DeclarativeDragDropEvent
+ */
+ void dragMove(DeclarativeDragDropEvent *event);
+
+ /**
+ * Emitted when the user drops something in the area
+ * @param event description of the dragged content
+ * @see DeclarativeDragDropEvent
+ */
+ void drop(DeclarativeDragDropEvent *event);
+
+ // Notifiers
+ void enabledChanged();
+
+ void preventStealingChanged();
+
+ void containsDragChanged(bool contained);
+
+protected:
+ void dragEnterEvent(QDragEnterEvent *event) override;
+ void dragLeaveEvent(QDragLeaveEvent *event) override;
+ void dragMoveEvent(QDragMoveEvent *event) override;
+ void dropEvent(QDropEvent *event) override;
+
+private Q_SLOTS:
+ void temporaryInhibitParent(bool inhibit);
+
+private:
+ void setContainsDrag(bool dragging);
+
+ bool m_enabled : 1;
+ bool m_preventStealing : 1;
+ bool m_temporaryInhibition : 1;
+ bool m_containsDrag : 1;
+ QPoint m_oldDragMovePos;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "DeclarativeMimeData.h"
+
+/*!
+ \qmlclass MimeData DeclarativeMimeData
+
+ This is a wrapper class around QMimeData, with a few extensions to provide better support for in-qml drag & drops.
+*/
+
+DeclarativeMimeData::DeclarativeMimeData()
+ : QMimeData()
+ , m_source(nullptr)
+{
+}
+
+/*!
+ \internal
+ \class DeclarativeMimeData
+
+ Creates a new DeclarativeMimeData by cloning the QMimeData passed as parameter.
+ This is useful for two reasons :
+ - In DragArea, we want to clone our "working copy" of the DeclarativeMimeData instance, as Qt will automatically
+ delete it after the drag and drop operation.
+ - In the drop events, the QMimeData is const, and we have troubles passing const to QML. So we clone it to
+ remove the "constness"
+
+ This method will try to cast the QMimeData to DeclarativeMimeData, and will clone our extensions to QMimeData as well
+*/
+DeclarativeMimeData::DeclarativeMimeData(const QMimeData *copy)
+ : QMimeData()
+ , m_source(nullptr)
+{
+ // Copy the standard MIME data
+ const auto formats = copy->formats();
+ for (const QString &format : formats) {
+ QMimeData::setData(format, copy->data(format));
+ }
+
+ // If the object we are copying actually is a DeclarativeMimeData, copy our extended properties as well
+ const DeclarativeMimeData *declarativeMimeData = qobject_cast<const DeclarativeMimeData *>(copy);
+ if (declarativeMimeData) {
+ this->setSource(declarativeMimeData->source());
+ }
+}
+
+/*!
+ \qmlproperty url MimeData::url
+
+ Returns the first URL from the urls property of QMimeData
+ TODO: We should use QDeclarativeListProperty<QUrls> to return the whole list instead of only the first element.
+*/
+QUrl DeclarativeMimeData::url() const
+{
+ if (this->hasUrls() && !this->urls().isEmpty()) {
+ return QMimeData::urls().first();
+ }
+ return QUrl();
+}
+void DeclarativeMimeData::setUrl(const QUrl &url)
+{
+ if (this->url() == url) {
+ return;
+ }
+
+ QList<QUrl> urlList;
+ urlList.append(url);
+ QMimeData::setUrls(urlList);
+ Q_EMIT urlChanged();
+}
+
+QJsonArray DeclarativeMimeData::urls() const
+{
+ QJsonArray varUrls;
+ const auto lstUrls = QMimeData::urls();
+ for (const QUrl &url : lstUrls) {
+ varUrls.append(url.toString());
+ }
+ return varUrls;
+}
+
+void DeclarativeMimeData::setUrls(const QJsonArray &urls)
+{
+ QList<QUrl> urlList;
+ urlList.reserve(urls.size());
+ for (const QVariant &varUrl : urls) {
+ urlList << varUrl.toUrl();
+ }
+ QMimeData::setUrls(urlList);
+ Q_EMIT urlsChanged();
+}
+
+// color
+QColor DeclarativeMimeData::color() const
+{
+ if (this->hasColor()) {
+ return qvariant_cast<QColor>(this->colorData());
+ }
+ return QColor();
+}
+
+bool DeclarativeMimeData::hasColor() const
+{
+ // qDebug() << " hasColor " << (QMimeData::hasColor() ? color().name() : "false");
+ return QMimeData::hasColor();
+}
+
+void DeclarativeMimeData::setColor(const QColor &color)
+{
+ if (this->color() != color) {
+ this->setColorData(color);
+ Q_EMIT colorChanged();
+ }
+}
+
+void DeclarativeMimeData::setData(const QString &mimeType, const QVariant &data)
+{
+ if (data.type() == QVariant::ByteArray) {
+ QMimeData::setData(mimeType, data.toByteArray());
+ } else if (data.canConvert(QVariant::String)) {
+ QMimeData::setData(mimeType, data.toString().toLatin1());
+ }
+}
+
+/*!
+ \qmlproperty item MimeData::source
+
+ Setting source to any existing qml item will enable the receiver of the drag and drop operation to know in which item
+ the operation originated.
+
+ In the case of inter-application drag and drop operations, the source will not be available, and will be 0.
+ Be sure to test it in your QML code, before using it, or it will generate errors in the console.
+*/
+QQuickItem *DeclarativeMimeData::source() const
+{
+ return m_source;
+}
+void DeclarativeMimeData::setSource(QQuickItem *source)
+{
+ if (m_source != source) {
+ m_source = source;
+ Q_EMIT sourceChanged();
+ }
+}
+
+QByteArray DeclarativeMimeData::getDataAsByteArray(const QString &format)
+{
+ return data(format);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2010 BetterInbox <contact@betterinbox.com>
+ SPDX-FileContributor: Gregory Schlomoff <greg@betterinbox.com>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef DECLARATIVEMIMEDATA_H
+#define DECLARATIVEMIMEDATA_H
+
+#include <QColor>
+#include <QJsonArray>
+#include <QMimeData>
+#include <QQuickItem>
+#include <QUrl>
+
+class DeclarativeMimeData : public QMimeData
+{
+ Q_OBJECT
+
+ /**
+ * A plain text (MIME type text/plain) representation of the data.
+ */
+ Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
+
+ /**
+ * A string if the data stored in the object is HTML (MIME type text/html); otherwise returns an empty string.
+ */
+ Q_PROPERTY(QString html READ html WRITE setHtml NOTIFY htmlChanged)
+
+ /**
+ * Url contained in the mimedata
+ */
+ Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)
+
+ /**
+ * A list of URLs contained within the MIME data object.
+ * URLs correspond to the MIME type text/uri-list.
+ */
+ Q_PROPERTY(QJsonArray urls READ urls WRITE setUrls NOTIFY urlsChanged)
+
+ /**
+ * A color if the data stored in the object represents a color (MIME type application/x-color); otherwise QColor().
+ */
+ Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+
+ /**
+ * The graphical item on the scene that started the drag event. It may be null.
+ */
+ Q_PROPERTY(QQuickItem *source READ source WRITE setSource NOTIFY sourceChanged)
+
+ /** @see QMimeData::hasUrls */
+ Q_PROPERTY(bool hasUrls READ hasUrls NOTIFY urlsChanged)
+ // TODO: Image property
+
+ /**
+ * @sa QMimeData::formats
+ */
+ Q_PROPERTY(QStringList formats READ formats)
+public:
+ DeclarativeMimeData();
+ DeclarativeMimeData(const QMimeData *copy);
+
+ QUrl url() const;
+ void setUrl(const QUrl &url);
+
+ QJsonArray urls() const;
+ void setUrls(const QJsonArray &urls);
+
+ QColor color() const;
+ void setColor(const QColor &color);
+ Q_INVOKABLE bool hasColor() const;
+
+ Q_INVOKABLE void setData(const QString &mimeType, const QVariant &data);
+
+ QQuickItem *source() const;
+ void setSource(QQuickItem *source);
+
+ Q_INVOKABLE QByteArray getDataAsByteArray(const QString &format);
+
+ /*
+ QString text() const; //TODO: Reimplement this to issue the onChanged signals
+ void setText(const QString &text);
+ QString html() const;
+ void setHtml(const QString &html);
+ */
+
+Q_SIGNALS:
+ void textChanged(); // FIXME not being used
+ void htmlChanged(); // FIXME not being used
+ void urlChanged();
+ void urlsChanged();
+ void colorChanged();
+ void sourceChanged();
+
+private:
+ QQuickItem *m_source;
+};
+
+#endif // DECLARATIVEMIMEDATA_H
--- /dev/null
+/** @mainpage Drag and Drop
+
+<h2>import org.kde.draganddrop</h2>
+
+Use those elements if you want to add drag and drop support to your application
+
+- DeclarativeDragArea
+- DeclarativeDropArea
+- DeclarativeDragDropEvent
+- DeclarativeMimeData
+
+*/
+
+// DOXYGEN_SET_PROJECT_NAME = DragAndDrop
+// vim:ts=4:sw=4:expandtab:filetype=doxygen
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "MimeDataWrapper.h"
+#include <QMimeData>
+#include <QUrl>
+
+MimeDataWrapper::MimeDataWrapper(const QMimeData *data, QObject *parent)
+ : QObject(parent)
+ , m_data(data)
+{
+}
+
+QString MimeDataWrapper::text() const
+{
+ return m_data->text();
+}
+
+QString MimeDataWrapper::html() const
+{
+ return m_data->html();
+}
+
+QUrl MimeDataWrapper::url() const
+{
+ if (m_data->hasUrls() && !m_data->urls().isEmpty()) {
+ return m_data->urls().first();
+ }
+ return QUrl();
+}
+
+bool MimeDataWrapper::hasUrls() const
+{
+ return m_data->hasUrls();
+}
+
+QJsonArray MimeDataWrapper::urls() const
+{
+ QJsonArray varUrls;
+ const auto urls = m_data->urls();
+ for (const QUrl &url : urls) {
+ varUrls.append(url.toString());
+ }
+ return varUrls;
+}
+
+QVariant MimeDataWrapper::color() const
+{
+ if (m_data->hasColor()) {
+ return m_data->colorData();
+ } else {
+ return QVariant();
+ }
+}
+
+QStringList MimeDataWrapper::formats() const
+{
+ return m_data->formats();
+}
+
+QByteArray MimeDataWrapper::getDataAsByteArray(const QString &format)
+{
+ return m_data->data(format);
+}
+
+QVariant MimeDataWrapper::source() const
+{
+ // In case it comes from a DeclarativeMimeData
+ return m_data->property("source");
+}
+
+QMimeData *MimeDataWrapper::mimeData() const
+{
+ return const_cast<QMimeData *>(m_data);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef MIMEDATAWRAPPER_H
+#define MIMEDATAWRAPPER_H
+
+#include <QJsonArray>
+#include <QObject>
+#include <QString>
+
+class QMimeData;
+class QObject;
+/**
+ * Exposes a const QMimeData instance
+ *
+ * In contrast to DeclarativeMimeData, doesn't create a copy of the QMimeData instance
+ */
+class MimeDataWrapper : public QObject
+{
+ Q_OBJECT
+
+ /**
+ * A plain text (MIME type text/plain) representation of the data.
+ */
+ Q_PROPERTY(QString text READ text CONSTANT)
+
+ /**
+ * A string if the data stored in the object is HTML (MIME type text/html); otherwise returns an empty string.
+ */
+ Q_PROPERTY(QString html READ html CONSTANT)
+
+ /**
+ * Url contained in the mimedata
+ */
+ Q_PROPERTY(QUrl url READ url CONSTANT)
+
+ /**
+ * A list of URLs contained within the MIME data object.
+ * URLs correspond to the MIME type text/uri-list.
+ */
+ Q_PROPERTY(QJsonArray urls READ urls CONSTANT)
+
+ /**
+ * A color if the data stored in the object represents a color (MIME type application/x-color); otherwise QVariant().
+ */
+ Q_PROPERTY(QVariant color READ color CONSTANT)
+
+ /**
+ * The graphical item on the scene that started the drag event. It may be null.
+ */
+ Q_PROPERTY(QVariant source READ source CONSTANT)
+
+ /**
+ * Mimetypes provided by the mime data instance
+ *
+ * @sa QMimeData::formats
+ */
+ Q_PROPERTY(QStringList formats READ formats CONSTANT)
+
+ /**
+ * @sa QMimeData::hasUrls
+ */
+ Q_PROPERTY(bool hasUrls READ hasUrls CONSTANT)
+
+ /**
+ * @returns the wrapped object
+ */
+ Q_PROPERTY(QMimeData *mimeData READ mimeData CONSTANT)
+
+public:
+ MimeDataWrapper(const QMimeData *data, QObject *parent);
+
+ QString text() const;
+ QString html() const;
+ QUrl url() const;
+ QJsonArray urls() const;
+ bool hasUrls() const;
+ QVariant color() const;
+ QStringList formats() const;
+ QVariant source() const;
+ QMimeData *mimeData() const;
+
+ Q_INVOKABLE QByteArray getDataAsByteArray(const QString &format);
+
+private:
+ const QMimeData *m_data;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "draganddropplugin.h"
+
+#include "DeclarativeDragArea.h"
+#include "DeclarativeDragDropEvent.h"
+#include "DeclarativeDropArea.h"
+#include "DeclarativeMimeData.h"
+#include "MimeDataWrapper.h"
+
+void DragAndDropPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.draganddrop"));
+
+ qmlRegisterType<DeclarativeDropArea>(uri, 2, 0, "DropArea");
+ qmlRegisterType<DeclarativeDragArea>(uri, 2, 0, "DragArea");
+ qmlRegisterAnonymousType<QMimeData>(uri, 1);
+ qmlRegisterUncreatableType<DeclarativeMimeData>(uri, 2, 0, "MimeData", QStringLiteral("MimeData cannot be created from QML."));
+ qmlRegisterUncreatableType<DeclarativeDragDropEvent>(uri, 2, 0, "DragDropEvent", QStringLiteral("DragDropEvent cannot be created from QML."));
+ qmlRegisterUncreatableType<MimeDataWrapper>(uri, 2, 0, "MimeDataWrapper", QStringLiteral("DragDropEvent cannot be created from QML."));
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef DRAGANDDROPPLUGIN_H
+#define DRAGANDDROPPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+
+class DragAndDropPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif
--- /dev/null
+module org.kde.draganddrop
+plugin draganddropplugin
+
--- /dev/null
+project(kgraphicaleffects)
+
+install(FILES
+ qmldir
+ Lanczos.qml
+ preserveaspect.vert
+ preserveaspect_core.vert
+ lanczos2sharp.frag
+ lanczos2sharp_core.frag
+ DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/graphicaleffects
+)
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2021 Arjen Hiemstra <ahiemstra@heimr.nl>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.15
+
+/**
+ * A ShaderEffect that makes use of the Lanczos resampling method for scaling textures.
+ *
+ * Lanczos resampling tries to preserve detail when scaling down images and
+ * thus looks less blurry compared to a simple linear interpolation.
+ *
+ * This effect implements a single-pass Lanczos resampling filter using two
+ * lobes. Everything is done in the shader, with some defaults set for
+ * parameters. These defaults were designed to provide a good visual result when
+ * scaling down window thumbnails.
+ */
+ShaderEffect {
+ /**
+ * The source texture. Can be any QQuickTextureProvider.
+ */
+ required property var source
+ /**
+ * The size of the source texture. Used to perform aspect ratio correction.
+ */
+ required property size sourceSize
+
+ /**
+ * The target size of the Lanczos effect.
+ *
+ * Defaults to the width and height of this effect.
+ */
+ property size targetSize: Qt.size(width, height)
+
+ /**
+ * Lanczos window Sinc function factor.
+ *
+ * Defaults to 0.4
+ */
+ property real windowSinc: 0.4;
+ /**
+ * Lanczos Sinc function factor.
+ *
+ * Defaults to 1.0
+ */
+ property real sinc: 1.0;
+
+ /**
+ * The amount of anti-ringing to apply.
+ *
+ * Defaults to 0.65
+ */
+ property real antiRingingStrength: 0.65;
+ /**
+ * The resolution of the Lanczos effect.
+ *
+ * Larger values mean reduced (more pixelated) results.
+ * Defaults to 0.98 to achieve good results.
+ */
+ property real resolution: 0.98;
+
+ vertexShader: Qt.resolvedUrl("preserveaspect.vert")
+ fragmentShader: Qt.resolvedUrl("lanczos2sharp.frag")
+}
--- /dev/null
+#version 120
+
+/*
+ SPDX-FileCopyrightText: 2021 Arjen Hiemstra <ahiemstra@heimr.nl>
+
+ Hyllian's lanczos windowed-jinc 2-lobe sharper 3D with anti-ringing Shader
+
+ Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
+
+ 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.
+*/
+
+uniform sampler2D source;
+uniform highp vec2 targetSize;
+
+uniform highp float windowSinc;
+uniform highp float sinc;
+
+uniform highp float antiRingingStrength;
+uniform highp float resolution;
+
+uniform highp float qt_Opacity;
+
+varying highp vec2 qt_TexCoord0;
+
+// A=0.5, B=0.825 is the best jinc approximation for x<2.5. if B=1.0, it's a lanczos filter.
+// Increase A to get more blur. Decrease it to get a sharper picture.
+// B = 0.825 to get rid of dithering. Increase B to get a fine sharpness, though dithering returns.
+
+#define wa (windowSinc * pi)
+#define wb (sinc * pi)
+
+const highp float pi = 3.1415926535897932384626433832795;
+const highp vec3 dtt = vec3(65536.0, 255.0, 1.0);
+
+highp vec4 reduce4(highp vec3 A, highp vec3 B, highp vec3 C, highp vec3 D)
+{
+ return dtt * mat4x3(A, B, C, D);
+}
+
+highp vec3 min4(highp vec3 a, highp vec3 b, highp vec3 c, highp vec3 d)
+{
+ return min(a, min(b, min(c, d)));
+}
+
+highp vec3 max4(highp vec3 a, highp vec3 b, highp vec3 c, highp vec3 d)
+{
+ return max(a, max(b, max(c, d)));
+}
+
+highp vec4 lanczos(highp vec4 x)
+{
+ return (x == vec4(0.0)) ? vec4(wa * wb) : sin(x * wa) * sin(x * wb) / (x * x);
+}
+
+void main()
+{
+ // Discard any pixels that are outside the bounds of the texture.
+ // This prevents artifacts when the texture doesn't have a full-alpha border.
+ if (any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0)))) {
+ discard;
+ }
+
+ highp vec2 dx = vec2(1.0, 0.0);
+ highp vec2 dy = vec2(0.0, 1.0);
+
+ highp vec2 pixelCoord = qt_TexCoord0 * targetSize / resolution;
+ highp vec2 texel = (floor(pixelCoord) + vec2(0.5, 0.5)) * resolution / targetSize;
+
+ highp vec2 texelCenter = (floor(pixelCoord - vec2(0.5, 0.5)) + vec2(0.5, 0.5));
+
+ highp mat4 weights;
+ weights[0] = lanczos(vec4(distance(pixelCoord, texelCenter - dx - dy),
+ distance(pixelCoord, texelCenter - dy),
+ distance(pixelCoord, texelCenter + dx - dy),
+ distance(pixelCoord, texelCenter + 2.0 * dx - dy)));
+ weights[1] = lanczos(vec4(distance(pixelCoord, texelCenter - dx),
+ distance(pixelCoord, texelCenter),
+ distance(pixelCoord, texelCenter + dx),
+ distance(pixelCoord, texelCenter + 2.0 * dx)));
+ weights[2] = lanczos(vec4(distance(pixelCoord, texelCenter - dx + dy),
+ distance(pixelCoord, texelCenter + dy),
+ distance(pixelCoord, texelCenter + dx + dy),
+ distance(pixelCoord, texelCenter + 2.0 * dx + dy)));
+ weights[3] = lanczos(vec4(distance(pixelCoord, texelCenter - dx + 2.0 * dy),
+ distance(pixelCoord, texelCenter + 2.0 * dy),
+ distance(pixelCoord, texelCenter + dx + 2.0 * dy),
+ distance(pixelCoord, texelCenter + 2.0 * dx + 2.0 * dy)));
+
+ dx = dx * resolution / targetSize;
+ dy = dy * resolution / targetSize;
+ texelCenter = texelCenter * resolution / targetSize;
+
+ // reading the texels
+ highp vec3 color = texture2D(source, qt_TexCoord0).xyz;
+
+ highp vec3 c00 = texture2D(source, texelCenter - dx - dy).xyz;
+ highp vec3 c10 = texture2D(source, texelCenter - dy).xyz;
+ highp vec3 c20 = texture2D(source, texelCenter + dx - dy).xyz;
+ highp vec3 c30 = texture2D(source, texelCenter + 2.0 * dx - dy).xyz;
+ highp vec3 c01 = texture2D(source, texelCenter - dx).xyz;
+ highp vec3 c11 = texture2D(source, texelCenter).xyz;
+ highp vec3 c21 = texture2D(source, texelCenter + dx).xyz;
+ highp vec3 c31 = texture2D(source, texelCenter + 2.0 * dx).xyz;
+ highp vec3 c02 = texture2D(source, texelCenter - dx + dy).xyz;
+ highp vec3 c12 = texture2D(source, texelCenter + dy).xyz;
+ highp vec3 c22 = texture2D(source, texelCenter + dx + dy).xyz;
+ highp vec3 c32 = texture2D(source, texelCenter + 2.0 * dx + dy).xyz;
+ highp vec3 c03 = texture2D(source, texelCenter - dx + 2.0 * dy).xyz;
+ highp vec3 c13 = texture2D(source, texelCenter + 2.0 * dy).xyz;
+ highp vec3 c23 = texture2D(source, texelCenter + dx + 2.0 * dy).xyz;
+ highp vec3 c33 = texture2D(source, texelCenter + 2.0 * dx + 2.0 * dy).xyz;
+
+ highp vec3 F6 = texture2D(source, texel + dx + 0.25 * dx + 0.25 * dy).xyz;
+ highp vec3 F7 = texture2D(source, texel + dx + 0.25 * dx - 0.25 * dy).xyz;
+ highp vec3 F8 = texture2D(source, texel + dx - 0.25 * dx - 0.25 * dy).xyz;
+ highp vec3 F9 = texture2D(source, texel + dx - 0.25 * dx + 0.25 * dy).xyz;
+
+ highp vec3 H6 = texture2D(source, texel + 0.25 * dx + 0.25 * dy + dy).xyz;
+ highp vec3 H7 = texture2D(source, texel + 0.25 * dx - 0.25 * dy + dy).xyz;
+ highp vec3 H8 = texture2D(source, texel - 0.25 * dx - 0.25 * dy + dy).xyz;
+ highp vec3 H9 = texture2D(source, texel - 0.25 * dx + 0.25 * dy + dy).xyz;
+
+ highp vec4 f0 = reduce4(F6, F7, F8, F9);
+ highp vec4 h0 = reduce4(H6, H7, H8, H9);
+
+ // Get min/max samples
+ highp vec3 min_sample = min4(c11, c21, c12, c22);
+ highp vec3 max_sample = max4(c11, c21, c12, c22);
+
+ color = weights[0] * transpose(mat4x3(c00, c10, c20, c30));
+ color += weights[1] * transpose(mat4x3(c01, c11, c21, c31));
+ color += weights[2] * transpose(mat4x3(c02, c12, c22, c32));
+ color += weights[3] * transpose(mat4x3(c03, c13, c23, c33));
+ color = color / dot(vec4(1.0) * weights, vec4(1.0));
+
+ // Anti-ringing
+ highp vec3 aux = color;
+ color = clamp(color, min_sample, max_sample);
+
+ color = mix(aux, color, antiRingingStrength);
+
+ highp float alpha = texture2D(source, qt_TexCoord0).a * qt_Opacity;
+ gl_FragColor = vec4(color, alpha);
+}
--- /dev/null
+#version 150 core
+
+/*
+ SPDX-FileCopyrightText: 2021 Arjen Hiemstra <ahiemstra@heimr.nl>
+
+ Hyllian's lanczos windowed-jinc 2-lobe sharper 3D with anti-ringing Shader
+
+ Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
+
+ 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.
+*/
+
+uniform sampler2D source;
+uniform highp vec2 targetSize;
+
+uniform highp float windowSinc;
+uniform highp float sinc;
+
+uniform highp float antiRingingStrength;
+uniform highp float resolution;
+
+uniform highp float qt_Opacity;
+
+in highp vec2 qt_TexCoord0;
+out highp vec4 out_color;
+
+// A=0.5, B=0.825 is the best jinc approximation for x<2.5. if B=1.0, it's a lanczos filter.
+// Increase A to get more blur. Decrease it to get a sharper picture.
+// B = 0.825 to get rid of dithering. Increase B to get a fine sharpness, though dithering returns.
+
+#define wa (windowSinc * pi)
+#define wb (sinc * pi)
+
+const highp float pi = 3.1415926535897932384626433832795;
+const highp vec3 dtt = vec3(65536.0, 255.0, 1.0);
+
+highp vec4 reduce4(highp vec3 A, highp vec3 B, highp vec3 C, highp vec3 D)
+{
+ return dtt * mat4x3(A, B, C, D);
+}
+
+highp vec3 min4(highp vec3 a, highp vec3 b, highp vec3 c, highp vec3 d)
+{
+ return min(a, min(b, min(c, d)));
+}
+
+highp vec3 max4(highp vec3 a, highp vec3 b, highp vec3 c, highp vec3 d)
+{
+ return max(a, max(b, max(c, d)));
+}
+
+highp vec4 lanczos(highp vec4 x)
+{
+ return (x == vec4(0.0)) ? vec4(wa * wb) : sin(x * wa) * sin(x * wb) / (x * x);
+}
+
+void main()
+{
+ // Discard any pixels that are outside the bounds of the texture.
+ // This prevents artifacts when the texture doesn't have a full-alpha border.
+ if (any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0)))) {
+ discard;
+ }
+
+ highp vec2 dx = vec2(1.0, 0.0);
+ highp vec2 dy = vec2(0.0, 1.0);
+
+ highp vec2 pixelCoord = qt_TexCoord0 * targetSize / resolution;
+ highp vec2 texel = (floor(pixelCoord) + vec2(0.5, 0.5)) * resolution / targetSize;
+
+ highp vec2 texelCenter = (floor(pixelCoord - vec2(0.5, 0.5)) + vec2(0.5, 0.5));
+
+ highp mat4 weights;
+ weights[0] = lanczos(vec4(distance(pixelCoord, texelCenter - dx - dy),
+ distance(pixelCoord, texelCenter - dy),
+ distance(pixelCoord, texelCenter + dx - dy),
+ distance(pixelCoord, texelCenter + 2.0 * dx - dy)));
+ weights[1] = lanczos(vec4(distance(pixelCoord, texelCenter - dx),
+ distance(pixelCoord, texelCenter),
+ distance(pixelCoord, texelCenter + dx),
+ distance(pixelCoord, texelCenter + 2.0 * dx)));
+ weights[2] = lanczos(vec4(distance(pixelCoord, texelCenter - dx + dy),
+ distance(pixelCoord, texelCenter + dy),
+ distance(pixelCoord, texelCenter + dx + dy),
+ distance(pixelCoord, texelCenter + 2.0 * dx + dy)));
+ weights[3] = lanczos(vec4(distance(pixelCoord, texelCenter - dx + 2.0 * dy),
+ distance(pixelCoord, texelCenter + 2.0 * dy),
+ distance(pixelCoord, texelCenter + dx + 2.0 * dy),
+ distance(pixelCoord, texelCenter + 2.0 * dx + 2.0 * dy)));
+
+ dx = dx * resolution / targetSize;
+ dy = dy * resolution / targetSize;
+ texelCenter = texelCenter * resolution / targetSize;
+
+ // reading the texels
+ highp vec3 color = texture(source, qt_TexCoord0).xyz;
+
+ highp vec3 c00 = texture(source, texelCenter - dx - dy).xyz;
+ highp vec3 c10 = texture(source, texelCenter - dy).xyz;
+ highp vec3 c20 = texture(source, texelCenter + dx - dy).xyz;
+ highp vec3 c30 = texture(source, texelCenter + 2.0 * dx - dy).xyz;
+ highp vec3 c01 = texture(source, texelCenter - dx).xyz;
+ highp vec3 c11 = texture(source, texelCenter).xyz;
+ highp vec3 c21 = texture(source, texelCenter + dx).xyz;
+ highp vec3 c31 = texture(source, texelCenter + 2.0 * dx).xyz;
+ highp vec3 c02 = texture(source, texelCenter - dx + dy).xyz;
+ highp vec3 c12 = texture(source, texelCenter + dy).xyz;
+ highp vec3 c22 = texture(source, texelCenter + dx + dy).xyz;
+ highp vec3 c32 = texture(source, texelCenter + 2.0 * dx + dy).xyz;
+ highp vec3 c03 = texture(source, texelCenter - dx + 2.0 * dy).xyz;
+ highp vec3 c13 = texture(source, texelCenter + 2.0 * dy).xyz;
+ highp vec3 c23 = texture(source, texelCenter + dx + 2.0 * dy).xyz;
+ highp vec3 c33 = texture(source, texelCenter + 2.0 * dx + 2.0 * dy).xyz;
+
+ highp vec3 F6 = texture(source, texel + dx + 0.25 * dx + 0.25 * dy).xyz;
+ highp vec3 F7 = texture(source, texel + dx + 0.25 * dx - 0.25 * dy).xyz;
+ highp vec3 F8 = texture(source, texel + dx - 0.25 * dx - 0.25 * dy).xyz;
+ highp vec3 F9 = texture(source, texel + dx - 0.25 * dx + 0.25 * dy).xyz;
+
+ highp vec3 H6 = texture(source, texel + 0.25 * dx + 0.25 * dy + dy).xyz;
+ highp vec3 H7 = texture(source, texel + 0.25 * dx - 0.25 * dy + dy).xyz;
+ highp vec3 H8 = texture(source, texel - 0.25 * dx - 0.25 * dy + dy).xyz;
+ highp vec3 H9 = texture(source, texel - 0.25 * dx + 0.25 * dy + dy).xyz;
+
+ highp vec4 f0 = reduce4(F6, F7, F8, F9);
+ highp vec4 h0 = reduce4(H6, H7, H8, H9);
+
+ // Get min/max samples
+ highp vec3 min_sample = min4(c11, c21, c12, c22);
+ highp vec3 max_sample = max4(c11, c21, c12, c22);
+
+ color = weights[0] * transpose(mat4x3(c00, c10, c20, c30));
+ color += weights[1] * transpose(mat4x3(c01, c11, c21, c31));
+ color += weights[2] * transpose(mat4x3(c02, c12, c22, c32));
+ color += weights[3] * transpose(mat4x3(c03, c13, c23, c33));
+ color = color / dot(vec4(1.0) * weights, vec4(1.0));
+
+ // Anti-ringing
+ highp vec3 aux = color;
+ color = clamp(color, min_sample, max_sample);
+
+ color = mix(aux, color, antiRingingStrength);
+
+ float alpha = texture(source, qt_TexCoord0).a * qt_Opacity;
+ out_color = vec4(color, alpha);
+}
--- /dev/null
+/*
+SPDX-FileCopyrightText: 2021 Arjen Hiemstra <ahiemstra@heimr.nl>
+
+SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+// This shader performs UV coordinates that account for the aspect ratio of some
+// source as specified by the sourceSize uniform. The effective result is that
+// this results in behaviour similar to the "PreserveAspectFit" mode of QML Image.
+
+uniform highp mat4 qt_Matrix;
+
+uniform highp vec2 sourceSize;
+uniform highp vec2 targetSize;
+
+attribute highp vec4 qt_Vertex;
+attribute highp vec2 qt_MultiTexCoord0;
+
+varying highp vec2 qt_TexCoord0;
+
+void main() {
+ highp float scale = min(targetSize.x / sourceSize.x, targetSize.y / sourceSize.y);
+
+ highp vec2 newSize = sourceSize * scale;
+ highp vec2 newOffset = (targetSize - newSize) / 2.0;
+ highp vec2 uvOffset = (1.0 / newSize) * newOffset;
+
+ qt_TexCoord0 = -uvOffset + (targetSize / newSize) * qt_MultiTexCoord0;
+ gl_Position = qt_Matrix * qt_Vertex;
+}
--- /dev/null
+/*
+SPDX-FileCopyrightText: 2021 Arjen Hiemstra <ahiemstra@heimr.nl>
+
+SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+// This shader performs UV coordinates that account for the aspect ratio of some
+// source as specified by the sourceSize uniform. The effective result is that
+// this results in behaviour similar to the "PreserveAspectFit" mode of QML Image.
+
+uniform highp mat4 qt_Matrix;
+
+uniform highp vec2 sourceSize;
+
+in highp vec4 qt_Vertex;
+in highp vec2 qt_MultiTexCoord0;
+
+out highp vec2 qt_TexCoord0;
+
+void main() {
+ highp float scale = min(targetSize.x / sourceSize.x, targetSize.y / sourceSize.y);
+
+ highp vec2 newSize = sourceSize * scale;
+ highp vec2 newOffset = (targetSize - newSize) / 2.0;
+ highp vec2 uvOffset = (1.0 / newSize) * newOffset;
+
+ qt_TexCoord0 = -uvOffset + (targetSize / newSize) * qt_MultiTexCoord0;
+ gl_Position = qt_Matrix * qt_Vertex;
+}
--- /dev/null
+module org.kde.graphicaleffects
+
+Lanczos 1.0 Lanczos.qml
--- /dev/null
+project(kcmcontrols)
+
+set(kcmcontrols_SRCS
+ kcmcontrolsplugin.cpp
+ settingstateproxy.cpp
+ settinghighlighterprivate.cpp
+)
+
+add_library(kcmcontrolsplugin SHARED ${kcmcontrols_SRCS})
+target_link_libraries(kcmcontrolsplugin
+ Qt5::Core
+ Qt5::Quick
+ Qt5::Qml
+ Qt5::Gui
+ KF5::CoreAddons
+ KF5::QuickAddons
+ KF5::ConfigCore
+)
+
+install(TARGETS kcmcontrolsplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kcm)
+
+install(DIRECTORY qml/ DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kcm)
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#include "kcmcontrolsplugin.h"
+
+#include "settinghighlighterprivate.h"
+#include "settingstateproxy.h"
+#include <KQuickAddons/ConfigModule>
+
+void KCMControlsPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(uri == QByteArray("org.kde.kcm"));
+
+ qmlRegisterUncreatableType<KQuickAddons::ConfigModule>(uri, 1, 0, "ConfigModule", QLatin1String("Do not create objects of type ConfigModule"));
+ qmlRegisterType<SettingStateProxy>(uri, 1, 3, "SettingStateProxy");
+ qmlRegisterType<SettingHighlighterPrivate>("org.kde.kcm.private", 1, 3, "SettingHighlighterPrivate");
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: MIT
+*/
+
+#ifndef KCMCONTROLSPLUGIN_H
+#define KCMCONTROLSPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+
+class KCMControlsPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.14 as Kirigami
+import org.kde.kcm 1.1 as KCM
+
+/**
+ * This component is intended to be used as root item for
+ * KCMs with arbitrary content. Unlike SimpleKCM this does NOT
+ * provide a scrollable view, The developer will have to manage
+ * their own scrollviews.
+ * Most of the times SimpleKCM should be used instead
+ * @code
+ * import org.kde.kcm 1.4 as KCM
+ * import org.kde.kirigami 2.3 as Kirigami
+ * KCM.AbstractKCM {
+ * RowLayout {
+ * QQC2.ScrollView {
+ * ...
+ * }
+ * QQC2.ScrollView {
+ * ...
+ * }
+ * }
+ * footer: Item {...}
+ * }
+ * @endcode
+ * @inherits org.kde.kirigami.Page
+ */
+Kirigami.Page {
+ id: root
+
+ title: kcm.name
+
+ // Make pages fill the whole view by default
+ Kirigami.ColumnView.fillWidth: true
+
+ leftPadding: 6 // Layout_ChildMarginWidth from Breeze
+ topPadding: headerParent.contentVisible ? 0 : leftPadding
+ rightPadding: leftPadding
+ bottomPadding: footerParent.contentVisible ? 0 : leftPadding
+
+ header: QtControls.Control {
+ id: headerParent
+ readonly property bool contentVisible: contentItem && contentItem.visible && contentItem.implicitHeight
+ height: contentVisible ? implicitHeight : 0
+ leftPadding: 6 // Layout_ChildMarginWidth from Breeze
+ topPadding: leftPadding
+ rightPadding: leftPadding
+ bottomPadding: leftPadding
+ }
+
+ footer: QtControls.Control {
+ id: footerParent
+ readonly property bool contentVisible: contentItem && contentItem.visible && contentItem.implicitHeight
+ height: contentVisible ? implicitHeight : 0
+ leftPadding: 6 // Layout_ChildMarginWidth from Breeze
+ topPadding: leftPadding
+ rightPadding: leftPadding
+ bottomPadding: leftPadding
+ }
+
+ Component.onCompleted: {
+ if (footer && footer != footerParent) {
+ var f = footer
+
+ footerParent.contentItem = f
+ footer = footerParent
+ footer.visible = true
+ f.parent = footerParent
+ }
+
+ if (header && header != headerParent) {
+ var h = header
+
+ headerParent.contentItem = h
+ header = headerParent
+ header.visible = true
+ h.parent = headerParent
+ }
+
+ //Search overlaysheets in contentItem, parent to root if found
+ for (let i in contentItem.data) {
+ let child = contentItem.data[i];
+ if (child instanceof Kirigami.OverlaySheet) {
+ if (!child.parent) {
+ child.parent = root;
+ }
+ root.data.push(child);
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ Copyright (c) 2020 Felix Ernst <fe.a.ernst@gmail.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the license or (at your option) any later version
+ that is accepted by the membership of KDE e.V. (or its successor
+ approved by the membership of KDE e.V.), which shall act as a
+ proxy as defined in Section 6 of version 3 of the license.
+
+ 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.
+*/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.7 as QQC2
+import QtQuick.Window 2.15
+import QtQuick.Dialogs 1.2 as QtDialogs
+import org.kde.kirigami 2.3 as Kirigami
+import org.kde.kcm 1.0
+
+
+QQC2.Button {
+ id: root
+
+ icon.name: "help-contextual"
+ flat: true
+ property alias toolTipText: toolTip.text
+ property var toolTipVisible: false
+
+ onReleased: {
+ toolTipVisible ? toolTip.delay = Kirigami.Units.toolTipDelay : toolTip.delay = 0;
+ toolTipVisible = !toolTipVisible;
+ }
+ onActiveFocusChanged: {
+ toolTip.delay = Kirigami.Units.toolTipDelay;
+ toolTipVisible = false;
+ }
+ Layout.maximumHeight: parent.height
+ QQC2.ToolTip {
+ id: toolTip
+ implicitWidth: Math.min(21 * Kirigami.Units.gridUnit, root.Window.width) // Wikipedia says anything between 45 and 75 characters per line is acceptable. 21 * Kirigami.Units.gridUnit feels right.
+ visible: parent.hovered || parent.toolTipVisible
+ onVisibleChanged: {
+ if (!visible && parent.toolTipVisible) {
+ parent.toolTipVisible = false;
+ delay = Kirigami.Units.toolTipDelay;
+ }
+ }
+ timeout: -1
+ }
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.WhatsThisCursor
+ acceptedButtons: Qt.NoButton
+ }
+ Accessible.name: i18nc("@action:button", "Show Contextual Help")
+}
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.8
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.2 as QQC2
+import QtQuick.Templates 2.2 as T2
+import QtGraphicalEffects 1.0
+
+import org.kde.kirigami 2.12 as Kirigami
+
+/**
+ * Base delegate for KControlmodules based on Grid views of thumbnails
+ * Use the onClicked signal handler for managing the main action when
+ * the user clicks on the thumbnail
+ * @inherits QtQuick.Templates.ItemDelegate
+ */
+T2.ItemDelegate {
+ id: delegate
+
+ /**
+ * toolTip: string
+ * string for a tooltip for the whole delegate
+ */
+ property string toolTip
+
+ /**
+ * subtitle: string
+ * optional string for the text to show below the main label
+ */
+ property string subtitle
+
+ /**
+ * thumbnail: Item
+ * the item actually implementing the thumbnail: the visualization is up to the implementation
+ */
+ property alias thumbnail: thumbnailArea.data
+
+ /**
+ * thumbnailAvailable: bool
+ * Set it to true when a thumbnail is actually available: when false,
+ * only an icon will be shown instead of the actual thumbnail
+ * ("edit-none" if pluginName is "None", otherwise it uses "view-preview").
+ */
+ property bool thumbnailAvailable: false
+
+ /**
+ * actions: list<Action>
+ * A list of extra actions for the thumbnails. They will be shown as
+ * icons on the bottom-right corner of the thumbnail on mouse over
+ */
+ property list<QtObject> actions
+
+ width: GridView.view.cellWidth
+ height: GridView.view.cellHeight
+ hoverEnabled: !Kirigami.Settings.isMobile
+
+ Keys.onEnterPressed: menu.trigger()
+ Keys.onSpacePressed: menu.trigger()
+
+ QQC2.Menu {
+ id: menu
+
+ function trigger() {
+ delegate.clicked()
+ if (delegate.actions.length > 0) {
+ menu.popup(delegate, thumbnail.x, thumbnail.y + thumbnail.height)
+ }
+ }
+
+ onClosed: view.forceActiveFocus()
+
+ Repeater {
+ model: delegate.actions
+ delegate: QQC2.MenuItem {
+ text: modelData.text || modelData.tooltip
+ icon.name: modelData.iconName
+ onTriggered: modelData.trigger()
+ enabled: modelData.enabled
+ visible: modelData.visible
+ }
+ }
+ }
+
+ Kirigami.ShadowedRectangle {
+ id: thumbnail
+ anchors {
+ centerIn: parent
+ verticalCenterOffset: Math.ceil(-labelLayout.height/2)
+ }
+ width: Kirigami.Settings.isMobile ? delegate.width - Kirigami.Units.gridUnit : Math.min(delegate.GridView.view.implicitCellWidth, delegate.width - Kirigami.Units.gridUnit)
+ height: Kirigami.Settings.isMobile ? Math.round((delegate.width - Kirigami.Units.gridUnit) / 1.6)
+ : Math.min(delegate.GridView.view.implicitCellHeight - Kirigami.Units.gridUnit * 3,
+ delegate.height - Kirigami.Units.gridUnit)
+ radius: Kirigami.Units.smallSpacing
+ Kirigami.Theme.inherit: false
+ Kirigami.Theme.colorSet: Kirigami.Theme.View
+
+ shadow.xOffset: 0
+ shadow.yOffset: 2
+ shadow.size: 10
+ shadow.color: Qt.rgba(0, 0, 0, 0.3)
+
+ color: {
+ if (delegate.GridView.isCurrentItem) {
+ if (delegate.GridView.view.neutralHighlight) {
+ return Kirigami.Theme.neutralTextColor;
+ }
+ return Kirigami.Theme.highlightColor;
+ } else if (parent.hovered) {
+ // Match appearance of hovered list items
+ return Qt.rgba(Kirigami.Theme.highlightColor.r,
+ Kirigami.Theme.highlightColor.g,
+ Kirigami.Theme.highlightColor.b,
+ 0.5);
+ } else {
+ return Kirigami.Theme.backgroundColor;
+ }
+ }
+
+ Rectangle {
+ id: thumbnailArea
+ radius: Kirigami.Units.smallSpacing/2
+ anchors {
+ fill: parent
+ margins: Kirigami.Units.smallSpacing
+ }
+
+ color: Kirigami.Theme.backgroundColor
+
+ // "None/There's nothing here" indicator
+ Kirigami.Icon {
+ visible: !delegate.thumbnailAvailable
+ anchors.centerIn: parent
+ width: Kirigami.Units.iconSizes.large
+ height: width
+ source: typeof pluginName === "string" && pluginName === "None" ? "edit-none" : "view-preview"
+ }
+
+ RowLayout {
+ anchors {
+ right: parent.right
+ rightMargin: Kirigami.Units.smallSpacing
+ bottom: parent.bottom
+ bottomMargin: Kirigami.Units.smallSpacing
+ }
+
+ // Always show above thumbnail content
+ z: 9999
+
+ visible: children.length > 0 && (Kirigami.Settings.isMobile || delegate.hovered || delegate.GridView.isCurrentItem)
+
+ Repeater {
+ model: delegate.actions
+ delegate: QQC2.Button {
+ icon.name: modelData.iconName
+ activeFocusOnTab: false
+ onClicked: modelData.trigger()
+ enabled: modelData.enabled
+ visible: modelData.visible
+ //NOTE: there aren't any global settings where to take "official" tooltip timeouts
+ QQC2.ToolTip.delay: 1000
+ QQC2.ToolTip.timeout: 5000
+ QQC2.ToolTip.visible: (Kirigami.Settings.isMobile ? pressed : hovered) && modelData.tooltip.length > 0
+ QQC2.ToolTip.text: modelData.tooltip
+ }
+ }
+ }
+ }
+ }
+
+ ColumnLayout {
+ id: labelLayout
+ spacing: 0
+ height: Kirigami.Units.gridUnit * 2
+ anchors {
+ left: thumbnail.left
+ right: thumbnail.right
+ top: thumbnail.bottom
+ topMargin: Kirigami.Units.largeSpacing
+ }
+
+ QQC2.Label {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignTop
+ text: delegate.text
+ elide: Text.ElideRight
+ font.bold: delegate.GridView.isCurrentItem
+ }
+ QQC2.Label {
+ id: caption
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ horizontalAlignment: Text.AlignHCenter
+ visible: delegate.subtitle.length > 0
+ opacity: 0.6
+ text: delegate.subtitle
+ font.pointSize: Kirigami.Theme.smallFont.pointSize
+ font.bold: delegate.GridView.isCurrentItem
+ elide: Text.ElideRight
+ }
+ }
+
+ QQC2.ToolTip.delay: 1000
+ QQC2.ToolTip.timeout: 5000
+ QQC2.ToolTip.visible: hovered && delegate.toolTip.length > 0
+ QQC2.ToolTip.text: toolTip
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.3 as Kirigami
+import "private"
+
+/**
+ * A ScrollView containing a GridView, with the default behavior about
+ * sizing and background as recommended by the user interface guidelines
+ * For most KControl modules, it's recommended to use instead the GridViewKCM
+ * component as the root element of your module.
+ * @see GridViewKCM
+ */
+QtControls.ScrollView {
+ id: scroll
+
+ /**
+ * view: GridView
+ * Exposes the internal GridView: in order to set a model or a delegate to it,
+ * use the following code:
+ * @code
+ * import org.kde.kcm 1.1 as KCM
+ * KCM.GridView {
+ * view.model: kcm.model
+ * view.delegate: KCM.GridDelegate {...}
+ * }
+ * @endcode
+ */
+ property alias view: view
+
+ activeFocusOnTab: false
+ Kirigami.Theme.colorSet: Kirigami.Theme.View
+ Kirigami.Theme.inherit: false
+
+ Component.onCompleted: scroll.background.visible = true;
+
+ GridViewInternal {
+ id: view
+ }
+ QtControls.ScrollBar.horizontal.visible: false
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.2 as Kirigami
+import org.kde.kcm 1.1 as KCM
+
+/**
+ * This component is intended to be used as the root item for KCMs that are based upon
+ * a grid view of thumbnails, such as the theme or wallpaper selectors.
+ * It contains a GridView as its main item.
+ * It is possible to specify a header and footer component.
+ * @code
+ * import org.kde.kcm 1.1 as KCM
+ * KCM.GridViewKCM {
+ * header: Item {...}
+ * view.model: kcm.model
+ * view.delegate: KCM.GridDelegate {...}
+ * footer: Item {...}
+ * }
+ * @endcode
+ */
+AbstractKCM {
+ id: root
+
+ /**
+ * view: GridView
+ * Exposes the internal GridView: in order to set a model or a delegate to it,
+ * use the following code:
+ * @code
+ * import org.kde.kcm 1.1 as KCM
+ * KCM.GridViewKCM {
+ * ...
+ * view.model: kcm.model
+ * view.delegate: KCM.GridDelegate {...}
+ * ...
+ * }
+ * @endcode
+ */
+ property alias view: scroll.view
+
+ implicitWidth: {
+ var width = 0;
+
+ // Show three columns at once, every column occupies implicitCellWidth + Units.gridUnit
+ width += 3 * (view.implicitCellWidth + Kirigami.Units.gridUnit);
+
+ var scrollBar = scroll.QtControls.ScrollBar.vertical;
+ width += scrollBar.width + scrollBar.leftPadding + scrollBar.rightPadding;
+
+ width += scroll.leftPadding + scroll.rightPadding
+ width += root.leftPadding + root.rightPadding;
+
+ return width;
+ }
+ implicitHeight: view.implicitCellHeight * 3 + (header ? header.height : 0) + (footer ? footer.height : 0) + Kirigami.Units.gridUnit
+
+ flickable: scroll.view
+
+ KCM.GridView {
+ id: scroll
+ anchors.fill: parent
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2018 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.3 as Kirigami
+
+/**
+ * A ScrollView containing a GridView, with the default behavior about
+ * sizing and background as recommended by the user interface guidelines
+ * For most KControl modules, it's recommended to use instead the GridViewKCM
+ * component as the root element of your module.
+ * @code
+ * import org.kde.kcm 1.2 as KCM
+ * KCM.ScrollView {
+ * view: ListView {
+ * ...
+ * }
+ * }
+ * @endcode
+ * @see GridViewKCM
+ */
+QtControls.ScrollView {
+ id: scroll
+
+ /**
+ * view: GridView
+ * Exposes the internal flickable
+ */
+ property Flickable view
+ contentItem: view
+ onViewChanged: {
+ view.parent = scroll;
+ }
+
+ activeFocusOnTab: false
+ Kirigami.Theme.colorSet: Kirigami.Theme.View
+ Kirigami.Theme.inherit: false
+
+ Component.onCompleted: scroll.background.visible = true;
+
+
+ QtControls.ScrollBar.horizontal.visible: false
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.2 as Kirigami
+import org.kde.kcm 1.1 as KCM
+import "." as Priv
+
+/**
+ * This component is intended to be used as the root item for KCMs that are based upon a list view or another vertical flickable.
+ * It contains a ScrollView as its main item.
+ * It is possible to specify a header and footer component.
+ * @code
+ * import org.kde.kcm 1.2 as KCM
+ * KCM.ScrollViewKCM {
+ * header: Item {...}
+ * view: ListView {
+ * ...
+ * }
+ * footer: Item {...}
+ * }
+ * @endcode
+ */
+AbstractKCM {
+ id: root
+
+ /**
+ * view: ScrollView
+ * Exposes the internal flickable
+ */
+ property alias view: scroll.view
+
+ Priv.ScrollView {
+ id: scroll
+ anchors.fill: parent
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>
+ SPDX-FileCopyrightText: 2020 David Redondo <kde@david.redondo.de>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.8
+import org.kde.kcm 1.3 as KCM
+import org.kde.kcm.private 1.3
+
+/**
+ * SettingHighlighter automatically impacts the representation of an item based on
+ * the value of a setting. When you are using this item you need to manually
+ * manage whether the highlighting is enabled or not. For a higher level component
+ * see KCM.SettingStateBinding which will manage the state of the Item
+ * @since 5.75
+ */
+Item {
+ id: root
+
+ /**
+ * target: Item
+ * The graphical element whose appearance will be altered.
+ * If target is not set, it will try to find the visual parent item
+ */
+ property alias target: helper.target
+
+ /***
+ * highlight: bool
+ * Whether the target will be highlighted.
+ */
+ property alias highlight: helper.highlight
+
+ SettingHighlighterPrivate {
+ id: helper
+ defaultIndicatorVisible: kcm.defaultsIndicatorsVisible
+ }
+
+ Component.onCompleted: {
+ helper.updateTarget();
+ }
+}
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.8
+import QtQml 2.14
+import QtQuick.Layouts 1.3
+import org.kde.kcm 1.3 as KCM
+import org.kde.kcm.private 1.3
+
+/**
+ * SettingStateBinding automatically impacts the representation
+ * of an item based on the state of a setting. It will disable
+ * the item if the setting is immutable and use a visual indicator
+ * for the state of the setting.
+ *
+ * This is a higher level convenience wrapper for KCM.SettingStateProxy
+ * and KCM.SettingStateIndicator.
+ *
+ * @since 5.73
+ */
+Item {
+ id: root
+
+ /**
+ * target: Item
+ * The graphical element whose state we want to manage based on a setting
+ * If target is not set, it will try to find the visual parent item
+ */
+ property alias target: helper.target
+
+ /**
+ * configObject: KCoreConfigSkeleton
+ * The config object which will be monitored for setting state changes
+ */
+ property alias configObject: settingState.configObject
+
+ /**
+ * settingName: string
+ * The name of the setting in the config object to be monitored
+ */
+ property alias settingName: settingState.settingName
+
+ /**
+ * extraEnabledConditions: bool
+ * SettingStateBinding will manage the enabled property of the target
+ * based on the immutability state of the setting it represents. But,
+ * sometimes that enabled state needs to bind to other properties as
+ * well to be computed properly. This extra condition will thus be
+ * combined with the immutability state of the setting to determine
+ * the effective enabled state of the target.
+ */
+ property bool extraEnabledConditions: true
+
+
+ /**
+ * nonDefaultHighlightVisible: bool
+ * Expose whether the non default highlight is visible.
+ * Allow one to implement highlight with custom items.
+ *
+ * @since 5.73
+ */
+ readonly property bool nonDefaultHighlightVisible: helper.highlight && kcm.defaultsIndicatorsVisible
+
+ Binding {
+ when: helper.target
+ target: helper.target
+ property: "enabled"
+ value: extraEnabledConditions && !settingState.immutable
+ restoreMode: Binding.RestoreBinding
+ }
+
+ Binding {
+ when: helper.target
+ target: helper
+ property: "highlight"
+ value: !settingState.defaulted
+ restoreMode: Binding.RestoreBinding
+ }
+
+ KCM.SettingStateProxy {
+ id: settingState
+ }
+
+ SettingHighlighterPrivate {
+ id: helper
+ defaultIndicatorVisible: kcm.defaultsIndicatorsVisible
+ }
+
+ Component.onCompleted: {
+ helper.updateTarget();
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2017 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.14 as Kirigami
+import org.kde.kcm 1.1 as KCM
+
+/**
+ * This component is intended to be used as root item for
+ * KCMs with arbitrary content. Often a Kirigami.FormLayout
+ * is used as main element.
+ * It is possible to specify a header and footer component.
+ * @code
+ * import org.kde.kcm 1.1 as KCM
+ * import org.kde.kirigami 2.3 as Kirigami
+ * KCM.SimpleKCM {
+ * Kirigami.FormLayout {
+ * TextField {
+ * Kirigami.FormData.label: "Label:"
+ * }
+ * TextField {
+ * Kirigami.FormData.label: "Label:"
+ * }
+ * }
+ * footer: Item {...}
+ * }
+ * @endcode
+ * @inherits org.kde.kirigami.ScrollablePage
+ */
+Kirigami.ScrollablePage {
+ id: root
+
+ title: kcm.name
+
+ // Make pages fill the whole view by default
+ Kirigami.ColumnView.fillWidth: true
+
+ leftPadding: 6 // Layout_ChildMarginWidth from Breeze
+ topPadding: headerParent.contentItem ? 0 : leftPadding
+ rightPadding: leftPadding
+ bottomPadding: footerParent.contentItem ? 0 : leftPadding
+
+ header: QtControls.Control {
+ id: headerParent
+ height: contentItem ? implicitHeight : 0
+ }
+
+ footer: QtControls.Control {
+ id: footerParent
+ height: contentItem ? implicitHeight : 0
+ }
+
+ Component.onCompleted: {
+ if (footer && footer != footerParent) {
+ var f = footer
+
+ footerParent.contentItem = f
+ footer = footerParent
+ footer.visible = true
+ f.parent = footerParent
+ }
+
+ if (header && header != headerParent) {
+ var h = header
+
+ headerParent.contentItem = h
+ header = headerParent
+ header.visible = true
+ h.parent = headerParent
+ }
+ }
+
+ children: [
+ Kirigami.Separator {
+ z: 999
+ anchors {
+ left: parent.left
+ right: parent.right
+ top: parent.top
+ topMargin: root.header.visible ? root.header.height : 0
+ }
+ visible: !root.flickable.atYBeginning && !Kirigami.Settings.isMobile
+ },
+ Kirigami.Separator {
+ z: 999
+ anchors {
+ left: parent.left
+ right: parent.right
+ bottom: parent.bottom
+ bottomMargin: root.footer.visible ? root.footer.height : 0
+ }
+ visible: !root.flickable.atYEnd && !Kirigami.Settings.isMobile
+ }
+ ]
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.7
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.2 as QtControls
+import org.kde.kirigami 2.3 as Kirigami
+
+
+GridView {
+ id: view
+
+ property int implicitCellWidth: Kirigami.Units.gridUnit * 10
+ property int implicitCellHeight: Math.round(implicitCellWidth / 1.6) + Kirigami.Units.gridUnit*3
+
+ /**
+ * Allow to highlight the selected item with Kirigami.Theme.neutralTextColor
+ */
+ property bool neutralHighlight: false
+
+ onCurrentIndexChanged: positionViewAtIndex(currentIndex, GridView.Contain);
+
+ QtObject {
+ id: internal
+ readonly property int availableWidth: scroll.width - internal.scrollBarSpace - 4
+ readonly property int scrollBarSpace: scroll.QtControls.ScrollBar.vertical.width
+ }
+ anchors {
+ fill: parent
+ margins: 2
+ leftMargin: scroll.QtControls.ScrollBar.vertical.visible ? 2 : Math.round(internal.scrollBarSpace/2) + 2
+ }
+ clip: true
+ activeFocusOnTab: true
+
+ Keys.onTabPressed: nextItemInFocusChain().forceActiveFocus(Qt.TabFocusReason)
+ Keys.onBacktabPressed: nextItemInFocusChain(false).forceActiveFocus(Qt.TabFocusReason)
+
+ cellWidth: Math.floor(internal.availableWidth / Math.max(Math.floor(internal.availableWidth / (implicitCellWidth + Kirigami.Units.gridUnit)), (Kirigami.Settings.isMobile ? 1 : 2)))
+ cellHeight: Kirigami.Settings.isMobile ? cellWidth/1.6 + Kirigami.Units.gridUnit : implicitCellHeight
+
+ keyNavigationEnabled: true
+ keyNavigationWraps: true
+ highlightMoveDuration: 0
+
+ remove: Transition {
+ ParallelAnimation {
+ NumberAnimation { property: "scale"; to: 0.5; duration: Kirigami.Units.longDuration }
+ NumberAnimation { property: "opacity"; to: 0.0; duration: Kirigami.Units.longDuration }
+ }
+ }
+
+ removeDisplaced: Transition {
+ SequentialAnimation {
+ // wait for the "remove" animation to finish
+ PauseAnimation { duration: Kirigami.Units.longDuration }
+ NumberAnimation { properties: "x,y"; duration: Kirigami.Units.longDuration }
+ }
+ }
+}
--- /dev/null
+module org.kde.kcm
+plugin kcmcontrolsplugin
+
+GridDelegate 1.1 GridDelegate.qml
+GridViewKCM 1.1 GridViewKCM.qml
+GridView 1.1 GridView.qml
+ScrollView 1.2 ScrollView.qml
+ScrollViewKCM 1.2 ScrollViewKCM.qml
+SimpleKCM 1.1 SimpleKCM.qml
+AbstractKCM 1.4 AbstractKCM.qml
+SettingStateBinding 1.3 SettingStateBinding.qml
+SettingHighlighter 1.5 SettingHighlighter.qml
+ContextualHelpButton 1.6 ContextualHelpButton.qml
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>
+ SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "settinghighlighterprivate.h"
+
+#include <QGuiApplication>
+#include <QQmlContext>
+
+namespace
+{
+QByteArray itemClassName(QQuickItem *item)
+{
+ // Split since some exported types will be of the form: Foo_QMLTYPE_XX
+ const auto className = QByteArray(item->metaObject()->className()).split('_').first();
+ return className;
+}
+
+QList<QQuickItem *> findDescendantItems(QQuickItem *item)
+{
+ const auto children = item->childItems();
+ auto result = children;
+ for (auto child : children) {
+ result += findDescendantItems(child);
+ }
+ return result;
+}
+
+QQuickItem *findStyleItem(QQuickItem *item)
+{
+ const auto className = itemClassName(item);
+
+ auto descendant = findDescendantItems(item);
+ for (auto child : std::as_const(descendant)) {
+ if (className.contains("FontWidget") && itemClassName(child).contains("TextField")) {
+ return child->property("background").value<QQuickItem *>();
+ }
+ if (itemClassName(child).contains("GridViewInternal")) {
+ return child;
+ }
+ if (itemClassName(child).contains("GridView")) {
+ return child->property("view").value<QQuickItem *>();
+ }
+ if (itemClassName(child).contains("CheckIndicator") //
+ || itemClassName(child).contains("KQuickStyleItem")) {
+ return child;
+ }
+ }
+ return nullptr;
+}
+
+} // namespace
+
+QQuickItem *SettingHighlighterPrivate::target() const
+{
+ return m_target;
+}
+
+void SettingHighlighterPrivate::setTarget(QQuickItem *target)
+{
+ if (m_target == target) {
+ return;
+ }
+
+ m_target = target;
+ Q_EMIT targetChanged();
+}
+
+bool SettingHighlighterPrivate::highlight() const
+{
+ return m_highlight;
+}
+
+void SettingHighlighterPrivate::setHighlight(bool highlight)
+{
+ if (m_highlight == highlight) {
+ return;
+ }
+
+ m_highlight = highlight;
+ updateTarget();
+ Q_EMIT highlightChanged();
+}
+
+bool SettingHighlighterPrivate::defaultIndicatorVisible() const
+{
+ return m_enabled;
+}
+
+void SettingHighlighterPrivate::setDefaultIndicatorVisible(bool enabled)
+{
+ if (m_enabled == enabled) {
+ return;
+ }
+
+ m_enabled = enabled;
+ updateTarget();
+
+ Q_EMIT defaultIndicatorVisibleChanged(m_enabled);
+}
+
+void SettingHighlighterPrivate::updateTarget()
+{
+ if (!m_styleTarget) {
+ if (!m_target) {
+ // parent is SettingStateBinding/SettingHighlighter, use its visual parent as target item.
+ const auto *parentItem = qobject_cast<QQuickItem *>(parent());
+ if (parentItem) {
+ setTarget(parentItem->parentItem());
+ }
+ }
+ if (m_target) {
+ m_styleTarget = findStyleItem(m_target);
+ }
+ }
+
+ if (m_styleTarget) {
+ if (itemClassName(m_styleTarget).contains("GridViewInternal")) {
+ m_styleTarget->setProperty("neutralHighlight", m_highlight && m_enabled);
+ } else {
+ m_styleTarget->setProperty("_kde_highlight_neutral", m_highlight && m_enabled);
+ }
+ m_styleTarget->polish();
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>
+ SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef SETTINGSHIGHLIGHTERPRIVATE_H
+#define SETTINGSHIGHLIGHTERPRIVATE_H
+
+#include <QPointer>
+#include <QQuickItem>
+
+class SettingHighlighterPrivate : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged)
+ Q_PROPERTY(bool highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
+ Q_PROPERTY(bool defaultIndicatorVisible READ defaultIndicatorVisible WRITE setDefaultIndicatorVisible NOTIFY defaultIndicatorVisibleChanged)
+
+public:
+ using QObject::QObject;
+
+ QQuickItem *target() const;
+ void setTarget(QQuickItem *target);
+
+ bool highlight() const;
+ void setHighlight(bool highlight);
+
+ bool defaultIndicatorVisible() const;
+ void setDefaultIndicatorVisible(bool enabled);
+
+Q_SIGNALS:
+ void targetChanged();
+ void highlightChanged();
+ void defaultIndicatorVisibleChanged(bool enabled);
+
+public Q_SLOTS:
+ void updateTarget();
+
+private:
+ QPointer<QQuickItem> m_target = nullptr;
+ QPointer<QQuickItem> m_styleTarget = nullptr;
+ bool m_highlight = false;
+ bool m_enabled = false;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>
+ SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "settingstateproxy.h"
+
+#include <QDebug>
+#include <QMetaMethod>
+
+KCoreConfigSkeleton *SettingStateProxy::configObject() const
+{
+ return m_configObject;
+}
+
+void SettingStateProxy::setConfigObject(KCoreConfigSkeleton *configObject)
+{
+ if (m_configObject == configObject) {
+ return;
+ }
+
+ if (m_configObject) {
+ m_configObject->disconnect(this);
+ }
+
+ m_configObject = configObject;
+ Q_EMIT configObjectChanged();
+ updateState();
+ connectSetting();
+}
+
+QString SettingStateProxy::settingName() const
+{
+ return m_settingName;
+}
+
+void SettingStateProxy::setSettingName(const QString &settingName)
+{
+ if (m_settingName == settingName) {
+ return;
+ }
+
+ if (m_configObject) {
+ m_configObject->disconnect(this);
+ }
+
+ m_settingName = settingName;
+ Q_EMIT settingNameChanged();
+ updateState();
+ connectSetting();
+}
+
+bool SettingStateProxy::isImmutable() const
+{
+ return m_immutable;
+}
+
+bool SettingStateProxy::isDefaulted() const
+{
+ return m_defaulted;
+}
+
+void SettingStateProxy::updateState()
+{
+ const auto item = m_configObject ? m_configObject->findItem(m_settingName) : nullptr;
+ const auto immutable = item ? item->isImmutable() : false;
+ const auto defaulted = item ? item->isDefault() : true;
+
+ if (m_immutable != immutable) {
+ m_immutable = immutable;
+ Q_EMIT immutableChanged();
+ }
+
+ if (m_defaulted != defaulted) {
+ m_defaulted = defaulted;
+ Q_EMIT defaultedChanged();
+ }
+}
+
+void SettingStateProxy::connectSetting()
+{
+ const auto item = m_configObject ? m_configObject->findItem(m_settingName) : nullptr;
+ if (!item) {
+ return;
+ }
+
+ const auto updateStateSlotIndex = metaObject()->indexOfMethod("updateState()");
+ Q_ASSERT(updateStateSlotIndex >= 0);
+ const auto updateStateSlot = metaObject()->method(updateStateSlotIndex);
+ Q_ASSERT(updateStateSlot.isValid());
+
+ const auto itemHasSignals = dynamic_cast<KConfigCompilerSignallingItem *>(item) || dynamic_cast<KPropertySkeletonItem *>(item);
+ if (!itemHasSignals) {
+ qWarning() << "Attempting to use SettingStateProxy with a non signalling item:" << m_settingName;
+ return;
+ }
+
+ const auto propertyName = [this] {
+ auto name = m_settingName;
+ if (name.at(0).isUpper()) {
+ name[0] = name[0].toLower();
+ }
+ return name.toUtf8();
+ }();
+
+ const auto metaObject = m_configObject->metaObject();
+ const auto propertyIndex = metaObject->indexOfProperty(propertyName.constData());
+ Q_ASSERT(propertyIndex >= 0);
+ const auto property = metaObject->property(propertyIndex);
+ Q_ASSERT(property.isValid());
+ if (!property.hasNotifySignal()) {
+ qWarning() << "Attempting to use SettingStateProxy with a non notifying property:" << propertyName;
+ return;
+ }
+
+ const auto changedSignal = property.notifySignal();
+ Q_ASSERT(changedSignal.isValid());
+ connect(m_configObject, changedSignal, this, updateStateSlot);
+ connect(m_configObject, &KCoreConfigSkeleton::configChanged, this, &SettingStateProxy::updateState);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 Kevin Ottens <kevin.ottens@enioka.com>
+ SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef SETTINGSTATEPROXY_H
+#define SETTINGSTATEPROXY_H
+
+#include <QObject>
+#include <QPointer>
+
+#include <KCoreConfigSkeleton>
+
+/**
+ * This element allows to represent in a declarative way the
+ * state of a particular setting in a config object.
+ *
+ * @since 5.73
+ */
+class SettingStateProxy : public QObject
+{
+ Q_OBJECT
+
+ /**
+ * The config object which will be monitored for setting state changes
+ */
+ Q_PROPERTY(KCoreConfigSkeleton *configObject READ configObject WRITE setConfigObject NOTIFY configObjectChanged)
+
+ /**
+ * The name of the setting in the config object
+ */
+ Q_PROPERTY(QString settingName READ settingName WRITE setSettingName NOTIFY settingNameChanged)
+
+ /**
+ * Indicates if the setting is marked as immutable
+ */
+ Q_PROPERTY(bool immutable READ isImmutable NOTIFY immutableChanged)
+
+ /**
+ * Indicates if the setting differs from its default value
+ */
+ Q_PROPERTY(bool defaulted READ isDefaulted NOTIFY defaultedChanged)
+
+public:
+ using QObject::QObject;
+
+ KCoreConfigSkeleton *configObject() const;
+ void setConfigObject(KCoreConfigSkeleton *configObject);
+
+ QString settingName() const;
+ void setSettingName(const QString &settingName);
+
+ bool isImmutable() const;
+ bool isDefaulted() const;
+
+Q_SIGNALS:
+ void configObjectChanged();
+ void settingNameChanged();
+
+ void immutableChanged();
+ void defaultedChanged();
+
+private Q_SLOTS:
+ void updateState();
+
+private:
+ void connectSetting();
+
+ QPointer<KCoreConfigSkeleton> m_configObject;
+ QString m_settingName;
+ bool m_immutable = false;
+ bool m_defaulted = true;
+};
+
+#endif
--- /dev/null
+project(kconfigplugin)
+
+set(kconfigplugin_SRCS
+ kconfigplugin.cpp
+ kauthorizedproxy.cpp
+ )
+
+add_library(kconfigplugin SHARED ${kconfigplugin_SRCS})
+target_link_libraries(kconfigplugin
+ Qt5::Core
+ Qt5::Qml
+ KF5::ConfigCore
+)
+
+install(TARGETS kconfigplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kconfig)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kconfig)
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2016 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "kauthorizedproxy.h"
+
+#include <KAuthorized>
+
+KAuthorizedProxy::KAuthorizedProxy(QObject *parent)
+ : QObject(parent)
+{
+}
+
+KAuthorizedProxy::~KAuthorizedProxy()
+{
+}
+
+bool KAuthorizedProxy::authorize(const QString &action) const
+{
+ return KAuthorized::authorize(action);
+}
+
+bool KAuthorizedProxy::authorizeAction(const QString &action) const
+{
+ return KAuthorized::authorizeAction(action);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2016 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#pragma once
+
+#include <QObject>
+
+class KAuthorizedProxy : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit KAuthorizedProxy(QObject *parent = nullptr);
+ ~KAuthorizedProxy() override;
+
+ /**
+ * Returns whether the user is permitted to perform a certain action.
+ */
+ Q_INVOKABLE bool authorize(const QString &action) const;
+
+ /**
+ * Returns whether the user is permitted to perform a certain action.
+ * This behaves like authorize(), except that "action/" is prepended to action
+ */
+ Q_INVOKABLE bool authorizeAction(const QString &action) const;
+};
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2016 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "kconfigplugin.h"
+
+#include <QtQml>
+
+#include "kauthorizedproxy.h"
+
+QObject *kauthorizedProxy_singleton_provider(QQmlEngine *, QJSEngine *)
+{
+ return new KAuthorizedProxy;
+}
+
+void KConfigPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kconfig"));
+
+ qmlRegisterSingletonType<KAuthorizedProxy>(uri, 1, 0, "KAuthorized", kauthorizedProxy_singleton_provider);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2016 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#pragma once
+
+#include <QQmlExtensionPlugin>
+
+class KConfigPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
--- /dev/null
+module org.kde.kconfig
+plugin kconfigplugin
--- /dev/null
+project(kcoreaddons)
+
+set(kcoreaddonsplugin_SRCS
+ kcoreaddonsplugin.cpp
+ formats.cpp
+ kuserproxy.cpp
+ )
+
+add_library(kcoreaddonsplugin SHARED ${kcoreaddonsplugin_SRCS})
+target_link_libraries(kcoreaddonsplugin
+ Qt5::Core
+ Qt5::Quick
+ Qt5::Qml
+ KF5::CoreAddons
+)
+
+install(TARGETS kcoreaddonsplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kcoreaddons)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kcoreaddons)
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Bhushan Shah <bhush94@gmail.com>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+#include "formats.h"
+
+Formats::Formats(QObject *parent)
+ : QObject(parent)
+ , m_format()
+{
+}
+
+QString Formats::formatByteSize(double size, int precision) const
+{
+ return m_format.formatByteSize(size, precision);
+}
+
+QString Formats::formatDuration(quint64 msecs, KFormat::DurationFormatOptions options) const
+{
+ return m_format.formatDuration(msecs, options);
+}
+
+QString Formats::formatDuration(quint64 msecs, int options) const
+{
+ return m_format.formatDuration(msecs, static_cast<KFormat::DurationFormatOptions>(options));
+}
+
+QString Formats::formatDecimalDuration(quint64 msecs, int decimalPlaces) const
+{
+ return m_format.formatDecimalDuration(msecs, decimalPlaces);
+}
+
+QString Formats::formatSpelloutDuration(quint64 msecs) const
+{
+ return m_format.formatSpelloutDuration(msecs);
+}
+
+QString Formats::formatRelativeDate(const QDate &date, QLocale::FormatType format) const
+{
+ return m_format.formatRelativeDate(date, format);
+}
+
+QString Formats::formatRelativeDateTime(const QDateTime &dateTime, QLocale::FormatType format) const
+{
+ return m_format.formatRelativeDateTime(dateTime, format);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Bhushan Shah <bhush94@gmail.com>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+#ifndef FORMATS_H
+#define FORMATS_H
+
+#include <KFormat>
+
+class Formats : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit Formats(QObject *parent = nullptr);
+
+ /**
+ * Converts size from bytes to the appropriate string representation
+ */
+ Q_INVOKABLE QString formatByteSize(double size, int precision = 1) const;
+
+ /**
+ * Given a number of milliseconds, converts that to a string containing
+ * the localized equivalent, e.g. 1:23:45
+ */
+ Q_INVOKABLE QString formatDuration(quint64 msecs, KFormat::DurationFormatOptions options = KFormat::DefaultDuration) const;
+
+ Q_DECLARE_FLAGS(DurationFormatOptions, KFormat::DurationFormatOption)
+
+ /**
+ * This overload exists so it can be called from QML, which does
+ * not support calling Q_INVOKABLEs with Q_ENUMS from different classes
+ *
+ * This is mentioned in the docs and also in https://bugreports.qt.io/browse/QTBUG-20639
+ * Until that bug is fixed, we'll need this
+ */
+ Q_INVOKABLE QString formatDuration(quint64 msecs, int options) const;
+
+ /**
+ * Given a number of milliseconds, converts that to a string containing
+ * the localized equivalent to the requested decimal places.
+ *
+ * e.g. given formatDuration(60000), returns "1.0 minutes"
+ */
+ Q_INVOKABLE QString formatDecimalDuration(quint64 msecs, int decimalPlaces = 2) const;
+
+ /**
+ * Given a number of milliseconds, converts that to a spell-out string containing
+ * the localized equivalent.
+ *
+ * e.g. given formatSpelloutDuration(60001) returns "1 minute"
+ * given formatSpelloutDuration(62005) returns "1 minute and 2 seconds"
+ * given formatSpelloutDuration(90060000) returns "1 day and 1 hour"
+ *
+ * Units not interesting to the user, for example seconds or minutes when the first
+ * unit is day, are not returned because they are irrelevant. The same applies for
+ * seconds when the first unit is hour.
+ *
+ */
+ Q_INVOKABLE QString formatSpelloutDuration(quint64 msecs) const;
+
+ /**
+ * Returns a string formatted to a relative date style.
+ *
+ * If the date falls within one week before or after the current date
+ * then a relative date string will be returned, such as:
+ * * Yesterday
+ * * Today
+ * * Tomorrow
+ * * Last Tuesday
+ * * Next Wednesday
+ *
+ * If the date falls outside this period then the format is used
+ */
+ Q_INVOKABLE QString formatRelativeDate(const QDate &date, QLocale::FormatType format) const;
+
+ /**
+ * Returns a string formatted to a relative datetime style.
+ *
+ * If the dateTime falls within one week before or after the current date
+ * then a relative date string will be returned, such as:
+ * * Yesterday, 3:00pm
+ * * Today, 3:00pm
+ * * Tomorrow, 3:00pm
+ * * Last Tuesday, 3:00pm
+ * * Next Wednesday, 3:00pm
+ *
+ * If the datetime falls outside this period then the format is used
+ */
+ Q_INVOKABLE QString formatRelativeDateTime(const QDateTime &dateTime, QLocale::FormatType format) const;
+
+private:
+ KFormat m_format;
+};
+
+Q_DECLARE_METATYPE(QLocale::FormatType)
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Bhushan Shah <bhush94@gmail.com>
+ SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+#include "kcoreaddonsplugin.h"
+
+#include <QtQml>
+
+#include "formats.h"
+#include "kuserproxy.h"
+
+#include <KFormat>
+
+static QObject *formats_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
+{
+ Q_UNUSED(engine)
+ Q_UNUSED(scriptEngine)
+
+ return new Formats();
+}
+
+void KCoreAddonsPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kcoreaddons"));
+
+ qmlRegisterSingletonType<Formats>(uri, 1, 0, "Format", formats_singletontype_provider);
+ qRegisterMetaType<QLocale::FormatType>();
+
+ qmlRegisterUncreatableType<KFormat>(uri, 1, 0, "FormatTypes", QString());
+
+ qmlRegisterType<KUserProxy>(uri, 1, 0, "KUser");
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Bhushan Shah <bhush94@gmail.com>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+#ifndef KCOREADDONSPLUGIN_H
+#define KCOREADDONSPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+
+class KCoreAddonsPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2014 Sebastian Kügler <sebas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include "kuserproxy.h"
+#include <QDir>
+#include <QFile>
+#include <QHostInfo>
+#include <QTextStream>
+#include <QUrl>
+
+const QString etcPasswd = QStringLiteral("/etc/passwd");
+const QString accountsServiceIconPath = QStringLiteral("/var/lib/AccountsService/icons");
+
+KUserProxy::KUserProxy(QObject *parent)
+ : QObject(parent)
+ , m_temporaryEmptyFaceIconPath(false)
+{
+ QString pathToFaceIcon(m_user.faceIconPath());
+ if (pathToFaceIcon.isEmpty()) {
+ // KUser returns null if the current faceIconPath is empty
+ // so we should explicitly watch ~/.face.icon rather than faceIconPath()
+ // as we want to watch for this file being created
+ pathToFaceIcon = QDir::homePath() + QStringLiteral("/.face.icon");
+ }
+
+ m_dirWatch.addFile(pathToFaceIcon);
+ m_dirWatch.addFile(accountsServiceIconPath + QLatin1Char('/') + m_user.loginName());
+ if (QFile::exists(etcPasswd)) {
+ m_dirWatch.addFile(etcPasswd);
+ }
+
+ connect(&m_dirWatch, &KDirWatch::dirty, this, &KUserProxy::update);
+ connect(&m_dirWatch, &KDirWatch::created, this, &KUserProxy::update);
+ connect(&m_dirWatch, &KDirWatch::deleted, this, &KUserProxy::update);
+}
+
+KUserProxy::~KUserProxy()
+{
+}
+
+void KUserProxy::update(const QString &path)
+{
+ if (path == m_user.faceIconPath() || path == QDir::homePath() + QLatin1String("/.face.icon")
+ || path == accountsServiceIconPath + QLatin1Char('/') + m_user.loginName()) {
+ // we need to force updates, even when the path doesn't change,
+ // but the underlying image does. Change path temporarily, to
+ // make the Image reload.
+ // Needs cache: false in the Image item to actually reload
+ m_temporaryEmptyFaceIconPath = true;
+ Q_EMIT faceIconUrlChanged();
+ m_temporaryEmptyFaceIconPath = false;
+ Q_EMIT faceIconUrlChanged();
+ } else if (path == etcPasswd) {
+ m_user = KUser();
+ Q_EMIT nameChanged();
+ }
+}
+
+QString KUserProxy::fullName() const
+{
+ QString fullName = m_user.property(KUser::FullName).toString();
+ if (!fullName.isEmpty()) {
+ return fullName;
+ }
+ return loginName();
+}
+
+QString KUserProxy::loginName() const
+{
+ return m_user.loginName();
+}
+
+QUrl KUserProxy::faceIconUrl() const
+{
+ if (m_temporaryEmptyFaceIconPath) {
+ return QUrl();
+ }
+ const QString u = m_user.faceIconPath();
+ const QFile f(u);
+ if (f.exists(u)) {
+ // We need to return a file URL, not a simple path
+ return QUrl::fromLocalFile(u);
+ }
+ return QUrl();
+}
+
+QString KUserProxy::os()
+{
+ if (m_os.isEmpty()) {
+ QFile osfile(QStringLiteral("/etc/os-release"));
+ if (osfile.exists()) {
+ if (!osfile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ return QString();
+ }
+
+ QTextStream in(&osfile);
+ while (!in.atEnd()) {
+ QString line = in.readLine();
+ if (line.startsWith(QLatin1String("PRETTY_NAME"))) {
+ QStringList fields = line.split(QLatin1String("PRETTY_NAME=\""));
+ if (fields.count() == 2) {
+ osfile.close();
+ QString pretty = fields.at(1);
+ pretty.chop(1);
+ m_os = pretty;
+ return pretty;
+ }
+ }
+ }
+ }
+ }
+ return m_os;
+}
+
+QString KUserProxy::host() const
+{
+ return QHostInfo::localHostName();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2014 Sebastian Kügler <sebas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#ifndef KUSERPROXY_H
+#define KUSERPROXY_H
+
+#include <QObject>
+
+#include <KDirWatch>
+#include <KUser>
+
+/**
+ * KUserProxy (exposed as KUser to the QML runtime) is an object allowing
+ * read-only access to the user's name, os and version and the configured
+ * user image. This object can be used to personalize user interfaces.
+ *
+ * Example usage:
+ * @code
+ import org.kde.kcoreaddons 1.0 as KCoreAddons
+ [...]
+
+ Item {
+ [...]
+ KCoreAddons.KUser {
+ id: kuser
+ }
+
+ Image {
+ id: faceIcon
+ source: kuser.faceIconUrl
+ [...]
+ }
+
+ Text {
+ text: kuser.fullName
+ [...]
+ }
+ }
+ @endcode
+
+ * @short KUser provides read-only access to the user's personal information
+ * @see KUser
+ */
+class KUserProxy : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QString fullName READ fullName NOTIFY nameChanged)
+ Q_PROPERTY(QString loginName READ loginName NOTIFY nameChanged)
+ Q_PROPERTY(QUrl faceIconUrl READ faceIconUrl NOTIFY faceIconUrlChanged)
+ Q_PROPERTY(QString os READ os CONSTANT)
+ Q_PROPERTY(QString host READ host CONSTANT)
+
+public:
+ KUserProxy(QObject *parent = nullptr);
+ ~KUserProxy();
+
+ /**
+ * @return the full name of the user
+ * @see nameChanged
+ */
+ QString fullName() const;
+
+ /**
+ * @return the user's login name
+ * @see nameChanged
+ *
+ */
+ QString loginName() const;
+
+ /**
+ * @return the url of the user's configured image (including file:/)
+ * @see faceIconUrlChanged
+ */
+ QUrl faceIconUrl() const;
+
+ /**
+ * @return pretty name indicating operating system and version
+ * @see nameChanged
+ */
+ QString os();
+
+ /**
+ * @return the system's hostname
+ * @see nameChanged
+ */
+ QString host() const;
+
+Q_SIGNALS:
+ /**
+ * signal that the user's name or login name changed
+ * @see fullName
+ * @see loginName
+ */
+ void nameChanged();
+ /**
+ * signal that the user image changed
+ * @see faceIconUrl
+ */
+ void faceIconUrlChanged();
+
+private:
+ void update(const QString &path);
+ KDirWatch m_dirWatch;
+ KUser m_user;
+ QString m_os;
+ bool m_temporaryEmptyFaceIconPath;
+};
+
+#endif // KUSERPROXY_H
--- /dev/null
+module org.kde.kcoreaddons
+plugin kcoreaddonsplugin
+
--- /dev/null
+project(kioplugin)
+
+set(kioplugin_SRCS
+ kioplugin.cpp
+ krunproxy.cpp
+ )
+
+add_library(kio SHARED ${kioplugin_SRCS})
+target_link_libraries(kio
+ Qt5::Core
+ Qt5::Qml
+ KF5::KIOWidgets
+ KF5::Notifications
+)
+
+install(TARGETS kio DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kio)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kio)
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas <antonis.tsiapaliokas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "kioplugin.h"
+
+#include <QtQml>
+
+#include "krunproxy.h"
+
+void KioPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kio"));
+
+ qmlRegisterType<KRunProxy>(uri, 1, 0, "KRun");
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas <antonis.tsiapaliokas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef KIOPLUGIN_H
+#define KIOPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+
+class KioPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas <antonis.tsiapaliokas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "krunproxy.h"
+
+#include <QMimeDatabase>
+
+#include <KIO/ApplicationLauncherJob>
+#include <KIO/JobUiDelegate>
+#include <KIO/OpenUrlJob>
+#include <KNotificationJobUiDelegate>
+#include <KService>
+
+KRunProxy::KRunProxy(QObject *parent)
+ : QObject(parent)
+{
+}
+
+// Apparently unused
+bool KRunProxy::openUrl(const QString &file)
+{
+ QUrl fileUrl(file);
+ QMimeDatabase db;
+ QMimeType mime = db.mimeTypeForUrl(fileUrl);
+ const QString fileMimeType = mime.name();
+
+ if (fileMimeType == QLatin1String("application/x-executable") || !mime.isValid()) {
+ // for security reasons we should not be able to execute applications.
+ // We should use its desktop file to access it.
+ return false;
+ }
+
+ if (fileMimeType == QLatin1String("application/x-desktop") && fileUrl.isLocalFile()) {
+ // If our mimetype is a desktop file, then we don't want to open
+ // the desktop file itself but the application in which it is associated
+ // with.
+ return openService(fileUrl.toLocalFile());
+ } else {
+ KIO::OpenUrlJob *job = new KIO::OpenUrlJob(fileUrl, fileMimeType);
+ // JobUiDelegate is widgets-based, but that's currently the only way to get the open-with dialog
+ job->setUiDelegate(new KIO::JobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, nullptr));
+ job->start();
+ return true;
+ }
+}
+
+bool KRunProxy::openService(const QString &serviceName)
+{
+ KService::Ptr service = KService::serviceByDesktopName(serviceName);
+ if (service) {
+ KIO::ApplicationLauncherJob *job = new KIO::ApplicationLauncherJob(service);
+ job->setUiDelegate(new KNotificationJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled));
+ job->start();
+ return true;
+ }
+ return false;
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas <antonis.tsiapaliokas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef KRUNPROXY_H
+#define KRUNPROXY_H
+
+#include <QObject>
+
+class KRunProxy : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit KRunProxy(QObject *parent = nullptr);
+
+ /**
+ * opens the url from the existing file
+ */
+ Q_INVOKABLE bool openUrl(const QString &fileUrl);
+
+ /**
+ * Runs the service (application)
+ * @param serviceName the name of the desktop file without extension
+ * @return true on success
+ */
+ Q_INVOKABLE bool openService(const QString &serviceName);
+};
+
+#endif
--- /dev/null
+module org.kde.kio
+plugin kio
+
--- /dev/null
+project(kquickcontrols)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kquickcontrols)
+install(FILES KeySequenceItem.qml DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kquickcontrols)
+install(FILES ColorButton.qml DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kquickcontrols)
+
+add_subdirectory(private)
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+*/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2 as QtControls
+import QtQuick.Dialogs 1.0 as QtDialogs
+
+/**
+ * @short A pushbutton to display or allow user selection of a color.
+ *
+ * This widget can be used to display or allow user selection of a color.
+ *
+ * Example usage:
+ * @code
+ * import org.kde.kquickcontrols 2.0
+ *
+ * ColorButton {
+ * [...]
+ * onColorChanged: console.log(color)
+ * }
+ * @endcode
+ *
+ * @inherits QtQuick.Controls.Button
+ */
+QtControls.Button {
+ id: colorPicker
+
+ /**
+ * The user selected color
+ */
+ property alias color: colorDialog.color
+
+ /**
+ * Title to show in the dialog
+ */
+ property alias dialogTitle: colorDialog.title
+
+ /**
+ * The color which the user has currently selected whilst the dialog is open
+ * For the color that is set when the dialog is accepted, use the color property.
+ */
+ property alias currentColor: colorDialog.currentColor
+
+ /**
+ * Allow the user to configure an alpha value
+ */
+ property alias showAlphaChannel: colorDialog.showAlphaChannel
+
+ /**
+ * This signal is emitted when the color dialog has been accepted
+ *
+ * @since 5.61
+ */
+ signal accepted(color color)
+
+ readonly property real _buttonMarigns: 4 // same as QStyles. Remove if we can get this provided by the QQC theme
+
+ implicitWidth: 40 + _buttonMarigns*2 //to perfectly clone kcolorbutton from kwidgetaddons
+
+
+ //create a checkerboard background for alpha to be adjusted
+ Canvas {
+ anchors.fill: colorBlock
+ visible: colorDialog.color.a < 1
+
+ onPaint: {
+ var ctx = getContext('2d');
+
+ ctx.fillStyle = "white";
+ ctx.fillRect(0,0, ctx.width, ctx.height)
+
+ ctx.fillStyle = "black";
+ //in blocks of 16x16 draw two black squares of 8x8 in top left and bottom right
+ for (var j=0;j<width;j+=16) {
+ for (var i=0;i<height;i+=16) {
+ //top left, bottom right
+ ctx.fillRect(j,i,8,8);
+ ctx.fillRect(j+8,i+8,8,8);
+ }
+ }
+ }
+
+ }
+
+ Rectangle {
+ id: colorBlock
+
+ anchors.centerIn: parent
+ height: parent.height - _buttonMarigns*2
+ width: parent.width - _buttonMarigns*2
+
+
+ color: enabled ? colorDialog.color : disabledPalette.button
+
+ SystemPalette {
+ id: disabledPalette
+ colorGroup: SystemPalette.Disabled
+ }
+ }
+
+ QtDialogs.ColorDialog {
+ id: colorDialog
+ onAccepted: colorPicker.accepted(color)
+ }
+
+ onClicked: {
+ colorDialog.open()
+ }
+}
--- /dev/null
+import QtQuick 2.0
+import QtQuick.Controls 2.12
+import QtQuick.Layouts 1.1
+import QtQuick.Window 2.15
+
+import org.kde.private.kquickcontrols 2.0 as KQuickControlsPrivate
+
+RowLayout {
+ id: root
+ property alias showClearButton: clearButton.visible
+ property alias modifierlessAllowed: _helper.modifierlessAllowed
+ property alias multiKeyShortcutsAllowed: _helper.multiKeyShortcutsAllowed
+ property var keySequence
+
+ /**
+ * This property controls which types of shortcuts are checked for conflicts when the keySequence
+ * is set. If a conflict is detected, a messagebox will be shown asking the user to confirm their
+ * input. Valid values are combinations of the following flags:
+ * - @p ShortcutType.None Do not check for conflicts.
+ * - @p ShortcutType.StandardShortcuts Check against standard shortcuts. @see KStandardshortcut
+ * - @p ShortcutType.GlobalShortcuts Check against global shortcuts. @see KGlobalAccel
+ *
+ * The default is `ShortcutType.GlobalShortcuts | ShortcutType.StandardShortcut`
+ * @since 5.74
+ */
+ property alias checkForConflictsAgainst: _helper.checkAgainstShortcutTypes
+
+ /**
+ * This signal is emitted after the user introduces a new key sequence
+ *
+ * @since 5.68
+ */
+ signal captureFinished()
+
+ /**
+ * Start capturing a key sequence. This equivalent to the user clicking on the main button of the item
+ * @since 5.70
+ */
+ function startCapturing() {
+ mainButton.checked = true
+ }
+
+ KQuickControlsPrivate.KeySequenceHelper {
+ id: _helper
+ window: renderWindow(parent.Window.window)
+ onGotKeySequence: {
+ if (isKeySequenceAvailable(keySequence)) {
+ root.keySequence = keySequence
+ }
+ mainButton.checked = false;
+ root.captureFinished();
+ }
+ }
+
+ KQuickControlsPrivate.TranslationContext {
+ id: _tr
+ domain: "kdeclarative5"
+ }
+
+ Button
+ {
+ id: mainButton
+
+ icon.name: "configure"
+
+ checkable: true
+ focus: checked
+
+ hoverEnabled: true
+
+ text: {
+ const keys = _helper.isRecording ? _helper.currentKeySequence : parent.keySequence
+ let text = " " // This space is intentional
+ if (keys == undefined || _helper.keySequenceIsEmpty(keys)) {
+ if (_helper.isRecording) {
+ text += _tr.i18nc("What the user inputs now will be taken as the new shortcut", "Input")
+ } else {
+ text += _tr.i18nc("No shortcut defined", "None");
+ }
+ } else {
+ // Single ampersand gets interpreted by the button as a mnemonic
+ // and removed; replace it with a double ampersand so that it
+ // will be displayed by the button as a single ampersand, or
+ // else shortcuts with the actual ampersand character will
+ // appear to be partially empty.
+ text += _helper.keySequenceNativeText(keys).replace('&', '&&')
+ }
+ return _helper.isRecording ? text.concat(" ... ") : text.concat(" ")
+ }
+
+ ToolTip.visible: hovered
+ ToolTip.delay: 1000
+ ToolTip.text: _tr.i18n("Click on the button, then enter the shortcut like you would in the program.\nExample for Ctrl+A: hold the Ctrl key and press A.")
+ ToolTip.timeout: 5000
+
+ onCheckedChanged: {
+ if (checked) {
+ mainButton.forceActiveFocus()
+ _helper.startRecording()
+ }
+ }
+
+ onFocusChanged: {
+ if (!focus) {
+ mainButton.checked = false
+ }
+ }
+ }
+
+ Button {
+ id: clearButton
+ Layout.fillHeight: true
+ Layout.preferredWidth: height
+ onClicked: root.keySequence = ""
+
+ //icon name determines the direction of the arrow, NOT the direction of the app layout
+ icon.name: Qt.application.layoutDirection == Qt.LeftToRight ? "edit-clear-locationbar-rtl" : "edit-clear-locationbar-ltr"
+ }
+}
--- /dev/null
+This import contains KDE extras that are visually similar to Qt Quick Controls.
--- /dev/null
+project(kquickcontrolsprivate)
+
+set(kquickcontrolsprivate_SRCS
+ kquickcontrolsprivateplugin.cpp
+ keysequencehelper.cpp
+ translationcontext.cpp
+)
+
+add_library(kquickcontrolsprivateplugin SHARED ${kquickcontrolsprivate_SRCS})
+
+target_link_libraries(kquickcontrolsprivateplugin
+ Qt5::Core
+ Qt5::Quick
+ Qt5::Qml
+ KF5::I18n
+ KF5::ConfigGui
+ KF5::GuiAddons
+ KF5::WidgetsAddons
+ KF5::WindowSystem
+ KF5::GlobalAccel
+ )
+
+install(TARGETS kquickcontrolsprivateplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/private/kquickcontrols)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/private/kquickcontrols)
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2020 David Redondo <davidedmundson@kde.org>
+ SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
+ SPDX-FileCopyrightText: 1998 Mark Donohoe <donohoe@kde.org>
+ SPDX-FileCopyrightText: 2001 Ellis Whitehead <ellis@kde.org>
+ SPDX-FileCopyrightText: 2007 Andreas Hartmetz <ahartmetz@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "keysequencehelper.h"
+
+#include <QDebug>
+#include <QHash>
+#include <QPointer>
+#include <QQmlEngine>
+#include <QQuickRenderControl>
+#include <QQuickWindow>
+
+#include <KGlobalAccel>
+#include <KGlobalShortcutInfo>
+#include <KLocalizedString>
+#include <KMessageBox>
+#include <KStandardShortcut>
+
+class KeySequenceHelperPrivate
+{
+public:
+ KeySequenceHelperPrivate(KeySequenceHelper *qq);
+
+ /**
+ * Conflicts the key sequence @a seq with a current standard
+ * shortcut?
+ */
+ bool conflictWithStandardShortcuts(const QKeySequence &seq);
+
+ /**
+ * Conflicts the key sequence @a seq with a current global
+ * shortcut?
+ */
+ bool conflictWithGlobalShortcuts(const QKeySequence &seq);
+
+ /**
+ * Get permission to steal the shortcut @seq from the standard shortcut @a std.
+ */
+ bool stealStandardShortcut(KStandardShortcut::StandardShortcut std, const QKeySequence &seq);
+
+ bool checkAgainstStandardShortcuts() const
+ {
+ return checkAgainstShortcutTypes & KeySequenceHelper::StandardShortcuts;
+ }
+
+ bool checkAgainstGlobalShortcuts() const
+ {
+ return checkAgainstShortcutTypes & KeySequenceHelper::GlobalShortcuts;
+ }
+
+ // members
+ KeySequenceHelper *const q;
+
+ //! Check the key sequence against KStandardShortcut::find()
+ KeySequenceHelper::ShortcutTypes checkAgainstShortcutTypes;
+};
+
+KeySequenceHelperPrivate::KeySequenceHelperPrivate(KeySequenceHelper *qq)
+ : q(qq)
+ , checkAgainstShortcutTypes(KeySequenceHelper::StandardShortcuts | KeySequenceHelper::GlobalShortcuts)
+{
+}
+
+KeySequenceHelper::KeySequenceHelper(QObject *parent)
+ : KeySequenceRecorder(nullptr, parent)
+ , d(new KeySequenceHelperPrivate(this))
+{
+}
+
+KeySequenceHelper::~KeySequenceHelper()
+{
+ delete d;
+}
+
+bool KeySequenceHelper::isKeySequenceAvailable(const QKeySequence &keySequence) const
+{
+ if (keySequence.isEmpty()) {
+ return true;
+ }
+ bool conflict = false;
+ if (d->checkAgainstShortcutTypes.testFlag(GlobalShortcuts)) {
+ conflict |= d->conflictWithGlobalShortcuts(keySequence);
+ }
+ if (d->checkAgainstShortcutTypes.testFlag(StandardShortcuts)) {
+ conflict |= d->conflictWithStandardShortcuts(keySequence);
+ }
+ return !conflict;
+}
+
+KeySequenceHelper::ShortcutTypes KeySequenceHelper::checkAgainstShortcutTypes()
+{
+ return d->checkAgainstShortcutTypes;
+}
+
+void KeySequenceHelper::setCheckAgainstShortcutTypes(KeySequenceHelper::ShortcutTypes types)
+{
+ if (d->checkAgainstShortcutTypes != types) {
+ d->checkAgainstShortcutTypes = types;
+ }
+ Q_EMIT checkAgainstShortcutTypesChanged();
+}
+
+bool KeySequenceHelperPrivate::conflictWithGlobalShortcuts(const QKeySequence &keySequence)
+{
+#ifdef Q_OS_WIN
+ // on windows F12 is reserved by the debugger at all times, so we can't use it for a global shortcut
+ if (KeySequenceHelper::GlobalShortcuts && keySequence.toString().contains(QLatin1String("F12"))) {
+ QString title = i18n("Reserved Shortcut");
+ QString message = i18n(
+ "The F12 key is reserved on Windows, so cannot be used for a global shortcut.\n"
+ "Please choose another one.");
+
+ KMessageBox::sorry(nullptr, message, title);
+ return false;
+ }
+#endif
+
+ if (!(checkAgainstShortcutTypes & KeySequenceHelper::GlobalShortcuts)) {
+ return false;
+ }
+
+ // Global shortcuts are on key+modifier shortcuts. They can clash with
+ // each of the keys of a multi key shortcut.
+ QList<KGlobalShortcutInfo> others;
+ for (int i = 0; i < keySequence.count(); ++i) {
+ QKeySequence tmp(keySequence[i]);
+
+ if (!KGlobalAccel::isGlobalShortcutAvailable(tmp, QString())) {
+ others << KGlobalAccel::getGlobalShortcutsByKey(tmp);
+ }
+ }
+
+ if (!others.isEmpty() && !KGlobalAccel::promptStealShortcutSystemwide(nullptr, others, keySequence)) {
+ return true;
+ }
+
+ // The user approved stealing the shortcut. We have to steal
+ // it immediately because KAction::setGlobalShortcut() refuses
+ // to set a global shortcut that is already used. There is no
+ // error it just silently fails. So be nice because this is
+ // most likely the first action that is done in the slot
+ // listening to keySequenceChanged().
+ for (int i = 0; i < keySequence.count(); ++i) {
+ KGlobalAccel::stealShortcutSystemwide(keySequence[i]);
+ }
+ return false;
+}
+
+bool KeySequenceHelperPrivate::conflictWithStandardShortcuts(const QKeySequence &keySequence)
+{
+ if (!checkAgainstStandardShortcuts()) {
+ return false;
+ }
+
+ KStandardShortcut::StandardShortcut ssc = KStandardShortcut::find(keySequence);
+ if (ssc != KStandardShortcut::AccelNone && !stealStandardShortcut(ssc, keySequence)) {
+ return true;
+ }
+ return false;
+}
+
+bool KeySequenceHelperPrivate::stealStandardShortcut(KStandardShortcut::StandardShortcut std, const QKeySequence &seq)
+{
+ QString title = i18n("Conflict with Standard Application Shortcut");
+ QString message = i18n(
+ "The '%1' key combination is also used for the standard action "
+ "\"%2\" that some applications use.\n"
+ "Do you really want to use it as a global shortcut as well?",
+ seq.toString(QKeySequence::NativeText),
+ KStandardShortcut::label(std));
+
+ if (KMessageBox::warningContinueCancel(nullptr, message, title, KGuiItem(i18n("Reassign"))) != KMessageBox::Continue) {
+ return false;
+ }
+ return true;
+}
+
+bool KeySequenceHelper::keySequenceIsEmpty(const QKeySequence &keySequence)
+{
+ return keySequence.isEmpty();
+}
+
+QString KeySequenceHelper::keySequenceNativeText(const QKeySequence &keySequence)
+{
+ return keySequence.toString(QKeySequence::NativeText);
+}
+
+QWindow *KeySequenceHelper::renderWindow(QQuickWindow *quickWindow)
+{
+ QWindow *renderWindow = QQuickRenderControl::renderWindowFor(quickWindow);
+ auto window = renderWindow ? renderWindow : quickWindow;
+ // If we have CppOwnership, set it explicitly to prevent the engine taking ownership of the window
+ // and crashing on teardown
+ if (QQmlEngine::objectOwnership(window) == QQmlEngine::CppOwnership) {
+ QQmlEngine::setObjectOwnership(window, QQmlEngine::CppOwnership);
+ }
+ return window;
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
+ SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef KEYSEQUENCEHELPER_H
+#define KEYSEQUENCEHELPER_H
+
+#include <KeySequenceRecorder>
+
+#include <QKeySequence>
+#include <QQuickItem>
+
+class KeySequenceHelperPrivate;
+class QQuickWindow;
+
+class KeySequenceHelper : public KeySequenceRecorder
+{
+ Q_OBJECT
+
+ Q_PROPERTY(
+ ShortcutTypes checkAgainstShortcutTypes READ checkAgainstShortcutTypes WRITE setCheckAgainstShortcutTypes NOTIFY checkAgainstShortcutTypesChanged)
+
+public:
+ enum ShortcutType {
+ None = 0x00, //!< No checking for conflicts
+ StandardShortcuts = 0x01, //!< Check against standard shortcuts. @see KStandardShortcut
+ GlobalShortcuts = 0x02, //!< Check against global shortcuts. @see KGlobalAccel
+ };
+ Q_DECLARE_FLAGS(ShortcutTypes, ShortcutType)
+ Q_FLAG(ShortcutTypes)
+
+ /**
+ * Constructor.
+ */
+ explicit KeySequenceHelper(QObject *parent = nullptr);
+
+ /**
+ * Destructs the widget.
+ */
+ virtual ~KeySequenceHelper();
+
+ Q_INVOKABLE bool isKeySequenceAvailable(const QKeySequence &keySequence) const;
+ // FIXME why can't qml call the inherited method?
+ Q_INVOKABLE void startRecording()
+ {
+ KeySequenceRecorder::startRecording();
+ }
+
+ ShortcutTypes checkAgainstShortcutTypes();
+ void setCheckAgainstShortcutTypes(ShortcutTypes types);
+
+ Q_INVOKABLE static bool keySequenceIsEmpty(const QKeySequence &keySequence);
+ Q_INVOKABLE static QString keySequenceNativeText(const QKeySequence &keySequence);
+ Q_INVOKABLE static QWindow *renderWindow(QQuickWindow *quickWindow);
+
+Q_SIGNALS:
+ void checkAgainstShortcutTypesChanged();
+
+private:
+ friend class KeySequenceHelperPrivate;
+ KeySequenceHelperPrivate *const d;
+
+ Q_DISABLE_COPY(KeySequenceHelper)
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(KeySequenceHelper::ShortcutTypes)
+
+#endif // KEYSEQUENCEHELPER_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "kquickcontrolsprivateplugin.h"
+
+#include <QtQml>
+
+#include "keysequencehelper.h"
+#include "translationcontext.h"
+
+void KQuickControlsPrivatePlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.private.kquickcontrols"));
+ qmlRegisterType<KeySequenceHelper>(uri, 2, 0, "KeySequenceHelper");
+ qmlRegisterType<TranslationContext>(uri, 2, 0, "TranslationContext");
+ // Register the Helper again publicly but uncreatable, so one can access the shortcuttype enum
+ // values as for example "ShortcutType.StandardShortcuts" from qml
+ qmlRegisterUncreatableType<KeySequenceHelper>("org.kde.kquickcontrols", 2, 0, "ShortcutType", QStringLiteral("This is just to allow accessing the enum"));
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KQUICKCONTROLSPRIVATEPLUGIN_H
+#define KQUICKCONTROLSPRIVATEPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+
+class KQuickControlsPrivatePlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif
--- /dev/null
+module org.kde.private.kquickcontrols
+plugin kquickcontrolsprivateplugin
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Kevin Ottens <ervin@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+// Undefine this because we don't want our i18n*() method names to be turned into i18nd*()
+#undef TRANSLATION_DOMAIN
+
+#include "translationcontext.h"
+
+#include <QDebug>
+
+#include <KLocalizedString>
+
+TranslationContext::TranslationContext(QObject *parent)
+ : QObject(parent)
+{
+}
+
+TranslationContext::~TranslationContext()
+{
+}
+
+QString TranslationContext::domain() const
+{
+ return m_domain;
+}
+
+void TranslationContext::setDomain(const QString &domain)
+{
+ if (m_domain == domain) {
+ return;
+ }
+
+ m_domain = domain;
+ Q_EMIT domainChanged(domain);
+}
+
+QString TranslationContext::i18n(const QString &message,
+ const QString ¶m1,
+ const QString ¶m2,
+ const QString ¶m3,
+ const QString ¶m4,
+ const QString ¶m5,
+ const QString ¶m6,
+ const QString ¶m7,
+ const QString ¶m8,
+ const QString ¶m9,
+ const QString ¶m10) const
+{
+ if (message.isNull()) {
+ qWarning() << "i18n() needs at least one parameter";
+ return QString();
+ }
+
+ KLocalizedString trMessage = ki18nd(m_domain.toUtf8().constData(), message.toUtf8().constData());
+
+ if (!param1.isNull()) {
+ trMessage = trMessage.subs(param1);
+ }
+ if (!param2.isNull()) {
+ trMessage = trMessage.subs(param2);
+ }
+ if (!param3.isNull()) {
+ trMessage = trMessage.subs(param3);
+ }
+ if (!param4.isNull()) {
+ trMessage = trMessage.subs(param4);
+ }
+ if (!param5.isNull()) {
+ trMessage = trMessage.subs(param5);
+ }
+ if (!param6.isNull()) {
+ trMessage = trMessage.subs(param6);
+ }
+ if (!param7.isNull()) {
+ trMessage = trMessage.subs(param7);
+ }
+ if (!param8.isNull()) {
+ trMessage = trMessage.subs(param8);
+ }
+ if (!param9.isNull()) {
+ trMessage = trMessage.subs(param9);
+ }
+ if (!param10.isNull()) {
+ trMessage = trMessage.subs(param10);
+ }
+
+ return trMessage.toString();
+}
+
+QString TranslationContext::i18nc(const QString &context,
+ const QString &message,
+ const QString ¶m1,
+ const QString ¶m2,
+ const QString ¶m3,
+ const QString ¶m4,
+ const QString ¶m5,
+ const QString ¶m6,
+ const QString ¶m7,
+ const QString ¶m8,
+ const QString ¶m9,
+ const QString ¶m10) const
+{
+ if (context.isNull() || message.isNull()) {
+ qWarning() << "i18nc() needs at least two arguments";
+ return QString();
+ }
+
+ KLocalizedString trMessage = ki18ndc(m_domain.toUtf8().constData(), context.toUtf8().constData(), message.toUtf8().constData());
+
+ if (!param1.isNull()) {
+ trMessage = trMessage.subs(param1);
+ }
+ if (!param2.isNull()) {
+ trMessage = trMessage.subs(param2);
+ }
+ if (!param3.isNull()) {
+ trMessage = trMessage.subs(param3);
+ }
+ if (!param4.isNull()) {
+ trMessage = trMessage.subs(param4);
+ }
+ if (!param5.isNull()) {
+ trMessage = trMessage.subs(param5);
+ }
+ if (!param6.isNull()) {
+ trMessage = trMessage.subs(param6);
+ }
+ if (!param7.isNull()) {
+ trMessage = trMessage.subs(param7);
+ }
+ if (!param8.isNull()) {
+ trMessage = trMessage.subs(param8);
+ }
+ if (!param9.isNull()) {
+ trMessage = trMessage.subs(param9);
+ }
+ if (!param10.isNull()) {
+ trMessage = trMessage.subs(param10);
+ }
+
+ return trMessage.toString();
+}
+
+QString TranslationContext::i18np(const QString &singular,
+ const QString &plural,
+ const QString ¶m1,
+ const QString ¶m2,
+ const QString ¶m3,
+ const QString ¶m4,
+ const QString ¶m5,
+ const QString ¶m6,
+ const QString ¶m7,
+ const QString ¶m8,
+ const QString ¶m9,
+ const QString ¶m10) const
+{
+ if (singular.isNull() || plural.isNull()) {
+ qWarning() << "i18np() needs at least two arguments";
+ return QString();
+ }
+
+ KLocalizedString trMessage = ki18ndp(m_domain.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
+
+ if (!param1.isNull()) {
+ bool ok;
+ int num = param1.toInt(&ok);
+ if (ok) {
+ trMessage = trMessage.subs(num);
+ } else {
+ trMessage = trMessage.subs(param1);
+ }
+ }
+ if (!param2.isNull()) {
+ trMessage = trMessage.subs(param2);
+ }
+ if (!param3.isNull()) {
+ trMessage = trMessage.subs(param3);
+ }
+ if (!param4.isNull()) {
+ trMessage = trMessage.subs(param4);
+ }
+ if (!param5.isNull()) {
+ trMessage = trMessage.subs(param5);
+ }
+ if (!param6.isNull()) {
+ trMessage = trMessage.subs(param6);
+ }
+ if (!param7.isNull()) {
+ trMessage = trMessage.subs(param7);
+ }
+ if (!param8.isNull()) {
+ trMessage = trMessage.subs(param8);
+ }
+ if (!param9.isNull()) {
+ trMessage = trMessage.subs(param9);
+ }
+ if (!param10.isNull()) {
+ trMessage = trMessage.subs(param10);
+ }
+
+ return trMessage.toString();
+}
+
+QString TranslationContext::i18ncp(const QString &context,
+ const QString &singular,
+ const QString &plural,
+ const QString ¶m1,
+ const QString ¶m2,
+ const QString ¶m3,
+ const QString ¶m4,
+ const QString ¶m5,
+ const QString ¶m6,
+ const QString ¶m7,
+ const QString ¶m8,
+ const QString ¶m9,
+ const QString ¶m10) const
+{
+ if (context.isNull() || singular.isNull() || plural.isNull()) {
+ qWarning() << "i18ncp() needs at least three arguments";
+ return QString();
+ }
+
+ KLocalizedString trMessage =
+ ki18ndcp(m_domain.toUtf8().constData(), context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
+
+ if (!param1.isNull()) {
+ bool ok;
+ int num = param1.toInt(&ok);
+ if (ok) {
+ trMessage = trMessage.subs(num);
+ } else {
+ trMessage = trMessage.subs(param1);
+ }
+ }
+ if (!param2.isNull()) {
+ trMessage = trMessage.subs(param2);
+ }
+ if (!param3.isNull()) {
+ trMessage = trMessage.subs(param3);
+ }
+ if (!param4.isNull()) {
+ trMessage = trMessage.subs(param4);
+ }
+ if (!param5.isNull()) {
+ trMessage = trMessage.subs(param5);
+ }
+ if (!param6.isNull()) {
+ trMessage = trMessage.subs(param6);
+ }
+ if (!param7.isNull()) {
+ trMessage = trMessage.subs(param7);
+ }
+ if (!param8.isNull()) {
+ trMessage = trMessage.subs(param8);
+ }
+ if (!param9.isNull()) {
+ trMessage = trMessage.subs(param9);
+ }
+ if (!param10.isNull()) {
+ trMessage = trMessage.subs(param10);
+ }
+
+ return trMessage.toString();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Kevin Ottens <ervin@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef TRANSLATIONCONTEXT_H
+#define TRANSLATIONCONTEXT_H
+
+#include <QObject>
+
+class TranslationContext : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString domain READ domain WRITE setDomain NOTIFY domainChanged)
+
+public:
+ explicit TranslationContext(QObject *parent = nullptr);
+ virtual ~TranslationContext();
+
+ QString domain() const;
+
+public Q_SLOTS:
+ void setDomain(const QString &domain);
+
+Q_SIGNALS:
+ void domainChanged(const QString &domain);
+
+public:
+ Q_INVOKABLE QString i18n(const QString &message,
+ const QString ¶m1 = QString(),
+ const QString ¶m2 = QString(),
+ const QString ¶m3 = QString(),
+ const QString ¶m4 = QString(),
+ const QString ¶m5 = QString(),
+ const QString ¶m6 = QString(),
+ const QString ¶m7 = QString(),
+ const QString ¶m8 = QString(),
+ const QString ¶m9 = QString(),
+ const QString ¶m10 = QString()) const;
+
+ Q_INVOKABLE QString i18nc(const QString &context,
+ const QString &message,
+ const QString ¶m1 = QString(),
+ const QString ¶m2 = QString(),
+ const QString ¶m3 = QString(),
+ const QString ¶m4 = QString(),
+ const QString ¶m5 = QString(),
+ const QString ¶m6 = QString(),
+ const QString ¶m7 = QString(),
+ const QString ¶m8 = QString(),
+ const QString ¶m9 = QString(),
+ const QString ¶m10 = QString()) const;
+
+ Q_INVOKABLE QString i18np(const QString &singular,
+ const QString &plural,
+ const QString ¶m1 = QString(),
+ const QString ¶m2 = QString(),
+ const QString ¶m3 = QString(),
+ const QString ¶m4 = QString(),
+ const QString ¶m5 = QString(),
+ const QString ¶m6 = QString(),
+ const QString ¶m7 = QString(),
+ const QString ¶m8 = QString(),
+ const QString ¶m9 = QString(),
+ const QString ¶m10 = QString()) const;
+
+ Q_INVOKABLE QString i18ncp(const QString &context,
+ const QString &singular,
+ const QString &plural,
+ const QString ¶m1 = QString(),
+ const QString ¶m2 = QString(),
+ const QString ¶m3 = QString(),
+ const QString ¶m4 = QString(),
+ const QString ¶m5 = QString(),
+ const QString ¶m6 = QString(),
+ const QString ¶m7 = QString(),
+ const QString ¶m8 = QString(),
+ const QString ¶m9 = QString(),
+ const QString ¶m10 = QString()) const;
+
+private:
+ Q_DISABLE_COPY(TranslationContext)
+
+ QString m_domain;
+};
+
+#endif // TRANSLATIONCONTEXT_H
--- /dev/null
+module org.kde.kquickcontrols
+
+KeySequenceItem 2.0 KeySequenceItem.qml
+ColorButton 2.0 ColorButton.qml
--- /dev/null
+project(kquickcontrolsaddons)
+
+configure_file(config-kquickcontrolsaddons.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-kquickcontrolsaddons.h)
+
+set(kquickcontrolsaddons_SRCS
+ kquickcontrolsaddonsplugin.cpp
+ qpixmapitem.cpp
+ qimageitem.cpp
+ qiconitem.cpp
+ fallbacktaphandler.cpp
+ mouseeventlistener.cpp
+ columnproxymodel.cpp
+ clipboard.cpp
+ eventgenerator.cpp
+ mimedatabase.cpp
+ kcmshell.cpp
+ icondialog.cpp
+)
+
+add_library(kquickcontrolsaddonsplugin SHARED ${kquickcontrolsaddons_SRCS})
+
+target_link_libraries(kquickcontrolsaddonsplugin
+ Qt5::Core
+ Qt5::Quick
+ Qt5::Qml
+ Qt5::Gui
+ KF5::IconThemes
+ KF5::KIOWidgets
+ KF5::QuickAddons
+ KF5::ConfigCore)
+
+if (HAVE_EPOXY)
+ target_sources(kquickcontrolsaddonsplugin PRIVATE plotter.cpp)
+ target_link_libraries(kquickcontrolsaddonsplugin epoxy::epoxy)
+endif()
+
+install(TARGETS kquickcontrolsaddonsplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kquickcontrolsaddons)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kquickcontrolsaddons)
--- /dev/null
+/** @mainpage Qt Extra Components
+
+<h2>import org.kde.qtextracomponents</h2>
+
+- QPixmapItem
+- QImageItem
+- QIconItem
+- MouseEventListener
+- ColumnProxyModel
+
+*/
+
+// DOXYGEN_SET_PROJECT_NAME = QtExtraComponents
+// vim:ts=4:sw=4:expandtab:filetype=doxygen
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "clipboard.h"
+#include <QDebug>
+#include <QGuiApplication>
+#include <QMimeData>
+#include <QUrl>
+
+Clipboard::Clipboard(QObject *parent)
+ : QObject(parent)
+ , m_clipboard(QGuiApplication::clipboard())
+ , m_mode(QClipboard::Clipboard)
+{
+ connect(m_clipboard, SIGNAL(changed(QClipboard::Mode)), SLOT(clipboardChanged(QClipboard::Mode)));
+}
+
+void Clipboard::setMode(QClipboard::Mode mode)
+{
+ m_mode = mode;
+ Q_EMIT modeChanged(m_mode);
+}
+
+void Clipboard::clipboardChanged(QClipboard::Mode m)
+{
+ if (m == m_mode) {
+ Q_EMIT contentChanged();
+ }
+}
+
+void Clipboard::clear()
+{
+ m_clipboard->clear(m_mode);
+}
+
+QClipboard::Mode Clipboard::mode() const
+{
+ return m_mode;
+}
+
+QVariant Clipboard::contentFormat(const QString &format) const
+{
+ const QMimeData *data = m_clipboard->mimeData(m_mode);
+ QVariant ret;
+ if (format == QLatin1String("text/uri-list")) {
+ QVariantList retList;
+ const auto urls = data->urls();
+ for (const QUrl &url : urls) {
+ retList += url;
+ }
+ ret = retList;
+ } else if (format.startsWith(QLatin1String("text/"))) {
+ ret = data->text();
+ } else if (format.startsWith(QLatin1String("image/"))) {
+ ret = data->imageData();
+ } else {
+ ret = data->data(format.isEmpty() ? data->formats().first() : format);
+ }
+
+ return ret;
+}
+
+QVariant Clipboard::content() const
+{
+ return contentFormat(m_clipboard->mimeData(m_mode)->formats().first());
+}
+
+void Clipboard::setContent(const QVariant &content)
+{
+ QMimeData *mimeData = new QMimeData;
+ switch (content.type()) {
+ case QVariant::String:
+ mimeData->setText(content.toString());
+ break;
+ case QVariant::Color:
+ mimeData->setColorData(content.toString());
+ break;
+ case QVariant::Pixmap:
+ case QVariant::Image:
+ mimeData->setImageData(content);
+ break;
+ default:
+ if (content.type() == QVariant::List) {
+ const QVariantList list = content.toList();
+ QList<QUrl> urls;
+ bool wasUrlList = true;
+ for (const QVariant &url : list) {
+ if (url.type() != QVariant::Url) {
+ wasUrlList = false;
+ break;
+ }
+ urls += url.toUrl();
+ }
+ if (wasUrlList) {
+ mimeData->setUrls(urls);
+ break;
+ }
+ }
+
+ if (content.canConvert(QVariant::String)) {
+ mimeData->setText(content.toString());
+ } else {
+ mimeData->setData(QStringLiteral("application/octet-stream"), content.toByteArray());
+ qWarning() << "Couldn't figure out the content type, storing as application/octet-stream";
+ }
+ break;
+ }
+ m_clipboard->setMimeData(mimeData, m_mode);
+}
+
+QStringList Clipboard::formats() const
+{
+ return m_clipboard->mimeData(m_mode)->formats();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CLIPBOARD_H
+#define CLIPBOARD_H
+
+#include <QClipboard>
+#include <QVariant>
+
+class ClipboardPrivate;
+
+/**
+ * @brief Wrapper for QClipboard
+ *
+ * Offers a simple wrapper to interact with QClipboard from QtQuick.
+ *
+ * ```
+ * import QtQuick 2.5
+ * import org.kde.kquickcontrolsaddons 2.0 as KQuickControlsAddons
+ * Text {
+ * text: "lorem ipsum"
+ *
+ * KQuickControlsAddons.Clipboard { id: clipboard }
+ *
+ * MouseArea {
+ * anchors.fill: parent
+ * acceptedButtons: Qt.LeftButton | Qt.RightButton
+ * onClicked: clipboard.content = parent.text
+ * }
+ * }
+ * ```
+ */
+class Clipboard : public QObject
+{
+ Q_OBJECT
+ /**
+ * Controls the state this object will be monitoring and extracting its contents from.
+ */
+ Q_PROPERTY(QClipboard::Mode mode READ mode WRITE setMode NOTIFY modeChanged)
+
+ /**
+ * Provides the contents currently in the clipboard and lets modify them.
+ */
+ Q_PROPERTY(QVariant content READ content WRITE setContent NOTIFY contentChanged)
+
+ /**
+ * Figure out the nature of the contents in the clipboard as mimetype strings.
+ */
+ Q_PROPERTY(QStringList formats READ formats NOTIFY contentChanged)
+
+public:
+ explicit Clipboard(QObject *parent = nullptr);
+
+ QClipboard::Mode mode() const;
+ void setMode(QClipboard::Mode mode);
+
+ /**
+ * @param format mimetype string
+ * @return Output based on the mimetype. This may be a list of URLs, text, image data, or use QMimeData::data
+ */
+ Q_SCRIPTABLE QVariant contentFormat(const QString &format) const;
+ QVariant content() const;
+ void setContent(const QVariant &content);
+
+ QStringList formats() const;
+
+ /** @see QClipboard::clear() */
+ Q_SCRIPTABLE void clear();
+
+Q_SIGNALS:
+ void modeChanged(QClipboard::Mode mode);
+ void contentChanged();
+
+private Q_SLOTS:
+ void clipboardChanged(QClipboard::Mode m);
+
+private:
+ QClipboard *m_clipboard;
+ QClipboard::Mode m_mode;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "columnproxymodel.h"
+
+ColumnProxyModel::ColumnProxyModel(QObject *parent)
+ : QAbstractListModel(parent)
+ , m_column(0)
+ , m_sourceModel(nullptr)
+{
+}
+
+void ColumnProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
+{
+ if (sourceModel == m_sourceModel) {
+ return;
+ }
+
+ beginResetModel();
+ if (m_sourceModel) {
+ disconnect(m_sourceModel, SIGNAL(destroyed(QObject *)), this, SLOT(sourceDestroyed(QObject *)));
+
+ disconnect(m_sourceModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(considerDataChanged(QModelIndex, QModelIndex)));
+ disconnect(m_sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(considerRowsAboutToBeInserted(QModelIndex, int, int)));
+ disconnect(m_sourceModel,
+ SIGNAL(rowsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int)),
+ this,
+ SLOT(considerRowsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int)));
+ disconnect(m_sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(considerRowsAboutToBeRemoved(QModelIndex, int, int)));
+ disconnect(m_sourceModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(considerRowsInserted(QModelIndex, int, int)));
+ disconnect(m_sourceModel,
+ SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)),
+ this,
+ SLOT(considerRowsMoved(QModelIndex, int, int, QModelIndex, int)));
+ disconnect(m_sourceModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(considerRowsRemoved(QModelIndex, int, int)));
+
+ disconnect(m_sourceModel, SIGNAL(modelAboutToBeReset()), this, SIGNAL(modelAboutToBeReset()));
+ disconnect(m_sourceModel, SIGNAL(modelReset()), this, SIGNAL(modelReset()));
+ disconnect(m_sourceModel, SIGNAL(headerDataChanged(Qt::Orientation, int, int)), this, SIGNAL(headerDataChanged(Qt::Orientation, int, int)));
+ disconnect(m_sourceModel, SIGNAL(layoutAboutToBeChanged()), this, SIGNAL(layoutAboutToBeChanged()));
+ disconnect(m_sourceModel, SIGNAL(layoutChanged()), this, SIGNAL(layoutChanged()));
+ }
+ m_sourceModel = sourceModel;
+ if (m_sourceModel) {
+ connect(m_sourceModel, SIGNAL(destroyed(QObject *)), this, SLOT(sourceDestroyed(QObject *)));
+
+ connect(m_sourceModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(considerDataChanged(QModelIndex, QModelIndex)));
+ connect(m_sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex, int, int)), this, SLOT(considerRowsAboutToBeInserted(QModelIndex, int, int)));
+ connect(m_sourceModel,
+ SIGNAL(rowsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int)),
+ this,
+ SLOT(considerRowsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int)));
+ connect(m_sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this, SLOT(considerRowsAboutToBeRemoved(QModelIndex, int, int)));
+ connect(m_sourceModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(considerRowsInserted(QModelIndex, int, int)));
+ connect(m_sourceModel,
+ SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)),
+ this,
+ SLOT(considerRowsMoved(QModelIndex, int, int, QModelIndex, int)));
+ connect(m_sourceModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(considerRowsRemoved(QModelIndex, int, int)));
+
+ connect(m_sourceModel, SIGNAL(modelAboutToBeReset()), this, SIGNAL(modelAboutToBeReset()));
+ connect(m_sourceModel, SIGNAL(modelReset()), this, SIGNAL(modelReset()));
+ connect(m_sourceModel, SIGNAL(headerDataChanged(Qt::Orientation, int, int)), this, SIGNAL(headerDataChanged(Qt::Orientation, int, int)));
+ connect(m_sourceModel, SIGNAL(layoutAboutToBeChanged()), this, SIGNAL(layoutAboutToBeChanged()));
+ connect(m_sourceModel, SIGNAL(layoutChanged()), this, SIGNAL(layoutChanged()));
+ }
+ endResetModel();
+}
+
+void ColumnProxyModel::setColumn(int col)
+{
+ beginResetModel();
+ m_column = col;
+ endResetModel();
+}
+
+int ColumnProxyModel::column() const
+{
+ return m_column;
+}
+
+QModelIndex ColumnProxyModel::rootIndex() const
+{
+ return m_index;
+}
+
+void ColumnProxyModel::setRootIndex(const QModelIndex &index)
+{
+ if (index == m_index) {
+ return;
+ }
+
+ if (index.isValid()) {
+ setSourceModel(const_cast<QAbstractItemModel *>(index.model()));
+ }
+ beginResetModel();
+ m_index = index;
+ endResetModel();
+
+ Q_EMIT rootIndexChanged();
+}
+
+QModelIndex ColumnProxyModel::indexFromModel(QAbstractItemModel *model, int row, int column, const QModelIndex &parent)
+{
+ return model ? model->index(row, column, parent) : QModelIndex();
+}
+
+QVariant ColumnProxyModel::data(const QModelIndex &index, int role) const
+{
+ return m_sourceModel ? m_sourceModel->data(sourceIndex(index), role) : QVariant();
+}
+
+QVariant ColumnProxyModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ return m_sourceModel ? m_sourceModel->headerData(section, orientation, role) : QVariant();
+}
+
+QModelIndex ColumnProxyModel::sourceIndex(const QModelIndex &proxyIndex) const
+{
+ return m_sourceModel ? m_sourceModel->index(proxyIndex.row(), m_column, m_index) : QModelIndex();
+}
+
+int ColumnProxyModel::rowCount(const QModelIndex &parent) const
+{
+ return (!m_sourceModel || parent.isValid()) ? 0 : m_sourceModel->rowCount(m_index);
+}
+
+QModelIndex ColumnProxyModel::proxyIndex(const QModelIndex &sourceIndex) const
+{
+ if (sourceIndex.parent() == m_index) {
+ return index(sourceIndex.row(), sourceIndex.column(), QModelIndex());
+ }
+
+ return QModelIndex();
+}
+
+void ColumnProxyModel::sourceDestroyed(QObject *source)
+{
+ Q_ASSERT(source == m_sourceModel);
+
+ beginResetModel();
+ m_sourceModel = nullptr;
+ endResetModel();
+}
+
+QModelIndex ColumnProxyModel::indexAt(int row, const QModelIndex &parent) const
+{
+ return m_sourceModel ? m_sourceModel->index(row, m_column, parent) : QModelIndex();
+}
+
+/////////////////
+
+void ColumnProxyModel::considerDataChanged(const QModelIndex &idxA, const QModelIndex &idxB)
+{
+ if (idxA.parent() == m_index && idxB.parent() == m_index) {
+ Q_EMIT dataChanged(proxyIndex(idxA), proxyIndex(idxB));
+ }
+}
+
+void ColumnProxyModel::considerRowsAboutToBeInserted(const QModelIndex &parent, int rA, int rB)
+{
+ if (parent == m_index) {
+ beginInsertRows(QModelIndex(), rA, rB);
+ }
+}
+
+void ColumnProxyModel::considerRowsAboutToBeMoved(const QModelIndex &sourceParent, int rA, int rB, const QModelIndex &destParent, int rD)
+{
+ if (sourceParent == m_index && destParent == m_index) {
+ beginMoveRows(QModelIndex(), rA, rB, QModelIndex(), rD);
+ } else if (sourceParent == m_index) {
+ beginRemoveRows(sourceParent, rA, rB);
+ } else if (destParent == m_index) {
+ beginInsertRows(destParent, rD, rD + (rB - rA));
+ }
+}
+
+void ColumnProxyModel::considerRowsAboutToBeRemoved(const QModelIndex &parent, int rA, int rB)
+{
+ if (parent == m_index) {
+ beginRemoveRows(QModelIndex(), rA, rB);
+ }
+}
+
+void ColumnProxyModel::considerRowsInserted(const QModelIndex &parent, int, int)
+{
+ if (parent == m_index) {
+ endInsertRows();
+ }
+}
+
+void ColumnProxyModel::considerRowsMoved(const QModelIndex &sourceParent, int, int, const QModelIndex &destParent, int)
+{
+ if (sourceParent == m_index && destParent == m_index) {
+ endMoveRows();
+ } else if (sourceParent == m_index) {
+ endRemoveRows();
+ } else if (destParent == m_index) {
+ endInsertRows();
+ }
+}
+
+void ColumnProxyModel::considerRowsRemoved(const QModelIndex &parent, int, int)
+{
+ if (parent == m_index) {
+ endInsertRows();
+ }
+}
+
+QHash<int, QByteArray> ColumnProxyModel::roleNames() const
+{
+ return m_sourceModel ? m_sourceModel->roleNames() : QHash<int, QByteArray>();
+}
+
+bool ColumnProxyModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ return m_sourceModel && m_sourceModel->setData(sourceIndex(index), value, role);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef COLUMNPROXYMODEL_H
+#define COLUMNPROXYMODEL_H
+
+#include <QAbstractListModel>
+
+class ColumnProxyModel : public QAbstractListModel
+{
+ Q_OBJECT
+ Q_PROPERTY(QModelIndex rootIndex READ rootIndex WRITE setRootIndex NOTIFY rootIndexChanged)
+ // Q_PROPERTY(QAbstractItemModel* sourceModel READ sourceModel WRITE setSourceModel) //rootIndex sets the model
+ Q_PROPERTY(int column READ column WRITE setColumn)
+public:
+ explicit ColumnProxyModel(QObject *parent = nullptr);
+
+ void setRootIndex(const QModelIndex &idx);
+ QModelIndex rootIndex() const;
+
+ void setSourceModel(QAbstractItemModel *sourceModel);
+ QAbstractItemModel *sourceModel() const
+ {
+ return m_sourceModel;
+ }
+
+ int column() const;
+ void setColumn(int col);
+
+ Q_SCRIPTABLE static QModelIndex indexFromModel(QAbstractItemModel *model, int row, int column = 0, const QModelIndex &parent = QModelIndex());
+ Q_SCRIPTABLE QModelIndex indexAt(int row, const QModelIndex &parent = QModelIndex()) const;
+
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ QHash<int, QByteArray> roleNames() const override;
+
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+
+Q_SIGNALS:
+ void rootIndexChanged();
+
+private:
+ QModelIndex proxyIndex(const QModelIndex &sourceIndex) const;
+ QModelIndex sourceIndex(const QModelIndex &proxyIndex) const;
+
+ int m_column;
+ QModelIndex m_index;
+ QAbstractItemModel *m_sourceModel;
+
+private Q_SLOTS:
+ void considerRowsAboutToBeInserted(const QModelIndex &, int, int);
+ void considerRowsAboutToBeMoved(const QModelIndex &sourceParent, int rA, int rB, const QModelIndex &destParent, int rD);
+ void considerRowsAboutToBeRemoved(const QModelIndex &, int, int);
+ void considerRowsRemoved(const QModelIndex &, int, int);
+ void considerRowsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
+ void considerRowsInserted(const QModelIndex &, int, int);
+ void considerDataChanged(const QModelIndex &idxA, const QModelIndex &idxB);
+ void sourceDestroyed(QObject *source);
+};
+
+#endif
--- /dev/null
+// epoxy library available?
+#cmakedefine01 HAVE_EPOXY
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org>
+ SPDX-FileCopyrightText: 2015 Marco Martin <notmart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "eventgenerator.h"
+
+#include <QGuiApplication>
+#include <QQuickItem>
+#include <QQuickWindow>
+
+EventGenerator::EventGenerator(QObject *parent)
+ : QObject(parent)
+{
+}
+
+EventGenerator::~EventGenerator()
+{
+}
+
+void EventGenerator::sendMouseEvent(QQuickItem *item,
+ EventGenerator::MouseEvent type,
+ int x,
+ int y,
+ int button,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers)
+{
+ if (!item) {
+ return;
+ }
+
+ QEvent::Type eventType;
+ switch (type) {
+ case MouseButtonPress:
+ eventType = QEvent::MouseButtonPress;
+ break;
+ case MouseButtonRelease:
+ eventType = QEvent::MouseButtonRelease;
+ break;
+ case MouseMove:
+ eventType = QEvent::MouseMove;
+ break;
+ default:
+ return;
+ }
+ QMouseEvent ev(eventType, QPointF(x, y), static_cast<Qt::MouseButton>(button), buttons, modifiers);
+
+ QGuiApplication::sendEvent(item, &ev);
+}
+
+void EventGenerator::sendMouseEventRecursive(QQuickItem *parentItem,
+ EventGenerator::MouseEvent type,
+ int x,
+ int y,
+ int button,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers)
+{
+ if (!parentItem) {
+ return;
+ }
+
+ const QList<QQuickItem *> items = allChildItemsRecursive(parentItem);
+
+ for (QQuickItem *item : items) {
+ sendMouseEvent(item, type, x, y, button, buttons, modifiers);
+ }
+}
+
+void EventGenerator::sendWheelEvent(QQuickItem *item,
+ int x,
+ int y,
+ const QPoint &pixelDelta,
+ const QPoint &angleDelta,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers)
+{
+ if (!item || !item->window()) {
+ return;
+ }
+
+ QPointF pos(x, y);
+ QPointF globalPos(item->window()->mapToGlobal(item->mapToScene(pos).toPoint()));
+ QWheelEvent ev(pos, globalPos, pixelDelta, angleDelta, buttons, modifiers, Qt::ScrollUpdate, false /*not inverted*/);
+ QGuiApplication::sendEvent(item, &ev);
+}
+
+void EventGenerator::sendWheelEventRecursive(QQuickItem *parentItem,
+ int x,
+ int y,
+ const QPoint &pixelDelta,
+ const QPoint &angleDelta,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers)
+{
+ if (!parentItem) {
+ return;
+ }
+
+ const QList<QQuickItem *> items = allChildItemsRecursive(parentItem);
+
+ for (QQuickItem *item : items) {
+ sendWheelEvent(item, x, y, pixelDelta, angleDelta, buttons, modifiers);
+ }
+}
+
+void EventGenerator::sendGrabEvent(QQuickItem *item, EventGenerator::GrabEvent type)
+{
+ if (!item) {
+ return;
+ }
+
+ switch (type) {
+ case GrabMouse:
+ item->grabMouse();
+ break;
+ case UngrabMouse: {
+ QEvent ev(QEvent::UngrabMouse);
+ QGuiApplication::sendEvent(item, &ev);
+ return;
+ }
+ default:
+ return;
+ }
+}
+
+void EventGenerator::sendGrabEventRecursive(QQuickItem *parentItem, EventGenerator::GrabEvent type)
+{
+ if (!parentItem) {
+ return;
+ }
+
+ const QList<QQuickItem *> items = allChildItemsRecursive(parentItem);
+
+ for (QQuickItem *item : items) {
+ sendGrabEvent(item, type);
+ }
+}
+
+QList<QQuickItem *> EventGenerator::allChildItemsRecursive(QQuickItem *parentItem)
+{
+ QList<QQuickItem *> itemList;
+
+ const auto childsItems = parentItem->childItems();
+ itemList.append(childsItems);
+
+ for (QQuickItem *childItem : childsItems) {
+ itemList.append(allChildItemsRecursive(childItem));
+ }
+
+ return itemList;
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Eike Hein <hein@kde.org>
+ SPDX-FileCopyrightText: 2015 Marco Martin <notmart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef EventGenerator_H
+#define EventGenerator_H
+
+#include <QObject>
+
+class QQuickItem;
+
+class EventGenerator : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum MouseEvent {
+ MouseButtonPress,
+ MouseButtonRelease,
+ MouseMove,
+ };
+ Q_ENUM(MouseEvent)
+
+ enum GrabEvent {
+ GrabMouse,
+ UngrabMouse,
+ };
+ Q_ENUM(GrabEvent)
+
+ EventGenerator(QObject *parent = nullptr);
+ ~EventGenerator();
+
+ /**
+ * Send a mouse event of @type to the given @item
+ */
+ Q_INVOKABLE void
+ sendMouseEvent(QQuickItem *item, EventGenerator::MouseEvent type, int x, int y, int button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers);
+
+ /**
+ * Send a mouse event of @type to the given @item, all its children and descendants
+ */
+ Q_INVOKABLE void sendMouseEventRecursive(QQuickItem *item,
+ EventGenerator::MouseEvent type,
+ int x,
+ int y,
+ int button,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers);
+
+ /**
+ * Send a wheel event to the given @item
+ *
+ * @since 5.16
+ */
+ Q_INVOKABLE void sendWheelEvent(QQuickItem *item,
+ int x,
+ int y,
+ const QPoint &pixelDelta,
+ const QPoint &angleDelta,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers);
+
+ /**
+ * Send a wheel event to the given @item, all its children and descendants
+ *
+ * @since 5.16
+ */
+ Q_INVOKABLE void sendWheelEventRecursive(QQuickItem *item,
+ int x,
+ int y,
+ const QPoint &pixelDelta,
+ const QPoint &angleDelta,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers);
+
+ /**
+ * Send a mouse grab event of @type (grab or ungrab) to the given @item
+ */
+ Q_INVOKABLE void sendGrabEvent(QQuickItem *item, EventGenerator::GrabEvent type);
+
+ /**
+ * Send a mouse grab event of @type (grab or ungrab) to the given @item, all its children and descendants
+ */
+ Q_INVOKABLE void sendGrabEventRecursive(QQuickItem *item, EventGenerator::GrabEvent type);
+
+private:
+ static QList<QQuickItem *> allChildItemsRecursive(QQuickItem *parentItem);
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
+
+ SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#include "fallbacktaphandler.h"
+
+#include <QGuiApplication>
+#include <QStyleHints>
+
+FallbackTapHandlerMouseEvent::FallbackTapHandlerMouseEvent(Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, qreal x, qreal y)
+ : QObject(nullptr)
+ , m_button(button)
+ , m_buttons(buttons)
+ , m_modifiers(modifiers)
+ , m_x(x)
+ , m_y(y)
+{
+}
+
+FallbackTapHandler::FallbackTapHandler(QQuickItem *parent)
+ : QQuickItem(parent)
+{
+ setFiltersChildMouseEvents(true);
+ setAcceptedMouseButtons(Qt::LeftButton);
+}
+
+FallbackTapHandler::~FallbackTapHandler()
+{
+}
+
+void FallbackTapHandler::setAcceptedButtons(Qt::MouseButtons buttons)
+{
+ setAcceptedMouseButtons(buttons);
+ Q_EMIT acceptedButtonsChanged();
+}
+
+bool FallbackTapHandler::childMouseEventFilter(QQuickItem *item, QEvent *event)
+{
+ if (event->type() == QEvent::MouseButtonPress && item->inherits("QQuickFlickable")) {
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ if (!(me->button() & acceptedMouseButtons()) && !(me->buttons() & acceptedMouseButtons())) {
+ return QQuickItem::childMouseEventFilter(item, event);
+ }
+ m_mouseDownItem = item;
+ m_mouseDownPos = me->windowPos();
+
+ QPointF mappedPoint = mapFromItem(item, me->pos());
+ FallbackTapHandlerMouseEvent eventProxy(me->button(), me->buttons(), me->modifiers(), mappedPoint.x(), mappedPoint.y());
+ Q_EMIT pressed(&eventProxy);
+
+ } else if (event->type() == QEvent::MouseButtonRelease && item->inherits("QQuickFlickable")) {
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+
+ if ((!(me->button() & acceptedMouseButtons()) && !(me->buttons() & acceptedMouseButtons())) || m_mouseDownItem != item) {
+ return QQuickItem::childMouseEventFilter(item, event);
+ }
+
+ QPointF mappedPoint = mapFromItem(item, me->pos());
+ FallbackTapHandlerMouseEvent eventProxy(me->button(), me->buttons(), me->modifiers(), mappedPoint.x(), mappedPoint.y());
+ Q_EMIT released(&eventProxy);
+
+ if (QPointF(m_mouseDownPos - me->windowPos()).manhattanLength() < QGuiApplication::styleHints()->startDragDistance()) {
+ Q_EMIT tapped(&eventProxy);
+ }
+
+ m_mouseDownItem.clear();
+ m_mouseDownPos = QPointF();
+ }
+
+ return QQuickItem::childMouseEventFilter(item, event);
+}
+
+void FallbackTapHandler::mousePressEvent(QMouseEvent *event)
+{
+ if ((!(event->button() & acceptedMouseButtons()) && !(event->buttons() & acceptedMouseButtons()))) {
+ event->ignore();
+ return;
+ }
+
+ event->accept();
+ m_mouseDownItem = this;
+ m_mouseDownPos = event->windowPos();
+
+ FallbackTapHandlerMouseEvent eventProxy(event->button(), event->buttons(), event->modifiers(), event->x(), event->y());
+ Q_EMIT pressed(&eventProxy);
+}
+
+void FallbackTapHandler::mouseReleaseEvent(QMouseEvent *event)
+{
+ if ((!(event->button() & acceptedMouseButtons()) && !(event->buttons() & acceptedMouseButtons()))) {
+ event->ignore();
+ return;
+ }
+
+ FallbackTapHandlerMouseEvent eventProxy(event->button(), event->buttons(), event->modifiers(), event->x(), event->y());
+
+ if (QPointF(m_mouseDownPos - event->windowPos()).manhattanLength() < QGuiApplication::styleHints()->startDragDistance()) {
+ Q_EMIT tapped(&eventProxy);
+ }
+
+ m_mouseDownItem.clear();
+ m_mouseDownPos = QPointF();
+
+ Q_EMIT released(&eventProxy);
+}
+
+#include "moc_fallbacktaphandler.cpp"
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2019 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2014-2015 Eike Hein <hein@kde.org>
+
+ SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#pragma once
+
+#include <QPointer>
+#include <QQuickItem>
+
+class FallbackTapHandlerMouseEvent : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(Qt::MouseButton button MEMBER m_button)
+ Q_PROPERTY(Qt::MouseButtons buttons MEMBER m_buttons)
+ Q_PROPERTY(Qt::KeyboardModifiers modifiers MEMBER m_modifiers)
+ Q_PROPERTY(qreal x MEMBER m_x)
+ Q_PROPERTY(qreal y MEMBER m_y)
+
+public:
+ FallbackTapHandlerMouseEvent(Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, qreal x, qreal y);
+ ~FallbackTapHandlerMouseEvent() = default;
+
+private:
+ Qt::MouseButton m_button = Qt::NoButton;
+ Qt::MouseButtons m_buttons = Qt::NoButton;
+ Qt::KeyboardModifiers m_modifiers = Qt::NoModifier;
+ qreal m_x = 0;
+ qreal m_y = 0;
+};
+
+class FallbackTapHandler : public QQuickItem
+{
+ Q_OBJECT
+ Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedMouseButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged)
+
+public:
+ explicit FallbackTapHandler(QQuickItem *parent = nullptr);
+ ~FallbackTapHandler() override;
+
+ void setAcceptedButtons(Qt::MouseButtons buttons);
+
+Q_SIGNALS:
+ void pressed(FallbackTapHandlerMouseEvent *event);
+ void tapped(FallbackTapHandlerMouseEvent *event);
+ void released(FallbackTapHandlerMouseEvent *event);
+ void acceptedButtonsChanged();
+
+protected:
+ bool childMouseEventFilter(QQuickItem *item, QEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
+ void mouseReleaseEvent(QMouseEvent *event) override;
+
+private:
+ QPointer<QQuickItem> m_mouseDownItem;
+ QPointF m_mouseDownPos;
+};
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#include "icondialog.h"
+
+#include <QQuickItem>
+#include <QQuickWindow>
+
+#include <KIconDialog>
+#include <KIconLoader>
+#include <QApplication>
+
+IconDialog::IconDialog(QObject *parent)
+ : QObject(parent)
+ , m_dialog(nullptr)
+ , m_iconSize(0)
+ , m_user(false)
+ , m_modality(Qt::WindowModal)
+ , m_visible(false)
+{
+ if (qobject_cast<QApplication *>(QCoreApplication::instance())) {
+ m_dialog.reset(new KIconDialog());
+ connect(m_dialog.data(), &KIconDialog::newIconName, this, [this](const QString &newIconName) {
+ if (m_iconName != newIconName) {
+ m_iconName = newIconName;
+ Q_EMIT iconNameChanged(newIconName);
+ }
+ });
+
+ m_dialog->installEventFilter(this);
+ }
+}
+
+IconDialog::~IconDialog()
+{
+ if (m_dialog) {
+ m_dialog->close();
+ }
+}
+
+QString IconDialog::iconName() const
+{
+ return m_iconName;
+}
+
+int IconDialog::iconSize() const
+{
+ return m_iconSize;
+}
+
+void IconDialog::setIconSize(int iconSize)
+{
+ if (m_dialog->iconSize() != iconSize) {
+ m_iconSize = iconSize;
+ Q_EMIT iconSizeChanged(iconSize);
+ }
+}
+
+QString IconDialog::title() const
+{
+ return m_dialog->windowTitle();
+}
+
+void IconDialog::setTitle(const QString &title)
+{
+ if (m_dialog->windowTitle() != title) {
+ m_dialog->setWindowTitle(title);
+ Q_EMIT titleChanged(title);
+ }
+}
+
+bool IconDialog::user() const
+{
+ return m_user;
+}
+
+void IconDialog::setUser(bool user)
+{
+ if (m_user != user) {
+ m_user = user;
+ Q_EMIT userChanged(user);
+ }
+}
+
+QString IconDialog::customLocation() const
+{
+ return m_customLocation;
+}
+
+void IconDialog::setCustomLocation(const QString &customLocation)
+{
+ if (m_customLocation != customLocation) {
+ m_dialog->setCustomLocation(customLocation);
+
+ m_customLocation = customLocation;
+ Q_EMIT customLocationChanged(customLocation);
+ }
+}
+
+Qt::WindowModality IconDialog::modality() const
+{
+ return m_modality;
+}
+
+void IconDialog::setModality(Qt::WindowModality modality)
+{
+ if (m_modality != modality) {
+ m_modality = modality;
+ Q_EMIT modalityChanged(modality);
+ }
+}
+
+bool IconDialog::visible() const
+{
+ return m_dialog->isVisible();
+}
+
+void IconDialog::setVisible(bool visible)
+{
+ if (visible) {
+ open();
+ } else {
+ close();
+ }
+}
+
+void IconDialog::open()
+{
+ if (m_dialog->isVisible()) {
+ return;
+ }
+
+ QQuickItem *parentItem = qobject_cast<QQuickItem *>(parent());
+ QQuickWindow *parentWindow = (parentItem ? parentItem->window() : qobject_cast<QQuickWindow *>(parent()));
+
+ if (m_modality == Qt::NonModal) {
+ m_dialog->setModal(false);
+ } else if (m_modality == Qt::WindowModal) {
+ m_dialog->winId(); // needed to get the windowHandle prior to showing
+ m_dialog->windowHandle()->setTransientParent(parentWindow);
+ m_dialog->setModal(false); // WindowModal does not unset the overall modality
+ } else if (m_modality == Qt::ApplicationModal) {
+ m_dialog->setModal(true);
+ }
+
+ m_dialog->setWindowModality(m_modality);
+
+ m_dialog->setup(KIconLoader::Desktop, KIconLoader::Application, false, m_iconSize, m_user);
+
+ m_dialog->show();
+}
+
+void IconDialog::close()
+{
+ if (!m_dialog->isVisible()) {
+ return;
+ }
+
+ m_dialog->hide();
+}
+
+bool IconDialog::eventFilter(QObject *watched, QEvent *event)
+{
+ if (watched == m_dialog.data() && (event->type() == QEvent::Show || event->type() == QEvent::Hide)) {
+ Q_EMIT visibleChanged();
+ }
+
+ return false;
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: GPL-2.0-or-later
+*/
+
+#ifndef ICONDIALOG_H
+#define ICONDIALOG_H
+
+#include <QObject>
+#include <QString>
+
+class KIconDialog;
+
+class IconDialog : public QObject
+{
+ Q_OBJECT
+
+ /**
+ * The name or path of the icon the user has selected
+ */
+ Q_PROPERTY(QString iconName READ iconName NOTIFY iconNameChanged)
+ /**
+ * The desired size of icons
+ */
+ Q_PROPERTY(int iconSize READ iconSize WRITE setIconSize NOTIFY iconSizeChanged)
+ /**
+ * The title to use for the dialog
+ */
+ Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)
+ /**
+ * Begin with the "user icons" instead of "system icons"
+ */
+ Q_PROPERTY(bool user READ user WRITE setUser NOTIFY userChanged)
+ /**
+ * Use a custom location, only local directory paths are allowed
+ */
+ Q_PROPERTY(QString customLocation READ customLocation WRITE setCustomLocation NOTIFY customLocationChanged)
+ /**
+ * Window modality, default is Qt.NonModal
+ */
+ Q_PROPERTY(Qt::WindowModality modality READ modality WRITE setModality NOTIFY modalityChanged)
+ /**
+ * Whether the dialog is currently visible, setting this property to true
+ * is the same as calling show()
+ */
+ Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged)
+
+public:
+ explicit IconDialog(QObject *parent = nullptr);
+ ~IconDialog() override;
+
+ QString iconName() const;
+
+ int iconSize() const;
+ void setIconSize(int iconSize);
+
+ QString title() const;
+ void setTitle(const QString &title);
+
+ bool user() const;
+ void setUser(bool user);
+
+ QString customLocation() const;
+ void setCustomLocation(const QString &customLocation);
+
+ Qt::WindowModality modality() const;
+ void setModality(Qt::WindowModality modality);
+
+ bool visible() const;
+ void setVisible(bool visible);
+
+ Q_INVOKABLE void open();
+ Q_INVOKABLE void close();
+
+Q_SIGNALS:
+ void iconNameChanged(const QString &iconName);
+ void iconSizeChanged(int iconSize);
+ void titleChanged(const QString &title);
+ void userChanged(bool user);
+ void customLocationChanged(const QString &customLocation);
+ void modalityChanged(Qt::WindowModality modality);
+ void visibleChanged();
+
+private:
+ bool eventFilter(QObject *watched, QEvent *event) override;
+
+ QScopedPointer<KIconDialog> m_dialog;
+
+ QString m_iconName;
+ int m_iconSize;
+ bool m_user;
+ QString m_customLocation;
+ Qt::WindowModality m_modality;
+ bool m_visible;
+};
+
+#endif // ICONDIALOG_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "kcmshell.h"
+
+#include <KAuthorized>
+#include <KService>
+
+#include <KIO/CommandLauncherJob>
+
+KCMShell::KCMShell(QObject *parent)
+ : QObject(parent)
+{
+}
+
+KCMShell::~KCMShell()
+{
+}
+
+void KCMShell::open(const QStringList &names) const
+{
+ KIO::CommandLauncherJob *job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), names);
+ job->start();
+}
+
+void KCMShell::openSystemSettings(const QString &name, const QStringList &args) const
+{
+ const QString systemSettings = QStringLiteral("systemsettings");
+ KIO::CommandLauncherJob *job = nullptr;
+
+ QStringList cmdline{name};
+ if (!args.isEmpty()) {
+ cmdline.append(QStringLiteral("--args"));
+ cmdline.append(args.join(QLatin1Char(' ')));
+ }
+
+ // Open in System Settings if it's available'
+ if (KService::serviceByDesktopName(systemSettings)) {
+ job = new KIO::CommandLauncherJob(QStringLiteral("systemsettings5"), cmdline);
+ job->setDesktopName(systemSettings);
+ } else {
+ job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), cmdline);
+ }
+
+ job->start();
+}
+
+void KCMShell::openInfoCenter(const QString &name) const
+{
+ const QString systemSettings = QStringLiteral("systemsettings");
+ KIO::CommandLauncherJob *job = nullptr;
+
+ // Open in Info Center if System Settings is available
+ if (KService::serviceByDesktopName(systemSettings)) {
+ job = new KIO::CommandLauncherJob(QStringLiteral("kinfocenter"), QStringList(name));
+ job->setIcon(systemSettings);
+ job->setDesktopName(systemSettings);
+ } else {
+ job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), QStringList(name));
+ }
+
+ job->start();
+}
+
+QStringList KCMShell::authorize(const QStringList &menuIds) const
+{
+ return KAuthorized::authorizeControlModules(menuIds);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCMSHELL_H
+#define KCMSHELL_H
+
+#include <QObject>
+
+class KCMShell : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit KCMShell(QObject *parent = nullptr);
+ virtual ~KCMShell();
+
+public Q_SLOTS:
+ void open(const QStringList &names) const;
+
+ /**
+ * Opens the specified module in System Settings. Only a single KCM name may
+ * be provided.
+ *
+ * @code
+ * onClicked: KCMShell.openSystemSettings("kcm_kscreen")
+ * @endcode
+ *
+ * @param name A single kcm name to open in System Settings. Opening multiple
+ * KCMs using this function is not supported; to do that, use kcmshell.open.
+ * @param args Additional arguments to pass to the module.
+ *
+ * @since 5.71
+ */
+ void openSystemSettings(const QString &name, const QStringList &args = QStringList()) const;
+
+ /**
+ * Opens the specified module in InfCenter. Only a single KCM name may
+ * be provided.
+ *
+ * @code
+ * onClicked: KCMShell.openInfoCenter("kcm_energy")
+ * @endcode
+ *
+ * @param name A single kcm name to open in Info Center. Opening multiple
+ * KCMs using this function is not supported; to do that, use kcmshell.open.
+ *
+ * @since 5.71
+ */
+ void openInfoCenter(const QString &name) const;
+
+ /**
+ * Check which of the given control modules the user is
+ * allowed to access
+ *
+ * This can be used for example to hide context menu options
+ * that would do nothing if the user wasn't authorized.
+ *
+ * @code
+ * visible: KCMShell.authorize(["org.kde.fooconfig.desktop"]).length > 0
+ * @endcode
+ *
+ * @param menuIds A list of control module menu IDs
+ * @return The entries in @p menuIds that the user is
+ * authorized to access, may be empty
+ * @sa KAuthorized::authorizeControlModules
+ * @since 5.23
+ */
+ QStringList authorize(const QStringList &menuIds) const;
+};
+
+#endif // KCMSHELL_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2009 Alan Alpert <alan.alpert@nokia.com>
+ SPDX-FileCopyrightText: 2010 Ménard Alexis <menard@kde.org>
+ SPDX-FileCopyrightText: 2010 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "kquickcontrolsaddonsplugin.h"
+#include "config-kquickcontrolsaddons.h"
+
+#include "clipboard.h"
+#include "columnproxymodel.h"
+#include "eventgenerator.h"
+#include "fallbacktaphandler.h"
+#include "icondialog.h"
+#include "kcmshell.h"
+#include "mimedatabase.h"
+#include "mouseeventlistener.h"
+#include "qiconitem.h"
+#include "qimageitem.h"
+#include "qpixmapitem.h"
+
+#if HAVE_EPOXY
+#include "plotter.h"
+#endif
+
+static QObject *kcmshell_singleton_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
+{
+ Q_UNUSED(engine);
+ Q_UNUSED(scriptEngine);
+
+ return new KCMShell();
+}
+
+void KQuickControlsAddonsPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kquickcontrolsaddons"));
+
+ qmlRegisterType<QPixmapItem>(uri, 2, 0, "QPixmapItem");
+ qmlRegisterType<QImageItem>(uri, 2, 0, "QImageItem");
+ qmlRegisterType<QIconItem>(uri, 2, 0, "QIconItem");
+ qmlRegisterType<MouseEventListener>(uri, 2, 0, "MouseEventListener");
+ qmlRegisterType<ColumnProxyModel>(uri, 2, 0, "ColumnProxyModel");
+ qmlRegisterType<Clipboard>(uri, 2, 0, "Clipboard");
+ qmlRegisterType<MimeDatabase>(uri, 2, 0, "MimeDatabase");
+ qmlRegisterSingletonType<KCMShell>(uri, 2, 0, "KCMShell", kcmshell_singleton_provider);
+ qmlRegisterType<IconDialog>(uri, 2, 0, "IconDialog");
+ qmlRegisterType<EventGenerator>(uri, 2, 0, "EventGenerator");
+ qmlRegisterUncreatableType<FallbackTapHandlerMouseEvent>(uri,
+ 2,
+ 1,
+ "FallbackTapHandlerMouseEvent",
+ QStringLiteral("Cannot create items of type FallbackTapHandlerMouseEvent"));
+ qmlRegisterType<FallbackTapHandler>(uri, 2, 1, "FallbackTapHandler");
+
+#if HAVE_EPOXY
+ qmlRegisterType<PlotData>(uri, 2, 0, "PlotData");
+ qmlRegisterType<Plotter>(uri, 2, 0, "Plotter");
+#endif
+ qmlRegisterAnonymousType<QAbstractItemModel>(uri, 1);
+ qRegisterMetaType<QModelIndex>("QModelIndex");
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2009 Alan Alpert <alan.alpert@nokia.com>
+ SPDX-FileCopyrightText: 2010 Ménard Alexis <menard@kde.org>
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KQUICKCONTROLSADDONSPLUGIN_H
+#define KQUICKCONTROLSADDONSPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+#include <QScreen>
+
+class KQuickControlsAddonsPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "mimedatabase.h"
+#include <QDebug>
+#include <QJsonObject>
+
+static QJsonObject mimetypeToJsonObject(const QMimeType &type)
+{
+ if (!type.isValid()) {
+ qWarning() << "trying to export an invalid type";
+ return QJsonObject();
+ }
+ QJsonObject ret;
+ ret[QStringLiteral("name")] = type.name();
+ ret[QStringLiteral("iconName")] = type.iconName();
+ ret[QStringLiteral("comment")] = type.comment();
+ return ret;
+}
+
+MimeDatabase::MimeDatabase(QObject *parent)
+ : QObject(parent)
+{
+}
+
+QJsonObject MimeDatabase::mimeTypeForUrl(const QUrl &url) const
+{
+ return mimetypeToJsonObject(m_db.mimeTypeForUrl(url));
+}
+
+QJsonObject MimeDatabase::mimeTypeForName(const QString &name) const
+{
+ QMimeType type = m_db.mimeTypeForName(name);
+ if (!type.isValid()) {
+ qWarning() << "wrong mime name" << name;
+ return QJsonObject();
+ }
+ return mimetypeToJsonObject(type);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef MIMEDATABASE_H
+#define MIMEDATABASE_H
+
+#include <QMimeDatabase>
+#include <QObject>
+
+class MimeDatabase : public QObject
+{
+ Q_OBJECT
+public:
+ MimeDatabase(QObject *parent = nullptr);
+
+ Q_SCRIPTABLE QJsonObject mimeTypeForUrl(const QUrl &url) const;
+ Q_SCRIPTABLE QJsonObject mimeTypeForName(const QString &name) const;
+
+private:
+ QMimeDatabase m_db;
+};
+
+#endif // MIMEDATABASE_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <notmart@gmail.com>
+ SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "mouseeventlistener.h"
+
+#include <QDebug>
+#include <QEvent>
+#include <QGuiApplication>
+#include <QMouseEvent>
+#include <QQuickWindow>
+#include <QScreen>
+#include <QStyleHints>
+#include <QTimer>
+
+MouseEventListener::MouseEventListener(QQuickItem *parent)
+ : QQuickItem(parent)
+ , m_pressed(false)
+ , m_pressAndHoldEvent(nullptr)
+ , m_lastEvent(nullptr)
+ , m_containsMouse(false)
+ , m_acceptedButtons(Qt::LeftButton)
+{
+ m_pressAndHoldTimer = new QTimer(this);
+ m_pressAndHoldTimer->setSingleShot(true);
+ connect(m_pressAndHoldTimer, SIGNAL(timeout()), this, SLOT(handlePressAndHold()));
+ qmlRegisterAnonymousType<KDeclarativeMouseEvent>("org.kde.kquickcontrolsaddons", 1);
+ qmlRegisterAnonymousType<KDeclarativeWheelEvent>("org.kde.kquickcontrolsaddons", 1);
+
+ setFiltersChildMouseEvents(true);
+ setAcceptedMouseButtons(Qt::LeftButton | Qt::RightButton | Qt::MiddleButton | Qt::XButton1 | Qt::XButton2);
+}
+
+MouseEventListener::~MouseEventListener()
+{
+}
+
+Qt::MouseButtons MouseEventListener::acceptedButtons() const
+{
+ return m_acceptedButtons;
+}
+
+Qt::CursorShape MouseEventListener::cursorShape() const
+{
+ return cursor().shape();
+}
+
+void MouseEventListener::setCursorShape(Qt::CursorShape shape)
+{
+ if (cursor().shape() == shape) {
+ return;
+ }
+
+ setCursor(shape);
+
+ Q_EMIT cursorShapeChanged();
+}
+
+void MouseEventListener::setAcceptedButtons(Qt::MouseButtons buttons)
+{
+ if (buttons == m_acceptedButtons) {
+ return;
+ }
+
+ m_acceptedButtons = buttons;
+ Q_EMIT acceptedButtonsChanged();
+}
+
+void MouseEventListener::setHoverEnabled(bool enable)
+{
+ if (enable == acceptHoverEvents()) {
+ return;
+ }
+
+ setAcceptHoverEvents(enable);
+ Q_EMIT hoverEnabledChanged(enable);
+}
+
+bool MouseEventListener::hoverEnabled() const
+{
+ return acceptHoverEvents();
+}
+
+bool MouseEventListener::isPressed() const
+{
+ return m_pressed;
+}
+
+void MouseEventListener::hoverEnterEvent(QHoverEvent *event)
+{
+ Q_UNUSED(event);
+
+ m_containsMouse = true;
+ Q_EMIT containsMouseChanged(true);
+}
+
+void MouseEventListener::hoverLeaveEvent(QHoverEvent *event)
+{
+ Q_UNUSED(event);
+
+ m_containsMouse = false;
+ Q_EMIT containsMouseChanged(false);
+}
+
+void MouseEventListener::hoverMoveEvent(QHoverEvent *event)
+{
+ if (m_lastEvent == event) {
+ return;
+ }
+
+ QQuickWindow *w = window();
+ QPoint screenPos;
+ if (w) {
+ screenPos = w->mapToGlobal(event->pos());
+ }
+
+ KDeclarativeMouseEvent dme(event->pos().x(),
+ event->pos().y(),
+ screenPos.x(),
+ screenPos.y(),
+ Qt::NoButton,
+ Qt::NoButton,
+ event->modifiers(),
+ nullptr,
+ Qt::MouseEventNotSynthesized);
+ Q_EMIT positionChanged(&dme);
+}
+
+bool MouseEventListener::containsMouse() const
+{
+ return m_containsMouse;
+}
+
+void MouseEventListener::mousePressEvent(QMouseEvent *me)
+{
+ if (m_lastEvent == me || !(me->buttons() & m_acceptedButtons)) {
+ me->setAccepted(false);
+ return;
+ }
+
+ // FIXME: when a popup window is visible: a click anywhere hides it: but the old qquickitem will continue to think it's under the mouse
+ // doesn't seem to be any good way to properly reset this.
+ // this msolution will still caused a missed click after the popup is gone, but gets the situation unblocked.
+ QPoint viewPosition;
+ if (window()) {
+ viewPosition = window()->position();
+ }
+
+ if (!QRectF(mapToScene(QPoint(0, 0)) + viewPosition, QSizeF(width(), height())).contains(me->screenPos())) {
+ me->ignore();
+ return;
+ }
+ m_buttonDownPos = me->screenPos();
+
+ KDeclarativeMouseEvent dme(me->pos().x(),
+ me->pos().y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ if (!m_pressAndHoldEvent) {
+ m_pressAndHoldEvent = new KDeclarativeMouseEvent(me->pos().x(),
+ me->pos().y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ }
+
+ m_pressed = true;
+ Q_EMIT pressed(&dme);
+ Q_EMIT pressedChanged();
+
+ if (dme.isAccepted()) {
+ me->setAccepted(true);
+ return;
+ }
+
+ m_pressAndHoldTimer->start(QGuiApplication::styleHints()->mousePressAndHoldInterval());
+}
+
+void MouseEventListener::mouseMoveEvent(QMouseEvent *me)
+{
+ if (m_lastEvent == me || !(me->buttons() & m_acceptedButtons)) {
+ me->setAccepted(false);
+ return;
+ }
+
+ if (QPointF(me->screenPos() - m_buttonDownPos).manhattanLength() > QGuiApplication::styleHints()->startDragDistance() && m_pressAndHoldTimer->isActive()) {
+ m_pressAndHoldTimer->stop();
+ }
+
+ KDeclarativeMouseEvent dme(me->pos().x(),
+ me->pos().y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ Q_EMIT positionChanged(&dme);
+
+ if (dme.isAccepted()) {
+ me->setAccepted(true);
+ }
+}
+
+void MouseEventListener::mouseReleaseEvent(QMouseEvent *me)
+{
+ if (m_lastEvent == me) {
+ me->setAccepted(false);
+ return;
+ }
+
+ KDeclarativeMouseEvent dme(me->pos().x(),
+ me->pos().y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ m_pressed = false;
+ Q_EMIT released(&dme);
+ Q_EMIT pressedChanged();
+
+ if (boundingRect().contains(me->pos()) && m_pressAndHoldTimer->isActive()) {
+ Q_EMIT clicked(&dme);
+ m_pressAndHoldTimer->stop();
+ }
+
+ if (dme.isAccepted()) {
+ me->setAccepted(true);
+ }
+}
+
+void MouseEventListener::wheelEvent(QWheelEvent *we)
+{
+ if (m_lastEvent == we) {
+ return;
+ }
+
+ KDeclarativeWheelEvent dwe(we->position().toPoint(),
+ we->globalPosition().toPoint(),
+ we->angleDelta(),
+ we->buttons(),
+ we->modifiers(),
+ Qt::Vertical /* HACK, deprecated, remove */);
+ Q_EMIT wheelMoved(&dwe);
+}
+
+void MouseEventListener::handlePressAndHold()
+{
+ if (m_pressed) {
+ Q_EMIT pressAndHold(m_pressAndHoldEvent);
+
+ delete m_pressAndHoldEvent;
+ m_pressAndHoldEvent = nullptr;
+ }
+}
+
+bool MouseEventListener::childMouseEventFilter(QQuickItem *item, QEvent *event)
+{
+ if (!isEnabled()) {
+ return false;
+ }
+
+ // don't filter other mouseeventlisteners
+ if (qobject_cast<MouseEventListener *>(item)) {
+ return false;
+ }
+
+ switch (event->type()) {
+ case QEvent::MouseButtonPress: {
+ m_lastEvent = event;
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+
+ if (!(me->buttons() & m_acceptedButtons)) {
+ break;
+ }
+
+ // the parent will receive events in its own coordinates
+ const QPointF myPos = mapFromScene(me->windowPos());
+
+ KDeclarativeMouseEvent dme(myPos.x(),
+ myPos.y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ delete m_pressAndHoldEvent;
+ m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(),
+ myPos.y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+
+ // qDebug() << "pressed in sceneEventFilter";
+ m_buttonDownPos = me->screenPos();
+ m_pressed = true;
+ Q_EMIT pressed(&dme);
+ Q_EMIT pressedChanged();
+
+ if (dme.isAccepted()) {
+ return true;
+ }
+
+ m_pressAndHoldTimer->start(QGuiApplication::styleHints()->mousePressAndHoldInterval());
+
+ break;
+ }
+ case QEvent::HoverMove: {
+ if (!acceptHoverEvents()) {
+ break;
+ }
+ m_lastEvent = event;
+ QHoverEvent *he = static_cast<QHoverEvent *>(event);
+ const QPointF myPos = item->mapToItem(this, he->pos());
+
+ QQuickWindow *w = window();
+ QPoint screenPos;
+ if (w) {
+ screenPos = w->mapToGlobal(myPos.toPoint());
+ }
+
+ KDeclarativeMouseEvent
+ dme(myPos.x(), myPos.y(), screenPos.x(), screenPos.y(), Qt::NoButton, Qt::NoButton, he->modifiers(), nullptr, Qt::MouseEventNotSynthesized);
+ // qDebug() << "positionChanged..." << dme.x() << dme.y();
+ Q_EMIT positionChanged(&dme);
+
+ if (dme.isAccepted()) {
+ return true;
+ }
+ break;
+ }
+ case QEvent::MouseMove: {
+ m_lastEvent = event;
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+ if (!(me->buttons() & m_acceptedButtons)) {
+ break;
+ }
+
+ const QPointF myPos = mapFromScene(me->windowPos());
+ KDeclarativeMouseEvent dme(myPos.x(),
+ myPos.y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ // qDebug() << "positionChanged..." << dme.x() << dme.y();
+
+ // stop the pressandhold if mouse moved enough
+ if (QPointF(me->screenPos() - m_buttonDownPos).manhattanLength() > QGuiApplication::styleHints()->startDragDistance()
+ && m_pressAndHoldTimer->isActive()) {
+ m_pressAndHoldTimer->stop();
+
+ // if the mouse moves and we are waiting to emit a press and hold event, update the coordinates
+ // as there is no update function, delete the old event and create a new one
+ } else if (m_pressAndHoldEvent) {
+ delete m_pressAndHoldEvent;
+ m_pressAndHoldEvent = new KDeclarativeMouseEvent(myPos.x(),
+ myPos.y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ }
+ Q_EMIT positionChanged(&dme);
+
+ if (dme.isAccepted()) {
+ return true;
+ }
+ break;
+ }
+ case QEvent::MouseButtonRelease: {
+ m_lastEvent = event;
+ QMouseEvent *me = static_cast<QMouseEvent *>(event);
+
+ const QPointF myPos = mapFromScene(me->windowPos());
+ KDeclarativeMouseEvent dme(myPos.x(),
+ myPos.y(),
+ me->screenPos().x(),
+ me->screenPos().y(),
+ me->button(),
+ me->buttons(),
+ me->modifiers(),
+ screenForGlobalPos(me->globalPos()),
+ me->source());
+ m_pressed = false;
+
+ Q_EMIT released(&dme);
+ Q_EMIT pressedChanged();
+
+ if (QPointF(me->screenPos() - m_buttonDownPos).manhattanLength() <= QGuiApplication::styleHints()->startDragDistance()
+ && m_pressAndHoldTimer->isActive()) {
+ Q_EMIT clicked(&dme);
+ m_pressAndHoldTimer->stop();
+ }
+
+ if (dme.isAccepted()) {
+ return true;
+ }
+ break;
+ }
+ case QEvent::UngrabMouse: {
+ m_lastEvent = event;
+ handleUngrab();
+ break;
+ }
+ case QEvent::Wheel: {
+ m_lastEvent = event;
+ QWheelEvent *we = static_cast<QWheelEvent *>(event);
+ KDeclarativeWheelEvent dwe(we->position().toPoint(),
+ we->globalPosition().toPoint(),
+ we->angleDelta(),
+ we->buttons(),
+ we->modifiers(),
+ Qt::Vertical /* HACK, deprecated, remove */);
+ Q_EMIT wheelMoved(&dwe);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return QQuickItem::childMouseEventFilter(item, event);
+ // return false;
+}
+
+QScreen *MouseEventListener::screenForGlobalPos(const QPoint &globalPos)
+{
+ const auto screens = QGuiApplication::screens();
+ for (QScreen *screen : screens) {
+ if (screen->geometry().contains(globalPos)) {
+ return screen;
+ }
+ }
+ return nullptr;
+}
+
+void MouseEventListener::mouseUngrabEvent()
+{
+ handleUngrab();
+
+ QQuickItem::mouseUngrabEvent();
+}
+
+void MouseEventListener::touchUngrabEvent()
+{
+ handleUngrab();
+
+ QQuickItem::touchUngrabEvent();
+}
+
+void MouseEventListener::handleUngrab()
+{
+ if (m_pressed) {
+ m_pressAndHoldTimer->stop();
+
+ m_pressed = false;
+ Q_EMIT pressedChanged();
+
+ Q_EMIT canceled();
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <notmart@gmail.com>
+ SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef MOUSEEVENTLISTENER_H
+#define MOUSEEVENTLISTENER_H
+
+#include <QQuickItem>
+
+/**
+ * This item spies on mouse events from all child objects including child MouseAreas regardless
+ * of whether the child MouseArea propagates events. It does not accept the event.
+ *
+ * In addition unlike MouseArea events include the mouse position in global coordinates and provides
+ * the screen the mouse is in.
+ */
+
+class KDeclarativeMouseEvent : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int x READ x)
+ Q_PROPERTY(int y READ y)
+ Q_PROPERTY(int screenX READ screenX)
+ Q_PROPERTY(int screenY READ screenY)
+ Q_PROPERTY(int button READ button)
+ Q_PROPERTY(Qt::MouseButtons buttons READ buttons)
+ Q_PROPERTY(Qt::KeyboardModifiers modifiers READ modifiers)
+ Q_PROPERTY(QScreen *screen READ screen CONSTANT)
+ Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted NOTIFY acceptedChanged)
+ Q_PROPERTY(int source READ source)
+
+public:
+ KDeclarativeMouseEvent(int x,
+ int y,
+ int screenX,
+ int screenY,
+ Qt::MouseButton button,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers,
+ QScreen *screen,
+ Qt::MouseEventSource source)
+ : m_x(x)
+ , m_y(y)
+ , m_screenX(screenX)
+ , m_screenY(screenY)
+ , m_button(button)
+ , m_buttons(buttons)
+ , m_modifiers(modifiers)
+ , m_screen(screen)
+ , m_source(source)
+ {
+ }
+
+ int x() const
+ {
+ return m_x;
+ }
+ int y() const
+ {
+ return m_y;
+ }
+ int screenX() const
+ {
+ return m_screenX;
+ }
+ int screenY() const
+ {
+ return m_screenY;
+ }
+ int button() const
+ {
+ return m_button;
+ }
+ Qt::MouseButtons buttons() const
+ {
+ return m_buttons;
+ }
+ Qt::KeyboardModifiers modifiers() const
+ {
+ return m_modifiers;
+ }
+ QScreen *screen() const
+ {
+ return m_screen;
+ }
+ int source() const
+ {
+ return m_source;
+ }
+
+ bool isAccepted() const
+ {
+ return m_accepted;
+ }
+ void setAccepted(bool accepted)
+ {
+ if (m_accepted != accepted) {
+ m_accepted = accepted;
+ Q_EMIT acceptedChanged();
+ }
+ }
+
+ // only for internal usage
+ void setX(int x)
+ {
+ m_x = x;
+ }
+ void setY(int y)
+ {
+ m_y = y;
+ }
+
+Q_SIGNALS:
+ void acceptedChanged();
+
+private:
+ int m_x;
+ int m_y;
+ int m_screenX;
+ int m_screenY;
+ Qt::MouseButton m_button;
+ Qt::MouseButtons m_buttons;
+ Qt::KeyboardModifiers m_modifiers;
+ QScreen *m_screen;
+ bool m_accepted = false;
+ int m_source;
+};
+
+class KDeclarativeWheelEvent : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int x READ x CONSTANT)
+ Q_PROPERTY(int y READ y CONSTANT)
+ Q_PROPERTY(int screenX READ screenX CONSTANT)
+ Q_PROPERTY(int screenY READ screenY CONSTANT)
+ Q_PROPERTY(int deltaX READ deltaX CONSTANT)
+ Q_PROPERTY(int deltaY READ deltaY CONSTANT)
+ Q_PROPERTY(int delta READ deltaY CONSTANT) // deprecated in favor of deltaY. TODO KF6: remove
+ Q_PROPERTY(Qt::MouseButtons buttons READ buttons CONSTANT)
+ Q_PROPERTY(Qt::KeyboardModifiers modifiers READ modifiers CONSTANT)
+ Q_PROPERTY(Qt::Orientation orientation READ orientation CONSTANT) // deprecated. TODO KF6: remove
+
+public:
+ KDeclarativeWheelEvent(QPointF pos,
+ QPoint screenPos,
+ QPoint angleDelta,
+ Qt::MouseButtons buttons,
+ Qt::KeyboardModifiers modifiers,
+ Qt::Orientation orientation)
+ : m_x(pos.x())
+ , m_y(pos.y())
+ , m_screenX(screenPos.x())
+ , m_screenY(screenPos.y())
+ , m_angleDelta(angleDelta)
+ , m_buttons(buttons)
+ , m_modifiers(modifiers)
+ , m_orientation(orientation)
+ {
+ }
+
+ int x() const
+ {
+ return m_x;
+ }
+ int y() const
+ {
+ return m_y;
+ }
+ int screenX() const
+ {
+ return m_screenX;
+ }
+ int screenY() const
+ {
+ return m_screenY;
+ }
+ int deltaX() const
+ {
+ return m_angleDelta.x();
+ }
+ int deltaY() const
+ {
+ return m_angleDelta.y();
+ }
+ Qt::MouseButtons buttons() const
+ {
+ return m_buttons;
+ }
+ Qt::KeyboardModifiers modifiers() const
+ {
+ return m_modifiers;
+ }
+ Qt::Orientation orientation()
+ {
+ return m_orientation;
+ } // TODO KF6: remove
+
+ // only for internal usage
+ void setX(int x)
+ {
+ m_x = x;
+ }
+ void setY(int y)
+ {
+ m_y = y;
+ }
+
+private:
+ int m_x;
+ int m_y;
+ int m_screenX;
+ int m_screenY;
+ QPoint m_angleDelta;
+ Qt::MouseButtons m_buttons;
+ Qt::KeyboardModifiers m_modifiers;
+ Qt::Orientation m_orientation;
+};
+
+class MouseEventListener : public QQuickItem
+{
+ Q_OBJECT
+ /**
+ * This property holds whether hover events are handled.
+ * By default hover events are disabled
+ */
+ Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)
+
+ /**
+ * True if this MouseEventListener or any of its children contains the mouse cursor:
+ * this property will change only when the mouse button is pressed if hoverEnabled is false.
+ */
+ Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)
+
+ Q_PROPERTY(Qt::MouseButtons acceptedButtons READ acceptedButtons WRITE setAcceptedButtons NOTIFY acceptedButtonsChanged)
+
+ /**
+ * This property holds the cursor shape for this mouse area.
+ * Note that on platforms that do not display a mouse cursor this may have no effect.
+ */
+ Q_PROPERTY(Qt::CursorShape cursorShape READ cursorShape WRITE setCursorShape RESET unsetCursor NOTIFY cursorShapeChanged)
+
+ /**
+ * True if the mouse is pressed in the item or any of its children
+ */
+ Q_PROPERTY(bool pressed READ isPressed NOTIFY pressedChanged)
+
+public:
+ MouseEventListener(QQuickItem *parent = nullptr);
+ ~MouseEventListener() override;
+
+ bool containsMouse() const;
+ void setHoverEnabled(bool enable);
+ bool hoverEnabled() const;
+ bool isPressed() const;
+
+ Qt::MouseButtons acceptedButtons() const;
+ void setAcceptedButtons(Qt::MouseButtons buttons);
+
+ Qt::CursorShape cursorShape() const;
+ void setCursorShape(Qt::CursorShape shape);
+
+protected:
+ void hoverEnterEvent(QHoverEvent *event) override;
+ void hoverLeaveEvent(QHoverEvent *event) override;
+ void hoverMoveEvent(QHoverEvent *event) override;
+ void mousePressEvent(QMouseEvent *event) override;
+ void mouseMoveEvent(QMouseEvent *event) override;
+ void mouseReleaseEvent(QMouseEvent *event) override;
+ void wheelEvent(QWheelEvent *event) override;
+ bool childMouseEventFilter(QQuickItem *item, QEvent *event) override;
+ void mouseUngrabEvent() override;
+ void touchUngrabEvent() override;
+
+Q_SIGNALS:
+ void pressed(KDeclarativeMouseEvent *mouse);
+ void positionChanged(KDeclarativeMouseEvent *mouse);
+ void released(KDeclarativeMouseEvent *mouse);
+ void clicked(KDeclarativeMouseEvent *mouse);
+ void pressAndHold(KDeclarativeMouseEvent *mouse);
+ void wheelMoved(KDeclarativeWheelEvent *wheel);
+ void containsMouseChanged(bool containsMouseChanged);
+ void hoverEnabledChanged(bool hoverEnabled);
+ void acceptedButtonsChanged();
+ void cursorShapeChanged();
+ void pressedChanged();
+ void canceled();
+
+private Q_SLOTS:
+ void handlePressAndHold();
+ void handleUngrab();
+
+private:
+ static QScreen *screenForGlobalPos(const QPoint &globalPos);
+
+ bool m_pressed;
+ KDeclarativeMouseEvent *m_pressAndHoldEvent;
+ QPointF m_buttonDownPos;
+ // Important: used only for comparison. If you will ever need to access this pointer, make it a QWeakPointer
+ QEvent *m_lastEvent;
+ QTimer *m_pressAndHoldTimer;
+ bool m_containsMouse;
+ Qt::MouseButtons m_acceptedButtons;
+};
+
+#endif
--- /dev/null
+/*
+ This file is part of the KDE project
+
+ SPDX-FileCopyrightText: 2014 Fredrik Höglund <fredrik@kde.org>
+ SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2015 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "plotter.h"
+
+#include <QOpenGLContext>
+#include <QOpenGLShaderProgram>
+
+#include <QPainterPath>
+#include <QPolygonF>
+
+#include <QMatrix4x4>
+#include <QVector2D>
+
+#include <QSGSimpleTextureNode>
+#include <QSGTexture>
+
+#include <QDebug>
+
+#include <math.h>
+
+// completely arbitrary
+static int s_defaultSampleSize = 40;
+
+PlotData::PlotData(QObject *parent)
+ : QObject(parent)
+ , m_min(std::numeric_limits<qreal>::max())
+ , m_max(std::numeric_limits<qreal>::min())
+ , m_sampleSize(s_defaultSampleSize)
+{
+ m_values.reserve(s_defaultSampleSize);
+ for (int i = 0; i < s_defaultSampleSize; ++i) {
+ m_values << 0.0;
+ }
+}
+
+void PlotData::setColor(const QColor &color)
+{
+ if (m_color == color) {
+ return;
+ }
+
+ m_color = color;
+
+ Q_EMIT colorChanged();
+}
+
+QColor PlotData::color() const
+{
+ return m_color;
+}
+
+qreal PlotData::max() const
+{
+ return m_max;
+}
+
+qreal PlotData::min() const
+{
+ return m_min;
+}
+
+void PlotData::setSampleSize(int size)
+{
+ if (m_sampleSize == size) {
+ return;
+ }
+
+ m_values.reserve(size);
+ if (m_values.size() > size) {
+ const int numberToRemove = (m_values.size() - size);
+ for (int i = 0; i < numberToRemove; ++i) {
+ m_values.removeFirst();
+ }
+ } else if (m_values.size() < size) {
+ const int numberToAdd = (size - m_values.size());
+ for (int i = 0; i < numberToAdd; ++i) {
+ m_values.prepend(0.0);
+ }
+ }
+
+ m_sampleSize = size;
+}
+
+QString PlotData::label() const
+{
+ return m_label;
+}
+
+void PlotData::setLabel(const QString &label)
+{
+ if (m_label == label) {
+ return;
+ }
+
+ m_label = label;
+ Q_EMIT labelChanged();
+}
+
+void PlotData::addSample(qreal value)
+{
+ // assume at this point we'll have to pop a single time to stay in size
+ if (m_values.size() >= m_sampleSize) {
+ m_values.removeFirst();
+ }
+
+ m_values.push_back(value);
+
+ m_max = std::numeric_limits<qreal>::min();
+ m_min = std::numeric_limits<qreal>::max();
+ for (auto v : std::as_const(m_values)) {
+ if (v > m_max) {
+ m_max = v;
+ } else if (v < m_min) {
+ m_min = v;
+ }
+ }
+
+ Q_EMIT valuesChanged();
+}
+
+QList<qreal> PlotData::values() const
+{
+ return m_values;
+}
+
+const char *vs_source =
+ "attribute vec4 vertex;\n"
+ "varying float gradient;\n"
+
+ "uniform mat4 matrix;\n"
+ "uniform float yMin;\n"
+ "uniform float yMax;\n"
+
+ "void main(void) {\n"
+ " gradient = (vertex.y - yMin) / (yMax - yMin);"
+ " gl_Position = matrix * vertex;\n"
+ "}";
+
+const char *fs_source =
+ "uniform vec4 color1;\n"
+ "uniform vec4 color2;\n"
+
+ "varying float gradient;\n"
+
+ "void main(void) {\n"
+ " gl_FragColor = mix(color1, color2, gradient);\n"
+ "}";
+
+// --------------------------------------------------
+
+class PlotTexture : public QSGTexture
+{
+public:
+ PlotTexture(QOpenGLContext *ctx);
+ ~PlotTexture() override;
+
+ void bind() override final;
+ bool hasAlphaChannel() const override final
+ {
+ return true;
+ }
+ bool hasMipmaps() const override final
+ {
+ return false;
+ }
+ int textureId() const override final
+ {
+ return m_texture;
+ }
+ QSize textureSize() const override final
+ {
+ return m_size;
+ }
+
+ void recreate(const QSize &size);
+ GLuint fbo() const
+ {
+ return m_fbo;
+ }
+
+private:
+ GLuint m_texture = 0;
+ GLuint m_fbo = 0;
+ GLenum m_internalFormat;
+ bool m_haveTexStorage;
+ QSize m_size;
+};
+
+PlotTexture::PlotTexture(QOpenGLContext *ctx)
+ : QSGTexture()
+{
+ QPair<int, int> version = ctx->format().version();
+
+ if (ctx->isOpenGLES()) {
+ m_haveTexStorage = version >= qMakePair(3, 0) || ctx->hasExtension("GL_EXT_texture_storage");
+ m_internalFormat = m_haveTexStorage ? GL_RGBA8 : GL_RGBA;
+ } else {
+ m_haveTexStorage = version >= qMakePair(4, 2) || ctx->hasExtension("GL_ARB_texture_storage");
+ m_internalFormat = GL_RGBA8;
+ }
+
+ glGenFramebuffers(1, &m_fbo);
+}
+
+PlotTexture::~PlotTexture()
+{
+ if (m_texture) {
+ glDeleteTextures(1, &m_texture);
+ }
+
+ glDeleteFramebuffers(1, &m_fbo);
+}
+
+void PlotTexture::bind()
+{
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+}
+
+void PlotTexture::recreate(const QSize &size)
+{
+ if (m_texture) {
+ glDeleteTextures(1, &m_texture);
+ }
+
+ glGenTextures(1, &m_texture);
+ glBindTexture(GL_TEXTURE_2D, m_texture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
+
+ if (m_haveTexStorage) {
+ glTexStorage2D(GL_TEXTURE_2D, 1, m_internalFormat, size.width(), size.height());
+ } else {
+ glTexImage2D(GL_TEXTURE_2D, 0, m_internalFormat, size.width(), size.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+ }
+
+ glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture, 0);
+
+ m_size = size;
+}
+
+class PlotSGNode : public QSGSimpleTextureNode
+{
+public:
+ PlotSGNode();
+ void bind()
+ {
+ m_program->bind();
+ }
+ void setMatrix(const QMatrix4x4 &matrix)
+ {
+ m_program->setUniformValue(u_matrix, matrix);
+ }
+ void setColor1(const QColor &color)
+ {
+ m_program->setUniformValue(u_color1, color);
+ }
+ void setColor2(const QColor &color)
+ {
+ m_program->setUniformValue(u_color2, color);
+ }
+ void setYMin(float min)
+ {
+ m_program->setUniformValue(u_yMin, min);
+ }
+ void setYMax(float max)
+ {
+ m_program->setUniformValue(u_yMax, max);
+ }
+ ~PlotSGNode() = default;
+private:
+ QScopedPointer<QOpenGLShaderProgram> m_program;
+ int u_matrix;
+ int u_color1;
+ int u_color2;
+ int u_yMin;
+ int u_yMax;
+};
+
+PlotSGNode::PlotSGNode()
+ : m_program(new QOpenGLShaderProgram)
+{
+ setOwnsTexture(true);
+ m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vs_source);
+ m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fs_source);
+ m_program->bindAttributeLocation("vertex", 0);
+ m_program->link();
+
+ u_yMin = m_program->uniformLocation("yMin");
+ u_yMax = m_program->uniformLocation("yMax");
+ u_color1 = m_program->uniformLocation("color1");
+ u_color2 = m_program->uniformLocation("color2");
+ u_matrix = m_program->uniformLocation("matrix");
+}
+
+// ----------------------
+
+Plotter::Plotter(QQuickItem *parent)
+ : QQuickItem(parent)
+ , m_min(0)
+ , m_max(0)
+ , m_rangeMax(0)
+ , m_rangeMin(0)
+ , m_sampleSize(s_defaultSampleSize)
+ , m_horizontalLineCount(5)
+ , m_stacked(true)
+ , m_autoRange(true)
+{
+ setFlag(ItemHasContents);
+ connect(this, &Plotter::windowChanged, this, [this]() {
+ if (m_window) {
+ disconnect(m_window.data(), &QQuickWindow::beforeRendering, this, &Plotter::render);
+ }
+ m_window.clear();
+ // when the window changes, the node gets deleted
+ m_node = nullptr;
+ });
+}
+
+Plotter::~Plotter()
+{
+}
+
+qreal Plotter::max() const
+{
+ return m_max;
+}
+
+qreal Plotter::min() const
+{
+ return m_min;
+}
+
+int Plotter::sampleSize() const
+{
+ return m_sampleSize;
+}
+
+void Plotter::setSampleSize(int size)
+{
+ if (m_sampleSize == size) {
+ return;
+ }
+
+ m_sampleSize = size;
+
+ m_mutex.lock();
+ for (auto data : std::as_const(m_plotData)) {
+ data->setSampleSize(size);
+ }
+ m_mutex.unlock();
+
+ update();
+ Q_EMIT sampleSizeChanged();
+}
+
+bool Plotter::isStacked() const
+{
+ return m_stacked;
+}
+
+void Plotter::setStacked(bool stacked)
+{
+ if (m_stacked == stacked) {
+ return;
+ }
+
+ m_stacked = stacked;
+
+ Q_EMIT stackedChanged();
+ update();
+}
+
+bool Plotter::isAutoRange() const
+{
+ return m_autoRange;
+}
+
+void Plotter::setAutoRange(bool autoRange)
+{
+ if (m_autoRange == autoRange) {
+ return;
+ }
+
+ m_autoRange = autoRange;
+
+ Q_EMIT autoRangeChanged();
+ normalizeData();
+ update();
+}
+
+qreal Plotter::rangeMax() const
+{
+ if (m_autoRange) {
+ return m_max;
+ } else {
+ return m_rangeMax;
+ }
+}
+
+void Plotter::setRangeMax(qreal max)
+{
+ if (m_rangeMax == max) {
+ return;
+ }
+
+ m_rangeMax = max;
+
+ Q_EMIT rangeMaxChanged();
+ normalizeData();
+ update();
+}
+
+qreal Plotter::rangeMin() const
+{
+ if (m_autoRange) {
+ return m_min;
+ } else {
+ return m_rangeMin;
+ }
+}
+
+void Plotter::setRangeMin(qreal min)
+{
+ if (m_rangeMin == min) {
+ return;
+ }
+
+ m_rangeMin = min;
+
+ Q_EMIT rangeMinChanged();
+ normalizeData();
+ update();
+}
+
+void Plotter::setGridColor(const QColor &color)
+{
+ if (m_gridColor == color) {
+ return;
+ }
+
+ m_gridColor = color;
+
+ Q_EMIT gridColorChanged();
+}
+
+QColor Plotter::gridColor() const
+{
+ return m_gridColor;
+}
+
+int Plotter::horizontalGridLineCount()
+{
+ return m_horizontalLineCount;
+}
+
+void Plotter::setHorizontalGridLineCount(int count)
+{
+ if (m_horizontalLineCount == count) {
+ return;
+ }
+
+ m_horizontalLineCount = count;
+ Q_EMIT horizontalGridLineCountChanged();
+}
+
+void Plotter::addSample(qreal value)
+{
+ if (m_plotData.count() != 1) {
+ qWarning() << "Must add a new value per data set, pass an array of values instead";
+ return;
+ }
+
+ addSample(QList<qreal>() << value);
+}
+
+void Plotter::addSample(const QList<qreal> &value)
+{
+ if (value.count() != m_plotData.count()) {
+ qWarning() << "Must add a new value per data set";
+ return;
+ }
+
+ int i = 0;
+ m_mutex.lock();
+ for (auto data : std::as_const(m_plotData)) {
+ data->addSample(value.value(i));
+ ++i;
+ }
+ m_mutex.unlock();
+
+ normalizeData();
+
+ update();
+}
+
+void Plotter::dataSet_append(QQmlListProperty<PlotData> *list, PlotData *item)
+{
+ // encase all m_plotData access in a mutex, since rendering is usually done in another thread
+ Plotter *p = static_cast<Plotter *>(list->object);
+ p->m_mutex.lock();
+ p->m_plotData.append(item);
+ p->m_mutex.unlock();
+}
+
+int Plotter::dataSet_count(QQmlListProperty<PlotData> *list)
+{
+ Plotter *p = static_cast<Plotter *>(list->object);
+ return p->m_plotData.count();
+}
+
+PlotData *Plotter::dataSet_at(QQmlListProperty<PlotData> *list, int index)
+{
+ Plotter *p = static_cast<Plotter *>(list->object);
+ p->m_mutex.lock();
+ PlotData *d = p->m_plotData.at(index);
+ p->m_mutex.unlock();
+ return d;
+}
+
+void Plotter::dataSet_clear(QQmlListProperty<PlotData> *list)
+{
+ Plotter *p = static_cast<Plotter *>(list->object);
+
+ p->m_mutex.lock();
+ p->m_plotData.clear();
+ p->m_mutex.unlock();
+}
+
+QQmlListProperty<PlotData> Plotter::dataSets()
+{
+ return QQmlListProperty<PlotData>(this, nullptr, Plotter::dataSet_append, Plotter::dataSet_count, Plotter::dataSet_at, Plotter::dataSet_clear);
+}
+
+// Catmull-Rom interpolation
+QPainterPath Plotter::interpolate(const QVector<qreal> &p, qreal x0, qreal x1) const
+{
+ QPainterPath path;
+
+ /* clang-format off */
+ const QMatrix4x4 matrix( 0, 1, 0, 0,
+ -1/6., 1, 1/6., 0,
+ 0, 1/6., 1, -1/6.,
+ 0, 0, 1, 0);
+ /* clang-format on */
+
+ const qreal xDelta = (x1 - x0) / (p.count() - 3);
+ qreal x = x0 - xDelta;
+
+ path.moveTo(x0, p[0]);
+
+ for (int i = 1; i < p.count() - 2; i++) {
+ /* clang-format off */
+ const QMatrix4x4 points(x, p[i-1], 0, 0,
+ x + xDelta * 1, p[i+0], 0, 0,
+ x + xDelta * 2, p[i+1], 0, 0,
+ x + xDelta * 3, p[i+2], 0, 0);
+
+ const QMatrix4x4 res = matrix * points;
+
+ path.cubicTo(res(1, 0), res(1, 1),
+ res(2, 0), res(2, 1),
+ res(3, 0), res(3, 1));
+ /* clang-format on */
+
+ x += xDelta;
+ }
+
+ return path;
+}
+
+void Plotter::render()
+{
+ if (!window() || !m_node || !m_node->texture()) {
+ return;
+ }
+
+ GLuint rb;
+
+ if (m_haveMSAA && m_haveFramebufferBlit) {
+ // Allocate a temporary MSAA renderbuffer
+ glGenRenderbuffers(1, &rb);
+ glBindRenderbuffer(GL_RENDERBUFFER, rb);
+ glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_samples, m_internalFormat, width(), height());
+
+ // Attach it to the framebuffer object
+ glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
+ } else {
+ // If we don't have MSAA support we render directly into the texture
+ glBindFramebuffer(GL_FRAMEBUFFER, static_cast<PlotTexture *>(m_node->texture())->fbo());
+ }
+
+ glViewport(0, 0, width(), height());
+
+ // Clear the color buffer
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ // Add horizontal lines
+ qreal lineSpacing = height() / m_horizontalLineCount;
+
+ QVector<QVector2D> vertices;
+
+ // don't draw the bottom line that will come later
+ for (int i = 0; i < m_horizontalLineCount; i++) {
+ int lineY = ceil(i * lineSpacing) + 1; // floor +1 makes the entry at point 0 on pixel 1
+ vertices << QVector2D(0, lineY) << QVector2D(width(), lineY);
+ }
+ // bottom line
+ vertices << QVector2D(0, height() - 1) << QVector2D(width(), height() - 1);
+
+ // Tessellate
+ float min = height();
+ float max = height();
+
+ QHash<PlotData *, QPair<int, int>> verticesCounts;
+
+ // encase all m_plotData access in a mutex, since rendering is usually done in another thread
+ m_mutex.lock();
+ int roundedHeight = qRound(height());
+ int roundedWidth = qRound(width());
+
+ for (auto data : std::as_const(m_plotData)) {
+ // Interpolate the data set
+ const QPainterPath path = interpolate(data->m_normalizedValues, 0, roundedWidth);
+
+ // Flatten the path
+ const QList<QPolygonF> polygons = path.toSubpathPolygons();
+
+ for (const QPolygonF &p : polygons) {
+ verticesCounts[data].first = 0;
+ vertices << QVector2D(p.first().x(), roundedHeight);
+
+ for (int i = 0; i < p.count() - 1; i++) {
+ min = qMin<float>(min, roundedHeight - p[i].y());
+ vertices << QVector2D(p[i].x(), roundedHeight - p[i].y());
+ vertices << QVector2D((p[i].x() + p[i + 1].x()) / 2.0, roundedHeight);
+ verticesCounts[data].first += 2;
+ }
+
+ min = qMin<float>(min, roundedHeight - p.last().y());
+ vertices << QVector2D(p.last().x(), roundedHeight - p.last().y());
+ vertices << QVector2D(p.last().x(), roundedHeight);
+ verticesCounts[data].first += 3;
+ }
+
+ for (const QPolygonF &p : polygons) {
+ verticesCounts[data].second = 0;
+
+ for (int i = 0; i < p.count() - 1; i++) {
+ min = qMin<float>(min, roundedHeight - p[i].y());
+ vertices << QVector2D(p[i].x(), roundedHeight - p[i].y());
+ verticesCounts[data].second += 1;
+ }
+
+ vertices << QVector2D(p.last().x(), roundedHeight - p.last().y());
+ verticesCounts[data].second += 1;
+ min = qMin<float>(min, roundedHeight - p.last().y());
+ }
+ }
+ m_mutex.unlock();
+
+ // Upload vertices
+ GLuint vbo;
+ glGenBuffers(1, &vbo);
+
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, vertices.count() * sizeof(QVector2D), vertices.constData(), GL_STATIC_DRAW);
+
+ // Set up the array
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(QVector2D), nullptr);
+ glEnableVertexAttribArray(0);
+
+ // Bind the shader program
+ m_node->bind();
+ m_node->setMatrix(m_matrix);
+
+ // Draw the lines
+ QColor color1 = m_gridColor;
+ QColor color2 = m_gridColor;
+ color1.setAlphaF(0.10);
+ color2.setAlphaF(0.40);
+ m_node->setYMin((float)0.0);
+ m_node->setYMax((float)height());
+ m_node->setColor1(color1);
+ m_node->setColor2(color2);
+
+ glDrawArrays(GL_LINES, 0, (m_horizontalLineCount + 1) * 2);
+
+ // Enable alpha blending
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ QPair<int, int> oldCount;
+ m_mutex.lock();
+ for (auto data : std::as_const(m_plotData)) {
+ color2 = data->color();
+ color2.setAlphaF(0.60);
+ // Draw the graph
+ m_node->setYMin(min);
+ m_node->setYMax(max);
+ m_node->setColor1(data->color());
+ m_node->setColor2(color2);
+
+ //+2 is for the bottom line
+ glDrawArrays(GL_TRIANGLE_STRIP, m_horizontalLineCount * 2 + 2 + oldCount.first + oldCount.second, verticesCounts[data].first);
+
+ oldCount.first += verticesCounts[data].first;
+
+ m_node->setColor1(data->color());
+ m_node->setColor2(data->color());
+ glDrawArrays(GL_LINE_STRIP, m_horizontalLineCount * 2 + 2 + oldCount.first + oldCount.second, verticesCounts[data].second);
+
+ oldCount.second += verticesCounts[data].second;
+ }
+ m_mutex.unlock();
+
+ glDisable(GL_BLEND);
+
+ m_node->setColor1(m_gridColor);
+ m_node->setColor2(m_gridColor);
+ glDrawArrays(GL_LINES, vertices.count() - 2, 2);
+
+ if (m_haveMSAA && m_haveFramebufferBlit) {
+ // Resolve the MSAA buffer
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, static_cast<PlotTexture *>(m_node->texture())->fbo());
+ glBlitFramebuffer(0, 0, width(), height(), 0, 0, width(), height(), GL_COLOR_BUFFER_BIT, GL_NEAREST);
+
+ // Delete the render buffer
+ glDeleteRenderbuffers(1, &rb);
+ }
+
+ // Delete the VBO
+ glDeleteBuffers(1, &vbo);
+}
+
+QSGNode *Plotter::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData)
+{
+ Q_UNUSED(updatePaintNodeData)
+ if (!window()->openglContext()) {
+ delete oldNode;
+ return nullptr;
+ }
+
+ PlotSGNode *n = static_cast<PlotSGNode *>(oldNode);
+
+ if (width() == 0 && height() == 0) {
+ delete oldNode;
+ return nullptr;
+ }
+
+ if (!n) {
+ n = new PlotSGNode();
+ n->setTexture(new PlotTexture(window()->openglContext()));
+ n->setFiltering(QSGTexture::Linear);
+
+ m_node = n;
+ if (m_window) {
+ disconnect(m_window.data(), &QQuickWindow::beforeRendering, this, &Plotter::render);
+ }
+ connect(window(), &QQuickWindow::beforeRendering, this, &Plotter::render, Qt::DirectConnection);
+ m_window = window();
+ }
+
+ if (!m_initialized) {
+ glGenFramebuffers(1, &m_fbo);
+
+ QOpenGLContext *ctx = window()->openglContext();
+ QPair<int, int> version = ctx->format().version();
+
+ if (ctx->isOpenGLES()) {
+ m_haveMSAA = version >= qMakePair(3, 0) || ctx->hasExtension("GL_NV_framebuffer_multisample");
+ m_haveFramebufferBlit = version >= qMakePair(3, 0) || ctx->hasExtension("GL_NV_framebuffer_blit");
+ m_haveInternalFormatQuery = version >= qMakePair(3, 0);
+ m_internalFormat = version >= qMakePair(3, 0) ? GL_RGBA8 : GL_RGBA;
+ } else {
+ /* clang-format off */
+ m_haveMSAA = version >= qMakePair(3, 2)
+ || ctx->hasExtension("GL_ARB_framebuffer_object")
+ || ctx->hasExtension("GL_EXT_framebuffer_multisample");
+
+ m_haveFramebufferBlit = version >= qMakePair(3, 0)
+ || ctx->hasExtension("GL_ARB_framebuffer_object")
+ || ctx->hasExtension("GL_EXT_framebuffer_blit");
+ /* clang-format on */
+
+ m_haveInternalFormatQuery = version >= qMakePair(4, 2) || ctx->hasExtension("GL_ARB_internalformat_query");
+ m_internalFormat = GL_RGBA8;
+ }
+
+ // Query the maximum sample count for the internal format
+ if (m_haveInternalFormatQuery) {
+ int count = 0;
+ glGetInternalformativ(GL_RENDERBUFFER, m_internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &count);
+
+ if (count > 0) {
+ QVector<int> samples(count);
+ glGetInternalformativ(GL_RENDERBUFFER, m_internalFormat, GL_SAMPLES, count, samples.data());
+
+ // The samples are returned in descending order. Choose the highest value.
+ m_samples = samples.at(0);
+ } else {
+ m_samples = 0;
+ }
+ } else if (m_haveMSAA) {
+ glGetIntegerv(GL_MAX_SAMPLES, &m_samples);
+ } else {
+ m_samples = 0;
+ }
+
+ m_initialized = true;
+ }
+
+ // we need a size always equal or smaller, size.toSize() won't do
+ const QSize targetTextureSize(qRound(boundingRect().size().width()), qRound(boundingRect().size().height()));
+ if (n->texture()->textureSize() != targetTextureSize) {
+ static_cast<PlotTexture *>(n->texture())->recreate(targetTextureSize);
+ m_matrix = QMatrix4x4();
+ m_matrix.ortho(0, targetTextureSize.width(), 0, targetTextureSize.height(), -1, 1);
+ }
+
+ n->setRect(QRect(QPoint(0, 0), targetTextureSize));
+ return n;
+}
+
+void Plotter::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ QQuickItem::geometryChanged(newGeometry, oldGeometry);
+ normalizeData();
+}
+
+void Plotter::normalizeData()
+{
+ if (m_plotData.isEmpty()) {
+ return;
+ }
+ // normalize data
+ m_max = std::numeric_limits<qreal>::min();
+ m_min = std::numeric_limits<qreal>::max();
+ qreal adjustedMax = m_max;
+ qreal adjustedMin = m_min;
+ m_mutex.lock();
+ if (m_stacked) {
+ PlotData *previousData = nullptr;
+ auto i = m_plotData.constEnd();
+ do {
+ --i;
+ PlotData *data = *i;
+ data->m_normalizedValues.clear();
+ data->m_normalizedValues.resize(data->values().count());
+ if (previousData) {
+ for (int i = 0; i < data->values().count(); ++i) {
+ data->m_normalizedValues[i] = data->values().value(i) + previousData->m_normalizedValues.value(i);
+
+ if (data->m_normalizedValues[i] > adjustedMax) {
+ adjustedMax = data->m_normalizedValues[i];
+ }
+ if (data->m_normalizedValues[i] < adjustedMin) {
+ adjustedMin = data->m_normalizedValues[i];
+ }
+ }
+ } else {
+ data->m_normalizedValues = data->values().toVector();
+ if (data->max() > adjustedMax) {
+ adjustedMax = data->max();
+ }
+ if (data->min() < adjustedMin) {
+ adjustedMin = data->min();
+ }
+ }
+ previousData = data;
+
+ // global max and global min
+ if (data->max() > m_max) {
+ m_max = data->max();
+ }
+ if (data->min() < m_min) {
+ m_min = data->min();
+ }
+ } while (i != m_plotData.constBegin());
+
+ } else {
+ for (auto data : std::as_const(m_plotData)) {
+ data->m_normalizedValues.clear();
+ data->m_normalizedValues = data->values().toVector();
+ // global max and global min
+ if (data->max() > m_max) {
+ adjustedMax = m_max = data->max();
+ }
+ if (data->min() < m_min) {
+ adjustedMin = m_min = data->min();
+ }
+ }
+ }
+ m_mutex.unlock();
+
+ if (adjustedMin > 0.0 && adjustedMax > 0.0) {
+ adjustedMin = 0.0;
+ }
+
+ if (adjustedMin < 0.0 && adjustedMax < 0.0) {
+ adjustedMax = 0.0;
+ }
+
+ if (m_autoRange || m_rangeMax > m_rangeMin) {
+ if (!m_autoRange) {
+ adjustedMax = m_rangeMax;
+ adjustedMin = m_rangeMin;
+ }
+
+ qreal adjust;
+ // this should never happen, remove?
+ if (qFuzzyCompare(adjustedMax - adjustedMin, std::numeric_limits<qreal>::min())) {
+ adjust = 1;
+ } else {
+ adjust = (height() / (adjustedMax - adjustedMin));
+ }
+
+ // normalizebased on global max and min
+ m_mutex.lock();
+ for (auto data : std::as_const(m_plotData)) {
+ for (int i = 0; i < data->values().count(); ++i) {
+ data->m_normalizedValues[i] = (data->m_normalizedValues.value(i) - adjustedMin) * adjust;
+ }
+ }
+ m_mutex.unlock();
+ }
+}
--- /dev/null
+/*
+ This file is part of the KDE project
+
+ SPDX-FileCopyrightText: 2014 Fredrik Höglund <fredrik@kde.org>
+ SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef PLASMA_PLOTTER_H
+#define PLASMA_PLOTTER_H
+
+#include <epoxy/gl.h>
+
+// qopengl.h declares GLdouble as a typedef of float when Qt is built
+// with GLES support. This conflicts with the epoxy/gl_generated.h
+// declaration, so we have to prevent the Qt header from being #included.
+#define QOPENGL_H
+
+#ifndef QOPENGLF_APIENTRY
+#define QOPENGLF_APIENTRY GLAPIENTRY
+#endif
+
+#ifndef QOPENGLF_APIENTRYP
+#define QOPENGLF_APIENTRYP GLAPIENTRYP
+#endif
+
+#include <QMutex>
+#include <QPointer>
+#include <QQmlListProperty>
+#include <QQuickItem>
+#include <QQuickWindow>
+
+class PlotSGNode;
+
+/**
+ * a Plotter can draw a graph of values arriving from an arbitrary number of data sources
+ * to show their evolution in time.
+ * an example can be a plot of the network transfer speed or CPU temperature over time.
+ * Multiple plots can be fitted in the same graph, either stacked or intersected.
+ */
+class PlotData : public QObject
+{
+ Q_OBJECT
+ /**
+ * text Label of the data set: note this is purely a model, it will need a Label somewhere to be actually painted
+ */
+ Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged)
+
+ /**
+ * Color to plot this data set
+ */
+ Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
+
+ /**
+ * All the values currently in this data set
+ */
+ Q_PROPERTY(QList<qreal> values READ values NOTIFY valuesChanged)
+
+ /**
+ * Maximum value of this data set
+ */
+ Q_PROPERTY(qreal max READ max NOTIFY maxChanged)
+
+ /**
+ * Minimum value of this data set
+ */
+ Q_PROPERTY(qreal min READ min NOTIFY minChanged)
+
+public:
+ PlotData(QObject *parent = nullptr);
+
+ void setColor(const QColor &color);
+ QColor color() const;
+
+ void addSample(qreal value);
+
+ QList<qreal> values() const;
+
+ QVector<qreal> m_normalizedValues;
+
+ qreal max() const;
+ qreal min() const;
+
+ void setSampleSize(int size);
+
+ QString label() const;
+ void setLabel(const QString &label);
+
+Q_SIGNALS:
+ void colorChanged();
+ void valuesChanged();
+ void maxChanged();
+ void minChanged();
+ void labelChanged();
+
+private:
+ QString m_label;
+ QColor m_color;
+ QList<qreal> m_values;
+
+ qreal m_min;
+ qreal m_max;
+ int m_sampleSize;
+};
+
+class Plotter : public QQuickItem
+{
+ Q_OBJECT
+ Q_PROPERTY(QQmlListProperty<PlotData> dataSets READ dataSets)
+
+ /**
+ * maximum value among all graphs
+ */
+ Q_PROPERTY(qreal max READ max NOTIFY maxChanged)
+
+ /**
+ * minimum value among all graphs
+ */
+ Q_PROPERTY(qreal min READ min NOTIFY minChanged)
+
+ /**
+ * draw at most n samples, if new samples are pushed old values are started to be thrown away
+ */
+ Q_PROPERTY(int sampleSize READ sampleSize WRITE setSampleSize NOTIFY sampleSizeChanged)
+
+ /**
+ * if true stack the graphs one on top of each other instead of just painting one on top of each other
+ */
+ Q_PROPERTY(bool stacked READ isStacked WRITE setStacked NOTIFY stackedChanged)
+
+ /**
+ * If true, the graph is automatically scaled to always fit in the Plotter area
+ */
+ Q_PROPERTY(bool autoRange READ isAutoRange WRITE setAutoRange NOTIFY autoRangeChanged)
+
+ /**
+ * Always represents the values scaled between this and rangeMin
+ * If autoRange is true, this property just holds the minimum value
+ */
+ Q_PROPERTY(qreal rangeMax READ rangeMax WRITE setRangeMax NOTIFY rangeMaxChanged)
+
+ /**
+ * Always represents the values scaled between this and rangeMax
+ * If autoRange is true, this property just holds the maximum value
+ */
+ Q_PROPERTY(qreal rangeMin READ rangeMin WRITE setRangeMin NOTIFY rangeMinChanged)
+
+ /**
+ * Color of the grid lines
+ */
+ Q_PROPERTY(QColor gridColor READ gridColor WRITE setGridColor NOTIFY gridColorChanged)
+
+ /**
+ * The number of horizontal lines drawn across the view between 0 and rangeMax at the top of the plotter at rangeMax
+ * This does not include the bottom line
+ * Setting this to 0 will disable grid lines
+ *
+ * The default value is 5
+ */
+ Q_PROPERTY(int horizontalGridLineCount READ horizontalGridLineCount WRITE setHorizontalGridLineCount NOTIFY horizontalGridLineCountChanged)
+
+ // Q_CLASSINFO("DefaultProperty", "dataSets")
+
+public:
+ Plotter(QQuickItem *parent = nullptr);
+ ~Plotter();
+
+ qreal max() const;
+ qreal min() const;
+
+ int sampleSize() const;
+ void setSampleSize(int size);
+
+ bool isStacked() const;
+ void setStacked(bool stacked);
+
+ bool isAutoRange() const;
+ void setAutoRange(bool autorange);
+
+ qreal rangeMax() const;
+ void setRangeMax(qreal max);
+
+ qreal rangeMin() const;
+ void setRangeMin(qreal min);
+
+ void setHorizontalGridLineCount(int count);
+ int horizontalGridLineCount();
+
+ void setGridColor(const QColor &color);
+ QColor gridColor() const;
+
+ QQmlListProperty<PlotData> dataSets();
+ static void dataSet_append(QQmlListProperty<PlotData> *list, PlotData *item);
+ static int dataSet_count(QQmlListProperty<PlotData> *list);
+ static PlotData *dataSet_at(QQmlListProperty<PlotData> *list, int pos);
+ static void dataSet_clear(QQmlListProperty<PlotData> *list);
+
+ Q_INVOKABLE void addSample(qreal value);
+ Q_INVOKABLE void addSample(const QList<qreal> &value);
+
+protected:
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+
+private:
+ QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) override final;
+ QPainterPath interpolate(const QVector<qreal> &p, qreal x0, qreal x1) const;
+ void normalizeData();
+
+Q_SIGNALS:
+ void maxChanged();
+ void minChanged();
+ void sampleSizeChanged();
+ void stackedChanged();
+ void autoRangeChanged();
+ void rangeMaxChanged();
+ void rangeMinChanged();
+ void gridColorChanged();
+ void horizontalGridLineCountChanged();
+
+private Q_SLOTS:
+ void render();
+
+private:
+ QList<PlotData *> m_plotData;
+
+ GLuint m_fbo = 0;
+ PlotSGNode *m_node = nullptr;
+ qreal m_min;
+ qreal m_max;
+ qreal m_rangeMax;
+ qreal m_rangeMin;
+ int m_sampleSize;
+ int m_horizontalLineCount;
+ bool m_stacked;
+ bool m_autoRange;
+ QColor m_gridColor;
+
+ QMatrix4x4 m_matrix;
+ bool m_initialized = false;
+ bool m_haveMSAA;
+ bool m_haveFramebufferBlit;
+ bool m_haveInternalFormatQuery;
+ GLenum m_internalFormat;
+ int m_samples;
+ QPointer<QQuickWindow> m_window;
+ QMutex m_mutex;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "qiconitem.h"
+
+#include <QIcon>
+#include <QQuickWindow>
+#include <quickaddons/imagetexturescache.h>
+#include <quickaddons/managedtexturenode.h>
+
+Q_GLOBAL_STATIC(ImageTexturesCache, s_iconImageCache)
+
+QIconItem::QIconItem(QQuickItem *parent)
+ : QQuickItem(parent)
+ , m_smooth(false)
+ , m_state(DefaultState)
+ , m_changed(false)
+{
+ setFlag(ItemHasContents, true);
+}
+
+QIconItem::~QIconItem()
+{
+}
+
+void QIconItem::setIcon(const QVariant &icon)
+{
+ if (icon.canConvert<QIcon>()) {
+ m_icon = icon.value<QIcon>();
+ } else if (icon.canConvert<QString>()) {
+ m_icon = QIcon::fromTheme(icon.toString());
+ } else {
+ m_icon = QIcon();
+ }
+ m_changed = true;
+ update();
+ Q_EMIT iconChanged();
+}
+
+QIcon QIconItem::icon() const
+{
+ return m_icon;
+}
+
+QIconItem::State QIconItem::state() const
+{
+ return m_state;
+}
+
+void QIconItem::setState(QIconItem::State state)
+{
+ if (m_state == state) {
+ return;
+ }
+
+ m_state = state;
+ m_changed = true;
+ Q_EMIT stateChanged(state);
+ update();
+}
+
+bool QIconItem::enabled() const
+{
+ return (m_state == DefaultState);
+}
+
+void QIconItem::setEnabled(bool enabled)
+{
+ if (enabled) {
+ setState(DefaultState);
+ } else {
+ setState(DisabledState);
+ }
+}
+
+int QIconItem::implicitWidth() const
+{
+ return 32;
+}
+
+int QIconItem::implicitHeight() const
+{
+ return 32;
+}
+
+void QIconItem::setSmooth(const bool smooth)
+{
+ if (smooth == m_smooth) {
+ return;
+ }
+ m_smooth = smooth;
+ m_changed = true;
+ update();
+ Q_EMIT smoothChanged();
+}
+
+bool QIconItem::smooth() const
+{
+ return m_smooth;
+}
+
+QSGNode *QIconItem::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData * /*data*/)
+{
+ if (m_icon.isNull()) {
+ delete node;
+ return nullptr;
+ }
+
+ if (m_changed || node == nullptr) {
+ m_changed = false;
+
+ ManagedTextureNode *mNode = dynamic_cast<ManagedTextureNode *>(node);
+ if (!mNode) {
+ delete node;
+ mNode = new ManagedTextureNode;
+ }
+
+ QIcon::Mode mode;
+ switch (m_state) {
+ case DefaultState:
+ mode = QIcon::Normal;
+ break;
+ case ActiveState:
+ mode = QIcon::Active;
+ break;
+ case DisabledState:
+ mode = QIcon::Disabled;
+ break;
+ case SelectedState:
+ mode = QIcon::Selected;
+ break;
+ }
+
+ QImage img;
+ const QSize size(width(), height());
+ if (!size.isEmpty()) {
+ img = m_icon.pixmap(size, mode, QIcon::On).toImage();
+ }
+ mNode->setTexture(s_iconImageCache->loadTexture(window(), img));
+ mNode->setRect(QRect(QPoint(0, 0), size));
+ node = mNode;
+ }
+
+ return node;
+}
+
+void QIconItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ if (newGeometry.size() != oldGeometry.size()) {
+ m_changed = true;
+ update();
+ }
+ QQuickItem::geometryChanged(newGeometry, oldGeometry);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef QICONITEM_H
+#define QICONITEM_H
+
+#include <QIcon>
+#include <QQuickItem>
+#include <QVariant>
+
+class QIconItem : public QQuickItem
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QVariant icon READ icon WRITE setIcon NOTIFY iconChanged)
+ Q_PROPERTY(bool smooth READ smooth WRITE setSmooth NOTIFY smoothChanged)
+ Q_PROPERTY(int implicitWidth READ implicitWidth CONSTANT)
+ Q_PROPERTY(int implicitHeight READ implicitHeight CONSTANT)
+ Q_PROPERTY(State state READ state WRITE setState NOTIFY stateChanged)
+ Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY stateChanged)
+
+public:
+ enum State {
+ DefaultState, /// The default state.
+ ActiveState, /// Icon is active.
+ DisabledState, /// Icon is disabled.
+ SelectedState, /// Icon is selected
+ };
+ Q_ENUM(State)
+
+ explicit QIconItem(QQuickItem *parent = nullptr);
+ ~QIconItem() override;
+
+ void setIcon(const QVariant &icon);
+ QIcon icon() const;
+
+ QIconItem::State state() const;
+ void setState(State state);
+
+ int implicitWidth() const;
+ int implicitHeight() const;
+
+ void setSmooth(const bool smooth);
+ bool smooth() const;
+
+ void setEnabled(bool enabled = true);
+ bool enabled() const;
+
+ QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *data) override;
+
+Q_SIGNALS:
+ void iconChanged();
+ void smoothChanged();
+ void stateChanged(State state);
+
+protected:
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+
+private:
+ QIcon m_icon;
+ bool m_smooth;
+ State m_state;
+ bool m_changed;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2015 Luca Beltrame <lbeltrame@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "qimageitem.h"
+
+#include <QPainter>
+
+QImageItem::QImageItem(QQuickItem *parent)
+ : QQuickPaintedItem(parent)
+ , m_smooth(false)
+ , m_fillMode(QImageItem::Stretch)
+{
+ setFlag(ItemHasContents, true);
+}
+
+QImageItem::~QImageItem()
+{
+}
+
+void QImageItem::setImage(const QImage &image)
+{
+ bool oldImageNull = m_image.isNull();
+ m_image = image;
+ updatePaintedRect();
+ update();
+ Q_EMIT nativeWidthChanged();
+ Q_EMIT nativeHeightChanged();
+ Q_EMIT imageChanged();
+ if (oldImageNull != m_image.isNull()) {
+ Q_EMIT nullChanged();
+ }
+}
+
+QImage QImageItem::image() const
+{
+ return m_image;
+}
+
+void QImageItem::resetImage()
+{
+ setImage(QImage());
+}
+
+void QImageItem::setSmooth(const bool smooth)
+{
+ if (smooth == m_smooth) {
+ return;
+ }
+ m_smooth = smooth;
+ update();
+}
+
+bool QImageItem::smooth() const
+{
+ return m_smooth;
+}
+
+int QImageItem::nativeWidth() const
+{
+ return m_image.size().width() / m_image.devicePixelRatio();
+}
+
+int QImageItem::nativeHeight() const
+{
+ return m_image.size().height() / m_image.devicePixelRatio();
+}
+
+QImageItem::FillMode QImageItem::fillMode() const
+{
+ return m_fillMode;
+}
+
+void QImageItem::setFillMode(QImageItem::FillMode mode)
+{
+ if (mode == m_fillMode) {
+ return;
+ }
+
+ m_fillMode = mode;
+ updatePaintedRect();
+ update();
+ Q_EMIT fillModeChanged();
+}
+
+void QImageItem::paint(QPainter *painter)
+{
+ if (m_image.isNull()) {
+ return;
+ }
+ painter->save();
+ painter->setRenderHint(QPainter::Antialiasing, m_smooth);
+ painter->setRenderHint(QPainter::SmoothPixmapTransform, m_smooth);
+
+ if (m_fillMode == TileVertically) {
+ painter->scale(width() / (qreal)m_image.width(), 1);
+ }
+
+ if (m_fillMode == TileHorizontally) {
+ painter->scale(1, height() / (qreal)m_image.height());
+ }
+
+ if (m_fillMode >= Tile) {
+ painter->drawTiledPixmap(m_paintedRect, QPixmap::fromImage(m_image));
+ } else {
+ painter->drawImage(m_paintedRect, m_image, m_image.rect());
+ }
+
+ painter->restore();
+}
+
+bool QImageItem::isNull() const
+{
+ return m_image.isNull();
+}
+
+int QImageItem::paintedWidth() const
+{
+ if (m_image.isNull()) {
+ return 0;
+ }
+
+ return m_paintedRect.width();
+}
+
+int QImageItem::paintedHeight() const
+{
+ if (m_image.isNull()) {
+ return 0;
+ }
+
+ return m_paintedRect.height();
+}
+
+void QImageItem::updatePaintedRect()
+{
+ if (m_image.isNull()) {
+ return;
+ }
+
+ QRectF sourceRect = m_paintedRect;
+
+ QRectF destRect;
+
+ switch (m_fillMode) {
+ case PreserveAspectFit: {
+ QSizeF scaled = m_image.size();
+
+ scaled.scale(boundingRect().size(), Qt::KeepAspectRatio);
+ destRect = QRectF(QPoint(0, 0), scaled);
+ destRect.moveCenter(boundingRect().center().toPoint());
+ break;
+ }
+ case PreserveAspectCrop: {
+ QSizeF scaled = m_image.size();
+
+ scaled.scale(boundingRect().size(), Qt::KeepAspectRatioByExpanding);
+ destRect = QRectF(QPoint(0, 0), scaled);
+ destRect.moveCenter(boundingRect().center().toPoint());
+ break;
+ }
+ case TileVertically: {
+ destRect = boundingRect().toRect();
+ destRect.setWidth(destRect.width() / (width() / (qreal)m_image.width()));
+ break;
+ }
+ case TileHorizontally: {
+ destRect = boundingRect().toRect();
+ destRect.setHeight(destRect.height() / (height() / (qreal)m_image.height()));
+ break;
+ }
+ case Stretch:
+ case Tile:
+ default:
+ destRect = boundingRect().toRect();
+ }
+
+ if (destRect != sourceRect) {
+ m_paintedRect = destRect.toRect();
+ Q_EMIT paintedHeightChanged();
+ Q_EMIT paintedWidthChanged();
+ }
+}
+
+void QImageItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);
+ updatePaintedRect();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2015 Luca Beltrame <lbeltrame@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef QIMAGEITEM_H
+#define QIMAGEITEM_H
+
+#include <QImage>
+#include <QQuickPaintedItem>
+
+class QImageItem : public QQuickPaintedItem
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QImage image READ image WRITE setImage NOTIFY imageChanged RESET resetImage)
+ Q_PROPERTY(bool smooth READ smooth WRITE setSmooth)
+ Q_PROPERTY(int nativeWidth READ nativeWidth NOTIFY nativeWidthChanged)
+ Q_PROPERTY(int nativeHeight READ nativeHeight NOTIFY nativeHeightChanged)
+ Q_PROPERTY(int paintedWidth READ paintedWidth NOTIFY paintedWidthChanged)
+ Q_PROPERTY(int paintedHeight READ paintedHeight NOTIFY paintedHeightChanged)
+ Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)
+ Q_PROPERTY(bool null READ isNull NOTIFY nullChanged)
+
+public:
+ enum FillMode {
+ Stretch, // the image is scaled to fit
+ PreserveAspectFit, // the image is scaled uniformly to fit without cropping
+ PreserveAspectCrop, // the image is scaled uniformly to fill, cropping if necessary
+ Tile, // the image is duplicated horizontally and vertically
+ TileVertically, // the image is stretched horizontally and tiled vertically
+ TileHorizontally, // the image is stretched vertically and tiled horizontally
+ };
+ Q_ENUM(FillMode)
+
+ explicit QImageItem(QQuickItem *parent = nullptr);
+ ~QImageItem() override;
+
+ void setImage(const QImage &image);
+ QImage image() const;
+ void resetImage();
+
+ void setSmooth(const bool smooth);
+ bool smooth() const;
+
+ int nativeWidth() const;
+ int nativeHeight() const;
+
+ int paintedWidth() const;
+ int paintedHeight() const;
+
+ FillMode fillMode() const;
+ void setFillMode(FillMode mode);
+
+ void paint(QPainter *painter) override;
+
+ bool isNull() const;
+
+Q_SIGNALS:
+ void nativeWidthChanged();
+ void nativeHeightChanged();
+ void fillModeChanged();
+ void imageChanged();
+ void nullChanged();
+ void paintedWidthChanged();
+ void paintedHeightChanged();
+
+protected:
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+
+private:
+ QImage m_image;
+ bool m_smooth;
+ FillMode m_fillMode;
+ QRect m_paintedRect;
+
+private Q_SLOTS:
+ void updatePaintedRect();
+};
+
+#endif
--- /dev/null
+module org.kde.kquickcontrolsaddons
+plugin kquickcontrolsaddonsplugin
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2015 Luca Beltrame <lbeltrame@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "qpixmapitem.h"
+
+#include <QPainter>
+
+QPixmapItem::QPixmapItem(QQuickItem *parent)
+ : QQuickPaintedItem(parent)
+ , m_smooth(false)
+ , m_fillMode(QPixmapItem::Stretch)
+{
+ setFlag(ItemHasContents, true);
+}
+
+QPixmapItem::~QPixmapItem()
+{
+}
+
+void QPixmapItem::setPixmap(const QPixmap &pixmap)
+{
+ bool oldPixmapNull = m_pixmap.isNull();
+ m_pixmap = pixmap;
+ updatePaintedRect();
+ update();
+ Q_EMIT nativeWidthChanged();
+ Q_EMIT nativeHeightChanged();
+ Q_EMIT pixmapChanged();
+ if (oldPixmapNull != m_pixmap.isNull()) {
+ Q_EMIT nullChanged();
+ }
+}
+
+QPixmap QPixmapItem::pixmap() const
+{
+ return m_pixmap;
+}
+
+void QPixmapItem::resetPixmap()
+{
+ setPixmap(QPixmap());
+}
+
+void QPixmapItem::setSmooth(const bool smooth)
+{
+ if (smooth == m_smooth) {
+ return;
+ }
+ m_smooth = smooth;
+ update();
+}
+
+bool QPixmapItem::smooth() const
+{
+ return m_smooth;
+}
+
+int QPixmapItem::nativeWidth() const
+{
+ return m_pixmap.size().width() / m_pixmap.devicePixelRatio();
+}
+
+int QPixmapItem::nativeHeight() const
+{
+ return m_pixmap.size().height() / m_pixmap.devicePixelRatio();
+}
+
+QPixmapItem::FillMode QPixmapItem::fillMode() const
+{
+ return m_fillMode;
+}
+
+void QPixmapItem::setFillMode(QPixmapItem::FillMode mode)
+{
+ if (mode == m_fillMode) {
+ return;
+ }
+
+ m_fillMode = mode;
+ updatePaintedRect();
+ update();
+ Q_EMIT fillModeChanged();
+}
+
+void QPixmapItem::paint(QPainter *painter)
+{
+ if (m_pixmap.isNull()) {
+ return;
+ }
+ painter->save();
+ painter->setRenderHint(QPainter::Antialiasing, m_smooth);
+ painter->setRenderHint(QPainter::SmoothPixmapTransform, m_smooth);
+
+ if (m_fillMode == TileVertically) {
+ painter->scale(width() / (qreal)m_pixmap.width(), 1);
+ }
+
+ if (m_fillMode == TileHorizontally) {
+ painter->scale(1, height() / (qreal)m_pixmap.height());
+ }
+
+ if (m_fillMode >= Tile) {
+ painter->drawTiledPixmap(m_paintedRect, m_pixmap);
+ } else {
+ painter->drawPixmap(m_paintedRect, m_pixmap, m_pixmap.rect());
+ }
+
+ painter->restore();
+}
+
+bool QPixmapItem::isNull() const
+{
+ return m_pixmap.isNull();
+}
+
+int QPixmapItem::paintedWidth() const
+{
+ if (m_pixmap.isNull()) {
+ return 0;
+ }
+
+ return m_paintedRect.width();
+}
+
+int QPixmapItem::paintedHeight() const
+{
+ if (m_pixmap.isNull()) {
+ return 0;
+ }
+
+ return m_paintedRect.height();
+}
+
+void QPixmapItem::updatePaintedRect()
+{
+ if (m_pixmap.isNull()) {
+ return;
+ }
+
+ QRectF sourceRect = m_paintedRect;
+
+ QRectF destRect;
+
+ switch (m_fillMode) {
+ case PreserveAspectFit: {
+ QSizeF scaled = m_pixmap.size();
+
+ scaled.scale(boundingRect().size(), Qt::KeepAspectRatio);
+ destRect = QRectF(QPoint(0, 0), scaled);
+ destRect.moveCenter(boundingRect().center().toPoint());
+
+ break;
+ }
+ case PreserveAspectCrop: {
+ QSizeF scaled = m_pixmap.size();
+
+ scaled.scale(boundingRect().size(), Qt::KeepAspectRatioByExpanding);
+ destRect = QRectF(QPoint(0, 0), scaled);
+ destRect.moveCenter(boundingRect().center().toPoint());
+ break;
+ }
+ case TileVertically: {
+ destRect = boundingRect().toRect();
+ destRect.setWidth(destRect.width() / (width() / (qreal)m_pixmap.width()));
+ break;
+ }
+ case TileHorizontally: {
+ destRect = boundingRect().toRect();
+ destRect.setHeight(destRect.height() / (height() / (qreal)m_pixmap.height()));
+ break;
+ }
+ case Stretch:
+ case Tile:
+ default:
+ destRect = boundingRect().toRect();
+ }
+
+ if (destRect != sourceRect) {
+ m_paintedRect = destRect.toRect();
+ Q_EMIT paintedHeightChanged();
+ Q_EMIT paintedWidthChanged();
+ }
+}
+
+void QPixmapItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);
+ updatePaintedRect();
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2015 Luca Beltrame <lbeltrame@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef QPIXMAPITEM_H
+#define QPIXMAPITEM_H
+
+#include <QPixmap>
+#include <QQuickPaintedItem>
+
+class QPixmapItem : public QQuickPaintedItem
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap NOTIFY pixmapChanged RESET resetPixmap)
+ Q_PROPERTY(bool smooth READ smooth WRITE setSmooth)
+ Q_PROPERTY(int nativeWidth READ nativeWidth NOTIFY nativeWidthChanged)
+ Q_PROPERTY(int nativeHeight READ nativeHeight NOTIFY nativeHeightChanged)
+ Q_PROPERTY(int paintedWidth READ paintedWidth NOTIFY paintedWidthChanged)
+ Q_PROPERTY(int paintedHeight READ paintedHeight NOTIFY paintedHeightChanged)
+ Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)
+ Q_PROPERTY(bool null READ isNull NOTIFY nullChanged)
+
+public:
+ enum FillMode {
+ Stretch, // the image is scaled to fit
+ PreserveAspectFit, // the image is scaled uniformly to fit without cropping
+ PreserveAspectCrop, // the image is scaled uniformly to fill, cropping if necessary
+ Tile, // the image is duplicated horizontally and vertically
+ TileVertically, // the image is stretched horizontally and tiled vertically
+ TileHorizontally, // the image is stretched vertically and tiled horizontally
+ };
+ Q_ENUM(FillMode)
+
+ explicit QPixmapItem(QQuickItem *parent = nullptr);
+ ~QPixmapItem() override;
+
+ void setPixmap(const QPixmap &pixmap);
+ QPixmap pixmap() const;
+ void resetPixmap();
+
+ void setSmooth(const bool smooth);
+ bool smooth() const;
+
+ int nativeWidth() const;
+ int nativeHeight() const;
+
+ int paintedWidth() const;
+ int paintedHeight() const;
+
+ FillMode fillMode() const;
+ void setFillMode(FillMode mode);
+
+ void paint(QPainter *painter) override;
+
+ bool isNull() const;
+
+Q_SIGNALS:
+ void nativeWidthChanged();
+ void nativeHeightChanged();
+ void fillModeChanged();
+ void pixmapChanged();
+ void nullChanged();
+ void paintedWidthChanged();
+ void paintedHeightChanged();
+
+protected:
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+
+private:
+ QPixmap m_pixmap;
+ bool m_smooth;
+ FillMode m_fillMode;
+ QRect m_paintedRect;
+
+private Q_SLOTS:
+ void updatePaintedRect();
+};
+
+#endif
--- /dev/null
+project(kwindowsystemplugin)
+
+set(kwindowsystemplugin_SRCS
+ kwindowsystemplugin.cpp
+ kwindowsystemproxy.cpp
+ )
+
+add_library(kwindowsystem SHARED ${kwindowsystemplugin_SRCS})
+target_link_libraries(kwindowsystem
+ Qt5::Core
+ Qt5::Qml
+ KF5::WindowSystem
+)
+
+install(TARGETS kwindowsystem DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kwindowsystem)
+
+install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/kwindowsystem)
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "kwindowsystemplugin.h"
+
+#include <QtQml>
+
+#include "kwindowsystemproxy.h"
+
+void KWindowSystemPlugin::registerTypes(const char *uri)
+{
+ Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kwindowsystem"));
+
+ qmlRegisterType<KWindowSystemProxy>(uri, 1, 0, "KWindowSystem");
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef KWINDOWSYSTEMPLUGIN_H
+#define KWINDOWSYSTEMPLUGIN_H
+
+#include <QQmlExtensionPlugin>
+
+class KWindowSystemPlugin : public QQmlExtensionPlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
+
+public:
+ void registerTypes(const char *uri) override;
+};
+
+#endif // KWINDOWSYSTEMPLUGIN_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#include "kwindowsystemproxy.h"
+
+#include <QMetaMethod>
+#include <QWindow>
+
+#include <kwindowsystem.h>
+
+KWindowSystemProxy::KWindowSystemProxy(QObject *parent)
+ : QObject(parent)
+ , m_initialized(false)
+{
+}
+
+KWindowSystemProxy::~KWindowSystemProxy()
+{
+}
+
+void KWindowSystemProxy::connectNotify(const QMetaMethod &signal)
+{
+ if (m_initialized) {
+ return;
+ }
+
+ if (signal == QMetaMethod::fromSignal(&KWindowSystemProxy::currentDesktopChanged)
+ || signal == QMetaMethod::fromSignal(&KWindowSystemProxy::desktopNamesChanged)
+ || signal == QMetaMethod::fromSignal(&KWindowSystemProxy::numberOfDesktopsChanged)
+ || signal == QMetaMethod::fromSignal(&KWindowSystemProxy::showingDesktopChanged)
+ || signal == QMetaMethod::fromSignal(&KWindowSystemProxy::compositingActiveChanged)) {
+ connect(KWindowSystem::self(), &KWindowSystem::currentDesktopChanged, this, [this](int currentDesktop) {
+ Q_EMIT currentDesktopChanged(currentDesktop);
+ Q_EMIT currentDesktopNameChanged();
+ });
+
+ connect(KWindowSystem::self(), &KWindowSystem::desktopNamesChanged, this, [this]() {
+ Q_EMIT desktopNamesChanged();
+ Q_EMIT currentDesktopNameChanged();
+ });
+
+ connect(KWindowSystem::self(), &KWindowSystem::numberOfDesktopsChanged, this, &KWindowSystemProxy::numberOfDesktopsChanged);
+ connect(KWindowSystem::self(), &KWindowSystem::showingDesktopChanged, this, &KWindowSystemProxy::showingDesktopChanged);
+ connect(KWindowSystem::self(), &KWindowSystem::compositingChanged, this, &KWindowSystemProxy::compositingActiveChanged);
+
+ m_initialized = true;
+ }
+}
+
+int KWindowSystemProxy::currentDesktop() const
+{
+ return KWindowSystem::currentDesktop();
+}
+
+void KWindowSystemProxy::setCurrentDesktop(int desktop)
+{
+ KWindowSystem::setCurrentDesktop(desktop);
+}
+
+QString KWindowSystemProxy::currentDesktopName() const
+{
+ return KWindowSystem::desktopName(KWindowSystem::currentDesktop());
+}
+
+int KWindowSystemProxy::numberOfDesktops() const
+{
+ return KWindowSystem::numberOfDesktops();
+}
+
+bool KWindowSystemProxy::showingDesktop() const
+{
+ return KWindowSystem::showingDesktop();
+}
+
+void KWindowSystemProxy::setShowingDesktop(bool showingDesktop)
+{
+ KWindowSystem::setShowingDesktop(showingDesktop);
+}
+
+bool KWindowSystemProxy::compositingActive() const
+{
+ return KWindowSystem::compositingActive();
+}
+
+bool KWindowSystemProxy::hasWindow(QWindow *window) const
+{
+ if (!window) {
+ return false;
+ }
+
+ return KWindowSystem::hasWId(window->winId());
+}
+
+void KWindowSystemProxy::forceActivateWindow(QWindow *window, long time)
+{
+ if (window) {
+ KWindowSystem::forceActiveWindow(window->winId(), time);
+ }
+}
+
+void KWindowSystemProxy::setOnAllDesktops(QWindow *window, bool onAllDesktops)
+{
+ if (window) {
+ KWindowSystem::setOnAllDesktops(window->winId(), onAllDesktops);
+ }
+}
+
+void KWindowSystemProxy::setOnDesktop(QWindow *window, int desktop)
+{
+ if (window) {
+ KWindowSystem::setOnDesktop(window->winId(), desktop);
+ }
+}
+
+void KWindowSystemProxy::setOnActivities(QWindow *window, const QStringList &activities)
+{
+ if (window) {
+ KWindowSystem::setOnActivities(window->winId(), activities);
+ }
+}
+
+QString KWindowSystemProxy::desktopName(int desktop) const
+{
+ return KWindowSystem::desktopName(desktop);
+}
+
+void KWindowSystemProxy::setDesktopName(int desktop, const QString &name)
+{
+ KWindowSystem::setDesktopName(desktop, name);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.1-or-later
+*/
+
+#ifndef KWINDOWSYSTEMPROXY_H
+#define KWINDOWSYSTEMPROXY_H
+
+#include <QObject>
+#include <QString>
+
+class QMetaMethod;
+class QWindow;
+
+/**
+ * This item exposes various properties of KWindowSystem for use inside a QML environment.
+ *
+ * Example usage:
+ * @code
+ * import org.kde.kwindowsystem 1.0
+ *
+ * KWindowSystem {
+ * id: kwindowsystem
+ * }
+ *
+ * Rectangle {
+ * width: 50
+ * height: 50
+ * color: "blue"
+ * opacity: kwindowsystem.compositingActive ? 0.5 : 1
+ * }
+ *
+ * Label {
+ * text: i18n("You are currently on Desktop '%1'", kwindowsystem.currentDesktopName)
+ * }
+ * @endcode
+ *
+ * @note The features provided by this item are specific to the windowing system and might not
+ * be supported on any platform other than X11
+ */
+class KWindowSystemProxy : public QObject
+{
+ Q_OBJECT
+
+ /**
+ * @brief The number of the current desktop
+ */
+ Q_PROPERTY(int currentDesktop READ currentDesktop WRITE setCurrentDesktop NOTIFY currentDesktopChanged)
+ /**
+ * @brief The name of the current desktop
+ */
+ Q_PROPERTY(QString currentDesktopName READ currentDesktopName NOTIFY currentDesktopNameChanged)
+ /**
+ * @brief The number of desktops
+ */
+ Q_PROPERTY(int numberOfDesktops READ numberOfDesktops NOTIFY numberOfDesktopsChanged)
+ /**
+ * @brief Whether "show desktop" is currently active
+ */
+ Q_PROPERTY(bool showingDesktop READ showingDesktop WRITE setShowingDesktop NOTIFY showingDesktopChanged)
+ /**
+ * @brief Whether desktop compositing is active
+ *
+ * @note This property is updated delayed
+ */
+ Q_PROPERTY(bool compositingActive READ compositingActive NOTIFY compositingActiveChanged)
+
+public:
+ explicit KWindowSystemProxy(QObject *parent = nullptr);
+ ~KWindowSystemProxy() override;
+
+ int currentDesktop() const;
+ void setCurrentDesktop(int desktop);
+
+ QString currentDesktopName() const;
+ int numberOfDesktops() const;
+
+ bool showingDesktop() const;
+ void setShowingDesktop(bool showingDesktop);
+
+ bool compositingActive() const;
+
+ /**
+ * Test to see if @p window still managed at present.
+ * @param window the window to test
+ */
+ Q_INVOKABLE bool hasWindow(QWindow *window) const;
+
+ /**
+ * Sets window @p window to be the active window.
+ *
+ * @note This should be called only in special cases, applications
+ * shouldn't force themselves or other windows to be the active
+ * window. Generally, this call should used only by pagers
+ * and similar tools.
+ *
+ * @param window the window to make active
+ * @param time X server timestamp of the user activity that caused this request
+ */
+ Q_INVOKABLE void forceActivateWindow(QWindow *window, long time = 0);
+
+ /**
+ * Sets window @p window to be present on all virtual desktops if @p
+ * onAllDesktops true. Otherwise the window lives only on one single desktop.
+ *
+ * @param window the window
+ * @param onAllDesktops true to show the window on all desktops, false otherwise
+ */
+ Q_INVOKABLE void setOnAllDesktops(QWindow *window, bool onAllDesktops);
+ /**
+ * Moves window @p window to desktop @p desktop.
+ *
+ * @param window the window
+ * @param desktop the number of the new desktop
+ */
+ Q_INVOKABLE void setOnDesktop(QWindow *window, int desktop);
+ /**
+ * Moves window @p window to activities @p activities.
+ *
+ * @param window the window
+ * @param activities the list of activity UUIDs
+ */
+ Q_INVOKABLE void setOnActivities(QWindow *window, const QStringList &activities);
+
+ /**
+ * Returns the name of the specified desktop.
+ * @see currentDesktopName
+ * @param desktop the number of the desktop
+ * @return the name of the desktop
+ **/
+ Q_INVOKABLE QString desktopName(int desktop) const;
+ /**
+ * Sets the name of the specified desktop.
+ * @param desktop the number of the desktop
+ * @param name the new name for the desktop
+ **/
+ Q_INVOKABLE void setDesktopName(int desktop, const QString &name);
+
+Q_SIGNALS:
+ void currentDesktopChanged(int desktop);
+ void currentDesktopNameChanged();
+
+ void desktopNamesChanged();
+ void numberOfDesktopsChanged(int numberOfDesktops);
+ void showingDesktopChanged(bool showingDesktop);
+ void compositingActiveChanged(bool compositingActive);
+
+protected:
+ void connectNotify(const QMetaMethod &signal) override;
+
+private:
+ bool m_initialized;
+};
+
+#endif // KWINDOWSYSTEMPROXY_H
--- /dev/null
+module org.kde.kwindowsystem
+plugin kwindowsystem
+
--- /dev/null
+set(KF5QuickAddons_LIB_SRCS
+ imagetexturescache.cpp
+ managedtexturenode.cpp
+ quickviewsharedengine.cpp
+ configmodule.cpp
+ managedconfigmodule.cpp
+ qtquicksettings.cpp)
+kconfig_add_kcfg_files(KF5QuickAddons_LIB_SRCS renderersettings.kcfgc)
+
+add_library(KF5QuickAddons ${KF5QuickAddons_LIB_SRCS})
+
+generate_export_header(KF5QuickAddons EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/quickaddons_export.h BASE_NAME QuickAddons)
+add_library(KF5::QuickAddons ALIAS KF5QuickAddons)
+
+# Apps must include <KQuickAddons/File> or <kquickaddons/file.h>
+target_include_directories(KF5QuickAddons INTERFACE "$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative>")
+
+target_link_libraries(KF5QuickAddons
+ PUBLIC
+ Qt5::Quick
+ KF5::CoreAddons
+ PRIVATE
+ KF5::I18n
+ KF5::Declarative
+ KF5::ConfigGui
+)
+if (ANDROID)
+ target_link_libraries(KF5QuickAddons PRIVATE GLESv3)
+endif()
+
+set_target_properties(KF5QuickAddons
+ PROPERTIES VERSION ${KDECLARATIVE_VERSION}
+ SOVERSION ${KDECLARATIVE_SOVERSION}
+ EXPORT_NAME QuickAddons
+)
+
+# Install files
+#those are deprecated, offered just for compatibility
+ecm_generate_headers(QuickAddons_CamelCase_HEADERS
+ HEADER_NAMES
+ ImageTexturesCache
+ ManagedTextureNode
+ PREFIX QuickAddons
+ REQUIRED_HEADERS QuickAddons_HEADERS
+)
+install(FILES ${QuickAddons_CamelCase_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/QuickAddons COMPONENT Devel)
+
+# Install files
+ecm_generate_headers(KQuickAddons_CamelCase_HEADERS
+ HEADER_NAMES
+ ImageTexturesCache
+ ManagedTextureNode
+ QtQuickSettings
+ ConfigModule
+ ManagedConfigModule
+ QuickViewSharedEngine
+
+ PREFIX KQuickAddons
+ REQUIRED_HEADERS KQuickAddons_HEADERS
+)
+install(FILES ${KQuickAddons_CamelCase_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/KQuickAddons COMPONENT Devel)
+
+install(TARGETS KF5QuickAddons
+ EXPORT KF5DeclarativeTargets
+ ${KF5_INSTALL_TARGETS_DEFAULT_ARGS}
+)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/quickaddons_export.h
+ ${QuickAddons_HEADERS}
+ DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/quickaddons
+ COMPONENT Devel
+)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/quickaddons_export.h
+ ${KQuickAddons_HEADERS}
+ DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/KDeclarative/kquickaddons
+ COMPONENT Devel
+)
+
+# make available to ecm_add_qch in parent folder
+set(KQuickAddons_QCH_SOURCES ${KQuickAddons_HEADERS} PARENT_SCOPE)
+set(KQuickAddons_QCH_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
+
+include(ECMGeneratePriFile)
+ecm_generate_pri_file(BASE_NAME QuickAddons LIB_NAME KF5QuickAddons DEPS "qml" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/QuickAddons)
+install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR})
--- /dev/null
+/*
+ This file is part of the KDE libraries
+
+ SPDX-FileCopyrightText: 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ SPDX-FileCopyrightText: 2001 Michael Goffioul <kdeprint@swing.be>
+ SPDX-FileCopyrightText: 2004 Frans Englich <frans.englich@telia.com>
+ SPDX-FileCopyrightText: 2009 Dario Freddi <drf@kde.org>
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "configmodule.h"
+
+#include <QDebug>
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQmlFileSelector>
+#include <QQuickItem>
+#include <QUrl>
+
+#include <KAboutData>
+#include <KLocalizedString>
+#include <kdeclarative/qmlobject.h>
+#include <kdeclarative/qmlobjectsharedengine.h>
+
+#include <KPackage/Package>
+#include <KPackage/PackageLoader>
+
+namespace KQuickAddons
+{
+class ConfigModulePrivate
+{
+public:
+ ConfigModulePrivate(ConfigModule *module)
+ : _q(module)
+ , _qmlObject(nullptr)
+ , _buttons(ConfigModule::Help | ConfigModule::Default | ConfigModule::Apply)
+ , _about(nullptr)
+ , _useRootOnlyMessage(false)
+ , _needsAuthorization(false)
+ , _needsSave(false)
+ , _representsDefaults(false)
+ , _defaultsIndicatorVisible(false)
+ {
+ }
+
+ void authStatusChanged(int status);
+
+ ConfigModule *_q;
+ KDeclarative::QmlObject *_qmlObject;
+ ConfigModule::Buttons _buttons;
+ const KAboutData *_about;
+ QString _rootOnlyMessage;
+ QString _quickHelp;
+ QString _errorString;
+ QList<QQuickItem *> subPages;
+ int _columnWidth = -1;
+ int currentIndex = 0;
+ bool _useRootOnlyMessage : 1;
+
+ bool _needsAuthorization : 1;
+ bool _needsSave : 1;
+ bool _representsDefaults : 1;
+ bool _defaultsIndicatorVisible : 1;
+ QString _authActionName;
+
+ static QHash<QObject *, ConfigModule *> s_rootObjects;
+};
+
+QHash<QObject *, ConfigModule *> ConfigModulePrivate::s_rootObjects = QHash<QObject *, ConfigModule *>();
+
+ConfigModule::ConfigModule(const KAboutData *aboutData, QObject *parent, const QVariantList &)
+ : QObject(parent)
+ , d(new ConfigModulePrivate(this))
+{
+ setAboutData(aboutData);
+}
+
+ConfigModule::ConfigModule(const KPluginMetaData &metaData, QObject *parent, const QVariantList &)
+ : QObject(parent)
+ , d(new ConfigModulePrivate(this))
+{
+ KAboutData *aboutData =
+ new KAboutData(metaData.pluginId(), metaData.name(), metaData.version(), metaData.description(), KAboutLicense::byKeyword(metaData.license()).key());
+
+ const auto authors = metaData.authors();
+ for (auto &author : authors) {
+ aboutData->addAuthor(author.name(), author.task(), author.emailAddress(), author.webAddress(), author.ocsUsername());
+ }
+ setAboutData(aboutData);
+}
+
+ConfigModule::ConfigModule(QObject *parent, const QVariantList &)
+ : QObject(parent)
+ , d(new ConfigModulePrivate(this))
+{
+}
+
+ConfigModule::~ConfigModule()
+{
+ // in case mainUi was never called
+ if (d->_qmlObject) {
+ ConfigModulePrivate::s_rootObjects.remove(d->_qmlObject->rootContext());
+ }
+
+ delete d->_qmlObject;
+ delete d->_about;
+ delete d;
+}
+
+ConfigModule *ConfigModule::qmlAttachedProperties(QObject *object)
+{
+ // at the moment of the attached object creation, the root item is the only one that hasn't a parent
+ // only way to avoid creation of this attached for everybody but the root item
+ const QQmlEngine *engine = QtQml::qmlEngine(object);
+ QQmlContext *cont = QQmlEngine::contextForObject(object);
+
+ // Search the qml context that is the "root" for the sharedqmlobject, which
+ // is an ancestor of QQmlEngine::contextForObject(object) and the direct child
+ // of the engine's root context: we can do this assumption on the internals as
+ // we are distributed on the same repo.
+ while (cont->parentContext() && cont->parentContext() != engine->rootContext()) {
+ cont = cont->parentContext();
+ }
+
+ if (!object->parent() && ConfigModulePrivate::s_rootObjects.contains(cont)) {
+ return ConfigModulePrivate::s_rootObjects.value(cont);
+ } else {
+ return nullptr;
+ }
+}
+
+QQuickItem *ConfigModule::mainUi()
+{
+ if (d->_qmlObject) {
+ return qobject_cast<QQuickItem *>(d->_qmlObject->rootObject());
+ }
+
+ d->_errorString.clear();
+
+ // if we have a qml context, hook up to it and use its engine
+ // this ensure that in e.g. Plasma config dialogs that use a different engine
+ // so they can have different QtQuick Controls styles, we don't end up using
+ // the shared engine that is used by the rest of plasma
+
+ QQmlContext *ctx = QQmlEngine::contextForObject(this);
+
+ if (ctx && ctx->engine()) {
+ d->_qmlObject = new KDeclarative::QmlObject(ctx->engine(), ctx, this);
+ } else {
+ d->_qmlObject = new KDeclarative::QmlObjectSharedEngine(this);
+ }
+
+ ConfigModulePrivate::s_rootObjects[d->_qmlObject->rootContext()] = this;
+ d->_qmlObject->setTranslationDomain(aboutData()->componentName());
+ d->_qmlObject->setInitializationDelayed(true);
+
+ KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("KPackage/GenericQML"));
+ package.setDefaultPackageRoot(QStringLiteral("kpackage/kcms"));
+ package.setPath(aboutData()->componentName());
+
+ if (!package.isValid()) {
+ d->_errorString = i18n("Invalid KPackage '%1'", aboutData()->componentName());
+ qWarning() << "Error loading the module" << aboutData()->componentName() << ": invalid KPackage";
+ return nullptr;
+ }
+
+ if (package.filePath("mainscript").isEmpty()) {
+ d->_errorString = i18n("No QML file provided");
+ qWarning() << "Error loading the module" << aboutData()->componentName() << ": no QML file provided";
+ return nullptr;
+ }
+
+ new QQmlFileSelector(d->_qmlObject->engine(), d->_qmlObject->engine());
+ d->_qmlObject->setSource(package.fileUrl("mainscript"));
+ d->_qmlObject->rootContext()->setContextProperty(QStringLiteral("kcm"), this);
+ d->_qmlObject->completeInitialization();
+
+ if (d->_qmlObject->status() != QQmlComponent::Ready) {
+ d->_errorString = d->_qmlObject->mainComponent()->errorString();
+ return nullptr;
+ }
+
+ return qobject_cast<QQuickItem *>(d->_qmlObject->rootObject());
+}
+
+void ConfigModule::push(const QString &fileName, const QVariantMap &propertyMap)
+{
+ // ensure main ui is created
+ if (!mainUi()) {
+ return;
+ }
+
+ // TODO: package as member
+ KPackage::Package package = KPackage::PackageLoader::self()->loadPackage(QStringLiteral("KPackage/GenericQML"));
+ package.setDefaultPackageRoot(QStringLiteral("kpackage/kcms"));
+ package.setPath(aboutData()->componentName());
+
+ QVariantHash propertyHash;
+ for (auto it = propertyMap.begin(), end = propertyMap.end(); it != end; ++it) {
+ propertyHash.insert(it.key(), it.value());
+ }
+
+ QObject *object = d->_qmlObject->createObjectFromSource(QUrl::fromLocalFile(package.filePath("ui", fileName)), d->_qmlObject->rootContext(), propertyHash);
+
+ QQuickItem *item = qobject_cast<QQuickItem *>(object);
+ if (!item) {
+ object->deleteLater();
+ return;
+ }
+
+ d->subPages << item;
+ Q_EMIT pagePushed(item);
+ Q_EMIT depthChanged(depth());
+ setCurrentIndex(d->currentIndex + 1);
+}
+
+void ConfigModule::push(QQuickItem *item)
+{
+ // ensure main ui is created
+ if (!mainUi()) {
+ return;
+ }
+
+ d->subPages << item;
+ Q_EMIT pagePushed(item);
+ Q_EMIT depthChanged(depth());
+ setCurrentIndex(d->currentIndex + 1);
+}
+
+void ConfigModule::pop()
+{
+ if (d->subPages.isEmpty()) {
+ return;
+ }
+ QQuickItem *page = d->subPages.takeLast();
+ Q_EMIT pageRemoved();
+ Q_EMIT depthChanged(depth());
+ page->deleteLater();
+
+ setCurrentIndex(qMin(d->currentIndex, depth() - 1));
+}
+
+void ConfigModule::showPassiveNotification(const QString &message, const QVariant &timeout, const QString &actionText, const QJSValue &callBack)
+{
+ Q_EMIT passiveNotificationRequested(message, timeout, actionText, callBack);
+}
+
+ConfigModule::Buttons ConfigModule::buttons() const
+{
+ return d->_buttons;
+}
+
+void ConfigModule::setButtons(const KQuickAddons::ConfigModule::Buttons buttons)
+{
+ if (d->_buttons == buttons) {
+ return;
+ }
+
+ d->_buttons = buttons;
+ Q_EMIT buttonsChanged();
+}
+
+void ConfigModule::setNeedsAuthorization(bool needsAuth)
+{
+ if (d->_needsAuthorization == needsAuth) {
+ return;
+ }
+
+ d->_needsAuthorization = needsAuth;
+ if (needsAuth && d->_about) {
+ d->_authActionName = QLatin1String("org.kde.kcontrol.") + d->_about->componentName() + QLatin1String(".save");
+ d->_needsAuthorization = true;
+
+ } else {
+ d->_authActionName = QString();
+ }
+
+ Q_EMIT needsAuthorizationChanged();
+ Q_EMIT authActionNameChanged();
+}
+
+bool ConfigModule::needsAuthorization() const
+{
+ return d->_needsAuthorization;
+}
+
+QString ConfigModule::name() const
+{
+ return d->_about->displayName();
+}
+
+QString ConfigModule::description() const
+{
+ return d->_about->shortDescription();
+}
+
+int ConfigModule::columnWidth() const
+{
+ return d->_columnWidth;
+}
+
+void ConfigModule::setColumnWidth(int width)
+{
+ if (d->_columnWidth == width) {
+ return;
+ }
+
+ d->_columnWidth = width;
+ Q_EMIT columnWidthChanged(width);
+}
+
+int ConfigModule::depth() const
+{
+ return d->subPages.count() + 1;
+}
+
+void ConfigModule::setCurrentIndex(int index)
+{
+ if (index < 0 || index > d->subPages.count() || index == d->currentIndex) {
+ return;
+ }
+
+ d->currentIndex = index;
+
+ Q_EMIT currentIndexChanged(index);
+}
+
+int ConfigModule::currentIndex() const
+{
+ return d->currentIndex;
+}
+
+void ConfigModule::setAuthActionName(const QString &name)
+{
+ if (d->_authActionName == name) {
+ return;
+ }
+
+ d->_authActionName = name;
+ d->_needsAuthorization = true;
+
+ Q_EMIT needsAuthorizationChanged();
+ Q_EMIT authActionNameChanged();
+}
+
+QString ConfigModule::authActionName() const
+{
+ return d->_authActionName;
+}
+
+QQmlEngine *ConfigModule::engine() const
+{
+ return d->_qmlObject->engine();
+}
+
+QQmlComponent::Status ConfigModule::status() const
+{
+ if (!d->_qmlObject) {
+ return QQmlComponent::Null;
+ }
+
+ return d->_qmlObject->status();
+}
+
+QString ConfigModule::errorString() const
+{
+ return d->_errorString;
+}
+
+void ConfigModule::load()
+{
+ setNeedsSave(false);
+}
+
+void ConfigModule::save()
+{
+ setNeedsSave(false);
+}
+
+void ConfigModule::defaults()
+{
+}
+
+const KAboutData *ConfigModule::aboutData() const
+{
+ return d->_about;
+}
+
+void ConfigModule::setAboutData(const KAboutData *about)
+{
+ if (about != d->_about) {
+ delete d->_about;
+ d->_about = about;
+ }
+}
+
+void ConfigModule::setRootOnlyMessage(const QString &message)
+{
+ if (d->_rootOnlyMessage == message) {
+ return;
+ }
+
+ d->_rootOnlyMessage = message;
+ Q_EMIT rootOnlyMessageChanged();
+}
+
+QString ConfigModule::rootOnlyMessage() const
+{
+ return d->_rootOnlyMessage;
+}
+
+void ConfigModule::setUseRootOnlyMessage(bool on)
+{
+ if (d->_useRootOnlyMessage == on) {
+ return;
+ }
+
+ d->_useRootOnlyMessage = on;
+
+ Q_EMIT useRootOnlyMessageChanged();
+}
+
+bool ConfigModule::useRootOnlyMessage() const
+{
+ return d->_useRootOnlyMessage;
+}
+
+QQuickItem *ConfigModule::subPage(int index) const
+{
+ return d->subPages[index];
+}
+
+void ConfigModule::setQuickHelp(const QString &help)
+{
+ if (d->_quickHelp == help) {
+ return;
+ }
+
+ d->_quickHelp = help;
+
+ Q_EMIT quickHelpChanged();
+}
+
+QString ConfigModule::quickHelp() const
+{
+ return d->_quickHelp;
+}
+
+void ConfigModule::setNeedsSave(bool needs)
+{
+ if (needs == d->_needsSave) {
+ return;
+ }
+
+ d->_needsSave = needs;
+ Q_EMIT needsSaveChanged();
+}
+
+bool ConfigModule::needsSave()
+{
+ return d->_needsSave;
+}
+
+void ConfigModule::setRepresentsDefaults(bool defaults)
+{
+ if (defaults == d->_representsDefaults) {
+ return;
+ }
+
+ d->_representsDefaults = defaults;
+ Q_EMIT representsDefaultsChanged();
+}
+
+bool ConfigModule::representsDefaults()
+{
+ return d->_representsDefaults;
+}
+
+bool ConfigModule::defaultsIndicatorsVisible() const
+{
+ return d->_defaultsIndicatorVisible;
+}
+
+void ConfigModule::setDefaultsIndicatorsVisible(bool visible)
+{
+ if (d->_defaultsIndicatorVisible == visible) {
+ return;
+ }
+ d->_defaultsIndicatorVisible = visible;
+ Q_EMIT defaultsIndicatorsVisibleChanged();
+}
+}
+
+#include "moc_configmodule.cpp"
--- /dev/null
+/*
+ This file is part of the KDE libraries
+
+ SPDX-FileCopyrightText: 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
+ SPDX-FileCopyrightText: 2001 Michael Goffioul <kdeprint@swing.be>
+ SPDX-FileCopyrightText: 2004 Frans Englich <frans.englich@telia.com>
+ SPDX-FileCopyrightText: 2009 Dario Freddi <drf@kde.org>
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CONFIGMODULE_H
+#define CONFIGMODULE_H
+
+#include "quickaddons_export.h"
+
+#include <QObject>
+#include <QVariant>
+#include <QtQml>
+
+#include <KPluginMetaData>
+
+class QStringList;
+class KAboutData;
+class QQuickItem;
+class QQmlEngine;
+
+namespace KQuickAddons
+{
+class ConfigModulePrivate;
+
+/**
+ * @class KQuickAddons::ConfigModule configmodule.h KQuickAddons/ConfigModule
+ *
+ * The base class for configuration modules.
+ *
+ * Configuration modules are realized as plugins that are loaded only when
+ * needed.
+ *
+ * The module in principle is a simple widget displaying the
+ * item to be changed. The module has a very small interface.
+ *
+ * All the necessary glue logic and the GUI bells and whistles
+ * are provided by the control center and must not concern
+ * the module author.
+ *
+ * To write a config module, you have to create a C++ library
+ * and an accompaning QML user interface.
+ * The library must contain a factory function like the following:
+ *
+ * \code
+ * #include <KPluginFactory>
+ *
+ * K_PLUGIN_FACTORY(MyConfigModuleFactory, registerPlugin<MyConfigModule>() )
+ * \endcode
+ *
+ * The constructor of the ConfigModule then looks like this:
+ * \code
+ * YourConfigModule::YourConfigModule( QObject* parent )
+ * : ConfigModule( parent )
+ * {
+ * KAboutData *about = new KAboutData(
+ * <kcm name>, i18n( "..." ),
+ * KDE_VERSION_STRING, QString(), KAboutLicense::GPL,
+ * i18n( "Copyright 2006 ..." ) );
+ * about->addAuthor( i18n(...) );
+ * setAboutData( about );
+ * .
+ * .
+ * .
+ * }
+ * \endcode
+ *
+ * The QML part must be in the KPackage format, installed under share/kpackage/kcms.
+ * @see KPackage::Package
+ *
+ * The package must have the same name as the KAboutData componentName, to be installed
+ * by CMake with the command:
+ * \code
+ * kpackage_install_package(packagedir kcm_componentName kcms)
+ * \endcode
+ * The "packagedir" is the subdirectory in the source tree where the package sources are
+ * located, and "kcm_componentName" is the componentname passed to the KAboutData in the
+ * C++ part. Finally "kcms" is the literal string "kcms", so that the package is
+ * installed as a configuration module (and not some other kind of package).
+ * The main config dialog UI will be the file
+ * ui/main.qml from the package (or what X-KPackage-MainScript value is in the
+ * package metadata desktop file).
+ *
+ * The QML part can access all the properties of ConfigModule (together with the properties
+ * defined in its subclass) by accessing to the global object "kcm", or with the
+ * import of "org.kde.kcm 1.0" the ConfigModule attached property.
+ *
+ * \code
+ * import QtQuick 2.1
+ * import QtQuick.Controls 1.0 as QtControls
+ * import org.kde.kcm 1.0
+ * import org.kde.plasma.core 2.0 as PlasmaCore
+ *
+ * Item {
+ * //implicitWidth and implicitHeight will be used as initial size
+ * //when loaded in kcmshell5
+ * implicitWidth: units.gridUnit * 20
+ * implicitHeight: units.gridUnit * 20
+ *
+ * ConfigModule.buttons: ConfigModule.Help|ConfigModule.Apply
+ * Label {
+ * text: kcm.needsSave
+ * }
+ * }
+ * \endcode
+ *
+ * See https://techbase.kde.org/Development/Tutorials/KCM_HowTo
+ * for more detailed documentation.
+ *
+ */
+class QUICKADDONS_EXPORT ConfigModule : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QQuickItem *mainUi READ mainUi CONSTANT)
+ Q_PROPERTY(KQuickAddons::ConfigModule::Buttons buttons READ buttons WRITE setButtons NOTIFY buttonsChanged)
+ Q_PROPERTY(bool needsSave READ needsSave WRITE setNeedsSave NOTIFY needsSaveChanged)
+ Q_PROPERTY(bool representsDefaults READ representsDefaults WRITE setRepresentsDefaults NOTIFY representsDefaultsChanged)
+ Q_PROPERTY(QString name READ name CONSTANT)
+ Q_PROPERTY(QString description READ description CONSTANT)
+ Q_PROPERTY(QString quickHelp READ quickHelp WRITE setQuickHelp NOTIFY quickHelpChanged)
+ Q_PROPERTY(QString rootOnlyMessage READ rootOnlyMessage WRITE setRootOnlyMessage NOTIFY rootOnlyMessageChanged)
+ Q_PROPERTY(bool useRootOnlyMessage READ useRootOnlyMessage WRITE setUseRootOnlyMessage NOTIFY useRootOnlyMessageChanged)
+ Q_PROPERTY(bool needsAuthorization READ needsAuthorization WRITE setNeedsAuthorization NOTIFY needsAuthorizationChanged)
+ Q_PROPERTY(int columnWidth READ columnWidth WRITE setColumnWidth NOTIFY columnWidthChanged)
+ Q_PROPERTY(int depth READ depth NOTIFY depthChanged)
+ Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
+ Q_PROPERTY(int defaultsIndicatorsVisible READ defaultsIndicatorsVisible WRITE setDefaultsIndicatorsVisible NOTIFY defaultsIndicatorsVisibleChanged)
+
+public:
+ /**
+ * An enumeration type for the buttons used by this module.
+ * You should only use Help, Default and Apply. The rest is obsolete.
+ * NoAdditionalButton can be used when we do not want have other button that Ok Cancel
+ *
+ * @see ConfigModule::buttons @see ConfigModule::setButtons
+ */
+ enum Button {
+ NoAdditionalButton = 0,
+ Help = 1,
+ Default = 2,
+ Apply = 4,
+ };
+ Q_ENUM(Button)
+ Q_DECLARE_FLAGS(Buttons, Button)
+ Q_FLAG(Buttons)
+
+ /**
+ * Base class for all KControlModules.
+ *
+ * @note do not emit changed signals here, since they are not yet connected
+ * to any slot.
+ * @param aboutData becomes owned by the ConfigModule
+ */
+ explicit ConfigModule(const KAboutData *aboutData, QObject *parent = nullptr, const QVariantList &args = QVariantList());
+
+ /**
+ * @note do not emit changed signals here, since they are not yet connected
+ * to any slot.
+ * @param metaData description for the plugin: it will generate a KAboutData from that
+ * @since 5.11
+ */
+ explicit ConfigModule(const KPluginMetaData &metaData, QObject *parent = nullptr, const QVariantList &args = QVariantList());
+
+ /**
+ * Base class for all KControlModules.
+ *
+ * @note do not emit changed signals here, since they are not yet connected
+ * to any slot.
+ */
+ explicit ConfigModule(QObject *parent = nullptr, const QVariantList &args = QVariantList());
+
+ /**
+ * Destroys the module.
+ */
+ ~ConfigModule();
+
+ /**
+ * This is generally only called for the KBugReport.
+ * If you override you should have it return a pointer to a constant.
+ *
+ *
+ * @returns the KAboutData for this module
+ */
+ const KAboutData *aboutData() const;
+
+ /**
+ * This sets the KAboutData returned by aboutData()
+ * The about data is now owned by ConfigModule.
+ */
+ void setAboutData(const KAboutData *about);
+
+ /**
+ * @brief Set if the module's save() method requires authorization to be executed
+ *
+ * It will still have to execute the action itself using the KAuth library, so
+ * this method is not technically needed to perform the action, but
+ * using this method will ensure that hosting
+ * applications like System Settings or kcmshell behave correctly.
+ *
+ * @param action the action that will be used by this ConfigModule
+ */
+ void setAuthActionName(const QString &action);
+
+ /**
+ * Returns the action previously set with setAuthActionName(). By default its an invalid action.
+ *
+ * @return The action that has to be authorized to execute the save() method.
+ */
+ QString authActionName() const;
+
+ /**
+ * @return the qml engine that built the main config UI
+ */
+ QQmlEngine *engine() const;
+
+ /**
+ * The status of the mainUi component.
+ * @since 5.64
+ */
+ QQmlComponent::Status status() const;
+
+ /**
+ * The error string in case the mainUi failed to load.
+ * @return 5.64
+ */
+ QString errorString() const;
+
+ // QML property accessors
+
+ /**
+ * @return The main UI for this configuration module. It's a QQuickItem coming from
+ * the QML package named the same as the KAboutData's component name for
+ * this config module
+ */
+ QQuickItem *mainUi();
+
+ /*
+ * @return a subpage at a given depth
+ * @note This does not include the mainUi. i.e a depth of 2 is a mainUi and one subPage
+ * at index 0
+ */
+ QQuickItem *subPage(int index) const;
+
+ /**
+ * Sets the quick help.
+ */
+ void setQuickHelp(const QString &help);
+
+ /**
+ * Return a quick-help text.
+ *
+ * This method is called when the module is docked.
+ * The quick-help text should contain a short description of the module and
+ * links to the module's help files. You can use HTML formatting tags in the text.
+ *
+ * @note make sure the quick help text gets translated (use i18n()).
+ */
+ QString quickHelp() const;
+
+ /**
+ * Set this property to true when the user changes something in the module,
+ * signaling that a save (such as user pressing Ok or Apply) is needed.
+ */
+ void setNeedsSave(bool needs);
+
+ /**
+ * True when the module has something changed and needs save.
+ */
+ bool needsSave();
+
+ /**
+ * Set this property to true when the user sets the state of the module
+ * to the default settings (e.g. clicking Defaults would do nothing).
+ */
+ void setRepresentsDefaults(bool defaults);
+
+ /**
+ * True when the module state represents the default settings.
+ */
+ bool representsDefaults();
+
+ /**
+ * Sets the buttons to display.
+ *
+ * Help: shows a "Help" button.
+ *
+ * Default: shows a "Use Defaults" button.
+ *
+ * Apply: in kcontrol this will show an "Apply" and "Reset" button,
+ * in kcmshell this will show an "Ok", "Apply" and "Cancel" button.
+ *
+ * If Apply is not specified, kcmshell will show a "Close" button.
+ *
+ * @see ConfigModule::buttons
+ */
+ void setButtons(const Buttons btn);
+
+ /**
+ * Indicate which buttons will be used.
+ *
+ * The return value is a value or'ed together from
+ * the Button enumeration type.
+ *
+ * @see ConfigModule::setButtons
+ */
+ Buttons buttons() const;
+
+ /**
+ * Sets the RootOnly message.
+ *
+ * This message will be shown at the top of the module if useRootOnlyMessage is
+ * set. If no message is set, a default one will be used.
+ *
+ * @see ConfigModule::rootOnlyMessage
+ */
+ void setRootOnlyMessage(const QString &message);
+
+ /**
+ * Get the RootOnly message for this module.
+ *
+ * When the module must be run as root, or acts differently
+ * for root and a normal user, it is sometimes useful to
+ * customize the message that appears at the top of the module
+ * when used as a normal user. This function returns this
+ * customized message. If none has been set, a default message
+ * will be used.
+ *
+ * @see ConfigModule::setRootOnlyMessage
+ */
+ QString rootOnlyMessage() const;
+
+ /**
+ * Change whether or not the RootOnly message should be shown.
+ *
+ * Following the value of @p on, the RootOnly message will be
+ * shown or not.
+ *
+ * @see ConfigModule::useRootOnlyMessage
+ */
+ void setUseRootOnlyMessage(bool on);
+
+ /**
+ * Tell if KControl should show a RootOnly message when run as
+ * a normal user.
+ *
+ * In some cases, the module don't want a RootOnly message to
+ * appear (for example if it has already one). This function
+ * tells KControl if a RootOnly message should be shown
+ *
+ * @see ConfigModule::setUseRootOnlyMessage
+ */
+ bool useRootOnlyMessage() const;
+
+ /**
+ * @brief Set if the module's save() method requires authorization to be executed.
+ *
+ * The module can set this property to @c true if it requires authorization.
+ * It will still have to execute the action itself using the KAuth library, so
+ * this method is not technically needed to perform the action, but
+ * using this and/or the setAuthActionName() method will ensure that hosting
+ * applications like System Settings or kcmshell behave correctly.
+ *
+ * Called with @c true, this method will set the action to "org.kde.kcontrol.name.save" where
+ * "name" is aboutData()->appName() return value. This default action won't be set if
+ * the aboutData() object is not valid.
+ *
+ * Note that called with @c false, this method will reset the action name set with setAuthActionName().
+ *
+ * @param needsAuth Tells if the module's save() method requires authorization to be executed.
+ */
+ void setNeedsAuthorization(bool needsAuth);
+
+ /**
+ * Returns the value previously set with setNeedsAuthorization() or setAuthActionName(). By default it's @c false.
+ *
+ * @return @c true if the module's save() method requires authorization, @c false otherwise
+ */
+ bool needsAuthorization() const;
+
+ /**
+ * @returns the name of the config module
+ * @since 5.41
+ */
+ QString name() const;
+
+ /**
+ * @returns the description of the config module
+ * @since 5.41
+ */
+ QString description() const;
+
+ /**
+ * returns the width the kcm wants in column mode.
+ * If a columnWidth is valid ( > 0 ) and less than the systemsettings' view width,
+ * more than one will be visible at once, and the first page will be a sidebar to the last page pushed.
+ * As default, this is -1 which will make the shell always show only one page at a time.
+ * @since 5.50
+ */
+ int columnWidth() const;
+
+ /**
+ * Sets the column width we want.
+ * @since 5.50
+ */
+ void setColumnWidth(int width);
+
+ /**
+ * @returns how many pages this kcm has.
+ * It is guaranteed to be at least 1 (the main ui) plus how many times a new page has been pushed without pop
+ */
+ int depth() const;
+
+ /**
+ * Sets the current page index this kcm should display
+ * @since 5.53
+ */
+ void setCurrentIndex(int index);
+
+ /**
+ * @returns the index of the page this kcm should display
+ * @since 5.53
+ */
+ int currentIndex() const;
+
+ static ConfigModule *qmlAttachedProperties(QObject *object);
+
+ /**
+ * @returns defaultness indicator visibility
+ * @since 5.73
+ */
+ bool defaultsIndicatorsVisible() const;
+
+public Q_SLOTS:
+ /**
+ * Load the configuration data into the module.
+ *
+ * The load method sets the user interface elements of the
+ * module to reflect the current settings stored in the
+ * configuration files.
+ *
+ * This method is invoked whenever the module should read its configuration
+ * (most of the times from a config file) and update the user interface.
+ * This happens when the user clicks the "Reset" button in the control
+ * center, to undo all of his changes and restore the currently valid
+ * settings. It is also called right after construction.
+ */
+ virtual void load();
+
+ /**
+ * Save the configuration data.
+ *
+ * The save method stores the config information as shown
+ * in the user interface in the config files.
+ *
+ * If necessary, this method also updates the running system,
+ * e.g. by restarting applications. This normally does not apply for
+ * KSettings::Dialog modules where the updating is taken care of by
+ * KSettings::Dispatcher.
+ *
+ * save is called when the user clicks "Apply" or "Ok".
+ *
+ */
+ virtual void save();
+
+ /**
+ * Sets the configuration to sensible default values.
+ *
+ * This method is called when the user clicks the "Default"
+ * button. It should set the display to useful values.
+ */
+ virtual void defaults();
+
+ /**
+ * Push a new sub page in the KCM hierarchy: pages will be seen as a Kirigami PageRow
+ * @since 5.50
+ */
+ void push(const QString &fileName, const QVariantMap &propertyMap = QVariantMap());
+
+ /**
+ *
+ */
+ void push(QQuickItem *item);
+
+ /**
+ * pop the last page of the KCM hierarchy
+ * @since 5.50
+ */
+ void pop();
+
+ /**
+ * Ask the shell to show a passive notification
+ * @param message The message text to display
+ * @param timeout (optional) the timeout, either in milliseconds or the strings "short" and "long"
+ * @param actionText (optional) The notification can have a button with this text
+ * @param callBack (optional) If actionText is set and callBack is a JavaScript function, it will be called when the use clicks the button.
+ * @since 5.68
+ */
+ void showPassiveNotification(const QString &message,
+ const QVariant &timeout = QVariant(),
+ const QString &actionText = QString(),
+ const QJSValue &callBack = QJSValue());
+
+ /**
+ * Change defaultness indicator visibility
+ * @param visible
+ * @since 5.73
+ */
+ void setDefaultsIndicatorsVisible(bool visible);
+
+Q_SIGNALS:
+
+ /**
+ * The auth action name has changed: this signal will relay it to the actual KCM
+ */
+ void authActionNameChanged();
+
+ // QML NOTIFY signaling
+ /**
+ * Buttons to display changed.
+ */
+ void buttonsChanged();
+
+ /**
+ * Indicate that the module's quickhelp has changed.
+ *
+ * Emit this signal whenever the module's quickhelp changes.
+ * Modules implemented as tabbed dialogs might want to implement
+ * per-tab quickhelp for example.
+ *
+ */
+ void quickHelpChanged();
+
+ /**
+ * Indicate that the state of the modules contents has changed.
+ *
+ * This signal is emitted whenever the state of the configuration
+ * shown in the module changes. It allows the module container to
+ * keep track of unsaved changes.
+ */
+ void needsSaveChanged();
+
+ /**
+ * Indicate that the state of the modules contents has changed
+ * in a way that it might represents the defaults settings, or
+ * stopped representing them.
+ */
+ void representsDefaultsChanged();
+
+ /**
+ * Emits this signal whenever the need for root authorization to save changes.
+ */
+ void needsAuthorizationChanged();
+
+ /**
+ * Indicate that the module's root message has changed.
+ *
+ * Emits this signal whenever the module's root message changes.
+ *
+ */
+ void rootOnlyMessageChanged();
+
+ /**
+ * Emits this signal whenever the root only message gets used or discarded.
+ */
+ void useRootOnlyMessageChanged();
+
+ /**
+ * Emitted when a new sub page is pushed
+ * @since 5.50
+ */
+ void pagePushed(QQuickItem *page);
+
+ /**
+ * Emitted when a sub page is popped
+ * @since 5.50
+ */
+ // RFC: page argument?
+ void pageRemoved();
+
+ /**
+ * Emitted when the wanted column width of the kcm changes
+ * @since 5.50
+ */
+ void columnWidthChanged(int width);
+
+ /**
+ * Emitted when the current page changed
+ * @since 5.53
+ */
+ void currentIndexChanged(int index);
+
+ /**
+ * Emitted when the number of pages changed
+ * @since 5.53
+ */
+ void depthChanged(int index);
+
+ /**
+ * Emitted when the kcm wants the shell to display a passive notification
+ * @since 5.68
+ */
+ void passiveNotificationRequested(const QString &message, const QVariant &timeout, const QString &actionText, const QJSValue &callBack);
+
+ /**
+ * Emitted when kcm need to display indicators for field with non default value
+ * @since 5.73
+ */
+ void defaultsIndicatorsVisibleChanged();
+
+private:
+ ConfigModulePrivate *const d;
+};
+
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(KQuickAddons::ConfigModule::Buttons)
+QML_DECLARE_TYPEINFO(KQuickAddons::ConfigModule, QML_HAS_ATTACHED_PROPERTIES)
+
+#endif // ConfigModule_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "imagetexturescache.h"
+#include <QSGTexture>
+
+typedef QHash<qint64, QHash<QWindow *, QWeakPointer<QSGTexture>>> TexturesCache;
+
+class ImageTexturesCachePrivate
+{
+public:
+ TexturesCache cache;
+};
+
+ImageTexturesCache::ImageTexturesCache()
+ : d(new ImageTexturesCachePrivate)
+{
+}
+
+ImageTexturesCache::~ImageTexturesCache()
+{
+}
+
+QSharedPointer<QSGTexture> ImageTexturesCache::loadTexture(QQuickWindow *window, const QImage &image, QQuickWindow::CreateTextureOptions options)
+{
+ qint64 id = image.cacheKey();
+ QSharedPointer<QSGTexture> texture = d->cache.value(id).value(window).toStrongRef();
+
+ if (!texture) {
+ auto cleanAndDelete = [this, window, id](QSGTexture *texture) {
+ QHash<QWindow *, QWeakPointer<QSGTexture>> &textures = (d->cache)[id];
+ textures.remove(window);
+ if (textures.isEmpty()) {
+ d->cache.remove(id);
+ }
+ delete texture;
+ };
+ texture = QSharedPointer<QSGTexture>(window->createTextureFromImage(image, options), cleanAndDelete);
+ (d->cache)[id][window] = texture.toWeakRef();
+ }
+
+ // if we have a cache in an atlas but our request cannot use an atlassed texture
+ // create a new texture and use that
+ // don't use removedFromAtlas() as that requires keeping a reference to the non atlased version
+ if (!(options & QQuickWindow::TextureCanUseAtlas) && texture->isAtlasTexture()) {
+ texture = QSharedPointer<QSGTexture>(window->createTextureFromImage(image, options));
+ }
+
+ return texture;
+}
+
+QSharedPointer<QSGTexture> ImageTexturesCache::loadTexture(QQuickWindow *window, const QImage &image)
+{
+ return loadTexture(window, image, QQuickWindow::CreateTextureOptions());
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef IMAGETEXTURESCACHE_H
+#define IMAGETEXTURESCACHE_H
+
+#include <QQuickWindow>
+#include <QSharedPointer>
+
+#include "quickaddons_export.h"
+
+class QImage;
+class QSGTexture;
+class ImageTexturesCachePrivate;
+
+/**
+ * @class ImageTexturesCache imagetexturescache.h KQuickAddons/ImageTexturesCache
+ *
+ * @short Helps to manage textures by creating images and reference counts them.
+ *
+ * Use this class as a factory for textures, when creating them from a QImage
+ * instance.
+ * Keeps track of all the created textures in a map between the QImage::cacheKey() and
+ * the cached texture until it gets de-referenced.
+ *
+ * @see ManagedTextureNode
+ */
+class QUICKADDONS_EXPORT ImageTexturesCache
+{
+public:
+ ImageTexturesCache();
+ ~ImageTexturesCache();
+
+ /**
+ * @returns the texture for a given @p window and @p image.
+ *
+ * If an @p image id is the same as one already provided before, we won't create
+ * a new texture and return a shared pointer to the existing texture.
+ */
+ QSharedPointer<QSGTexture> loadTexture(QQuickWindow *window, const QImage &image, QQuickWindow::CreateTextureOptions options);
+
+ QSharedPointer<QSGTexture> loadTexture(QQuickWindow *window, const QImage &image);
+
+private:
+ QScopedPointer<ImageTexturesCachePrivate> d;
+};
+
+#endif // IMAGETEXTURESCACHE_H
--- /dev/null
+/*
+ This file is part of the KDE libraries
+ SPDX-FileCopyrightText: 2019 Kevin Ottens <kevin.ottens@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "managedconfigmodule.h"
+
+#include <QPointer>
+
+#include <KConfigCore/KCoreConfigSkeleton>
+
+namespace KQuickAddons
+{
+class ManagedConfigModulePrivate
+{
+public:
+ ManagedConfigModulePrivate(ManagedConfigModule *module)
+ : _q(module)
+ {
+ QMetaObject::invokeMethod(_q, "_k_registerSettings", Qt::QueuedConnection);
+ }
+
+ void _k_registerSettings();
+
+ ManagedConfigModule *_q;
+ QList<QPointer<KCoreConfigSkeleton>> _skeletons;
+};
+
+ManagedConfigModule::ManagedConfigModule(const KAboutData *aboutData, QObject *parent, const QVariantList &args)
+ : ConfigModule(aboutData, parent, args)
+ , d(new ManagedConfigModulePrivate(this))
+{
+}
+
+ManagedConfigModule::ManagedConfigModule(const KPluginMetaData &metaData, QObject *parent, const QVariantList &args)
+ : ConfigModule(metaData, parent, args)
+ , d(new ManagedConfigModulePrivate(this))
+{
+}
+
+ManagedConfigModule::ManagedConfigModule(QObject *parent, const QVariantList &args)
+ : ConfigModule(parent, args)
+ , d(new ManagedConfigModulePrivate(this))
+{
+}
+
+ManagedConfigModule::~ManagedConfigModule()
+{
+ delete d;
+}
+
+void ManagedConfigModule::load()
+{
+ for (const auto &skeleton : std::as_const(d->_skeletons)) {
+ if (skeleton) {
+ skeleton->load();
+ }
+ }
+}
+
+void ManagedConfigModule::save()
+{
+ for (const auto &skeleton : std::as_const(d->_skeletons)) {
+ if (skeleton) {
+ skeleton->save();
+ }
+ }
+}
+
+void ManagedConfigModule::defaults()
+{
+ for (const auto &skeleton : std::as_const(d->_skeletons)) {
+ if (skeleton) {
+ skeleton->setDefaults();
+ }
+ }
+}
+
+bool ManagedConfigModule::isSaveNeeded() const
+{
+ return false;
+}
+
+bool ManagedConfigModule::isDefaults() const
+{
+ return true;
+}
+
+void ManagedConfigModulePrivate::_k_registerSettings()
+{
+ const auto skeletons = _q->findChildren<KCoreConfigSkeleton *>();
+ for (auto *skeleton : skeletons) {
+ _q->registerSettings(skeleton);
+ }
+}
+
+void ManagedConfigModule::settingsChanged()
+{
+ bool needsSave = false;
+ bool representsDefaults = true;
+ for (const auto &skeleton : std::as_const(d->_skeletons)) {
+ if (skeleton) {
+ needsSave |= skeleton->isSaveNeeded();
+ representsDefaults &= skeleton->isDefaults();
+ }
+ }
+
+ if (!needsSave) {
+ needsSave = isSaveNeeded();
+ }
+
+ if (representsDefaults) {
+ representsDefaults = isDefaults();
+ }
+
+ setRepresentsDefaults(representsDefaults);
+ setNeedsSave(needsSave);
+}
+
+void ManagedConfigModule::registerSettings(KCoreConfigSkeleton *skeleton)
+{
+ if (!skeleton || d->_skeletons.contains(skeleton)) {
+ return;
+ }
+
+ d->_skeletons.append(skeleton);
+
+ auto settingsChangedSlotIndex = metaObject()->indexOfMethod("settingsChanged()");
+ auto settingsChangedSlot = metaObject()->method(settingsChangedSlotIndex);
+
+ QObject::connect(skeleton, &KCoreConfigSkeleton::configChanged, this, &ManagedConfigModule::settingsChanged);
+
+ const auto items = skeleton->items();
+ for (auto item : items) {
+ const auto itemHasSignals = dynamic_cast<KConfigCompilerSignallingItem *>(item) || dynamic_cast<KPropertySkeletonItem *>(item);
+ if (!itemHasSignals) {
+ continue;
+ }
+
+ auto name = item->name();
+ if (name.at(0).isUpper()) {
+ name[0] = name[0].toLower();
+ }
+
+ const auto metaObject = skeleton->metaObject();
+ const auto propertyIndex = metaObject->indexOfProperty(name.toUtf8().constData());
+ const auto property = metaObject->property(propertyIndex);
+ if (!property.hasNotifySignal()) {
+ continue;
+ }
+
+ const auto changedSignal = property.notifySignal();
+ QObject::connect(skeleton, changedSignal, this, settingsChangedSlot);
+ }
+
+ auto toRemove = std::remove_if(d->_skeletons.begin(), d->_skeletons.end(), [](const QPointer<KCoreConfigSkeleton> &value) {
+ return value.isNull();
+ });
+ d->_skeletons.erase(toRemove, d->_skeletons.end());
+
+ QMetaObject::invokeMethod(this, "settingsChanged", Qt::QueuedConnection);
+}
+
+}
+
+#include "moc_managedconfigmodule.cpp"
--- /dev/null
+/*
+ This file is part of the KDE libraries
+ SPDX-FileCopyrightText: 2019 Kevin Ottens <kevin.ottens@enioka.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef MANAGEDCONFIGMODULE_H
+#define MANAGEDCONFIGMODULE_H
+
+#include <KQuickAddons/ConfigModule>
+
+class KCoreConfigSkeleton;
+
+namespace KQuickAddons
+{
+class ManagedConfigModulePrivate;
+
+/**
+ * @class KQuickAddons::ManagedConfigModule managedconfigmodule.h KQuickAddons/ManagedConfigModule
+ *
+ * The base class for configuration modules using KConfigXT settings.
+ *
+ * Configuration modules are realized as plugins that are loaded only when
+ * needed.
+ *
+ * The module in principle is a simple widget displaying the
+ * item to be changed. The module has a very small interface.
+ *
+ * All the necessary glue logic and the GUI bells and whistles
+ * are provided by the control center and must not concern
+ * the module author.
+ *
+ * To write a config module, you have to create a C++ library
+ * and an accompanying QML user interface.
+ * The library must contain a factory function like the following:
+ *
+ * \code
+ * #include <KPluginFactory>
+ *
+ * K_PLUGIN_FACTORY(MyConfigModuleFactory, registerPlugin<MyConfigModule>() )
+ * \endcode
+ *
+ * The constructor of the ConfigModule then looks like this:
+ * \code
+ * YourConfigModule::YourConfigModule( QObject* parent )
+ * : ManagedConfigModule( parent ),
+ * SettingsObject( this )
+ * {
+ * KAboutData *about = new KAboutData(
+ * <kcm name>, i18n( "..." ),
+ * KDE_VERSION_STRING, QString(), KAboutLicense::GPL,
+ * i18n( "Copyright 2006 ..." ) );
+ * about->addAuthor( i18n(...) );
+ * setAboutData( about );
+ * .
+ * .
+ * .
+ * }
+ * \endcode
+ *
+ * We are assuming here that SettingsObject is a class generated from a kcfg file
+ * and that it will be somehow exposed as a constant property to be used from the QML side.
+ * It will be automatically discovered by ManagedConfigModule which will update
+ * the saveNeeded and defaults inherited properties by itself. Thus by inheriting from
+ * this class you shall not try to manage those properties yourselves.
+ *
+ * The QML part must be in the KPackage format, installed under share/kpackage/kcms.
+ * @see KPackage::Package
+ * The package must have the same name as the KAboutData componentName, to be installed
+ * by CMake with the command:
+ * kpackage_install_package(package kcm_componentName kcms)
+ * given "package" is the subdirectory in the source tree where the package sources are
+ * located, and "kcm_componentName" is the componentname passed to the KAboutData in the
+ * C++ part.
+ * The main config dialog UI will be the file
+ * ui/main.qml from the package (or what X-KPackage-MainScript value is in the
+ * package metadata desktop file).
+ *
+ * The QML part can access all the properties of ManagedConfigModule (together with the properties
+ * defined in its subclass) by accessing to the global object "kcm", or with the
+ * import of "org.kde.kcm 1.0" the ConfigModule attached property.
+ *
+ * \code
+ * import QtQuick 2.1
+ * import QtQuick.Controls 1.0 as QtControls
+ * import org.kde.kcm 1.0
+ * import org.kde.plasma.core 2.0 as PlasmaCore
+ *
+ * Item {
+ * //implicitWidth and implicitHeight will be used as initial size
+ * //when loaded in kcmshell5
+ * implicitWidth: units.gridUnit * 20
+ * implicitHeight: units.gridUnit * 20
+ *
+ * ConfigModule.buttons: ConfigModule.Help|ConfigModule.Apply
+ * Label {
+ * text: kcm.needsSave
+ * }
+ * }
+ * \endcode
+ *
+ * See https://techbase.kde.org/Development/Tutorials/KCM_HowTo
+ * for more detailed documentation.
+ *
+ * @since 5.65
+ */
+class QUICKADDONS_EXPORT ManagedConfigModule : public ConfigModule
+{
+ Q_OBJECT
+public:
+ /**
+ * Base class for all modules which manage automatically some of their state.
+ *
+ * @param aboutData becomes owned by the ManagedConfigModule
+ */
+ explicit ManagedConfigModule(const KAboutData *aboutData, QObject *parent = nullptr, const QVariantList &args = QVariantList());
+
+ /**
+ * @param metaData description for the plugin: it will generate a KAboutData from that
+ */
+ explicit ManagedConfigModule(const KPluginMetaData &metaData, QObject *parent = nullptr, const QVariantList &args = QVariantList());
+
+ /**
+ * Base class for all KControlModules.
+ *
+ * @note do not emit changed signals here, since they are not yet connected
+ * to any slot.
+ */
+ explicit ManagedConfigModule(QObject *parent = nullptr, const QVariantList &args = QVariantList());
+
+ /**
+ * Destroys the module.
+ */
+ ~ManagedConfigModule();
+
+public Q_SLOTS:
+ /**
+ * Load the configuration data into the module.
+ *
+ * This method is invoked whenever the module should read its configuration
+ * (most of the times from a config file) and update the user interface.
+ * This happens when the user clicks the "Reset" button in the control
+ * center, to undo all of his changes and restore the currently valid
+ * settings. It is also called right after construction.
+ *
+ * By default this will load the settings from the child setting objects
+ * of this module.
+ */
+ void load() override;
+
+ /**
+ * Save the configuration data.
+ *
+ * The save method stores the config information as shown
+ * in the user interface in the config files.
+ * It is called when the user clicks "Apply" or "Ok".
+ *
+ * By default this will save the child setting objects
+ * of this module.
+ */
+ void save() override;
+
+ /**
+ * Sets the configuration to sensible default values.
+ *
+ * This method is called when the user clicks the "Default"
+ * button. It should set the display to useful values.
+ *
+ * By default this will reset to defaults the child setting objects
+ * of this module.
+ */
+ void defaults() override;
+
+protected Q_SLOTS:
+ /**
+ * Forces the module to reevaluate the saveNeeded and
+ * representsDefault state.
+ *
+ * This is required for some modules which might have
+ * some settings managed outside of KConfigXT objects.
+ */
+ void settingsChanged();
+
+ /**
+ * Allow to register manually settings class generated from a kcfg file.
+ * Used by derived class when automatic discovery is not possible.
+ * After skeleton is registered it will automatically call settingsChanged().
+ *
+ * @since 5.67
+ */
+ void registerSettings(KCoreConfigSkeleton *skeleton);
+
+private:
+ /**
+ * Allows to indicate if the module requires saving.
+ *
+ * By default this returns false, it needs to be overridden only
+ * if the module has state outside of the settings declared in
+ * the KConfigXT classes it uses.
+ */
+ virtual bool isSaveNeeded() const;
+
+ /**
+ * Allows to indicate if the module state is representing its defaults.
+ *
+ * By default this returns true, it needs to be overridden only
+ * if the module has state outside of the settings declared in
+ * the KConfigXT classes it uses.
+ */
+ virtual bool isDefaults() const;
+
+ Q_PRIVATE_SLOT(d, void _k_registerSettings())
+ ManagedConfigModulePrivate *const d;
+ friend class ManagedConfigModulePrivate;
+};
+
+}
+
+#endif // MANAGEDCONFIGMODULE_H
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "managedtexturenode.h"
+
+ManagedTextureNode::ManagedTextureNode()
+{
+}
+
+void ManagedTextureNode::setTexture(QSharedPointer<QSGTexture> texture)
+{
+ m_texture = texture;
+ QSGSimpleTextureNode::setTexture(texture.data());
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef MANAGEDTEXTURENODE_H
+#define MANAGEDTEXTURENODE_H
+
+#include "quickaddons_export.h"
+#include <QSGSimpleTextureNode>
+#include <QSGTexture>
+#include <QSharedPointer>
+#include <qglobal.h>
+
+/**
+ * @class ManagedTextureNode managedtexturenode.h KQuickAddons/ManagedTextureNode
+ *
+ * @short Node that contains a reference counted texture
+ *
+ * Usually when assigning textures within a node, we'll want to delete the
+ * texture with the node. This class will take a shared texture and display it
+ * within the node.
+ *
+ * It's especially interesting to use this class together with the ImageTexturesCache
+ * that will offer us shareable textures and cache them transparently, when asking
+ * it to create the texture.
+ *
+ * @see ImageTexturesCache
+ */
+
+class QUICKADDONS_EXPORT ManagedTextureNode : public QSGSimpleTextureNode
+{
+ Q_DISABLE_COPY(ManagedTextureNode)
+public:
+ ManagedTextureNode();
+
+ void setTexture(QSharedPointer<QSGTexture> texture);
+
+private:
+ QSharedPointer<QSGTexture> m_texture;
+};
+
+#endif
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2016 David Edmundson <davidedmundson@kde.org>
+ SPDX-FileCopyrightText: 2020 Piotr Henryk Dabrowski <phd@phd.re>
+ SPDX-FileCopyrightText: 2021 David Redondo <kde@david-redondo.de>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "qtquicksettings.h"
+#include "renderersettings.h"
+
+#include <QGuiApplication>
+#include <QLibraryInfo>
+#include <QOffscreenSurface>
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#include <QQuickWindow>
+#include <QSurfaceFormat>
+#include <QVersionNumber>
+
+/**
+ * If QtQuick is configured (QQuickWindow::sceneGraphBackend()) to use the OpenGL backend,
+ * check if it is supported or otherwise reconfigure QtQuick to fallback to software mode.
+ * This function is called by init().
+ *
+ * @returns true if the selected backend is supported, false on fallback to software mode.
+ */
+static bool checkBackend(QOpenGLContext &checkContext)
+{
+ if (!QQuickWindow::sceneGraphBackend().isEmpty()) {
+ return true; // QtQuick is not configured to use the OpenGL backend
+ }
+
+ // kwin wayland has it's own QPA, it is unable to create a GL context at this point.
+ // KF6 TODO, drop this . The issue will be resolved in future kwin releases.
+ QString platformName = qApp->platformName();
+ if (platformName == QLatin1String("wayland-org.kde.kwin.qpa")) {
+ return true;
+ }
+
+#ifdef QT_NO_OPENGL
+ bool ok = false;
+#else
+ bool ok = checkContext.create();
+#endif
+ if (!ok) {
+ qWarning("Warning: fallback to QtQuick software backend.");
+ QQuickWindow::setSceneGraphBackend(QStringLiteral("software"));
+ }
+ return ok;
+}
+
+void KQuickAddons::QtQuickSettings::init()
+{
+ if (!(qobject_cast<QGuiApplication *> qApp)) {
+ qWarning("Error: cannot call KQuickAddons::QtQuickSettings::init() before QGuiApplication is created.");
+ return;
+ }
+
+ PlasmaQtQuickSettings::RendererSettings s;
+ QOpenGLContext checkContext;
+ if (!s.sceneGraphBackend().isEmpty()) {
+ QQuickWindow::setSceneGraphBackend(s.sceneGraphBackend());
+ } else {
+ QQuickWindow::setSceneGraphBackend(QStringLiteral(""));
+ checkBackend(checkContext);
+ }
+
+ if (!qEnvironmentVariableIsSet("QSG_RENDER_LOOP")) {
+ if (!s.renderLoop().isEmpty()) {
+ qputenv("QSG_RENDER_LOOP", s.renderLoop().toLatin1());
+ } else if (QGuiApplication::platformName() == QLatin1String("wayland")) {
+ // Workaround for Bug 432062 / QTBUG-95817
+ QOffscreenSurface surface;
+ surface.create();
+ if (checkContext.makeCurrent(&surface)) {
+ const char *vendor = reinterpret_cast<const char *>(checkContext.functions()->glGetString(GL_VENDOR));
+ if (qstrcmp(vendor, "NVIDIA Corporation") == 0) {
+ // Otherwise Qt Quick Windows break when resized
+ qputenv("QSG_RENDER_LOOP", "basic");
+ }
+ }
+ }
+ }
+
+ auto format = QSurfaceFormat::defaultFormat();
+ if (s.forceGlCoreProfile()) {
+ format.setVersion(3, 2);
+ format.setProfile(QSurfaceFormat::CoreProfile);
+ }
+ // Before Qt 5.12.2 this setting was somewhat unstable
+ // it was opt-in to find bugs both in KDE and Qt
+ // For 5.13 with modern plasma it should be fine
+ if (s.graphicsResetNotifications() || QLibraryInfo::version() >= QVersionNumber(5, 13, 0)) {
+ format.setOption(QSurfaceFormat::ResetNotification);
+ }
+ QSurfaceFormat::setDefaultFormat(format);
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2016 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef PLASMAQTQUICKSETTINGS_H
+#define PLASMAQTQUICKSETTINGS_H
+
+#include "quickaddons_export.h"
+
+namespace KQuickAddons
+{
+/**
+ * @namespace KQuickAddons::QtQuickSettings
+ *
+ * TODO
+ */
+namespace QtQuickSettings
+{
+/**
+ * Load settings from the appConfig (app + kdeglobals) which relate to QtQuick rendering.
+ * This will then set relevant default QWindow and QSurfaceFormat flags, or in some cases environment variables
+ *
+ * This function must be called at the start of your application before any windows are created,
+ * but after an instance of QGuiApplication is already available.
+ *
+ * @since 5.26
+ */
+QUICKADDONS_EXPORT void init();
+
+}
+}
+
+#endif
--- /dev/null
+/*
+ This file is part of the KDE libraries
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "quickviewsharedengine.h"
+
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQuickItem>
+
+#include <KLocalizedString>
+#include <kdeclarative/qmlobjectsharedengine.h>
+
+#include <KPackage/Package>
+#include <KPackage/PackageLoader>
+
+namespace KQuickAddons
+{
+class QuickViewSharedEnginePrivate
+{
+public:
+ QuickViewSharedEnginePrivate(QuickViewSharedEngine *module)
+ : q(module)
+ , resizeMode(QuickViewSharedEngine::ResizeMode::SizeRootObjectToView)
+ , initialSize(0, 0)
+ {
+ qmlObject = new KDeclarative::QmlObjectSharedEngine(q);
+ QObject::connect(qmlObject, &KDeclarative::QmlObject::statusChanged, q, &QuickViewSharedEngine::statusChanged);
+ QObject::connect(qmlObject, SIGNAL(finished()), q, SLOT(executionFinished()));
+ }
+
+ void executionFinished();
+ void syncResizeMode();
+ void syncWidth();
+ void syncHeight();
+
+ QuickViewSharedEngine *q;
+ KDeclarative::QmlObjectSharedEngine *qmlObject;
+ QuickViewSharedEngine::ResizeMode resizeMode;
+ QSize initialSize;
+};
+
+void QuickViewSharedEnginePrivate::executionFinished()
+{
+ if (!qmlObject->rootObject()) {
+ return;
+ }
+
+ QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
+
+ if (!item) {
+ return;
+ }
+
+ item->setParentItem(q->contentItem());
+ initialSize = QSize(item->width(), item->height());
+
+ if (q->size().isEmpty()) {
+ q->resize(initialSize);
+ q->contentItem()->setSize(initialSize);
+ }
+
+ syncResizeMode();
+}
+
+void QuickViewSharedEnginePrivate::syncResizeMode()
+{
+ QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
+
+ if (!item) {
+ return;
+ }
+
+ if (resizeMode == QuickViewSharedEngine::SizeRootObjectToView) {
+ item->setSize(QSize(q->width(), q->height()));
+
+ QObject::disconnect(item, SIGNAL(widthChanged()), q, SLOT(syncWidth()));
+ QObject::disconnect(item, SIGNAL(heightChanged()), q, SLOT(syncHeight()));
+
+ } else {
+ QObject::connect(item, SIGNAL(widthChanged()), q, SLOT(syncWidth()));
+ QObject::connect(item, SIGNAL(heightChanged()), q, SLOT(syncHeight()));
+
+ syncWidth();
+ syncHeight();
+ }
+}
+
+void QuickViewSharedEnginePrivate::syncWidth()
+{
+ QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
+
+ if (!item) {
+ return;
+ }
+
+ q->setWidth(item->width());
+}
+
+void QuickViewSharedEnginePrivate::syncHeight()
+{
+ QQuickItem *item = qobject_cast<QQuickItem *>(qmlObject->rootObject());
+
+ if (!item) {
+ return;
+ }
+
+ q->setHeight(item->height());
+}
+
+QuickViewSharedEngine::QuickViewSharedEngine(QWindow *parent)
+ : QQuickWindow(parent)
+ , d(new QuickViewSharedEnginePrivate(this))
+{
+}
+
+QuickViewSharedEngine::~QuickViewSharedEngine()
+{
+}
+
+void QuickViewSharedEngine::setTranslationDomain(const QString &translationDomain)
+{
+ d->qmlObject->setTranslationDomain(translationDomain);
+}
+
+QString QuickViewSharedEngine::translationDomain() const
+{
+ return d->qmlObject->translationDomain();
+}
+
+QQmlEngine *QuickViewSharedEngine::engine() const
+{
+ return d->qmlObject->engine();
+}
+
+QList<QQmlError> QuickViewSharedEngine::errors() const
+{
+ QList<QQmlError> errs;
+
+ if (d->qmlObject->mainComponent()) {
+ errs = d->qmlObject->mainComponent()->errors();
+ }
+
+ return errs;
+}
+
+QSize QuickViewSharedEngine::sizeHint() const
+{
+ QQuickItem *item = qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
+ if (!item) {
+ return QSize();
+ }
+
+ const QSizeF implicitSize(item->implicitWidth(), item->implicitHeight());
+
+ if (!implicitSize.isEmpty()) {
+ return implicitSize.toSize();
+ }
+
+ return QSize(item->width(), item->height());
+}
+
+QSize QuickViewSharedEngine::initialSize() const
+{
+ return d->initialSize;
+}
+
+QuickViewSharedEngine::ResizeMode QuickViewSharedEngine::resizeMode() const
+{
+ return d->resizeMode;
+}
+
+QQmlContext *QuickViewSharedEngine::rootContext() const
+{
+ return d->qmlObject->rootContext();
+}
+
+QQuickItem *QuickViewSharedEngine::rootObject() const
+{
+ return qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
+}
+
+void QuickViewSharedEngine::setResizeMode(ResizeMode mode)
+{
+ if (d->resizeMode == mode) {
+ return;
+ }
+
+ d->resizeMode = mode;
+
+ Q_EMIT resizeModeChanged(mode);
+
+ QQuickItem *item = qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
+ if (!item) {
+ return;
+ }
+
+ d->syncResizeMode();
+}
+
+void QuickViewSharedEngine::setSource(const QUrl &url)
+{
+ if (d->qmlObject->source() == url) {
+ return;
+ }
+
+ d->qmlObject->setSource(url);
+ Q_EMIT sourceChanged(url);
+}
+
+QUrl QuickViewSharedEngine::source() const
+{
+ return d->qmlObject->source();
+}
+
+QQmlComponent::Status QuickViewSharedEngine::status() const
+{
+ if (!d->qmlObject->mainComponent()) {
+ return QQmlComponent::Null;
+ }
+
+ return QQmlComponent::Status(d->qmlObject->status());
+}
+
+void QuickViewSharedEngine::resizeEvent(QResizeEvent *e)
+{
+ QQuickItem *item = qobject_cast<QQuickItem *>(d->qmlObject->rootObject());
+ if (item && d->resizeMode == SizeRootObjectToView) {
+ item->setSize(e->size());
+ }
+
+ QQuickWindow::resizeEvent(e);
+}
+
+}
+
+#include "moc_quickviewsharedengine.cpp"
--- /dev/null
+/*
+ This file is part of the KDE libraries
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef QUICKVIEWSHAREDENGINE_H
+#define QUICKVIEWSHAREDENGINE_H
+
+#include "quickaddons_export.h"
+
+#include <QQmlComponent>
+#include <QQmlError>
+#include <QQuickWindow>
+#include <QUrl>
+#include <memory>
+
+class QQuickItem;
+class QQmlEngine;
+
+namespace KQuickAddons
+{
+class QuickViewSharedEnginePrivate;
+
+/**
+ * @class KQuickAddons::QuickViewSharedEngine quickviewsharedengine.h KQuickAddons/QuickViewSharedEngine
+ *
+ * TODO
+ */
+class QUICKADDONS_EXPORT QuickViewSharedEngine : public QQuickWindow
+{
+ Q_OBJECT
+
+ Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode NOTIFY resizeModeChanged)
+ Q_PROPERTY(QQmlComponent::Status status READ status NOTIFY statusChanged)
+ Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
+
+public:
+ enum ResizeMode {
+ SizeViewToRootObject,
+ SizeRootObjectToView,
+ };
+ Q_ENUM(ResizeMode)
+
+ explicit QuickViewSharedEngine(QWindow *parent = nullptr);
+ ~QuickViewSharedEngine() override;
+
+ /**
+ * Installs a translation domain for all
+ * i18n global functions. If a translation domain is set all i18n calls delegate to the
+ * matching i18nd calls with the provided translation domain.
+ *
+ * The translationDomain affects all i18n calls including those from imports. Because of
+ * that modules intended to be used as imports should prefer the i18nd variants and set
+ * the translation domain explicitly in each call.
+ *
+ * This method is only required if your declarative usage is inside a library. If it's
+ * in an application there is no need to set the translation domain as the application's
+ * domain can be used.
+ *
+ * @param translationDomain The translation domain to be used for i18n calls.
+ * @since 5.25
+ */
+ void setTranslationDomain(const QString &translationDomain);
+
+ /**
+ * @return the translation domain for the i18n calls done in this QML engine
+ * @since 5.25
+ */
+ QString translationDomain() const;
+
+ QQmlEngine *engine() const;
+ QList<QQmlError> errors() const;
+ QSize sizeHint() const;
+ QSize initialSize() const;
+ QQmlContext *rootContext() const;
+ QQuickItem *rootObject() const;
+ QUrl source() const;
+ QQmlComponent::Status status() const;
+ ResizeMode resizeMode() const;
+ void setResizeMode(ResizeMode);
+
+protected:
+ void resizeEvent(QResizeEvent *e) override;
+
+public Q_SLOTS:
+ void setSource(const QUrl &url);
+
+Q_SIGNALS:
+ void statusChanged(QQmlComponent::Status status);
+ void resizeModeChanged(QuickViewSharedEngine::ResizeMode resizeMode);
+ void sourceChanged(const QUrl &source);
+
+private:
+ const std::unique_ptr<QuickViewSharedEnginePrivate> d;
+
+ Q_PRIVATE_SLOT(d, void executionFinished())
+ Q_PRIVATE_SLOT(d, void syncWidth())
+ Q_PRIVATE_SLOT(d, void syncHeight())
+};
+
+}
+
+#endif // QuickViewSharedEngine_H
--- /dev/null
+<?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 arg="true" />
+ <group name="QtQuickRendererSettings">
+ <entry name="RenderLoop" type="String">
+ <default></default>
+ </entry>
+ <entry name="SceneGraphBackend" type="String">
+ <default></default>
+ </entry>
+ <entry name="ForceGlCoreProfile" type="Bool">
+ <default>false</default>
+ </entry>
+ <entry name="GraphicsResetNotifications" type="Bool">
+ <default>false</default>
+ </entry>
+ </group>
+</kcfg>
--- /dev/null
+File=renderer.kcfg
+NameSpace=PlasmaQtQuickSettings
+ClassName=RendererSettings
+UseEnumTypes=true
--- /dev/null
+include(ECMMarkAsTest)
+
+find_package(Qt5Test REQUIRED)
+
+add_executable(kdeclarativetest kdeclarativetest.cpp)
+
+target_include_directories(kdeclarativetest
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/../src
+ ${CMAKE_CURRENT_BINARY_DIR}/..
+)
+
+ecm_mark_as_test(kdeclarativetest)
+target_link_libraries(kdeclarativetest
+ Qt5::Quick
+ Qt5::Test
+ KF5::Declarative
+)
+
+
+add_executable(qimageitemtest qimageitemtest.cpp)
+
+ecm_mark_as_test(qimageitemtest)
+target_link_libraries(qimageitemtest
+ Qt5::Quick
+ Qt5::Test
+)
+
+if (BUILD_EXAMPLES)
+ kpackage_install_package(helloworld org.kde.example.helloworld genericqml)
+ kpackage_install_package(helloworldnowindow org.kde.example.helloworldnowindow genericqml)
+endif()
+
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.1
+import org.kde.kquickcontrols 2.0
+
+Rectangle {
+ width: 300
+ height: 300
+ color: "white"
+
+ ColorButton {
+ id: btn
+
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.margins: 10
+
+ dialogTitle: "I am title"
+ showAlphaChannel: true
+
+ color: "blue" //a default colour
+ }
+
+
+ Rectangle {
+ anchors.top: parent.top
+ anchors.left: btn.right
+ anchors.margins: 10
+
+ width: 20
+ height: 20
+
+ color: btn.color
+ }
+
+
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.1
+import org.kde.kquickcontrolsaddons 2.0
+
+Rectangle {
+ width: 500
+ height: 500
+ color: "red"
+
+ EventGenerator {
+ id: eventGenerator
+ }
+
+ MouseArea {
+ id: parentMouseArea
+ anchors.fill: parent
+ drag.filterChildren: true
+
+ onPressed: {
+ print("Parent Mouse Pressed");
+ }
+ onPositionChanged: {
+ print("Parent Position changed " + mouse.x + " " + mouse.y);
+ }
+ onReleased: {
+ print("Parent Mouse Released");
+ }
+
+ onPressAndHold: {
+ print("Parent press and hold");
+
+ eventGenerator.sendGrabEvent(childMouseArea, EventGenerator.UngrabMouse);
+ eventGenerator.sendGrabEvent(parentMouseArea, EventGenerator.GrabMouse);
+ eventGenerator.sendMouseEvent(parentMouseArea, EventGenerator.MouseButtonPress, mouse.x, mouse.y, Qt.LeftButton, Qt.LeftButton, 0);
+
+ print("Now Child Position changed events shouldn't appear anymore")
+ }
+
+ MouseArea {
+ id: childMouseArea
+ width: 300
+ height: 300
+ Rectangle {
+ anchors.fill: parent
+ }
+ onPressed: print("Child Mouse Pressed");
+ onPositionChanged: print("Child Position changed " + mouse.x + " " + mouse.y);
+ onReleased: print("Child Mouse Released");
+ }
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.0
+import QtQuick.Controls 1.3
+import QtQuick.Layouts 1.1
+
+ApplicationWindow {
+ width: 300
+ height: 100
+ visible: true
+
+ menuBar: MenuBar {
+ Menu {
+ title: i18n("Menu")
+ MenuItem {
+ text: i18n("item1")
+ }
+ MenuItem {
+ text: i18n("item1")
+ }
+ }
+ }
+
+ toolBar: ToolBar {
+ RowLayout {
+ anchors.fill: parent
+ ToolButton {
+ text: i18n("Button")
+ }
+ }
+ }
+
+ Column {
+ Label {
+ text: i18n("Hello world")
+ }
+ Label {
+ text: commandlineArguments.join(" ")
+ }
+ }
+}
--- /dev/null
+[Desktop Entry]
+Comment=
+Encoding=UTF-8
+Keywords=
+Name=hello world
+Name[ast]=hola mundiu
+Name[ca]=hola món
+Name[ca@valencia]=hola món
+Name[cs]=hello world
+Name[da]=Hej verden
+Name[de]=Hallo Welt
+Name[el]=hello world
+Name[en_GB]=hello world
+Name[es]=hola mundo
+Name[fi]=hei maailma
+Name[gd]=shin thu, a shaoghail
+Name[gl]=Ola, mundo!
+Name[he]=שלום עולם
+Name[hu]=Helló világ!
+Name[it]=ciao mondo
+Name[ko]=hello world
+Name[nb]=hallo verden
+Name[nl]=hallo wereld
+Name[nn]=hei verda
+Name[pl]=witaj świecie
+Name[pt]=olá mundo
+Name[pt_BR]=Olá mundo
+Name[ru]=Здравствуй, мир!
+Name[sk]=ahoj svet
+Name[sl]=pozdravljen svet
+Name[sr]=Здраво свете
+Name[sr@ijekavian]=Здраво свете
+Name[sr@ijekavianlatin]=Zdravo svete
+Name[sr@latin]=Zdravo svete
+Name[sv]=hello world
+Name[tr]=merhaba dünya
+Name[uk]=Привіт, світе
+Name[x-test]=xxhello worldxx
+Name[zh_CN]=你好世界
+Name[zh_TW]=hello world
+Type=Application
+Icon=package_toys
+Exec=kpackagelauncherqml -a org.kde.example.helloworld
+X-KDE-ParentApp=
+X-KDE-PluginInfo-Author=Marco Martin
+X-KDE-PluginInfo-Category=Miscellaneous
+X-KDE-PluginInfo-Email=mart@kde.org
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-Name=org.kde.example.helloworld
+X-KDE-PluginInfo-Version=
+X-KDE-PluginInfo-Website=
+X-KDE-ServiceTypes=KPackage/GenericQML
+
+X-Plasma-MainScript=ui/main.qml
+X-Plasma-RemoteLocation=
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.0
+import QtQuick.Controls 1.3
+import QtQuick.Layouts 1.1
+
+Item {
+ implicitWidth: 300
+ implicitHeight: 100
+ visible: true
+
+ Column {
+ Label {
+ text: i18n("Hello world")
+ }
+ Label {
+ text: commandlineArguments.join(" ")
+ }
+ }
+}
--- /dev/null
+[Desktop Entry]
+Comment=
+Encoding=UTF-8
+Keywords=
+Name=hello world
+Name[ast]=hola mundiu
+Name[ca]=hola món
+Name[ca@valencia]=hola món
+Name[cs]=hello world
+Name[da]=Hej verden
+Name[de]=Hallo Welt
+Name[el]=hello world
+Name[en_GB]=hello world
+Name[es]=hola mundo
+Name[fi]=hei maailma
+Name[gd]=shin thu, a shaoghail
+Name[gl]=Ola, mundo!
+Name[he]=שלום עולם
+Name[hu]=Helló világ!
+Name[it]=ciao mondo
+Name[ko]=hello world
+Name[nb]=hallo verden
+Name[nl]=hallo wereld
+Name[nn]=hei verda
+Name[pl]=witaj świecie
+Name[pt]=olá mundo
+Name[pt_BR]=Olá mundo
+Name[ru]=Здравствуй, мир!
+Name[sk]=ahoj svet
+Name[sl]=pozdravljen svet
+Name[sr]=Здраво свете
+Name[sr@ijekavian]=Здраво свете
+Name[sr@ijekavianlatin]=Zdravo svete
+Name[sr@latin]=Zdravo svete
+Name[sv]=hello world
+Name[tr]=merhaba dünya
+Name[uk]=Привіт, світе
+Name[x-test]=xxhello worldxx
+Name[zh_CN]=你好世界
+Name[zh_TW]=hello world
+Type=Application
+Icon=package_toys
+Exec=kpackagelauncherqml -a org.kde.example.helloworldnowindow
+X-KDE-ParentApp=
+X-KDE-PluginInfo-Author=Marco Martin
+X-KDE-PluginInfo-Category=Miscellaneous
+X-KDE-PluginInfo-Email=mart@kde.org
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-Name=org.kde.example.helloworldnowindow
+X-KDE-PluginInfo-Version=
+X-KDE-PluginInfo-Website=
+X-KDE-ServiceTypes=KPackage/GenericQML
+
+X-Plasma-MainScript=ui/main.qml
+X-Plasma-RemoteLocation=
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.3
+import QtQuick.Layouts 1.1
+
+import org.kde.kquickcontrolsaddons 2.0
+
+RowLayout {
+ spacing: 10
+
+ IconDialog {
+ id: iconDialog
+ iconSize: Number(iconSizeInput.text)
+ title: dialogTitleInput.text
+ user: userCheckbox.checked
+ customLocation: customLocationField.text
+ modality: {
+ switch(modalityCombo.currentIndex) {
+ case 0: return Qt.WindowModal
+ case 1: return Qt.ApplicationModal
+ case 2: return Qt.NonModal
+ }
+ }
+ }
+
+ Button {
+ Layout.minimumWidth: 80
+ Layout.maximumWidth: Layout.minimumWidth
+ Layout.minimumHeight: Layout.minimumWidth
+ Layout.maximumHeight: Layout.minimumWidth
+ iconName: iconDialog.iconName
+ onClicked: iconDialog.open()
+ }
+
+ GridLayout {
+ Layout.fillWidth: true
+ columns: 2
+
+ Label {
+ Layout.columnSpan: 2
+ font.pointSize: Math.round(someLabel.font.pointSize * 1.2)
+ text: "Push the button to open the icon dialog"
+ }
+
+ Label {
+ id: someLabel
+ text: "Dialog visible:"
+ }
+ Label {
+ text: iconDialog.visible ? "yes" : "no"
+ }
+
+ Label {
+ text: "Selected icon:"
+ }
+ Label {
+ text: iconDialog.iconName || "(none)"
+ }
+
+ Label {
+ text: "Desired icon size (blank = default):"
+ }
+ TextField {
+ id: iconSizeInput
+ text: ""
+ }
+
+ Label {
+ text: "Dialog title:"
+ }
+ TextField {
+ id: dialogTitleInput
+ Layout.minimumWidth: 250
+ }
+
+ Label {
+ Layout.columnSpan: 2
+ Layout.fillWidth: true
+ font.pointSize: Math.round(someLabel.font.pointSize / 1.2)
+ opacity: 0.6
+ wrapMode: Text.WordWrap
+ text: "Not setting a title at all will default to 'Choose Icon' "
+ + "whereas explicitly setting it to empty (which we do here) "
+ + "will default to the application name"
+ }
+
+ CheckBox {
+ id: userCheckbox
+ Layout.columnSpan: 2
+ text: "Begin with user icons rather than system icons"
+ }
+
+ Label {
+ text: "Custom search location"
+ }
+
+ TextField {
+ id: customLocationField
+ Layout.minimumWidth: 250
+ }
+
+ Label {
+ Layout.columnSpan: 2
+ Layout.fillWidth: true
+ font.pointSize: Math.round(someLabel.font.pointSize / 1.2)
+ opacity: 0.6
+ wrapMode: Text.WordWrap
+ text: "This needs to be a URL to a local folder. You should enable "
+ + "'Begin with user icons' when setting this"
+ }
+
+ Label {
+ text: "Modality"
+ }
+
+ ComboBox {
+ id: modalityCombo
+ Layout.minimumWidth: 250
+ model: ["Window modal (default)", "Application modal", "Non-modal"]
+ }
+
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QGuiApplication>
+#include <QQmlContext>
+#include <QQuickView>
+
+#include <kdeclarative/kdeclarative.h>
+
+#include <qtestcase.h>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQuickView view;
+ QQmlContext *context = view.rootContext();
+ context->setContextProperty(QStringLiteral("backgroundColor"), QColor(Qt::yellow));
+
+ KDeclarative::KDeclarative::setupEngine(view.engine());
+ KDeclarative::KDeclarative kdeclarative;
+ kdeclarative.setDeclarativeEngine(view.engine());
+
+ view.setSource(QUrl::fromLocalFile(QFINDTESTDATA("test.qml")));
+ view.show();
+
+ return app.exec();
+}
--- /dev/null
+import QtQuick 2.0
+import QtQuick.Controls 1.1
+
+import org.kde.kquickcontrols 2.0
+import QtQuick.Layouts 1.1
+
+RowLayout {
+
+ KeySequenceItem
+ {
+ id: sequenceItem
+
+ }
+ Text
+ {
+ text: sequenceItem.keySequence
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import org.kde.qtextracomponents 2.0
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+
+
+Item
+{
+ width: 800
+ height: 400
+ Row {
+ anchors.fill: parent
+ MouseEventListener {
+ width: 400
+ height: 400
+ id: mouseListener
+ acceptedButtons: Qt.LeftButton
+ hoverEnabled: true
+ onPressed: {
+ updateDebug("Pressed", mouse);
+ }
+ onPressAndHold: {
+ updateDebug("Held", mouse);
+ }
+ onReleased: {
+ mouseState.text = "";
+ mousePos.text = "";
+ screenPos.text = "";
+ }
+
+ function updateDebug(state, mouse) {
+ mouseState.text = state
+ mousePos.text = mouse.x + "," + mouse.y
+ screenPos.text = mouse.screenX + "," + mouse.screenY
+ }
+
+ Rectangle {
+ color: "red"
+ anchors.fill: parent
+
+ //MouseEventListener should still get events, even though this has a mousearea
+ MouseArea {
+ anchors.fill: parent
+ }
+ }
+ }
+
+ GridLayout {
+ width: 400
+ columns: 2
+ Text {
+ text: "Mouse status:"
+ }
+ Text {
+ id: mouseState
+ }
+ Text {
+ text: "Contains Mouse: "
+ }
+ Text {
+ text: mouseListener.containsMouse
+ }
+ Text {
+ text: "Mouse Position: "
+ }
+ Text {
+ id: mousePos
+ }
+ Text {
+ text: "Screen Position: "
+ }
+ Text {
+ id: screenPos
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
+ SPDX-FileCopyrightText: 2015 David Edmundson <davidedmundson@kde.org>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.0
+import QtQuick.Controls 1.3
+
+import org.kde.kquickcontrolsaddons 2.0
+
+Item {
+ width: 500
+ height: 200
+
+ Plotter {
+ id: renderer
+ anchors.fill: parent
+ anchors.margins: 0
+ stacked: stackedButton.checked
+ autoRange: autoRangeButton.checked
+ horizontalGridLineCount: linesSpinner.value
+
+ dataSets: [
+ PlotData {
+ color: "#4cb2ff"
+ },
+ PlotData {
+ color: "#00b200"
+ }
+ ]
+
+ }
+ Row {
+ Button {
+ text: "Add values"
+ checkable: true
+ Timer {
+ interval: 100
+ running: parent.checked
+ repeat: true
+ onTriggered: {
+ renderer.addSample([Math.random() * 40, Math.random() * 40])
+ }
+ }
+ }
+
+ Button {
+ id: stackedButton
+ text: "Stacked"
+ checkable: true
+ checked: true
+ }
+ Button {
+ id: autoRangeButton
+ text: "Auto Range"
+ checkable: true
+ checked: true
+ }
+
+ SpinBox {
+ id: linesSpinner
+ value: 5
+ minimumValue: 0
+ }
+ }
+}
--- /dev/null
+import org.kde.kquickcontrolsaddons 2.0
+import QtQuick 2.2
+import QtQuick.Controls 1.3
+import QtQuick.Layouts 1.1
+
+
+Rectangle {
+ color: "white"
+ width: 400
+ height: 400
+
+ QIconItem {
+ id: anIcon
+ icon: "rating"
+ width: 8
+ height: 8
+ }
+
+ Button {
+ anchors.bottom: parent.bottom
+ text: "Resize"
+ onClicked: {
+ anIcon.width += 4
+ anIcon.height += 4
+ }
+ }
+}
--- /dev/null
+import org.kde.kquickcontrolsaddons 2.0
+import QtQuick 2.2
+
+GridView {
+ width: 300
+ cellWidth: 16
+ cellHeight: 16
+
+ model: 50000
+ delegate: QIconItem {
+ width: 16
+ height: 16
+ icon: "rating"
+ }
+}
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QGuiApplication>
+#include <QQmlContext>
+#include <QQuickView>
+
+#include <qtestcase.h>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+ app.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
+
+ QQuickView view;
+ QQmlContext *context = view.rootContext();
+
+ QImage image;
+ if (app.devicePixelRatio() < 2) {
+ image = QImage(QFINDTESTDATA("testimage.png"));
+ } else {
+ image = QImage(QFINDTESTDATA("testimage@2x.png"));
+ image.setDevicePixelRatio(2);
+ }
+
+ context->setContextProperty(QStringLiteral("testImage"), image);
+
+ view.setSource(QUrl::fromLocalFile(QFINDTESTDATA("qimageitemtest.qml")));
+ view.show();
+
+ return app.exec();
+}
--- /dev/null
+import QtQuick 2.0
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 1.1
+import org.kde.kquickcontrolsaddons 2.0 as KQCA
+
+//this file should be used via qimageitemtest executable
+//unless you want to test isNull
+
+Rectangle {
+ color: "white"
+ width: 500
+ height: 500
+
+ RowLayout {
+ anchors.fill: parent
+ KQCA.QImageItem {
+ implicitWidth: 300
+ implicitHeight: 300
+
+ id: image
+ image: testImage
+ fillMode: fillModeCombo.currentIndex
+ }
+ GridLayout {
+ columns: 2
+ Text {text: "fillMode"}
+ ComboBox {
+ id: fillModeCombo
+ model: ListModel{
+ ListElement {
+ display: "Stretch"
+ }
+ ListElement {
+ display: "PreserveAspectFit"
+ }ListElement {
+ display: "PreserveAspectCrop"
+ }ListElement {
+ display: "Tile"
+ }ListElement {
+ display: "TileVertically"
+ }
+ ListElement {
+ display: "TileHorizontally"
+ }
+ }
+ }
+
+ Text {text: "isNull:"}
+ Text {text: image.null}
+ Text {text: "nativeWidth:"}
+ Text {text: image.nativeWidth}
+ Text {text: "nativeHeight:"}
+ Text {text: image.nativeHeight}
+ Text {text: "paintedWidth:"}
+ Text {text: image.paintedWidth}
+ Text {text: "paintedHeight:"}
+ Text {text: image.paintedHeight}
+
+ Text {text: "rect size is 300x300"}
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2011 Marco Martin <mart@gmail.com>
+
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.1
+
+Rectangle {
+ width: 300
+ height: 300
+ color: "red"
+
+ Text {
+ anchors.fill: parent
+ text: i18n("Hello")
+ }
+}