From 8d9b2d2e9f642dd75ec525f86f19e015aede0e44 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 13 Jan 2021 01:32:41 +0000 Subject: [PATCH] Import kdeclarative_5.78.0.orig.tar.xz [dgit import orig kdeclarative_5.78.0.orig.tar.xz] --- .gitignore | 22 + CMakeLists.txt | 146 +++ KF5DeclarativeConfig.cmake.in | 10 + LICENSES/GPL-2.0-only.txt | 319 ++++++ LICENSES/GPL-2.0-or-later.txt | 319 ++++++ LICENSES/GPL-3.0-only.txt | 625 ++++++++++++ LICENSES/LGPL-2.0-or-later.txt | 446 +++++++++ LICENSES/LGPL-2.1-only.txt | 467 +++++++++ LICENSES/LGPL-2.1-or-later.txt | 468 +++++++++ LICENSES/LGPL-3.0-only.txt | 163 +++ LICENSES/LicenseRef-KDE-Accepted-GPL.txt | 12 + LICENSES/LicenseRef-KDE-Accepted-LGPL.txt | 12 + LICENSES/LicenseRef-Qt-Commercial.txt | 7 + LICENSES/MIT.txt | 19 + LICENSES/Qt-LGPL-exception-1.1.txt | 21 + README.md | 35 + autotests/CMakeLists.txt | 17 + autotests/columnproxymodeltest.cpp | 78 ++ autotests/columnproxymodeltest.h | 21 + autotests/data/resizemodeitem.qml | 5 + autotests/quickviewsharedengine.cpp | 187 ++++ autotests/util.cpp | 100 ++ autotests/util.h | 75 ++ docs/Doxyfile.local | 11 + metainfo.yaml | 21 + po/af/kdeclarative5.po | 101 ++ po/ar/kdeclarative5.po | 123 +++ po/as/kdeclarative5.po | 102 ++ po/az/kdeclarative5.po | 106 ++ po/be/kdeclarative5.po | 117 +++ po/be@latin/kdeclarative5.po | 106 ++ po/bg/kdeclarative5.po | 103 ++ po/bn/kdeclarative5.po | 107 ++ po/bn_IN/kdeclarative5.po | 103 ++ po/br/kdeclarative5.po | 105 ++ po/bs/kdeclarative5.po | 123 +++ po/ca/kdeclarative5.po | 116 +++ po/ca@valencia/kdeclarative5.po | 115 +++ po/crh/kdeclarative5.po | 105 ++ po/cs/kdeclarative5.po | 109 +++ po/csb/kdeclarative5.po | 106 ++ po/cy/kdeclarative5.po | 118 +++ po/da/kdeclarative5.po | 108 ++ po/de/kdeclarative5.po | 115 +++ po/el/kdeclarative5.po | 120 +++ po/en_GB/kdeclarative5.po | 107 ++ po/eo/kdeclarative5.po | 119 +++ po/es/kdeclarative5.po | 116 +++ po/et/kdeclarative5.po | 109 +++ po/eu/kdeclarative5.po | 113 +++ po/fa/kdeclarative5.po | 109 +++ po/fi/kdeclarative5.po | 126 +++ po/fr/kdeclarative5.po | 127 +++ po/fy/kdeclarative5.po | 112 +++ po/ga/kdeclarative5.po | 118 +++ po/gd/kdeclarative5.po | 111 +++ po/gl/kdeclarative5.po | 117 +++ po/gu/kdeclarative5.po | 105 ++ po/ha/kdeclarative5.po | 99 ++ po/he/kdeclarative5.po | 120 +++ po/hi/kdeclarative5.po | 106 ++ po/hne/kdeclarative5.po | 106 ++ po/hr/kdeclarative5.po | 126 +++ po/hsb/kdeclarative5.po | 109 +++ po/hu/kdeclarative5.po | 106 ++ po/hy/kdeclarative5.po | 117 +++ po/ia/kdeclarative5.po | 109 +++ po/id/kdeclarative5.po | 109 +++ po/is/kdeclarative5.po | 128 +++ po/it/kdeclarative5.po | 116 +++ po/ja/kdeclarative5.po | 116 +++ po/ka/kdeclarative5.po | 103 ++ po/kk/kdeclarative5.po | 121 +++ po/km/kdeclarative5.po | 111 +++ po/kn/kdeclarative5.po | 107 ++ po/ko/kdeclarative5.po | 106 ++ po/ku/kdeclarative5.po | 117 +++ po/lb/kdeclarative5.po | 103 ++ po/lt/kdeclarative5.po | 114 +++ po/lv/kdeclarative5.po | 120 +++ po/mai/kdeclarative5.po | 107 ++ po/mk/kdeclarative5.po | 126 +++ po/ml/kdeclarative5.po | 105 ++ po/mr/kdeclarative5.po | 106 ++ po/ms/kdeclarative5.po | 116 +++ po/nb/kdeclarative5.po | 115 +++ po/nds/kdeclarative5.po | 111 +++ po/ne/kdeclarative5.po | 113 +++ po/nl/kdeclarative5.po | 126 +++ po/nn/kdeclarative5.po | 111 +++ po/oc/kdeclarative5.po | 101 ++ po/or/kdeclarative5.po | 107 ++ po/pa/kdeclarative5.po | 114 +++ po/pl/kdeclarative5.po | 203 ++++ po/ps/kdeclarative5.po | 103 ++ po/pt/kdeclarative5.po | 197 ++++ po/pt_BR/kdeclarative5.po | 118 +++ po/ro/kdeclarative5.po | 109 +++ po/ru/kdeclarative5.po | 128 +++ po/se/kdeclarative5.po | 110 +++ po/si/kdeclarative5.po | 103 ++ po/sk/kdeclarative5.po | 117 +++ po/sl/kdeclarative5.po | 123 +++ po/sq/kdeclarative5.po | 101 ++ po/sr/kdeclarative5.po | 121 +++ po/sr@ijekavian/kdeclarative5.po | 120 +++ po/sr@ijekavianlatin/kdeclarative5.po | 120 +++ po/sr@latin/kdeclarative5.po | 120 +++ po/sv/kdeclarative5.po | 118 +++ po/ta/kdeclarative5.po | 114 +++ po/te/kdeclarative5.po | 109 +++ po/tg/kdeclarative5.po | 111 +++ po/th/kdeclarative5.po | 115 +++ po/tr/kdeclarative5.po | 124 +++ po/tt/kdeclarative5.po | 112 +++ po/ug/kdeclarative5.po | 113 +++ po/uk/kdeclarative5.po | 113 +++ po/uz/kdeclarative5.po | 102 ++ po/uz@cyrillic/kdeclarative5.po | 102 ++ po/vi/kdeclarative5.po | 111 +++ po/wa/kdeclarative5.po | 108 ++ po/xh/kdeclarative5.po | 108 ++ po/zh_CN/kdeclarative5.po | 116 +++ po/zh_HK/kdeclarative5.po | 129 +++ po/zh_TW/kdeclarative5.po | 114 +++ src/CMakeLists.txt | 42 + src/Messages.sh | 18 + src/calendarevents/CMakeLists.txt | 33 + .../CalendarEventsConfig.cmake.in | 6 + src/calendarevents/calendareventsplugin.cpp | 24 + src/calendarevents/calendareventsplugin.h | 245 +++++ src/calendarevents/eventdata_p.cpp | 157 +++ src/kdeclarative/CMakeLists.txt | 77 ++ src/kdeclarative/configpropertymap.cpp | 160 +++ src/kdeclarative/configpropertymap.h | 83 ++ src/kdeclarative/kdeclarative.cpp | 180 ++++ src/kdeclarative/kdeclarative.h | 211 ++++ src/kdeclarative/private/kdeclarative_p.h | 32 + src/kdeclarative/private/kiconprovider.cpp | 61 ++ src/kdeclarative/private/kiconprovider_p.h | 24 + .../private/kioaccessmanagerfactory.cpp | 26 + .../private/kioaccessmanagerfactory_p.h | 24 + src/kdeclarative/qmlobject.cpp | 364 +++++++ src/kdeclarative/qmlobject.h | 247 +++++ src/kdeclarative/qmlobjectsharedengine.cpp | 68 ++ src/kdeclarative/qmlobjectsharedengine.h | 50 + src/kpackagelauncherqml/CMakeLists.txt | 21 + src/kpackagelauncherqml/main.cpp | 123 +++ src/qmlcontrols/CMakeLists.txt | 25 + src/qmlcontrols/draganddrop/CMakeLists.txt | 22 + .../draganddrop/DeclarativeDragArea.cpp | 370 +++++++ .../draganddrop/DeclarativeDragArea.h | 155 +++ .../draganddrop/DeclarativeDragDropEvent.cpp | 54 + .../draganddrop/DeclarativeDragDropEvent.h | 105 ++ .../draganddrop/DeclarativeDropArea.cpp | 149 +++ .../draganddrop/DeclarativeDropArea.h | 96 ++ .../draganddrop/DeclarativeMimeData.cpp | 152 +++ .../draganddrop/DeclarativeMimeData.h | 100 ++ src/qmlcontrols/draganddrop/Mainpage.dox | 15 + .../draganddrop/MimeDataWrapper.cpp | 77 ++ src/qmlcontrols/draganddrop/MimeDataWrapper.h | 92 ++ .../draganddrop/draganddropplugin.cpp | 26 + .../draganddrop/draganddropplugin.h | 21 + src/qmlcontrols/draganddrop/qmldir | 3 + src/qmlcontrols/kcmcontrols/CMakeLists.txt | 22 + .../kcmcontrols/kcmcontrolsplugin.cpp | 22 + .../kcmcontrols/kcmcontrolsplugin.h | 21 + .../kcmcontrols/qml/AbstractKCM.qml | 93 ++ .../kcmcontrols/qml/GridDelegate.qml | 202 ++++ src/qmlcontrols/kcmcontrols/qml/GridView.qml | 47 + .../kcmcontrols/qml/GridViewKCM.qml | 69 ++ .../kcmcontrols/qml/ScrollView.qml | 48 + .../kcmcontrols/qml/ScrollViewKCM.qml | 42 + .../kcmcontrols/qml/SettingHighlighter.qml | 44 + .../kcmcontrols/qml/SettingStateBinding.qml | 95 ++ src/qmlcontrols/kcmcontrols/qml/SimpleKCM.qml | 96 ++ .../qml/private/GridViewInternal.qml | 60 ++ src/qmlcontrols/kcmcontrols/qml/qmldir | 12 + .../kcmcontrols/settinghighlighterprivate.cpp | 128 +++ .../kcmcontrols/settinghighlighterprivate.h | 48 + .../kcmcontrols/settingshighlighterprivate.h | 0 .../kcmcontrols/settingstateproxy.cpp | 123 +++ .../kcmcontrols/settingstateproxy.h | 77 ++ src/qmlcontrols/kconfig/CMakeLists.txt | 18 + src/qmlcontrols/kconfig/kauthorizedproxy.cpp | 29 + src/qmlcontrols/kconfig/kauthorizedproxy.h | 30 + src/qmlcontrols/kconfig/kconfigplugin.cpp | 23 + src/qmlcontrols/kconfig/kconfigplugin.h | 19 + src/qmlcontrols/kconfig/qmldir | 2 + src/qmlcontrols/kcoreaddons/CMakeLists.txt | 20 + src/qmlcontrols/kcoreaddons/formats.cpp | 48 + src/qmlcontrols/kcoreaddons/formats.h | 102 ++ .../kcoreaddons/kcoreaddonsplugin.cpp | 35 + .../kcoreaddons/kcoreaddonsplugin.h | 21 + src/qmlcontrols/kcoreaddons/kuserproxy.cpp | 125 +++ src/qmlcontrols/kcoreaddons/kuserproxy.h | 116 +++ src/qmlcontrols/kcoreaddons/qmldir | 3 + src/qmlcontrols/kioplugin/CMakeLists.txt | 19 + src/qmlcontrols/kioplugin/kioplugin.cpp | 18 + src/qmlcontrols/kioplugin/kioplugin.h | 21 + src/qmlcontrols/kioplugin/krunproxy.cpp | 60 ++ src/qmlcontrols/kioplugin/krunproxy.h | 33 + src/qmlcontrols/kioplugin/qmldir | 3 + src/qmlcontrols/kquickcontrols/CMakeLists.txt | 8 + .../kquickcontrols/ColorButton.qml | 112 +++ .../kquickcontrols/KeySequenceItem.qml | 114 +++ src/qmlcontrols/kquickcontrols/README | 1 + .../kquickcontrols/private/CMakeLists.txt | 25 + .../private/keysequencehelper.cpp | 207 ++++ .../private/keysequencehelper.h | 75 ++ .../private/kquickcontrolsprivateplugin.cpp | 24 + .../private/kquickcontrolsprivateplugin.h | 21 + src/qmlcontrols/kquickcontrols/private/qmldir | 2 + .../private/translationcontext.cpp | 222 +++++ .../private/translationcontext.h | 44 + src/qmlcontrols/kquickcontrols/qmldir | 4 + .../kquickcontrolsaddons/CMakeLists.txt | 39 + .../kquickcontrolsaddons/Mainpage.dox | 14 + .../kquickcontrolsaddons/clipboard.cpp | 116 +++ .../kquickcontrolsaddons/clipboard.h | 59 ++ .../kquickcontrolsaddons/columnproxymodel.cpp | 233 +++++ .../kquickcontrolsaddons/columnproxymodel.h | 62 ++ .../config-kquickcontrolsaddons.h.cmake | 2 + .../kquickcontrolsaddons/eventgenerator.cpp | 131 +++ .../kquickcontrolsaddons/eventgenerator.h | 75 ++ .../fallbacktaphandler.cpp | 112 +++ .../kquickcontrolsaddons/fallbacktaphandler.h | 59 ++ .../kquickcontrolsaddons/icondialog.cpp | 172 ++++ .../kquickcontrolsaddons/icondialog.h | 99 ++ .../kquickcontrolsaddons/kcmshell.cpp | 72 ++ .../kquickcontrolsaddons/kcmshell.h | 75 ++ .../kquickcontrolsaddonsplugin.cpp | 63 ++ .../kquickcontrolsaddonsplugin.h | 24 + .../kquickcontrolsaddons/mimedatabase.cpp | 42 + .../kquickcontrolsaddons/mimedatabase.h | 26 + .../mouseeventlistener.cpp | 397 ++++++++ .../kquickcontrolsaddons/mouseeventlistener.h | 232 +++++ .../kquickcontrolsaddons/plotter.cpp | 924 ++++++++++++++++++ .../kquickcontrolsaddons/plotter.h | 252 +++++ .../kquickcontrolsaddons/qiconitem.cpp | 159 +++ .../kquickcontrolsaddons/qiconitem.h | 70 ++ .../kquickcontrolsaddons/qimageitem.cpp | 195 ++++ .../kquickcontrolsaddons/qimageitem.h | 84 ++ src/qmlcontrols/kquickcontrolsaddons/qmldir | 2 + .../kquickcontrolsaddons/qpixmapitem.cpp | 200 ++++ .../kquickcontrolsaddons/qpixmapitem.h | 84 ++ .../kwindowsystemplugin/CMakeLists.txt | 17 + .../kwindowsystemplugin.cpp | 18 + .../kwindowsystemplugin/kwindowsystemplugin.h | 21 + .../kwindowsystemproxy.cpp | 139 +++ .../kwindowsystemplugin/kwindowsystemproxy.h | 157 +++ src/qmlcontrols/kwindowsystemplugin/qmldir | 3 + src/quickaddons/CMakeLists.txt | 85 ++ src/quickaddons/configmodule.cpp | 499 ++++++++++ src/quickaddons/configmodule.h | 626 ++++++++++++ src/quickaddons/imagetexturescache.cpp | 57 ++ src/quickaddons/imagetexturescache.h | 52 + src/quickaddons/managedconfigmodule.cpp | 169 ++++ src/quickaddons/managedconfigmodule.h | 221 +++++ src/quickaddons/managedtexturenode.cpp | 16 + src/quickaddons/managedtexturenode.h | 44 + src/quickaddons/qtquicksettings.cpp | 80 ++ src/quickaddons/qtquicksettings.h | 35 + src/quickaddons/quickviewsharedengine.cpp | 253 +++++ src/quickaddons/quickviewsharedengine.h | 108 ++ src/quickaddons/renderer.kcfg | 21 + src/quickaddons/renderersettings.kcfgc | 4 + tests/CMakeLists.txt | 33 + tests/colorButtonTest.qml | 41 + tests/eventgenerator.qml | 56 ++ tests/helloworld/contents/ui/main.qml | 45 + tests/helloworld/metadata.desktop | 55 ++ tests/helloworldnowindow/contents/ui/main.qml | 24 + tests/helloworldnowindow/metadata.desktop | 55 ++ tests/icondialog.qml | 128 +++ tests/kdeclarativetest.cpp | 32 + tests/keysequencetest.qml | 18 + tests/mouseeventlistenertest.qml | 82 ++ tests/plotter.qml | 68 ++ tests/qiconitem_resize.qml | 27 + tests/qiconitem_test.qml | 15 + tests/qimageitemtest.cpp | 37 + tests/qimageitemtest.qml | 62 ++ tests/test.qml | 18 + tests/testimage.png | Bin 0 -> 8850 bytes tests/testimage@2x.png | Bin 0 -> 22915 bytes 286 files changed, 29128 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 KF5DeclarativeConfig.cmake.in create mode 100644 LICENSES/GPL-2.0-only.txt create mode 100644 LICENSES/GPL-2.0-or-later.txt create mode 100644 LICENSES/GPL-3.0-only.txt create mode 100644 LICENSES/LGPL-2.0-or-later.txt create mode 100644 LICENSES/LGPL-2.1-only.txt create mode 100644 LICENSES/LGPL-2.1-or-later.txt create mode 100644 LICENSES/LGPL-3.0-only.txt create mode 100644 LICENSES/LicenseRef-KDE-Accepted-GPL.txt create mode 100644 LICENSES/LicenseRef-KDE-Accepted-LGPL.txt create mode 100644 LICENSES/LicenseRef-Qt-Commercial.txt create mode 100644 LICENSES/MIT.txt create mode 100644 LICENSES/Qt-LGPL-exception-1.1.txt create mode 100644 README.md create mode 100644 autotests/CMakeLists.txt create mode 100644 autotests/columnproxymodeltest.cpp create mode 100644 autotests/columnproxymodeltest.h create mode 100644 autotests/data/resizemodeitem.qml create mode 100644 autotests/quickviewsharedengine.cpp create mode 100644 autotests/util.cpp create mode 100644 autotests/util.h create mode 100644 docs/Doxyfile.local create mode 100644 metainfo.yaml create mode 100644 po/af/kdeclarative5.po create mode 100644 po/ar/kdeclarative5.po create mode 100644 po/as/kdeclarative5.po create mode 100644 po/az/kdeclarative5.po create mode 100644 po/be/kdeclarative5.po create mode 100644 po/be@latin/kdeclarative5.po create mode 100644 po/bg/kdeclarative5.po create mode 100644 po/bn/kdeclarative5.po create mode 100644 po/bn_IN/kdeclarative5.po create mode 100644 po/br/kdeclarative5.po create mode 100644 po/bs/kdeclarative5.po create mode 100644 po/ca/kdeclarative5.po create mode 100644 po/ca@valencia/kdeclarative5.po create mode 100644 po/crh/kdeclarative5.po create mode 100644 po/cs/kdeclarative5.po create mode 100644 po/csb/kdeclarative5.po create mode 100644 po/cy/kdeclarative5.po create mode 100644 po/da/kdeclarative5.po create mode 100644 po/de/kdeclarative5.po create mode 100644 po/el/kdeclarative5.po create mode 100644 po/en_GB/kdeclarative5.po create mode 100644 po/eo/kdeclarative5.po create mode 100644 po/es/kdeclarative5.po create mode 100644 po/et/kdeclarative5.po create mode 100644 po/eu/kdeclarative5.po create mode 100644 po/fa/kdeclarative5.po create mode 100644 po/fi/kdeclarative5.po create mode 100644 po/fr/kdeclarative5.po create mode 100644 po/fy/kdeclarative5.po create mode 100644 po/ga/kdeclarative5.po create mode 100644 po/gd/kdeclarative5.po create mode 100644 po/gl/kdeclarative5.po create mode 100644 po/gu/kdeclarative5.po create mode 100644 po/ha/kdeclarative5.po create mode 100644 po/he/kdeclarative5.po create mode 100644 po/hi/kdeclarative5.po create mode 100644 po/hne/kdeclarative5.po create mode 100644 po/hr/kdeclarative5.po create mode 100644 po/hsb/kdeclarative5.po create mode 100644 po/hu/kdeclarative5.po create mode 100644 po/hy/kdeclarative5.po create mode 100644 po/ia/kdeclarative5.po create mode 100644 po/id/kdeclarative5.po create mode 100644 po/is/kdeclarative5.po create mode 100644 po/it/kdeclarative5.po create mode 100644 po/ja/kdeclarative5.po create mode 100644 po/ka/kdeclarative5.po create mode 100644 po/kk/kdeclarative5.po create mode 100644 po/km/kdeclarative5.po create mode 100644 po/kn/kdeclarative5.po create mode 100644 po/ko/kdeclarative5.po create mode 100644 po/ku/kdeclarative5.po create mode 100644 po/lb/kdeclarative5.po create mode 100644 po/lt/kdeclarative5.po create mode 100644 po/lv/kdeclarative5.po create mode 100644 po/mai/kdeclarative5.po create mode 100644 po/mk/kdeclarative5.po create mode 100644 po/ml/kdeclarative5.po create mode 100644 po/mr/kdeclarative5.po create mode 100644 po/ms/kdeclarative5.po create mode 100644 po/nb/kdeclarative5.po create mode 100644 po/nds/kdeclarative5.po create mode 100644 po/ne/kdeclarative5.po create mode 100644 po/nl/kdeclarative5.po create mode 100644 po/nn/kdeclarative5.po create mode 100644 po/oc/kdeclarative5.po create mode 100644 po/or/kdeclarative5.po create mode 100644 po/pa/kdeclarative5.po create mode 100644 po/pl/kdeclarative5.po create mode 100644 po/ps/kdeclarative5.po create mode 100644 po/pt/kdeclarative5.po create mode 100644 po/pt_BR/kdeclarative5.po create mode 100644 po/ro/kdeclarative5.po create mode 100644 po/ru/kdeclarative5.po create mode 100644 po/se/kdeclarative5.po create mode 100644 po/si/kdeclarative5.po create mode 100644 po/sk/kdeclarative5.po create mode 100644 po/sl/kdeclarative5.po create mode 100644 po/sq/kdeclarative5.po create mode 100644 po/sr/kdeclarative5.po create mode 100644 po/sr@ijekavian/kdeclarative5.po create mode 100644 po/sr@ijekavianlatin/kdeclarative5.po create mode 100644 po/sr@latin/kdeclarative5.po create mode 100644 po/sv/kdeclarative5.po create mode 100644 po/ta/kdeclarative5.po create mode 100644 po/te/kdeclarative5.po create mode 100644 po/tg/kdeclarative5.po create mode 100644 po/th/kdeclarative5.po create mode 100644 po/tr/kdeclarative5.po create mode 100644 po/tt/kdeclarative5.po create mode 100644 po/ug/kdeclarative5.po create mode 100644 po/uk/kdeclarative5.po create mode 100644 po/uz/kdeclarative5.po create mode 100644 po/uz@cyrillic/kdeclarative5.po create mode 100644 po/vi/kdeclarative5.po create mode 100644 po/wa/kdeclarative5.po create mode 100644 po/xh/kdeclarative5.po create mode 100644 po/zh_CN/kdeclarative5.po create mode 100644 po/zh_HK/kdeclarative5.po create mode 100644 po/zh_TW/kdeclarative5.po create mode 100644 src/CMakeLists.txt create mode 100755 src/Messages.sh create mode 100644 src/calendarevents/CMakeLists.txt create mode 100644 src/calendarevents/CalendarEventsConfig.cmake.in create mode 100644 src/calendarevents/calendareventsplugin.cpp create mode 100644 src/calendarevents/calendareventsplugin.h create mode 100644 src/calendarevents/eventdata_p.cpp create mode 100644 src/kdeclarative/CMakeLists.txt create mode 100644 src/kdeclarative/configpropertymap.cpp create mode 100644 src/kdeclarative/configpropertymap.h create mode 100644 src/kdeclarative/kdeclarative.cpp create mode 100644 src/kdeclarative/kdeclarative.h create mode 100644 src/kdeclarative/private/kdeclarative_p.h create mode 100644 src/kdeclarative/private/kiconprovider.cpp create mode 100644 src/kdeclarative/private/kiconprovider_p.h create mode 100644 src/kdeclarative/private/kioaccessmanagerfactory.cpp create mode 100644 src/kdeclarative/private/kioaccessmanagerfactory_p.h create mode 100644 src/kdeclarative/qmlobject.cpp create mode 100644 src/kdeclarative/qmlobject.h create mode 100644 src/kdeclarative/qmlobjectsharedengine.cpp create mode 100644 src/kdeclarative/qmlobjectsharedengine.h create mode 100644 src/kpackagelauncherqml/CMakeLists.txt create mode 100644 src/kpackagelauncherqml/main.cpp create mode 100644 src/qmlcontrols/CMakeLists.txt create mode 100644 src/qmlcontrols/draganddrop/CMakeLists.txt create mode 100644 src/qmlcontrols/draganddrop/DeclarativeDragArea.cpp create mode 100644 src/qmlcontrols/draganddrop/DeclarativeDragArea.h create mode 100644 src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.cpp create mode 100644 src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.h create mode 100644 src/qmlcontrols/draganddrop/DeclarativeDropArea.cpp create mode 100644 src/qmlcontrols/draganddrop/DeclarativeDropArea.h create mode 100644 src/qmlcontrols/draganddrop/DeclarativeMimeData.cpp create mode 100644 src/qmlcontrols/draganddrop/DeclarativeMimeData.h create mode 100644 src/qmlcontrols/draganddrop/Mainpage.dox create mode 100644 src/qmlcontrols/draganddrop/MimeDataWrapper.cpp create mode 100644 src/qmlcontrols/draganddrop/MimeDataWrapper.h create mode 100644 src/qmlcontrols/draganddrop/draganddropplugin.cpp create mode 100644 src/qmlcontrols/draganddrop/draganddropplugin.h create mode 100644 src/qmlcontrols/draganddrop/qmldir create mode 100644 src/qmlcontrols/kcmcontrols/CMakeLists.txt create mode 100644 src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.cpp create mode 100644 src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.h create mode 100644 src/qmlcontrols/kcmcontrols/qml/AbstractKCM.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/GridDelegate.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/GridView.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/GridViewKCM.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/ScrollView.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/ScrollViewKCM.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/SettingHighlighter.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/SettingStateBinding.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/SimpleKCM.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/private/GridViewInternal.qml create mode 100644 src/qmlcontrols/kcmcontrols/qml/qmldir create mode 100644 src/qmlcontrols/kcmcontrols/settinghighlighterprivate.cpp create mode 100644 src/qmlcontrols/kcmcontrols/settinghighlighterprivate.h create mode 100644 src/qmlcontrols/kcmcontrols/settingshighlighterprivate.h create mode 100644 src/qmlcontrols/kcmcontrols/settingstateproxy.cpp create mode 100644 src/qmlcontrols/kcmcontrols/settingstateproxy.h create mode 100644 src/qmlcontrols/kconfig/CMakeLists.txt create mode 100644 src/qmlcontrols/kconfig/kauthorizedproxy.cpp create mode 100644 src/qmlcontrols/kconfig/kauthorizedproxy.h create mode 100644 src/qmlcontrols/kconfig/kconfigplugin.cpp create mode 100644 src/qmlcontrols/kconfig/kconfigplugin.h create mode 100644 src/qmlcontrols/kconfig/qmldir create mode 100644 src/qmlcontrols/kcoreaddons/CMakeLists.txt create mode 100644 src/qmlcontrols/kcoreaddons/formats.cpp create mode 100644 src/qmlcontrols/kcoreaddons/formats.h create mode 100644 src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.cpp create mode 100644 src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.h create mode 100644 src/qmlcontrols/kcoreaddons/kuserproxy.cpp create mode 100644 src/qmlcontrols/kcoreaddons/kuserproxy.h create mode 100644 src/qmlcontrols/kcoreaddons/qmldir create mode 100644 src/qmlcontrols/kioplugin/CMakeLists.txt create mode 100644 src/qmlcontrols/kioplugin/kioplugin.cpp create mode 100644 src/qmlcontrols/kioplugin/kioplugin.h create mode 100644 src/qmlcontrols/kioplugin/krunproxy.cpp create mode 100644 src/qmlcontrols/kioplugin/krunproxy.h create mode 100644 src/qmlcontrols/kioplugin/qmldir create mode 100644 src/qmlcontrols/kquickcontrols/CMakeLists.txt create mode 100644 src/qmlcontrols/kquickcontrols/ColorButton.qml create mode 100644 src/qmlcontrols/kquickcontrols/KeySequenceItem.qml create mode 100644 src/qmlcontrols/kquickcontrols/README create mode 100644 src/qmlcontrols/kquickcontrols/private/CMakeLists.txt create mode 100644 src/qmlcontrols/kquickcontrols/private/keysequencehelper.cpp create mode 100644 src/qmlcontrols/kquickcontrols/private/keysequencehelper.h create mode 100644 src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.cpp create mode 100644 src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.h create mode 100644 src/qmlcontrols/kquickcontrols/private/qmldir create mode 100644 src/qmlcontrols/kquickcontrols/private/translationcontext.cpp create mode 100644 src/qmlcontrols/kquickcontrols/private/translationcontext.h create mode 100644 src/qmlcontrols/kquickcontrols/qmldir create mode 100644 src/qmlcontrols/kquickcontrolsaddons/CMakeLists.txt create mode 100644 src/qmlcontrols/kquickcontrolsaddons/Mainpage.dox create mode 100644 src/qmlcontrols/kquickcontrolsaddons/clipboard.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/clipboard.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/config-kquickcontrolsaddons.h.cmake create mode 100644 src/qmlcontrols/kquickcontrolsaddons/eventgenerator.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/eventgenerator.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/icondialog.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/icondialog.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/kcmshell.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/kcmshell.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/mimedatabase.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/mimedatabase.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/plotter.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/plotter.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qiconitem.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qiconitem.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qimageitem.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qimageitem.h create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qmldir create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.cpp create mode 100644 src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.h create mode 100644 src/qmlcontrols/kwindowsystemplugin/CMakeLists.txt create mode 100644 src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.cpp create mode 100644 src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.h create mode 100644 src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.cpp create mode 100644 src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.h create mode 100644 src/qmlcontrols/kwindowsystemplugin/qmldir create mode 100644 src/quickaddons/CMakeLists.txt create mode 100644 src/quickaddons/configmodule.cpp create mode 100644 src/quickaddons/configmodule.h create mode 100644 src/quickaddons/imagetexturescache.cpp create mode 100644 src/quickaddons/imagetexturescache.h create mode 100644 src/quickaddons/managedconfigmodule.cpp create mode 100644 src/quickaddons/managedconfigmodule.h create mode 100644 src/quickaddons/managedtexturenode.cpp create mode 100644 src/quickaddons/managedtexturenode.h create mode 100644 src/quickaddons/qtquicksettings.cpp create mode 100644 src/quickaddons/qtquicksettings.h create mode 100644 src/quickaddons/quickviewsharedengine.cpp create mode 100644 src/quickaddons/quickviewsharedengine.h create mode 100644 src/quickaddons/renderer.kcfg create mode 100644 src/quickaddons/renderersettings.kcfgc create mode 100644 tests/CMakeLists.txt create mode 100644 tests/colorButtonTest.qml create mode 100644 tests/eventgenerator.qml create mode 100644 tests/helloworld/contents/ui/main.qml create mode 100644 tests/helloworld/metadata.desktop create mode 100644 tests/helloworldnowindow/contents/ui/main.qml create mode 100644 tests/helloworldnowindow/metadata.desktop create mode 100644 tests/icondialog.qml create mode 100644 tests/kdeclarativetest.cpp create mode 100644 tests/keysequencetest.qml create mode 100644 tests/mouseeventlistenertest.qml create mode 100644 tests/plotter.qml create mode 100644 tests/qiconitem_resize.qml create mode 100644 tests/qiconitem_test.qml create mode 100644 tests/qimageitemtest.cpp create mode 100644 tests/qimageitemtest.qml create mode 100644 tests/test.qml create mode 100644 tests/testimage.png create mode 100644 tests/testimage@2x.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3330ae3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# 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/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e663f2d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,146 @@ +cmake_minimum_required(VERSION 3.5) + +set(KF5_VERSION "5.78.0") # handled by release scripts +set(KF5_DEP_VERSION "5.78.0") # handled by release scripts +project(KDeclarative VERSION ${KF5_VERSION}) + +# Dependencies +include(FeatureSummary) +find_package(ECM 5.78.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.14.0) + +find_package(Qt5 ${REQUIRED_QT_VERSION} NO_MODULE REQUIRED Qml Quick Gui) +include(KDEInstallDirs) +include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) +include(KDECMakeSettings) + +find_package(KF5Config ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5I18n ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5IconThemes ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5KIO ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5WidgetsAddons ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5WindowSystem ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5GlobalAccel ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5GuiAddons ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5Package ${KF5_DEP_VERSION} REQUIRED) +find_package(KF5Notifications ${KF5_DEP_VERSION} REQUIRED) + +######################################################################### + +add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x050e00) +add_definitions(-DKF_DISABLE_DEPRECATED_BEFORE_AND_AT=0x054B00) + +#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\") +if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/po") + ki18n_install(po) +endif() + +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_definitions(-DQT_NO_FOREACH) +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() + diff --git a/KF5DeclarativeConfig.cmake.in b/KF5DeclarativeConfig.cmake.in new file mode 100644 index 0000000..2170917 --- /dev/null +++ b/KF5DeclarativeConfig.cmake.in @@ -0,0 +1,10 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(Qt5Quick "@REQUIRED_QT_VERSION@") +find_dependency(KF5Config "@KF5_DEP_VERSION@") +find_dependency(KF5CoreAddons "@KF5_DEP_VERSION@") +find_dependency(KF5Package "@KF5_DEP_VERSION@") + +include("${CMAKE_CURRENT_LIST_DIR}/KF5DeclarativeTargets.cmake") +@PACKAGE_INCLUDE_QCHTARGETS@ diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt new file mode 100644 index 0000000..0f3d641 --- /dev/null +++ b/LICENSES/GPL-2.0-only.txt @@ -0,0 +1,319 @@ +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. + + + +Copyright (C)< yyyy> + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 51 Franklin +Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when +it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author Gnomovision comes +with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, +and you are welcome to redistribute it under certain conditions; type `show +c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than `show w' and `show c'; they could even be mouse-clicks +or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' +(which makes passes at compilers) written by James Hacker. + +, 1 April 1989 Ty Coon, President of Vice This General +Public License does not permit incorporating your program into proprietary +programs. If your program is a subroutine library, you may consider it more +useful to permit linking proprietary applications with the library. If this +is what you want to do, use the GNU Lesser General Public License instead +of this License. diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt new file mode 100644 index 0000000..1d80ac3 --- /dev/null +++ b/LICENSES/GPL-2.0-or-later.txt @@ -0,0 +1,319 @@ +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. + + + +Copyright (C) + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 2 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 51 Franklin +Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when +it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author Gnomovision comes +with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, +and you are welcome to redistribute it under certain conditions; type `show +c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than `show w' and `show c'; they could even be mouse-clicks +or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' +(which makes passes at compilers) written by James Hacker. + +, 1 April 1989 Ty Coon, President of Vice This General +Public License does not permit incorporating your program into proprietary +programs. If your program is a subroutine library, you may consider it more +useful to permit linking proprietary applications with the library. If this +is what you want to do, use the GNU Lesser General Public License instead +of this License. diff --git a/LICENSES/GPL-3.0-only.txt b/LICENSES/GPL-3.0-only.txt new file mode 100644 index 0000000..e142a52 --- /dev/null +++ b/LICENSES/GPL-3.0-only.txt @@ -0,0 +1,625 @@ +GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The GNU General Public License is a free, copyleft license for software and +other kinds of works. + +The licenses for most software and other practical works are designed to take +away your freedom to share and change the works. By contrast, the GNU General +Public License is intended to guarantee your freedom to share and change all +versions of a program--to make sure it remains free software for all its users. +We, the Free Software Foundation, use the GNU General Public License for most +of our software; it applies also to any other work released this way by its +authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for them if you wish), that +you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs, and that you know you +can do these things. + +To protect your rights, we need to prevent others from denying you these rights +or asking you to surrender the rights. Therefore, you have certain responsibilities +if you distribute copies of the software, or if you modify it: responsibilities +to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or +for a fee, you must pass on to the recipients the same freedoms that you received. +You must make sure that they, too, receive or can get the source code. And +you must show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert +copyright on the software, and (2) offer you this License giving you legal +permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that +there is no warranty for this free software. For both users' and authors' +sake, the GPL requires that modified versions be marked as changed, so that +their problems will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified +versions of the software inside them, although the manufacturer can do so. +This is fundamentally incompatible with the aim of protecting users' freedom +to change the software. The systematic pattern of such abuse occurs in the +area of products for individuals to use, which is precisely where it is most +unacceptable. Therefore, we have designed this version of the GPL to prohibit +the practice for those products. If such problems arise substantially in other +domains, we stand ready to extend this provision to those domains in future +versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States +should not allow patents to restrict development and use of software on general-purpose +computers, but in those that do, we wish to avoid the special danger that +patents applied to a free program could make it effectively proprietary. To +prevent this, the GPL assures that patents cannot be used to render the program +non-free. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, +such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. +Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals +or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in +a fashion requiring copyright permission, other than the making of an exact +copy. The resulting work is called a "modified version" of the earlier work +or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the +Program. + +To "propagate" a work means to do anything with it that, without permission, +would make you directly or secondarily liable for infringement under applicable +copyright law, except executing it on a computer or modifying a private copy. +Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as +well. + +To "convey" a work means any kind of propagation that enables other parties +to make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the +extent that it includes a convenient and prominently visible feature that +(1) displays an appropriate copyright notice, and (2) tells the user that +there is no warranty for the work (except to the extent that warranties are +provided), that licensees may convey the work under this License, and how +to view a copy of this License. If the interface presents a list of user commands +or options, such as a menu, a prominent item in the list meets this criterion. + + 1. Source Code. + +The "source code" for a work means the preferred form of the work for making +modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard +defined by a recognized standards body, or, in the case of interfaces specified +for a particular programming language, one that is widely used among developers +working in that language. + +The "System Libraries" of an executable work include anything, other than +the work as a whole, that (a) is included in the normal form of packaging +a Major Component, but which is not part of that Major Component, and (b) +serves only to enable use of the work with that Major Component, or to implement +a Standard Interface for which an implementation is available to the public +in source code form. A "Major Component", in this context, means a major essential +component (kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to produce +the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source +code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. +However, it does not include the work's System Libraries, or general-purpose +tools or generally available free programs which are used unmodified in performing +those activities but which are not part of the work. For example, Corresponding +Source includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically linked +subprograms that the work is specifically designed to require, such as by +intimate data communication or control flow between those subprograms and +other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + + The Corresponding Source for a work in source code form is that same work. + + 2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright +on the Program, and are irrevocable provided the stated conditions are met. +This License explicitly affirms your unlimited permission to run the unmodified +Program. The output from running a covered work is covered by this License +only if the output, given its content, constitutes a covered work. This License +acknowledges your rights of fair use or other equivalent, as provided by copyright +law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey +covered works to others for the sole purpose of having them make modifications +exclusively for you, or provide you with facilities for running those works, +provided that you comply with the terms of this License in conveying all material +for which you do not control copyright. Those thus making or running the covered +works for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of your copyrighted +material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure +under any applicable law fulfilling obligations under article 11 of the WIPO +copyright treaty adopted on 20 December 1996, or similar laws prohibiting +or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention +of technological measures to the extent such circumvention is effected by +exercising rights under this License with respect to the covered work, and +you disclaim any intention to limit operation or modification of the work +as a means of enforcing, against the work's users, your or third parties' +legal rights to forbid circumvention of technological measures. + + 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive +it, in any medium, provided that you conspicuously and appropriately publish +on each copy an appropriate copyright notice; keep intact all notices stating +that this License and any non-permissive terms added in accord with section +7 apply to the code; keep intact all notices of the absence of any warranty; +and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you +may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce +it from the Program, in the form of source code under the terms of section +4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified it, and +giving a relevant date. + +b) The work must carry prominent notices stating that it is released under +this License and any conditions added under section 7. This requirement modifies +the requirement in section 4 to "keep intact all notices". + +c) You must license the entire work, as a whole, under this License to anyone +who comes into possession of a copy. This License will therefore apply, along +with any applicable section 7 additional terms, to the whole of the work, +and all its parts, regardless of how they are packaged. This License gives +no permission to license the work in any other way, but it does not invalidate +such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display Appropriate +Legal Notices; however, if the Program has interactive interfaces that do +not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, +which are not by their nature extensions of the covered work, and which are +not combined with it such as to form a larger program, in or on a volume of +a storage or distribution medium, is called an "aggregate" if the compilation +and its resulting copyright are not used to limit the access or legal rights +of the compilation's users beyond what the individual works permit. Inclusion +of a covered work in an aggregate does not cause this License to apply to +the other parts of the aggregate. + + 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections +4 and 5, provided that you also convey the machine-readable Corresponding +Source under the terms of this License, in one of these ways: + +a) Convey the object code in, or embodied in, a physical product (including +a physical distribution medium), accompanied by the Corresponding Source fixed +on a durable physical medium customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product (including +a physical distribution medium), accompanied by a written offer, valid for +at least three years and valid for as long as you offer spare parts or customer +support for that product model, to give anyone who possesses the object code +either (1) a copy of the Corresponding Source for all the software in the +product that is covered by this License, on a durable physical medium customarily +used for software interchange, for a price no more than your reasonable cost +of physically performing this conveying of source, or (2) access to copy the +Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the written +offer to provide the Corresponding Source. This alternative is allowed only +occasionally and noncommercially, and only if you received the object code +with such an offer, in accord with subsection 6b. + +d) Convey the object code by offering access from a designated place (gratis +or for a charge), and offer equivalent access to the Corresponding Source +in the same way through the same place at no further charge. You need not +require recipients to copy the Corresponding Source along with the object +code. If the place to copy the object code is a network server, the Corresponding +Source may be on a different server (operated by you or a third party) that +supports equivalent copying facilities, provided you maintain clear directions +next to the object code saying where to find the Corresponding Source. Regardless +of what server hosts the Corresponding Source, you remain obligated to ensure +that it is available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided you inform +other peers where the object code and Corresponding Source of the work are +being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from +the Corresponding Source as a System Library, need not be included in conveying +the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible +personal property which is normally used for personal, family, or household +purposes, or (2) anything designed or sold for incorporation into a dwelling. +In determining whether a product is a consumer product, doubtful cases shall +be resolved in favor of coverage. For a particular product received by a particular +user, "normally used" refers to a typical or common use of that class of product, +regardless of the status of the particular user or of the way in which the +particular user actually uses, or expects or is expected to use, the product. +A product is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent the +only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, +authorization keys, or other information required to install and execute modified +versions of a covered work in that User Product from a modified version of +its Corresponding Source. The information must suffice to ensure that the +continued functioning of the modified object code is in no case prevented +or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically +for use in, a User Product, and the conveying occurs as part of a transaction +in which the right of possession and use of the User Product is transferred +to the recipient in perpetuity or for a fixed term (regardless of how the +transaction is characterized), the Corresponding Source conveyed under this +section must be accompanied by the Installation Information. But this requirement +does not apply if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has been installed +in ROM). + +The requirement to provide Installation Information does not include a requirement +to continue to provide support service, warranty, or updates for a work that +has been modified or installed by the recipient, or for the User Product in +which it has been modified or installed. Access to a network may be denied +when the modification itself materially and adversely affects the operation +of the network or violates the rules and protocols for communication across +the network. + +Corresponding Source conveyed, and Installation Information provided, in accord +with this section must be in a format that is publicly documented (and with +an implementation available to the public in source code form), and must require +no special password or key for unpacking, reading or copying. + + 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this License +by making exceptions from one or more of its conditions. Additional permissions +that are applicable to the entire Program shall be treated as though they +were included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part +may be used separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when +you modify the work.) You may place additional permissions on material, added +by you to a covered work, for which you have or can give appropriate copyright +permission. + +Notwithstanding any other provision of this License, for material you add +to a covered work, you may (if authorized by the copyright holders of that +material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the terms of +sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices displayed +by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or requiring +that modified versions of such material be marked in reasonable ways as different +from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or authors +of the material; or + +e) Declining to grant rights under trademark law for use of some trade names, +trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that material by +anyone who conveys the material (or modified versions of it) with contractual +assumptions of liability to the recipient, for any liability that these contractual +assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" +within the meaning of section 10. If the Program as you received it, or any +part of it, contains a notice stating that it is governed by this License +along with a term that is a further restriction, you may remove that term. +If a license document contains a further restriction but permits relicensing +or conveying under this License, you may add to a covered work material governed +by the terms of that license document, provided that the further restriction +does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, +in the relevant source files, a statement of the additional terms that apply +to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form +of a separately written license, or stated as exceptions; the above requirements +apply either way. + + 8. Termination. + +You may not propagate or modify a covered work except as expressly provided +under this License. Any attempt otherwise to propagate or modify it is void, +and will automatically terminate your rights under this License (including +any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from +a particular copyright holder is reinstated (a) provisionally, unless and +until the copyright holder explicitly and finally terminates your license, +and (b) permanently, if the copyright holder fails to notify you of the violation +by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently +if the copyright holder notifies you of the violation by some reasonable means, +this is the first time you have received notice of violation of this License +(for any work) from that copyright holder, and you cure the violation prior +to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses +of parties who have received copies or rights from you under this License. +If your rights have been terminated and not permanently reinstated, you do +not qualify to receive new licenses for the same material under section 10. + + 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy +of the Program. Ancillary propagation of a covered work occurring solely as +a consequence of using peer-to-peer transmission to receive a copy likewise +does not require acceptance. However, nothing other than this License grants +you permission to propagate or modify any covered work. These actions infringe +copyright if you do not accept this License. Therefore, by modifying or propagating +a covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives +a license from the original licensors, to run, modify and propagate that work, +subject to this License. You are not responsible for enforcing compliance +by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, +or substantially all assets of one, or subdividing an organization, or merging +organizations. If propagation of a covered work results from an entity transaction, +each party to that transaction who receives a copy of the work also receives +whatever licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the Corresponding +Source of the work from the predecessor in interest, if the predecessor has +it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights +granted or affirmed under this License. For example, you may not impose a +license fee, royalty, or other charge for exercise of rights granted under +this License, and you may not initiate litigation (including a cross-claim +or counterclaim in a lawsuit) alleging that any patent claim is infringed +by making, using, selling, offering for sale, or importing the Program or +any portion of it. + + 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License +of the Program or a work on which the Program is based. The work thus licensed +is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled +by the contributor, whether already acquired or hereafter acquired, that would +be infringed by some manner, permitted by this License, of making, using, +or selling its contributor version, but do not include claims that would be +infringed only as a consequence of further modification of the contributor +version. For purposes of this definition, "control" includes the right to +grant patent sublicenses in a manner consistent with the requirements of this +License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent +license under the contributor's essential patent claims, to make, use, sell, +offer for sale, import and otherwise run, modify and propagate the contents +of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement +or commitment, however denominated, not to enforce a patent (such as an express +permission to practice a patent or covenant not to sue for patent infringement). +To "grant" such a patent license to a party means to make such an agreement +or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free +of charge and under the terms of this License, through a publicly available +network server or other readily accessible means, then you must either (1) +cause the Corresponding Source to be so available, or (2) arrange to deprive +yourself of the benefit of the patent license for this particular work, or +(3) arrange, in a manner consistent with the requirements of this License, +to extend the patent license to downstream recipients. "Knowingly relying" +means you have actual knowledge that, but for the patent license, your conveying +the covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that country +that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, +you convey, or propagate by procuring conveyance of, a covered work, and grant +a patent license to some of the parties receiving the covered work authorizing +them to use, propagate, modify or convey a specific copy of the covered work, +then the patent license you grant is automatically extended to all recipients +of the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope +of its coverage, prohibits the exercise of, or is conditioned on the non-exercise +of one or more of the rights that are specifically granted under this License. +You may not convey a covered work if you are a party to an arrangement with +a third party that is in the business of distributing software, under which +you make payment to the third party based on the extent of your activity of +conveying the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by you +(or copies made from those copies), or (b) primarily for and in connection +with specific products or compilations that contain the covered work, unless +you entered into that arrangement, or that patent license was granted, prior +to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available +to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from +the conditions of this License. If you cannot convey a covered work so as +to satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may not convey it at all. +For example, if you agree to terms that obligate you to collect a royalty +for further conveying from those to whom you convey the Program, the only +way you could satisfy both those terms and this License would be to refrain +entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to +link or combine any covered work with a work licensed under version 3 of the +GNU Affero General Public License into a single combined work, and to convey +the resulting work. The terms of this License will continue to apply to the +part which is the covered work, but the special requirements of the GNU Affero +General Public License, section 13, concerning interaction through a network +will apply to the combination as such. + + 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the +GNU General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +that a certain numbered version of the GNU General Public License "or any +later version" applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published +by the Free Software Foundation. If the Program does not specify a version +number of the GNU General Public License, you may choose any version ever +published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of +the GNU General Public License can be used, that proxy's public statement +of acceptance of a version permanently authorizes you to choose that version +for the Program. + +Later license versions may give you additional or different permissions. However, +no additional obligations are imposed on any author or copyright holder as +a result of your choosing to follow a later version. + + 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE +LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM +PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + + 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM +AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO +USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot +be given local legal effect according to their terms, reviewing courts shall +apply local law that most closely approximates an absolute waiver of all civil +liability in connection with the Program, unless a warranty or assumption +of liability accompanies a copy of the Program in return for a fee. END OF +TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively state the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like +this when it starts in an interactive mode: + + Copyright (C) + +This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + +This is free software, and you are welcome to redistribute it under certain +conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands might +be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU GPL, see . + +The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General Public +License instead of this License. But first, please read . diff --git a/LICENSES/LGPL-2.0-or-later.txt b/LICENSES/LGPL-2.0-or-later.txt new file mode 100644 index 0000000..5c96471 --- /dev/null +++ b/LICENSES/LGPL-2.0-or-later.txt @@ -0,0 +1,446 @@ +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! diff --git a/LICENSES/LGPL-2.1-only.txt b/LICENSES/LGPL-2.1-only.txt new file mode 100644 index 0000000..130dffb --- /dev/null +++ b/LICENSES/LGPL-2.1-only.txt @@ -0,0 +1,467 @@ +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! diff --git a/LICENSES/LGPL-2.1-or-later.txt b/LICENSES/LGPL-2.1-or-later.txt new file mode 100644 index 0000000..04bb156 --- /dev/null +++ b/LICENSES/LGPL-2.1-or-later.txt @@ -0,0 +1,468 @@ +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. + + + +Copyright (C) + +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! diff --git a/LICENSES/LGPL-3.0-only.txt b/LICENSES/LGPL-3.0-only.txt new file mode 100644 index 0000000..bd405af --- /dev/null +++ b/LICENSES/LGPL-3.0-only.txt @@ -0,0 +1,163 @@ +GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +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. diff --git a/LICENSES/LicenseRef-KDE-Accepted-GPL.txt b/LICENSES/LicenseRef-KDE-Accepted-GPL.txt new file mode 100644 index 0000000..60a2dff --- /dev/null +++ b/LICENSES/LicenseRef-KDE-Accepted-GPL.txt @@ -0,0 +1,12 @@ +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. diff --git a/LICENSES/LicenseRef-KDE-Accepted-LGPL.txt b/LICENSES/LicenseRef-KDE-Accepted-LGPL.txt new file mode 100644 index 0000000..232b3c5 --- /dev/null +++ b/LICENSES/LicenseRef-KDE-Accepted-LGPL.txt @@ -0,0 +1,12 @@ +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. diff --git a/LICENSES/LicenseRef-Qt-Commercial.txt b/LICENSES/LicenseRef-Qt-Commercial.txt new file mode 100644 index 0000000..11e00c7 --- /dev/null +++ b/LICENSES/LicenseRef-Qt-Commercial.txt @@ -0,0 +1,7 @@ +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. diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 0000000..204b93d --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,19 @@ +MIT License Copyright (c) + +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. diff --git a/LICENSES/Qt-LGPL-exception-1.1.txt b/LICENSES/Qt-LGPL-exception-1.1.txt new file mode 100644 index 0000000..d0f532e --- /dev/null +++ b/LICENSES/Qt-LGPL-exception-1.1.txt @@ -0,0 +1,21 @@ +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb3181e --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# 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 informations 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 diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt new file mode 100644 index 0000000..d53f0e5 --- /dev/null +++ b/autotests/CMakeLists.txt @@ -0,0 +1,17 @@ +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) + + diff --git a/autotests/columnproxymodeltest.cpp b/autotests/columnproxymodeltest.cpp new file mode 100644 index 0000000..1ba521d --- /dev/null +++ b/autotests/columnproxymodeltest.cpp @@ -0,0 +1,78 @@ +/* + SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "columnproxymodeltest.h" +#include "../src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.h" +#include +#include +#include +#include + +QTEST_MAIN(ColumnProxyModelTest) + +void ColumnProxyModelTest::testInit() +{ + qRegisterMetaType("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 = 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"))); + + 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); +} diff --git a/autotests/columnproxymodeltest.h b/autotests/columnproxymodeltest.h new file mode 100644 index 0000000..3c3f2d7 --- /dev/null +++ b/autotests/columnproxymodeltest.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef COLUMNPROXYMODELTEST_H +#define COLUMNPROXYMODELTEST_H + +#include + +class ColumnProxyModelTest : public QObject +{ + Q_OBJECT + + private Q_SLOTS: + void testInit(); + void testSet(); +}; + +#endif diff --git a/autotests/data/resizemodeitem.qml b/autotests/data/resizemodeitem.qml new file mode 100644 index 0000000..ed73009 --- /dev/null +++ b/autotests/data/resizemodeitem.qml @@ -0,0 +1,5 @@ +import QtQuick 2.0 +Item { + width: 200 + height: 200 +} diff --git a/autotests/quickviewsharedengine.cpp b/autotests/quickviewsharedengine.cpp new file mode 100644 index 0000000..01611d2 --- /dev/null +++ b/autotests/quickviewsharedengine.cpp @@ -0,0 +1,187 @@ +/* + This file is part of the test suite of the Qt Toolkit. + SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) + + 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 +#include +#include +#include +#include +#include +#include "util.h" +#include +#include +#include +#include + +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(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(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"<size(); + view->resize(300, 300);qWarning()<<"ccc"<size(); + item = qobject_cast(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" diff --git a/autotests/util.cpp b/autotests/util.cpp new file mode 100644 index 0000000..f7e5d70 --- /dev/null +++ b/autotests/util.cpp @@ -0,0 +1,100 @@ +/* + This file is part of the test suite of the Qt Toolkit. + SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) + + 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 +#include +#include +#include +#include +#include +#include + +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 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; +} diff --git a/autotests/util.h b/autotests/util.h new file mode 100644 index 0000000..80370ac --- /dev/null +++ b/autotests/util.h @@ -0,0 +1,75 @@ +/* + This file is part of the test suite of the Qt Toolkit. + SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) + + 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 +#include +#include + +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 diff --git a/docs/Doxyfile.local b/docs/Doxyfile.local new file mode 100644 index 0000000..74dde6f --- /dev/null +++ b/docs/Doxyfile.local @@ -0,0 +1,11 @@ +### 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)=" diff --git a/metainfo.yaml b/metainfo.yaml new file mode 100644 index 0000000..96900e0 --- /dev/null +++ b/metainfo.yaml @@ -0,0 +1,21 @@ +maintainer: mart +description: Provides integration of QML and KDE Frameworks +tier: 3 +type: functional +platforms: + - name: Linux + - name: FreeBSD + - name: Windows + - name: MacOSX + 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 diff --git a/po/af/kdeclarative5.po b/po/af/kdeclarative5.po new file mode 100644 index 0000000..a38b3cb --- /dev/null +++ b/po/af/kdeclarative5.po @@ -0,0 +1,101 @@ +# UTF-8 test:äëïöü +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4 stable\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2006-01-12 16:33+0200\n" +"Last-Translator: JUANITA FRANZ \n" +"Language-Team: AFRIKAANS \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definieër die program skrif tipe." + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Kortpad" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflik met Standaard Program Kortpad" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ar/kdeclarative5.po b/po/ar/kdeclarative5.po new file mode 100644 index 0000000..ac2ca48 --- /dev/null +++ b/po/ar/kdeclarative5.po @@ -0,0 +1,123 @@ +# 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 , 2001,2003. +# Sayed Jaffer Al-Mosawi , 2002. +# Hicham Amaoui , 2002. +# Youcef Rabah Rahal , 2003. +# Ahmad M. Zawawi , 2004. +# Mohammed Gamal , 2004. +# Usamah Ali Al-Maqdad , 2004. +# Munzir Taha , 2004. +# Mohamed SAAD , 2006. +# Khaled Hosny , 2007. +# Youssef Chahibi , 2007. +# zayed , 2008, 2009. +# Zayed Al-Saidi , 2009. +# hanny , 2012. +# Abderrahim Kitouni , 2012. +# Safa Alfulaij , 2013, 2017, 2018. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2018-06-09 19:24+0300\n" +"Last-Translator: Safa Alfulaij \n" +"Language-Team: Arabic \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 2.0\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "اختصار محجوز" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "تضارب مع اختصار تطبيق قياسي" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/as/kdeclarative5.po b/po/as/kdeclarative5.po new file mode 100644 index 0000000..c1f3b4a --- /dev/null +++ b/po/as/kdeclarative5.po @@ -0,0 +1,102 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Amitakhya Phukan , 2008. +# Amitakhya Phukan <অমিতাক্ষ ফুকন>, 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4_as\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2008-12-26 15:19+0530\n" +"Last-Translator: Amitakhya Phukan <অমিতাক্ষ ফুকন>\n" +"Language-Team: Assamese \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "নতুন ৱেব চমু পথ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "অনুপ্ৰয়োগৰ মানপ্ৰাপ্ত চমু পথৰ সৈতে দ্বন্দ্ব" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/az/kdeclarative5.po b/po/az/kdeclarative5.po new file mode 100644 index 0000000..dcda1de --- /dev/null +++ b/po/az/kdeclarative5.po @@ -0,0 +1,106 @@ +# Copyright (C) YEAR This file is copyright: +# This file is distributed under the same license as the kdeclarative package. +# +# Xəyyam , 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-04-10 22:09+0400\n" +"Last-Translator: Xəyyam \n" +"Language-Team: Azerbaijani\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 19.12.3\n" + +#, kde-format +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Xəyyam" + +#, 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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Tətbiqin unikal adı (məcburidir)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Qısayolun rezerv olunması" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Tətbiqin Standart Qısayolları ilə ziddiyyət" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/be/kdeclarative5.po b/po/be/kdeclarative5.po new file mode 100644 index 0000000..382d869 --- /dev/null +++ b/po/be/kdeclarative5.po @@ -0,0 +1,117 @@ +# translation of kdelibs4.po to Belarusian +# translation of kdelibs4.po to +# +# Eugene Zelenko , 2002-2004. +# Ihar Hrachyshka , 2006. +# Darafei Praliaskouski , 2007. +# Komяpa , 2007. +# Komяpa , 2007. +# Darafei Praliaskoski , 2007. +# Darafei Praliaskouski , 2008, 2009. +# Siarhei Liantsevich , 2008. +# kom , 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-09-06 15:21+0300\n" +"Last-Translator: Darafei Praliaskouski \n" +"Language-Team: Belarusian \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Скарот" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Канфліктуе з стандартным скаротам праграмы" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/be@latin/kdeclarative5.po b/po/be@latin/kdeclarative5.po new file mode 100644 index 0000000..01cf4e7 --- /dev/null +++ b/po/be@latin/kdeclarative5.po @@ -0,0 +1,106 @@ +# 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 , 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2008-08-30 01:10+0300\n" +"Last-Translator: Ihar Hrachyshka \n" +"Language-Team: Belarusian Latin \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "aznačaje šryft aplikacyi" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "Novy sieciŭny skarot" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Niazhoda z zvyčajnym klavijaturnym skarotam aplikacyi" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/bg/kdeclarative5.po b/po/bg/kdeclarative5.po new file mode 100644 index 0000000..cbecb86 --- /dev/null +++ b/po/bg/kdeclarative5.po @@ -0,0 +1,103 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Zlatko Popov , 2006, 2007, 2008, 2009. +# Yasen Pramatarov , 2009, 2010, 2011, 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-07-23 01:52+0300\n" +"Last-Translator: Yasen Pramatarov \n" +"Language-Team: Bulgarian \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Запазен бърз клавиш" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Конфликт с програмна клавишна комбинация" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/bn/kdeclarative5.po b/po/bn/kdeclarative5.po new file mode 100644 index 0000000..1e8a6fd --- /dev/null +++ b/po/bn/kdeclarative5.po @@ -0,0 +1,107 @@ +# 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,,, , 2003. +# Deepayan Sarkar , 2003, 2004, 2005. +# Deepayan Sarkar , 2006, 2008, 2009.. +# Deepayan Sarkar , 2009, 2010, 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-07-16 14:27+0530\n" +"Last-Translator: Deepayan Sarkar \n" +"Language-Team: American English \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "অন্য কাজের জন্য নির্দিষ্ট শর্টকাট" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "স্ট্যাণ্ডার্ড অ্যাপলিকেশন শর্টকাটের সঙ্গে বিরোধ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/bn_IN/kdeclarative5.po b/po/bn_IN/kdeclarative5.po new file mode 100644 index 0000000..b7f0345 --- /dev/null +++ b/po/bn_IN/kdeclarative5.po @@ -0,0 +1,103 @@ +# 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 , 2007. +# Runa Bhattacharjee , 2008, 2009. +# Runa Bhattacharjee , 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-12-28 14:35+0530\n" +"Last-Translator: Runa Bhattacharjee \n" +"Language-Team: Bengali INDIA \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "সংরক্ষিত শর্ট-কাট" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "অ্যাপ্লিকেশনের প্রমিত শর্ট-কাটের সাথে দ্বন্দ্ব" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/br/kdeclarative5.po b/po/br/kdeclarative5.po new file mode 100644 index 0000000..db6d67d --- /dev/null +++ b/po/br/kdeclarative5.po @@ -0,0 +1,105 @@ +# KDE breton translation +# Copyright (C) 1998-2001 Free Software Foundation, Inc. +# Jañ-Mai Drapier , 1998 +# Thierry Vignaud , 2001-2005 +# $Id$ +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4-1.1\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2007-10-15 22:19+0200\n" +"Last-Translator: Jañ-Mai Drapier \n" +"Language-Team: Brezhoneg \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:37 +#, fuzzy, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Kas ur bostel da ratreer an arload" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Berradennoù" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/bs/kdeclarative5.po b/po/bs/kdeclarative5.po new file mode 100644 index 0000000..a43a2ea --- /dev/null +++ b/po/bs/kdeclarative5.po @@ -0,0 +1,123 @@ +# translation of kdelibs4.po to bosanski +# Marko Rosic , 2003. +# Toplica Tanaskovic , 2003, 2004, 2005. +# Chusslove Illich , 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# Dalibor Djuric , 2009, 2010. +# Dalibor Djuric , 2010. +# KDE 4 , 2011. +# Bosnian translation of kdelibs4 +# Initially converted from translation of kdelibs4.po by +# Samir Ribić +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-12-21 17:26+0000\n" +"Last-Translator: Ademovic Saudin \n" +"Language-Team: bosanski \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definiše font programa" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervisana prečica" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Sukob sa standardnom programskom prečicom" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ca/kdeclarative5.po b/po/ca/kdeclarative5.po new file mode 100644 index 0000000..81eb5ae --- /dev/null +++ b/po/ca/kdeclarative5.po @@ -0,0 +1,116 @@ +# Translation of kdeclarative5.po to Catalan +# Copyright (C) 1998-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. +# +# Sebastià Pla i Sanz , 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007. +# Antoni Bella Pérez , 2003, 2006, 2011, 2012, 2013, 2014, 2020. +# Albert Astals Cid , 2004, 2005, 2007. +# Josep Ma. Ferrer , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2019, 2020. +# Robert Millan , 2009. +# Orestes Mas , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-08-06 00:26+0200\n" +"Last-Translator: Antoni Bella Pérez \n" +"Language-Team: Catalan \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.04.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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "El nom únic de l'aplicació (obligatori)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Drecera reservada" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflicte amb una drecera estàndard d'aplicació" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/ca@valencia/kdeclarative5.po b/po/ca@valencia/kdeclarative5.po new file mode 100644 index 0000000..ae627b3 --- /dev/null +++ b/po/ca@valencia/kdeclarative5.po @@ -0,0 +1,115 @@ +# 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 , 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007. +# Antoni Bella Pérez , 2003, 2006, 2011, 2012, 2013, 2014. +# Albert Astals Cid , 2004, 2005, 2007. +# Josep Ma. Ferrer , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2019. +# Robert Millan , 2009. +# Orestes Mas , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2019-02-04 20:27+0100\n" +"Last-Translator: Josep Ma. Ferrer \n" +"Language-Team: Catalan \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "El nom únic de l'aplicació (obligatori)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Drecera reservada" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflicte amb la drecera estàndard de l'aplicació" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/crh/kdeclarative5.po b/po/crh/kdeclarative5.po new file mode 100644 index 0000000..6bcedf1 --- /dev/null +++ b/po/crh/kdeclarative5.po @@ -0,0 +1,105 @@ +# 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 , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-02-12 23:29-0600\n" +"Last-Translator: Reşat SABIQ \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "uyğulamanıñ urufatını belgiley" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "Yañı İnternet Qısqa-yolu" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Standart Uyğulama Qısqa-yolunen Çatışma" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/cs/kdeclarative5.po b/po/cs/kdeclarative5.po new file mode 100644 index 0000000..fdd5851 --- /dev/null +++ b/po/cs/kdeclarative5.po @@ -0,0 +1,109 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Lukáš Tinkl , 2010, 2011, 2012. +# Vít Pelčák , 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# Tomáš Chvátal , 2012, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-02-11 11:12+0100\n" +"Last-Translator: Vit Pelcak \n" +"Language-Team: Czech \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 19.12.1\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Unikátní název aplikace (povinné)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervovaná klávesová zkratka" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt se standardní zkratkou aplikace" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/csb/kdeclarative5.po b/po/csb/kdeclarative5.po new file mode 100644 index 0000000..77021a2 --- /dev/null +++ b/po/csb/kdeclarative5.po @@ -0,0 +1,106 @@ +# translation of kdelibs4.po to Kaszëbsczi +# +# Michôł Òstrowsczi , 2006, 2007, 2008, 2009. +# Mark Kwidzińsczi , 2006, 2007, 2008, 2009. +# Mark Kwidzińśczi , 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-12-04 22:09+0100\n" +"Last-Translator: Mark Kwidzińśczi \n" +"Language-Team: Kaszëbsczi \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "òpisëwô fònt programë" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "Nowô sécowô skrodzëna" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Zwada ze sztandardową skrodzëną programë" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/cy/kdeclarative5.po b/po/cy/kdeclarative5.po new file mode 100644 index 0000000..75da083 --- /dev/null +++ b/po/cy/kdeclarative5.po @@ -0,0 +1,118 @@ +# 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 , 2003. +# Kgyfieithu , 2003. +# KGyfieithu , 2003. +# KD at KGyfieithu , 2003, 2004. +# Kyfieithu , 2004. +# Kevin Donnelly , 2005. +# +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2005-01-28 17:54+0000\n" +"Last-Translator: Kevin Donnelly \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "diffinio wynebfath y cymhwysiad" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Byrlwybr" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Croestyniad efo Byrlwybr Cymhwysiad Arferol" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/da/kdeclarative5.po b/po/da/kdeclarative5.po new file mode 100644 index 0000000..7fb861b --- /dev/null +++ b/po/da/kdeclarative5.po @@ -0,0 +1,108 @@ +# 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 , 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# Keld Simonsen , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-30 19:42+0100\n" +"Last-Translator: Martin Schlander \n" +"Language-Team: Danish \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Programmets unikke navn (obligatorisk)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reserveret genvej" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt med programmets standardgenvejstast" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/de/kdeclarative5.po b/po/de/kdeclarative5.po new file mode 100644 index 0000000..f180e78 --- /dev/null +++ b/po/de/kdeclarative5.po @@ -0,0 +1,115 @@ +# Thomas Diehl , 2002, 2003, 2004, 2005. +# Stefan Winter , 2004. +# Thomas Fischer , 2004. +# Stephan Johach , 2004, 2005, 2006, 2007. +# Georg Schuster , 2005. +# Thomas Reitelbach , 2005, 2006, 2007, 2008, 2009. +# Burkhard Lück , 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# Frederik Schwarzer , 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Johannes Obermayr , 2010. +# Panagiotis Papadopoulos , 2010. +# Rolf Eike Beer , 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 07:31+0100\n" +"Last-Translator: Burkhard Lück \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 18.12.3\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Der eindeutige Name der Anwendung (erforderlich)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reservierter Kurzbefehl" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt mit Standard-Kurzbefehl des Programms" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/el/kdeclarative5.po b/po/el/kdeclarative5.po new file mode 100644 index 0000000..9be8cf3 --- /dev/null +++ b/po/el/kdeclarative5.po @@ -0,0 +1,120 @@ +# 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 , 2000-2002. +# Stergios Dramis , 2002-2004. +# Κώστας Μπουκουβάλας , 2005. +# Spiros Georgaras , 2005, 2006, 2007, 2008. +# Toussis Manolis , 2006, 2007, 2008, 2009. +# Spiros Georgaras , 2007, 2008. +# Σπύρος Γεωργαράς , 2008. +# Petros , 2009. +# Petros Vidalis , 2010, 2011. +# Dimitrios Glentadakis , 2010, 2011, 2012, 2013, 2014. +# nikos, 2011. +# Stelios , 2012, 2013, 2015, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-09-13 16:07+0300\n" +"Last-Translator: Stelios \n" +"Language-Team: Greek \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Δεσμευμένη συντόμευση" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Σύγκρουση με πρότυπη συντόμευση εφαρμογής" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 αρχείο" diff --git a/po/en_GB/kdeclarative5.po b/po/en_GB/kdeclarative5.po new file mode 100644 index 0000000..a19459d --- /dev/null +++ b/po/en_GB/kdeclarative5.po @@ -0,0 +1,107 @@ +# translation of kdelibs4.po to British English +# Malcolm Hunter , 2002,2003,2004, 2005, 2006, 2007, 2008, 2009. +# Jonathan Riddell , 2003. +# Andrew Coles , 2004, 2005, 2009, 2010. +# Steve Allewell , 2014, 2015, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-03-30 19:59+0100\n" +"Last-Translator: Steve Allewell \n" +"Language-Team: British English \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 19.07.70\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "The unique name of the application (mandatory)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reserved Shortcut" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflict with Standard Application Shortcut" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/eo/kdeclarative5.po b/po/eo/kdeclarative5.po new file mode 100644 index 0000000..1bd75dd --- /dev/null +++ b/po/eo/kdeclarative5.po @@ -0,0 +1,119 @@ +# 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 , 1998. +# Heiko Evermann , 2002, 2003. +# Matthias Peick , 2004, 2005. +# Oliver Kellogg ,2007. +# Cindy McKee , 2007, 2008. +# Axel Rousseau , 2009. +# Michael Moroni , 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-05-22 12:30+0200\n" +"Last-Translator: Michael Moroni \n" +"Language-Team: Esperanto \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:37 +#, 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/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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervita Klavkombino" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikto kun defaŭlta aplikaĵa klavokombino" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/es/kdeclarative5.po b/po/es/kdeclarative5.po new file mode 100644 index 0000000..02ccd44 --- /dev/null +++ b/po/es/kdeclarative5.po @@ -0,0 +1,116 @@ +# translation of kdelibs4.po to Spanish +# Translation of kdelibs4 to Spanish +# Copyright (C) 2000-2007 +# +# Pablo de Vicente , 2000-2002,2003, 2004. +# Pablo de Vicente , 2003. +# Pablo de Vicente , 2004, 2005. +# Eloy Cuadra , 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# Pablo de Vicente , 2005, 2006, 2007. +# Enrique Matias Sanchez (aka Quique) , 2007. +# Jaime Robles , 2007. +# Javier Viñal , 2013. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-10 01:02+0100\n" +"Last-Translator: Eloy Cuadra \n" +"Language-Team: Spanish \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 \n" +"X-Generator: Lokalize 19.12.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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "El nombre único de la aplicación (obligatorio)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Acceso rápido reservado" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, 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:175 +#, 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:180 +#, 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" diff --git a/po/et/kdeclarative5.po b/po/et/kdeclarative5.po new file mode 100644 index 0000000..e897e61 --- /dev/null +++ b/po/et/kdeclarative5.po @@ -0,0 +1,109 @@ +# translation of kdelibs4.po to Estonian +# Copyright (C) 1999-2004, 2005, 2006, 2009 Free Software Foundation, Inc. +# +# Hasso Tepper , 1999-2004, 2005, 2006. +# Marek Laane , 2003-2009. +# Peeter Russak , 2005. +# Marek Laane , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 10:59+0200\n" +"Last-Translator: Marek Laane \n" +"Language-Team: Estonian \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Rakenduse unikaalne nimi (kohustuslik)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reserveeritud kiirklahv" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt rakenduse standardse kiirklahviga" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/eu/kdeclarative5.po b/po/eu/kdeclarative5.po new file mode 100644 index 0000000..9ffaf5e --- /dev/null +++ b/po/eu/kdeclarative5.po @@ -0,0 +1,113 @@ +# Translation of kdeclarative5.po to Euskara/Basque (eu). +# Copyright (C) 1999-2017, Free Software Foundation, Inc. +# This file is distributed under the same license as the frameworks package. +# KDE Euskaratzeko proiektuaren arduraduna . +# +# Translators: +# Marcos , 2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# Ion Gaztañaga , 2005. +# Iñaki Larrañaga Murgoitio , 2009. +# Iñigo Salvador Azurmendi , 2010, 2011, 2012, 2013, 2014, 2017, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative5\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-10 22:17+0100\n" +"Last-Translator: Iñigo Salvador Azurmendi \n" +"Language-Team: Basque \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 19.12.1\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@euskalnet.net" + +#: kpackagelauncherqml/main.cpp:30 +#, kde-format +msgid "KPackage QML application shell" +msgstr "KPackage QML aplikazioaren shell" + +#: kpackagelauncherqml/main.cpp:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Aplikazioaren izen esklusiboa (nahitaezkoa)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Lasterbide erreserbatua" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Aplikazioaren lasterbide estandarrekin gatazkan" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/fa/kdeclarative5.po b/po/fa/kdeclarative5.po new file mode 100644 index 0000000..c40c2cf --- /dev/null +++ b/po/fa/kdeclarative5.po @@ -0,0 +1,109 @@ +# translation of kdelibs4.po to Persian +# Nazanin Kazemi , 2006, 2007. +# Mahdi Foladgar , 2006. +# Nasim Daniarzadeh , 2006, 2007. +# Tahereh Dadkhahfar , 2006. +# MaryamSadat Razavi , 2007. +# Nooshin Asiaie , 2007. +# Mohamad Reza Mirdamadi , 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-06-28 16:40+0430\n" +"Last-Translator: Mohammad Reza Mirdamadi \n" +"Language-Team: Farsi (Persian) \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "میان‌بر رزرو شده" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "ناسازگاری با میان‌بر کاربرد استاندارد" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/fi/kdeclarative5.po b/po/fi/kdeclarative5.po new file mode 100644 index 0000000..25ec0c2 --- /dev/null +++ b/po/fi/kdeclarative5.po @@ -0,0 +1,126 @@ +# 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 , 2002,2003, 2005, 2006, 2007. +# Tapio Kautto , 2003, 2004. +# Mikko Ikola , 2003. +# Teemu Rytilahti , 2003, 2008. +# Mikko Ikola , 2003. +# Teemu Rytilahti , 2003, 2004, 2008. +# Niklas Laxström , 2006, 2007. +# Joonas Niilola , 2006. +# Mikko Piippo , 2007. +# Teemu Rytilahti , 2008. +# Tommi Nieminen , 2009, 2010, 2011, 2020. +# Jorma Karvonen , 2010. +# Lasse Liehu , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-17 18:07+0200\n" +"Last-Translator: Tommi Nieminen \n" +"Language-Team: Finnish \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Sovelluksen yksilöllinen nimi (pakollinen)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Varattu pikanäppäin" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Ristiriita sovelluksen vakiopikanäppäimen kanssa" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/fr/kdeclarative5.po b/po/fr/kdeclarative5.po new file mode 100644 index 0000000..2090948 --- /dev/null +++ b/po/fr/kdeclarative5.po @@ -0,0 +1,127 @@ +# translation of kdelibs4.po to Français +# translation of kdelibs4.po to +# Matthieu Robin , 2002,2003, 2004. +# Robert Jacolin , 2003,2004. +# Gilles Caulier , 2003. +# Gérard Delafond , 2003, 2004. +# Matthieu Robin , 2004, 2005, 2006. +# Cedric Pasteur , 2004. +# Nicolas Ternisien , 2004, 2005, 2006, 2007, 2008. +# Matthieu Robin , 2005. +# Éric Bischoff , 2005. +# Sébastien Renard , 2006, 2007, 2008. +# Anne-Marie Mahfouf , 2007, 2008, 2012. +# Ludovic Grossard , 2008. +# Mickael Sibelle , 2008. +# Nicolas Lécureuil , 2010. +# Joëlle Cornavin , 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Sebastien Renard , 2013, 2014. +# Vincent Pinon , 2016. +# Simon Depiets , 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-02-02 18:04+0800\n" +"Last-Translator: Simon Depiets \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Lokalize 19.07.70\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Le nom unique de l'application (obligatoire)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Raccourci réservé" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflit avec un raccourci d'application standard" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/fy/kdeclarative5.po b/po/fy/kdeclarative5.po new file mode 100644 index 0000000..2231c69 --- /dev/null +++ b/po/fy/kdeclarative5.po @@ -0,0 +1,112 @@ +# 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 , 2002. +# KDE-oersetgroep Frysk , 2000, 2001, 2002,2003. +# Rinse de Vries , 2004, 2005, 2006, 2007. +# Berend ytsma , 2004. +# Rinse de Vries , 2006, 2008. +# Berend Ytsma , 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2010-07-22 09:48+0100\n" +"Last-Translator: Berend Ytsma \n" +"Language-Team: nl \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definiearret it lettertype foar de applikaasjes" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reservearre fluchtoets" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt mei standert applikaasje-fluchtoets" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ga/kdeclarative5.po b/po/ga/kdeclarative5.po new file mode 100644 index 0000000..7b4b79f --- /dev/null +++ b/po/ga/kdeclarative5.po @@ -0,0 +1,118 @@ +# translation of kdelibs4.po to Irish +# Translation of kdelibs4.po to Irish +# Copyright (C) 1999,2003,2004 Free Software Foundation, Inc. +# Sean V. Kelley , 1999 +# Séamus Ó Ciardhuáin , 2003,2004 +# Kevin Scannell , 2004-2009 +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2004-12-14 09:11-0600\n" +"Last-Translator: Kevin Scannell \n" +"Language-Team: Irish \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "socraíonn cló an fheidhmchláir" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Aicearra In Áirithe" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Coimhlint le hAicearra Feidhmchláir Chaighdeánaithe" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/gd/kdeclarative5.po b/po/gd/kdeclarative5.po new file mode 100644 index 0000000..ecb05d1 --- /dev/null +++ b/po/gd/kdeclarative5.po @@ -0,0 +1,111 @@ +# 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 , 2014, 2015, 2016. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative5\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2016-04-30 12:50+0100\n" +"Last-Translator: GunChleoc \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Ainm sònraichte na h-aplacaid (riatanach)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Ath-ghoirid ghlèidhte" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Còmhstri le ath-ghoirid thùsail na h-aplacaid" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/gl/kdeclarative5.po b/po/gl/kdeclarative5.po new file mode 100644 index 0000000..349b685 --- /dev/null +++ b/po/gl/kdeclarative5.po @@ -0,0 +1,117 @@ +# 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 , 2007, 2008, 2009. +# Marce Villarino , 2008, 2009. +# marce villarino , 2009. +# marce villarino , 2009. +# Marce Villarino , 2009, 2010, 2011, 2012. +# Xosé , 2010. +# Marce Villarino , 2011, 2012, 2013, 2014. +# Adrián Chaves Fernández , 2015. +# Adrian Chaves , 2018, 2019. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2019-10-19 22:29+0200\n" +"Last-Translator: Adrián Chaves (Gallaecio) \n" +"Language-Team: Galician \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Nome único para a aplicación (obrigatorio)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Atallo reservado" + +# skip-rule: PT-2010-window +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflito cun atallo estándar de aplicación" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/gu/kdeclarative5.po b/po/gu/kdeclarative5.po new file mode 100644 index 0000000..efb2a6e --- /dev/null +++ b/po/gu/kdeclarative5.po @@ -0,0 +1,105 @@ +# 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 , 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-11-22 00:01+0530\n" +"Last-Translator: Kartik Mistry \n" +"Language-Team: Gujarati \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "નવો વેબ ટુંકાણ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "પ્રમાણભૂત કાર્યક્રમ ટૂંકાણ સાથે તકરાર થાય છે" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ha/kdeclarative5.po b/po/ha/kdeclarative5.po new file mode 100644 index 0000000..59725a9 --- /dev/null +++ b/po/ha/kdeclarative5.po @@ -0,0 +1,99 @@ +# 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 , 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-03-17 11:22+0100\n" +"Last-Translator: Adriaan de Groot \n" +"Language-Team: Hausa \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/he/kdeclarative5.po b/po/he/kdeclarative5.po new file mode 100644 index 0000000..57a4884 --- /dev/null +++ b/po/he/kdeclarative5.po @@ -0,0 +1,120 @@ +# 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 +# Copyright (C) 1999-2003 Meni Livne +# +# This translation is subject to the same Open Source +# license as the program which it accompanies. +# +# Diego Iastrubni , 2003. +# Diego Iastrubni , 2003, 2004. +# Diego Iastrubni , 2005, 2006, 2007, 2008, 2009, 2012, 2014. +# Meni Livne , 2007. +# tahmar1900 , 2008, 2009. +# Elkana Bardugo , 2017. #zanata +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative5\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2017-05-16 06:49-0400\n" +"Last-Translator: Copied by Zanata \n" +"Language-Team: Hebrew \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:37 +#, fuzzy, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "קיצורי מקשים שמורים" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "התנגשות עם קיצור סטנדרטי של ישומים" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/hi/kdeclarative5.po b/po/hi/kdeclarative5.po new file mode 100644 index 0000000..9e6a569 --- /dev/null +++ b/po/hi/kdeclarative5.po @@ -0,0 +1,106 @@ +# 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 , 2007. +# Ravishankar Shrivastava , 2008. +# G Karunakar , 2009, 2010, 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-06-25 15:27+0530\n" +"Last-Translator: G Karunakar \n" +"Language-Team: 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 1.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" + +#: kpackagelauncherqml/main.cpp:30 +#, kde-format +msgid "KPackage QML application shell" +msgstr "" + +#: kpackagelauncherqml/main.cpp:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "आरक्षित शॉर्टकट" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "प्रामाणिक अनुप्रयोग शॉर्टकट के परस्पर विरोध में है" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/hne/kdeclarative5.po b/po/hne/kdeclarative5.po new file mode 100644 index 0000000..8a3725a --- /dev/null +++ b/po/hne/kdeclarative5.po @@ -0,0 +1,106 @@ +# 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 , 2007. +# Ravishankar Shrivastava , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-02-10 20:44+0530\n" +"Last-Translator: Ravishankar Shrivastava \n" +"Language-Team: Hindi \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "नवा वेब सार्टकट" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "प्रामानिक अनुपरयोग सार्टकट के आपसी विरोध मं हे" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/hr/kdeclarative5.po b/po/hr/kdeclarative5.po new file mode 100644 index 0000000..7113b25 --- /dev/null +++ b/po/hr/kdeclarative5.po @@ -0,0 +1,126 @@ +# Translation of kdelibs4 to Croatian +# +# Renato Pavicic , 2006. +# Zarko Pintar , 2009. +# Marko Dimjasevic , 2009, 2010, 2011. +# Andrej Dundović , 2009, 2010. +# DoDo , 2009. +# Andrej Dundovic , 2009, 2010, 2011. +# Marko Dimjašević , 2011. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2011-07-22 16:08+0200\n" +"Last-Translator: Marko Dimjašević \n" +"Language-Team: Croatian \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definira pismo aplikacije." + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervirani prečaci" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Sukob sa zadanim prečacem aplikacije" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/hsb/kdeclarative5.po b/po/hsb/kdeclarative5.po new file mode 100644 index 0000000..e8dc373 --- /dev/null +++ b/po/hsb/kdeclarative5.po @@ -0,0 +1,109 @@ +# translation of kdelibs4.po to Upper Sorbian +# translation of kdelibs4.po to +# Copyright (C) 2003,2004, 2005, 2007 Free Software Foundation, Inc. +# Eduard Werner , 2003. +# Prof. Dr. Eduard Werner , 2003,2004. +# Eduard Werner , 2005. +# Eduard Werner/Edward Wornar , 2007, 2008. +# Bianka Šwejdźic , 2007, 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2008-12-19 22:49+0100\n" +"Last-Translator: Eduard Werner \n" +"Language-Team: en_US \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definuje pismo programa." + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "Nowa skrótšenka za web" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt ze standardowym outputom programa" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/hu/kdeclarative5.po b/po/hu/kdeclarative5.po new file mode 100644 index 0000000..49b0dc2 --- /dev/null +++ b/po/hu/kdeclarative5.po @@ -0,0 +1,106 @@ +# Kiszel Kristóf , 2010. +# Kristóf Kiszel , 2010, 2011, 2012, 2014, 2019. +# Balázs Úr , 2012, 2013. +# Kristof Kiszel , 2018, 2020. +msgid "" +msgstr "" +"Project-Id-Version: KDE 4.4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-11-12 21:45+0100\n" +"Last-Translator: Kristóf Kiszel \n" +"Language-Team: Hungarian \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Az alkalmazás egyedi neve (kötelező)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Foglalt keresőazonosító" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Ütközés egy alkalmazásbeli billentyűkombinációval" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/hy/kdeclarative5.po b/po/hy/kdeclarative5.po new file mode 100644 index 0000000..2dfa7c0 --- /dev/null +++ b/po/hy/kdeclarative5.po @@ -0,0 +1,117 @@ +# KDE - kdelibs/kdelibs4.po Armenian translation. +# Copyright (C) 2005, KDE Armenian translation team. +# +# Davit Nikoghosyan , 2013 +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-01-31 01:08+0400\n" +"Last-Translator: Davit \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Պահեստավորված կոճակների համադրություն" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Կոնֆլիկտ ծրագրի ստանդարտ կոճակի հետ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ia/kdeclarative5.po b/po/ia/kdeclarative5.po new file mode 100644 index 0000000..ce6bdb8 --- /dev/null +++ b/po/ia/kdeclarative5.po @@ -0,0 +1,109 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# g.sora , 2010, 2011, 2012, 2013, 2014, 2017, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-02-08 23:04+0100\n" +"Last-Translator: Giovanni Sora \n" +"Language-Team: Interlingua \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Il define le nomine unic del application (obligatori)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Via breve reservate" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "" +"Conflicto con Standard Application Shortcut (Via Breve de application " +"standard)" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/id/kdeclarative5.po b/po/id/kdeclarative5.po new file mode 100644 index 0000000..7cc1ef9 --- /dev/null +++ b/po/id/kdeclarative5.po @@ -0,0 +1,109 @@ +# 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 , 2010-2014. +# Wantoyo , 2017, 2018, 2019, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-14 07:27+0700\n" +"Last-Translator: Wantoyo \n" +"Language-Team: Indonesian \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Nama unik dari aplikasi (mandat)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Pintasan Dipesan" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflik dengan Pintasan Aplikasi Standar" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/is/kdeclarative5.po b/po/is/kdeclarative5.po new file mode 100644 index 0000000..6a0f00f --- /dev/null +++ b/po/is/kdeclarative5.po @@ -0,0 +1,128 @@ +# 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 , 1998-2003. +# Richard Allen , 1998-2004. +# Pjetur G. Hjaltason , 2003. +# Arnar Leósson , 2003, 2005. +# Sveinn í Felli , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2016-04-08 22:57+0000\n" +"Last-Translator: Sveinn í Felli \n" +"Language-Team: Icelandic \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "skilgreinir letur forritsins" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Frátekinn flýtilykill" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Árekstur við staðlaða fýtilykla forrita" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/it/kdeclarative5.po b/po/it/kdeclarative5.po new file mode 100644 index 0000000..7f48f69 --- /dev/null +++ b/po/it/kdeclarative5.po @@ -0,0 +1,116 @@ +# translation of kdelibs4.po to Italian +# Andrea Rizzi , 2003, 2004, 2005. +# Federico Cozzi , 2004. +# Federico Zenith , 2004, 2008, 2009, 2010, 2011. +# Andrea Rizzi , 2004. +# Nicola Ruggero , 2005, 2006. +# Nicola Ruggero , 2006, 2007, 2010. +# Luciano Montanaro , 2007. +# Dario Panico , 2008. +# Pino Toscano , 2008. +# Federico Zenith , 2008, 2012, 2013, 2014, 2015. +# Innocenzo Ventre , 2012. +# Vincenzo Reale , 2014, 2015, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 20:30+0100\n" +"Last-Translator: Vincenzo Reale \n" +"Language-Team: Italian \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 19.12.0\n" + +#, kde-format +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Vincenzo Reale" + +#, kde-format +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "smart2128@baslug.org" + +#: kpackagelauncherqml/main.cpp:30 +#, kde-format +msgid "KPackage QML application shell" +msgstr "Shell applicazione KPackage QML" + +#: kpackagelauncherqml/main.cpp:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Il nome univoco dell'applicazione (obbligatorio)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Scorciatoia riservata" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflitto con una scorciatoia standard delle applicazioni" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/ja/kdeclarative5.po b/po/ja/kdeclarative5.po new file mode 100644 index 0000000..07ca347 --- /dev/null +++ b/po/ja/kdeclarative5.po @@ -0,0 +1,116 @@ +# Translation of kdelibs4 into Japanese. +# This file is distributed under the same license as the kdelibs package. +# Taiki Komoda , 2002, 2004, 2006, 2010. +# Noboru Sinohara , 2004. +# Toyohiro Asukai , 2004. +# Kurose Shushi , 2004. +# AWASHIRO Ikuya , 2004. +# Shinichi Tsunoda , 2005. +# Yukiko Bando , 2006, 2007, 2008, 2009, 2010. +# Fumiaki Okushi , 2006, 2007, 2008, 2010, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2011-08-27 14:05-0700\n" +"Last-Translator: Fumiaki Okushi \n" +"Language-Team: Japanese \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "予約済みのショートカット" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "標準アプリケーションショートカットと競合します" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ka/kdeclarative5.po b/po/ka/kdeclarative5.po new file mode 100644 index 0000000..4999552 --- /dev/null +++ b/po/ka/kdeclarative5.po @@ -0,0 +1,103 @@ +# KDE3 - Georgian translation of kdelibs4.po +# Gia Shervashidze , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-12-17 02:11+0400\n" +"Last-Translator: George Machitidze \n" +"Language-Team: Georgian \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "მალმხმობი" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "კონფლიქტი პროგრამის სტანდარტულ მალმხმობთან" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/kk/kdeclarative5.po b/po/kk/kdeclarative5.po new file mode 100644 index 0000000..4a8eb21 --- /dev/null +++ b/po/kk/kdeclarative5.po @@ -0,0 +1,121 @@ +# translation of kdelibs4.po to Karakh +# +# Sairan Kikkarin , 2005, 2006, 2007, 2008, 2009. +# Sairan Kikkarin , 2010, 2011, 2012. +# Sairan Kikkarin , 2010, 2013. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-11-08 01:24+0600\n" +"Last-Translator: Sairan Kikkarin \n" +"Language-Team: Kazakh \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Арналған тіркесімі" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Қолданбаның стандартты перне тіркесімімен қайшылық" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/km/kdeclarative5.po b/po/km/kdeclarative5.po new file mode 100644 index 0000000..c689513 --- /dev/null +++ b/po/km/kdeclarative5.po @@ -0,0 +1,111 @@ +# translation of kdelibs4.po to Khmer +# Khoem Sokhem , 2008, 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-06-27 10:04+0700\n" +"Last-Translator: Khoem Sokhem \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "ផ្លូវកាត់​ដែល​បានបម្រុង​ទុក" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "ប៉ះទង្គិច​ជាមួយ​នឹង​ផ្លូវកាត់​កម្មវិធី​ស្តង់ដា" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/kn/kdeclarative5.po b/po/kn/kdeclarative5.po new file mode 100644 index 0000000..dcacc6d --- /dev/null +++ b/po/kn/kdeclarative5.po @@ -0,0 +1,107 @@ +# 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 , 2007. +# Umesh Rudrapatna , 2007, 2008, 2009. +# Shankar Prasad , 2008, 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2010-06-24 18:32+0530\n" +"Last-Translator: Shankar Prasad \n" +"Language-Team: kn_IN \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "ಕಾದಿರಿಸಲಾದ ಸಮೀಪಮಾರ್ಗ (ಶಾರ್ಟ್ ಕಟ್)" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "ಮಾನಕ (standard) ಅನ್ವಯಿಕ ಸಮೀಪಮಾರ್ಗಗಳೊಡನೆ ಕಲಹ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ko/kdeclarative5.po b/po/ko/kdeclarative5.po new file mode 100644 index 0000000..8584cb7 --- /dev/null +++ b/po/ko/kdeclarative5.po @@ -0,0 +1,106 @@ +# Korean messages for kdelibs. +# Copyright (C) Free Software Foundation, Inc. +# Cho Sung Jae , 2007. +# Shinjo Park , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-26 23:10+0100\n" +"Last-Translator: Shinjo Park \n" +"Language-Team: Korean \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 19.04.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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "예약된 바로 가기" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "표준 프로그램 단축키와 충돌" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 파일을 지정하지 않았음" diff --git a/po/ku/kdeclarative5.po b/po/ku/kdeclarative5.po new file mode 100644 index 0000000..3de6f64 --- /dev/null +++ b/po/ku/kdeclarative5.po @@ -0,0 +1,117 @@ +# 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 , 2006. +# Erdal Ronahi , 2006, 2008. +# Erdal Ronahi , 2007, 2008, 2009. +# Amed Çeko Jiyan , 2008. +# Erdal Ronahî , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2010-08-13 15:45+0200\n" +"Last-Translator: Erdal Ronahî \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "curetîpê sepandinê diyar dike" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Kurteriya Veqetandî" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Lihevnekirina Bi Kurteriya Sepana Standard" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/lb/kdeclarative5.po b/po/lb/kdeclarative5.po new file mode 100644 index 0000000..63259fc --- /dev/null +++ b/po/lb/kdeclarative5.po @@ -0,0 +1,103 @@ +# translation of kdelibs4.po to Luxembourgish +# kevin claude everard , 2005. +# Michel Ludwig , 2005, 2006. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2006-06-22 16:29+0200\n" +"Last-Translator: Michel Ludwig \n" +"Language-Team: Luxembourgish \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:37 +#, 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/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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Tastekombinatioun" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt mat der Standardkombinatioun vum Programm" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/lt/kdeclarative5.po b/po/lt/kdeclarative5.po new file mode 100644 index 0000000..6b95664 --- /dev/null +++ b/po/lt/kdeclarative5.po @@ -0,0 +1,114 @@ +# translation of kdelibs4.po to Lithuanian +# Ričardas Čepas , 2002-2004. +# Donatas Glodenis , 2004-2009. +# Gintautas Miselis , 2008. +# Andrius Štikonas , 2009. +# Tomas Straupis , 2011. +# Remigijus Jarmalavičius , 2011. +# Liudas Ališauskas , 2011, 2012, 2013, 2014. +# Liudas Alisauskas , 2013, 2015. +# Mindaugas Baranauskas , 2015. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-11 23:54+0200\n" +"Last-Translator: Moo\n" +"Language-Team: lt \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Unikalus programos pavadinimas (privalomas)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervuota klavišų kombinacija" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konfliktas su standartine programos klavišų kombinacija" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/lv/kdeclarative5.po b/po/lv/kdeclarative5.po new file mode 100644 index 0000000..71365be --- /dev/null +++ b/po/lv/kdeclarative5.po @@ -0,0 +1,120 @@ +# 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 , 2005. +# Maris Nartiss , 2006, 2007, 2008, 2009, 2010, 2011. +# Linux localization project , 2007. +# Viesturs Zarins , 2007, 2008, 2010. +# Viesturs Zariņš , 2009. +# Einars Sprugis , 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2011-07-06 12:57+0300\n" +"Last-Translator: Maris Nartiss \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definē programmas fontu" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervērts īsceļš" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikts ar standarta programmu īsceļu" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/mai/kdeclarative5.po b/po/mai/kdeclarative5.po new file mode 100644 index 0000000..9b228f7 --- /dev/null +++ b/po/mai/kdeclarative5.po @@ -0,0 +1,107 @@ +# 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 , 2008. +# Rajesh Ranjan , 2010. +# Rajesh Ranjan , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2010-09-24 15:44+0530\n" +"Last-Translator: Rajesh Ranjan \n" +"Language-Team: Hindi \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "शार्टकट" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "प्रामाणिक अनुप्रयोग शार्टकट केर परस्पर विरोध मे अछि" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/mk/kdeclarative5.po b/po/mk/kdeclarative5.po new file mode 100644 index 0000000..45084cb --- /dev/null +++ b/po/mk/kdeclarative5.po @@ -0,0 +1,126 @@ +# translation of kdelibs4.po to Macedonian +# +# Copyright (C) 2000,2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# Dimitar Indovski +# Damjan Janevski +# Dragan Sekulovski +# +# Maratonec , 2002. +# Dragan Bocevski , 2002. +# Danko Ilik , 2002,2003. +# Bozidar Proevski , 2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# Danko Ilik , 2003. +# Darko Nikolovski , 2003. +# Ivan Dimitrov , 2003. +# Magdica Shambevska , 2004. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2010-01-27 10:39+0100\n" +"Last-Translator: Bozidar Proevski \n" +"Language-Team: Macedonian \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Резервирана кратенка" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Конфликт со стандардна кратенка на апликација" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ml/kdeclarative5.po b/po/ml/kdeclarative5.po new file mode 100644 index 0000000..4b99a80 --- /dev/null +++ b/po/ml/kdeclarative5.po @@ -0,0 +1,105 @@ +# 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 | പനവളപ്പില്‍ , 2008. +# ANI PETER|അനി പീറ്റര്‍ , 2008. +# Maxin B. John , 2007. +# Manu S Madhav | മനു എസ് മാധവ് , 2008. +# Praveen Arimbrathodiyil , 2007, 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2019-12-12 21:03+0000\n" +"Last-Translator: Vivek KJ Pazhedath \n" +"Language-Team: SMC \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:37 +#, fuzzy, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "പറഞ്ഞുവച്ച കുറുക്കുവഴി" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "നിലവാരത്തിലുള്ള പ്രയോഗ കുറുക്കുവഴിയുമായി പ്രശ്നം" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/mr/kdeclarative5.po b/po/mr/kdeclarative5.po new file mode 100644 index 0000000..15692ff --- /dev/null +++ b/po/mr/kdeclarative5.po @@ -0,0 +1,106 @@ +# 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 , 2008, 2009. +# Chetan Khona , 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-03-29 16:14+0530\n" +"Last-Translator: Chetan Khona \n" +"Language-Team: Marathi \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "आरक्षित शॉर्टकट" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "प्रमाणित अनुप्रयोग शॉर्टकट सह मतभेद" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ms/kdeclarative5.po b/po/ms/kdeclarative5.po new file mode 100644 index 0000000..ad5f38d --- /dev/null +++ b/po/ms/kdeclarative5.po @@ -0,0 +1,116 @@ +# kdelibs4 Bahasa Melayu (Malay) (ms) +# Hasbullah bin Pit , 2003. +# Muhammad Najmi Ahmad Zabidi , 2003. +# Mohd Nasir bin Che Embee , 2003. +# Muhammad Najmi bin Ahmad Zabidi , 2006. +# Sharuzzaman Ahmat Raslan , 2006, 2007, 2008, 2009, 2010. +# Sharuzzaman Ahmat Raslan , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2011-07-16 00:57+0800\n" +"Last-Translator: Sharuzzaman Ahmat Raslan \n" +"Language-Team: Malay \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "mentakrifkan font aplikasi" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Pintasan Dikhaskan" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflik dengan Piawaian Kekunci Pintas Aplikasi" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/nb/kdeclarative5.po b/po/nb/kdeclarative5.po new file mode 100644 index 0000000..bb750ef --- /dev/null +++ b/po/nb/kdeclarative5.po @@ -0,0 +1,115 @@ +# Translation of kdeclarative5 to Norwegian Bokmål +# +# Knut Yrvin , 2002, 2003, 2004, 2005. +# Bjørn Steensrud , 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015. +# Eskild Hustvedt , 2004, 2005. +# Gaute Hvoslef Kvalnes , 2004, 2005. +# Axel Bojer , 2005, 2006. +# Nils Kristian Tomren , 2005, 2007. +# Øyvind A. Holm , 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2015-04-28 08:55+0200\n" +"Last-Translator: Bjørn Steensrud \n" +"Language-Team: Norwegian Bokmål \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Det entydige navnet på programmet (obligatorisk)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reservert snarvei" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt med en standard programsnarvei" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/nds/kdeclarative5.po b/po/nds/kdeclarative5.po new file mode 100644 index 0000000..e45ba8b --- /dev/null +++ b/po/nds/kdeclarative5.po @@ -0,0 +1,111 @@ +# Translation of kdelibs4.po to Low Saxon +# Heiko Evermann , 2004. +# Heiko Evermann , 2004, 2005. +# Volker Jockheck , 2004. +# Sönke Dibbern , 2004, 2005, 2006, 2007, 2008, 2009, 2014. +# Manfred Wiese , 2008, 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2014-05-11 00:55+0200\n" +"Last-Translator: Sönke Dibbern \n" +"Language-Team: Low Saxon \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:37 +#, 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/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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reserveert Tastkombinatschoon" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Problem mit'n Standard-Programmkombinatschoon" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ne/kdeclarative5.po b/po/ne/kdeclarative5.po new file mode 100644 index 0000000..a5a9405 --- /dev/null +++ b/po/ne/kdeclarative5.po @@ -0,0 +1,113 @@ +# translation of kdelibs4.po to Nepali +# Mahesh Subedi , 2006, 2007. +# Shiva Prasad Pokharel , 2006, 2007. +# shyam krishna ball , 2006. +# shyam krishna bal , 2006, 2007. +# Shiva Pokharel , 2007. +# Nabin Gautam , 2007. +# Shiva Prasad Pokharel , 2007. +# Shyam Krishna Bal , 2007. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2007-11-05 15:41+0545\n" +"Last-Translator: Shyam Krishna Bal \n" +"Language-Team: Nepali \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "सर्टकट" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "मानक अनुप्रयोग सर्टकटसँग द्वन्द्व" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/nl/kdeclarative5.po b/po/nl/kdeclarative5.po new file mode 100644 index 0000000..952ea9c --- /dev/null +++ b/po/nl/kdeclarative5.po @@ -0,0 +1,126 @@ +# 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 , 2000, 2001, 2002. +# Rinse de Vries ,2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009. +# Wilbert Berendsen , 2003, 2004. +# Bram Schoenmakers , 2004, 2005, 2006, 2007. +# Tom Albers , 2004. +# Sander Koning , 2005. +# Tijmen Baarda , 2005. +# Freek de Kruijf , 2008, 2009. +# Kristof Bal , 2008, 2009. +# Freek de Kruijf , 2009, 2010. +# Freek de Kruijf , 2010, 2011, 2012. +# Freek de Kruijf , 2010, 2011, 2013, 2014, 2015, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 11:01+0100\n" +"Last-Translator: Freek de Kruijf \n" +"Language-Team: Dutch \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 19.12.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 2020" + +#, 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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "De unieke naam van de toepassingen" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Gereserveerde snelkoppeling" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflict met standaard-sneltoets" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/nn/kdeclarative5.po b/po/nn/kdeclarative5.po new file mode 100644 index 0000000..3fd17d7 --- /dev/null +++ b/po/nn/kdeclarative5.po @@ -0,0 +1,111 @@ +# Translation of kdeclarative5 to Norwegian Nynorsk +# +# Gaute Hvoslef Kvalnes , 2003, 2004, 2005, 2006. +# Håvard Korsvoll , 2003, 2005. +# Karl Ove Hufthammer , 2004, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2019, 2020. +# Eirik U. Birkeland , 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-02-16 14:31+0100\n" +"Last-Translator: Karl Ove Hufthammer \n" +"Language-Team: Norwegian Nynorsk \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Eintydig namn på programmet (obligatorisk)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reservert snarveg" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt med standardprogramsnarveg" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/oc/kdeclarative5.po b/po/oc/kdeclarative5.po new file mode 100644 index 0000000..8668e82 --- /dev/null +++ b/po/oc/kdeclarative5.po @@ -0,0 +1,101 @@ +# 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) , 2007, 2008. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2008-08-06 00:07+0200\n" +"Last-Translator: \n" +"Language-Team: Occitan \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Acorchi" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflicte amb un acorchi clavièr d'aplicacion estandarda" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/or/kdeclarative5.po b/po/or/kdeclarative5.po new file mode 100644 index 0000000..24ae502 --- /dev/null +++ b/po/or/kdeclarative5.po @@ -0,0 +1,107 @@ +# 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 , 2008. +# Manoj Kumar Giri , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-01-02 17:37+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "New Web Shortcut" +msgid "Reserved Shortcut" +msgstr "ନୂତନ ୱେବ ସଂକ୍ଷିପ୍ତ ପଥ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "ମାନକ ପ୍ରୟୋଗ ସଂକ୍ଷିପ୍ତ ପଥ ସହିତ ଦ୍ୱନ୍ଦ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/pa/kdeclarative5.po b/po/pa/kdeclarative5.po new file mode 100644 index 0000000..a081ce5 --- /dev/null +++ b/po/pa/kdeclarative5.po @@ -0,0 +1,114 @@ +# translation of kdelibs4.po to Punjabi +# Punjabi translation of kdelibs. +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. +# +# Amanpreet Singh Alam , 2004. +# Amanpreet Singh Alam , 2004. +# A S Alam , 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. +# ASB , 2007. +# Amanpreet Singh Alam , 2008. +# Amanpreet Singh , 2008. +# Amanpreet Singh Alam , 2008, 2009, 2013, 2014. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2014-03-16 23:21-0500\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi/Panjabi \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "ਰਾਖਵਾਂ ਸ਼ਾਰਟਕੱਟ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "ਸਟੈਂਡਰਡ ਐਪਲੀਕੇਸ਼ਨ ਸ਼ਾਰਟਕੱਟਾਂ ਨਾਲ ਟਕਰਾਅ ਹੋ ਰਿਹਾ ਹੈ।" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/pl/kdeclarative5.po b/po/pl/kdeclarative5.po new file mode 100644 index 0000000..ce38822 --- /dev/null +++ b/po/pl/kdeclarative5.po @@ -0,0 +1,203 @@ +# translation of kdelibs4.po to Polish +# translation of kdelibs4.po to +# Version: $Revision: 685926 $ +# Ostatnie poprawki przed 2.0 Jacek Stolarczyk +# Jacek Stolarczyk , 2001. +# Piotr Roszatycki , 1997-2000. +# Artur Górniak , 2000. +# Michał Rudolf , 2002. +# Michal Rudolf , 2002,2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# Krzysztof Lichota , 2005, 2006. +# Marta Rybczyńska , 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Michal Rudolf , 2010. +# Artur Chłond , 2010. +# Łukasz Wojniłowicz , 2011, 2012, 2013, 2014, 2015, 2016, 2019. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2019-10-20 11:42+0200\n" +"Last-Translator: Łukasz Wojniłowicz \n" +"Language-Team: Polish \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 19.07.70\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Niepowtarzalna nazwa aplikacji (obowiązkowo)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Skrót zarezerwowany" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt ze standardowym skrótem programu" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, kde-format +msgid "Reassign" +msgstr "Przypisz ponownie" + +#: quickaddons/configmodule.cpp:164 +#, fuzzy, kde-format +#| msgid "Invalid KPackage" +msgid "Invalid KPackage '%1'" +msgstr "Nieprawidłowy KPackage" + +#: quickaddons/configmodule.cpp:170 +#, kde-format +msgid "No QML file provided" +msgstr "Nie podano pliku QML" diff --git a/po/ps/kdeclarative5.po b/po/ps/kdeclarative5.po new file mode 100644 index 0000000..3baea52 --- /dev/null +++ b/po/ps/kdeclarative5.po @@ -0,0 +1,103 @@ +# 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 , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2008-08-16 16:01-0800\n" +"Last-Translator: Zabeeh Khan \n" +"Language-Team: Pashto \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "لنډلار" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "د کره کاريال لنډلارې سره ټکر" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/pt/kdeclarative5.po b/po/pt/kdeclarative5.po new file mode 100644 index 0000000..d59f8fa --- /dev/null +++ b/po/pt/kdeclarative5.po @@ -0,0 +1,197 @@ +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 11:46+0000\n" +"Last-Translator: José Nuno Pires \n" +"Language-Team: pt \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "O nome único da aplicação (obrigatório)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Atalho Reservado" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflito com o Atalho-Padrão da Aplicação" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/pt_BR/kdeclarative5.po b/po/pt_BR/kdeclarative5.po new file mode 100644 index 0000000..36b2fe9 --- /dev/null +++ b/po/pt_BR/kdeclarative5.po @@ -0,0 +1,118 @@ +# 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 , 2002, 2003, 2004. +# Lisiane Sztoltz Teixeira , 2003, 2004, 2005. +# Henrique Pinto , 2003. +# Marcus Gama , 2006. +# Diniz Bortolotto , 2007, 2008. +# André Marcelo Alvarenga , 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# Luiz Fernando Ranghetti , 2008, 2009, 2010, 2012, 2019. +# Fernando Boaglio , 2009. +# Doutor Zero , 2007, 2009. +# Marcus Vinícius de Andrade Gama , 2010, 2012. +# Aracele Torres , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative5\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-09 23:30-0300\n" +"Last-Translator: André Marcelo Alvarenga \n" +"Language-Team: Brazilian Portuguese \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 19.04.3\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "O único nome do aplicativo (obrigatório)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Atalho reservado" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflito com o atalho padrão do aplicativo" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/ro/kdeclarative5.po b/po/ro/kdeclarative5.po new file mode 100644 index 0000000..b595223 --- /dev/null +++ b/po/ro/kdeclarative5.po @@ -0,0 +1,109 @@ +# Traducerea kdelibs4.po în Română +# Laurenţiu Buzdugan , 2008, 2009. +# Sergiu Bivol , 2008, 2009, 2010. +# Sergiu Bivol , 2010, 2012, 2013, 2014, 2020. +# Cristian Oneț , 2010, 2011, 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-09-27 13:04+0100\n" +"Last-Translator: Sergiu Bivol \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Denumirea unică a aplicației (obligatoriu)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Scurtătură rezervată" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Conflict cu un accelerator standard de aplicație" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/ru/kdeclarative5.po b/po/ru/kdeclarative5.po new file mode 100644 index 0000000..118abc9 --- /dev/null +++ b/po/ru/kdeclarative5.po @@ -0,0 +1,128 @@ +# KDE - kdelibs/kdelibs4.po Russian translation. +# Copyright (C) 2005, KDE Russian translation team. +# +# Denis Perchine , 2000. +# Gregory Mokhin , 2000, 2004, 2005. +# Albert R. Valiev , 2002, 2008. +# Leonid Kanter , 2002-2004, 2005, 2008. +# Andrey Cherepanov , 2005-2007, 2008, 2009, 2011. +# Nick Shaforostoff , 2004, 2006, 2007, 2008, 2009. +# Nick Shaforostoff , 2009. +# Alexander Potashev , 2009, 2010, 2011, 2014, 2015, 2019. +# Yury G. Kudryashov , 2011. +# Yuri Efremov , 2012. +# Inga Barinova , 2012. +# Julia Dronova , 2012. +# Alexander Lakhin , 2013. +# Alexander Yavorsky , 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-18 18:00+0300\n" +"Last-Translator: Alexander Yavorsky \n" +"Language-Team: Russian \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 19.12.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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Зарезервированная комбинация клавиш" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Конфликт со стандартной клавишей приложения" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/se/kdeclarative5.po b/po/se/kdeclarative5.po new file mode 100644 index 0000000..8f792ea --- /dev/null +++ b/po/se/kdeclarative5.po @@ -0,0 +1,110 @@ +# Translation of kdeclarative5 to Northern Sami +# +# Børre Gaup , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-05-30 23:19+0200\n" +"Last-Translator: Børre Gaup \n" +"Language-Team: Northern Sami \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Várrejuvvon njuolggobálggis" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikta standardprográmma njuolggobálgáin" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/si/kdeclarative5.po b/po/si/kdeclarative5.po new file mode 100644 index 0000000..3e8eb8f --- /dev/null +++ b/po/si/kdeclarative5.po @@ -0,0 +1,103 @@ +# This file is distributed under the same license as the PACKAGE package. +# +# Danishka Navin , 2008, 2009, 2010, 2011. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2011-07-25 07:45+0530\n" +"Last-Translator: Danishka Navin \n" +"Language-Team: Sinhala \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "වෙන් කළ කෙටි මාර්‍ගය" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "සම්මත වැඩසටහන් කෙටි මඟ සමඟ ගැටේ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/sk/kdeclarative5.po b/po/sk/kdeclarative5.po new file mode 100644 index 0000000..c11642e --- /dev/null +++ b/po/sk/kdeclarative5.po @@ -0,0 +1,117 @@ +# translation of kdelibs4.po to Slovak +# Stanislav Visnovsky , 2002. +# Stanislav Visnovsky , 2003, 2004, 2005. +# Richard Fric , 2006, 2007, 2010. +# Michal Gaspar , 2006. +# Jakub , 2009. +# Michal Sulek , 2009, 2010, 2011. +# Richard Frič , 2011. +# Roman Paholík , 2012, 2013, 2014, 2015. +# Matej Mrenica , 2019. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2019-10-10 20:01+0200\n" +"Last-Translator: Matej Mrenica \n" +"Language-Team: Slovak \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Jedinečný názov pre aplikáciu (povinné)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervovaná skratka" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt so štandardnou skratkou aplikácie" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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ý" diff --git a/po/sl/kdeclarative5.po b/po/sl/kdeclarative5.po new file mode 100644 index 0000000..922c13a --- /dev/null +++ b/po/sl/kdeclarative5.po @@ -0,0 +1,123 @@ +# 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 , 2002. +# Gregor Rakar , 2002,2003. +# Gregor Rakar , 2003, 2004, 2005. +# Andrej Vernekar , 2005, 2007, 2008, 2009, 2010. +# Jure Repinc , 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Andrej Vernekar , 2008, 2011, 2012. +# Andrej Mernik , 2012, 2013, 2014, 2015. +# Matjaž Jeran , 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-05-19 09:13+0200\n" +"Last-Translator: Matjaž Jeran \n" +"Language-Team: Slovenian \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 \n" +"X-Generator: Poedit 2.3\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Edinstveno ime programa (obvezno)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rezervirana bližnjica" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Spor z običajnimi bližnjicami programov" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/sq/kdeclarative5.po b/po/sq/kdeclarative5.po new file mode 100644 index 0000000..7aadbf4 --- /dev/null +++ b/po/sq/kdeclarative5.po @@ -0,0 +1,101 @@ +# Agron Selimaj , 2012. +msgid "" +msgstr "" +"Project-Id-Version: kde4libs\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-01-19 00:20-0500\n" +"Last-Translator: Agron Selimaj \n" +"Language-Team: Albanian \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "përkufizon gërmat e programit" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Create Web Shortcut" +msgid "Reserved Shortcut" +msgstr "Krijo Shkurtore Web-i" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflike me Shkurtoren e Programit Standart" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/sr/kdeclarative5.po b/po/sr/kdeclarative5.po new file mode 100644 index 0000000..a6a55be --- /dev/null +++ b/po/sr/kdeclarative5.po @@ -0,0 +1,121 @@ +# Translation of kdeclarative5.po into Serbian. +# Marko Rosic , 2003. +# Toplica Tanaskovic , 2003, 2004, 2005. +# Chusslove Illich , 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \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 "" diff --git a/po/sr@ijekavian/kdeclarative5.po b/po/sr@ijekavian/kdeclarative5.po new file mode 100644 index 0000000..6c4018a --- /dev/null +++ b/po/sr@ijekavian/kdeclarative5.po @@ -0,0 +1,120 @@ +# Translation of kdeclarative5.po into Serbian. +# Marko Rosic , 2003. +# Toplica Tanaskovic , 2003, 2004, 2005. +# Chusslove Illich , 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \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 "" diff --git a/po/sr@ijekavianlatin/kdeclarative5.po b/po/sr@ijekavianlatin/kdeclarative5.po new file mode 100644 index 0000000..ec4b130 --- /dev/null +++ b/po/sr@ijekavianlatin/kdeclarative5.po @@ -0,0 +1,120 @@ +# Translation of kdeclarative5.po into Serbian. +# Marko Rosic , 2003. +# Toplica Tanaskovic , 2003, 2004, 2005. +# Chusslove Illich , 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \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 "" diff --git a/po/sr@latin/kdeclarative5.po b/po/sr@latin/kdeclarative5.po new file mode 100644 index 0000000..35770f7 --- /dev/null +++ b/po/sr@latin/kdeclarative5.po @@ -0,0 +1,120 @@ +# Translation of kdeclarative5.po into Serbian. +# Marko Rosic , 2003. +# Toplica Tanaskovic , 2003, 2004, 2005. +# Chusslove Illich , 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \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 "" diff --git a/po/sv/kdeclarative5.po b/po/sv/kdeclarative5.po new file mode 100644 index 0000000..d09ad7a --- /dev/null +++ b/po/sv/kdeclarative5.po @@ -0,0 +1,118 @@ +# 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 , 1997. +# Anders Widell , 1998-2000. +# Per Lindström , 2000. +# Mattias Newzella , 2000, 2001, 2002,2003, 2004, 2005. +# Stefan Asserhäll , 2002. +# Stefan Asserhäll , 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# Stefan Asserhall , 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +# 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 17:56+0100\n" +"Last-Translator: Stefan Asserhäll \n" +"Language-Team: Swedish \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 19.04.3\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Programmets unika namn (krävs)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Reserverad genväg" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Konflikt med standardsnabbtangenter för program" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/ta/kdeclarative5.po b/po/ta/kdeclarative5.po new file mode 100644 index 0000000..825af16 --- /dev/null +++ b/po/ta/kdeclarative5.po @@ -0,0 +1,114 @@ +# translation of kdelibs4.po to தமிழ் +# Copyright (C) 2000,2002, 2004, 2007, 2008 Free Software Foundation, Inc. +# +# Sivakumar Shanmugasundaram , 2000. +# Thuraiappah Vaseeharan , 2000-2001. +# ம. ஸ்ரீ ராமதாஸ் | Sri Ramadoss M , 2007-2012 +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-03-25 21:39+0530\n" +"Last-Translator: Sri Ramadoss M \n" +"Language-Team: Tamil \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "ஒதுக்கப்பட்ட சுருக்குவழி" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "வழக்கமான பயன்பாட்டு சுருக்கு வழியுடன் முரண்" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/te/kdeclarative5.po b/po/te/kdeclarative5.po new file mode 100644 index 0000000..b8745c3 --- /dev/null +++ b/po/te/kdeclarative5.po @@ -0,0 +1,109 @@ +# translation of kdelibs4.po to Telugu +# +# +# Purushottam Boyanapalli , 2005. +# విజయ్ కిరణ్ కముజు , 2007. +# pavithran , 2007. +# Krishna Babu K , 2008, 2009. +# sreekalyanbapatla , 2013. +# GVS.Giri , 2013. +# Bhuvan Krishna ,2013. +# Naveen Kandimalla ,2013. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-11-04 23:55+0630\n" +"Last-Translator: Bhuvan Krishna \n" +"Language-Team: Telugu \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "నిలిపిఉంచి శీఘ్ర మార్గము" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "ప్రామాణిక కార్యక్రమ శీఘ్రమార్గంతొ ఘర్షణ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/tg/kdeclarative5.po b/po/tg/kdeclarative5.po new file mode 100644 index 0000000..d393649 --- /dev/null +++ b/po/tg/kdeclarative5.po @@ -0,0 +1,111 @@ +# 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 , 2003. +# Thomas Diehl , 2003. +# Victor Ibragimov , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2019-12-26 21:21+0500\n" +"Last-Translator: Victor Ibragimov \n" +"Language-Team: English \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Миёнбури маҳдудшуда" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Ихтилоф бо миёнбурҳои барномавии стандартӣ" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 таъмин карда нашуд" diff --git a/po/th/kdeclarative5.po b/po/th/kdeclarative5.po new file mode 100644 index 0000000..5cf6f5f --- /dev/null +++ b/po/th/kdeclarative5.po @@ -0,0 +1,115 @@ +# translation of kdelibs4.po to Thai +# Copyright (C) 2003,2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# Thanomsub Noppaburana , 2003,2004, 2005. +# Thanomsub Noppaburana , 2005, 2008, 2010. +# Sahachart Anukulkitch , 2006, 2007. +# Narachai Sakorn , 2008. +# Phuwanat Sakornsakolpat , 2010. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2010-12-31 22:47+0700\n" +"Last-Translator: Phuwanat Sakornsakolpat \n" +"Language-Team: Thai \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "ปุ่มพิมพ์ลัดที่ถูกสงวนไว้" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "เกิดความขัดแย้งกับปุ่มพิมพ์ลัดมาตรฐานของโปรแกรม" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/tr/kdeclarative5.po b/po/tr/kdeclarative5.po new file mode 100644 index 0000000..362d6dd --- /dev/null +++ b/po/tr/kdeclarative5.po @@ -0,0 +1,124 @@ +# 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 ,1999-2002. +# Görkem Çetin , 2002,2003, 2004. +# Tuncay YENİAY ,2002. +# Ayşe Genç , 2005. +# Görkem Çetin , 2005. +# Görkem Çetin , 2005. +# Bekir SONAT , 2005. +# Serdar Soytetir , 2007. +# Serdar Soytetir , 2007, 2008, 2009, 2011. +# H. İbrahim Güngör , 2010, 2011. +# Ozan Çağlayan , 2010, 2011. +# Serdar SOYTETİR , 2010, 2012. +# Volkan Gezer , 2013, 2014. +# Kaan Ozdincer , 2014. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2015-05-19 10:02+0000\n" +"Last-Translator: Necdet \n" +"Language-Team: Turkish \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Uygulamanın benzersiz ismi (zorunlu)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Ayrılmış Kısayol" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Standart Uygulama Kısayolu ile Çakışma" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/tt/kdeclarative5.po b/po/tt/kdeclarative5.po new file mode 100644 index 0000000..107f04b --- /dev/null +++ b/po/tt/kdeclarative5.po @@ -0,0 +1,112 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Ainur Shakirov , 2011. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2011-11-26 15:12+0400\n" +"Last-Translator: Ainur Shakirov \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Зарезервированная комбинация клавиш" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Стандартлы төймә функциясе белән конфликт" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/ug/kdeclarative5.po b/po/ug/kdeclarative5.po new file mode 100644 index 0000000..759b7e9 --- /dev/null +++ b/po/ug/kdeclarative5.po @@ -0,0 +1,113 @@ +# 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2013-09-08 07:05+0900\n" +"Last-Translator: Gheyret Kenji \n" +"Language-Team: Uyghur Computer Science Association \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "بەلگىلىنىپ بولغان تېزلەتمە" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "پروگراممىنىڭ ئۆلچەملىك تېزلەتمىسى بىلەن توقۇنۇشۇپ قالدى" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/uk/kdeclarative5.po b/po/uk/kdeclarative5.po new file mode 100644 index 0000000..58ec159 --- /dev/null +++ b/po/uk/kdeclarative5.po @@ -0,0 +1,113 @@ +# 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 , 2002, 2003, 2004, 2005, 2006. +# Andriy Rysin , 2002, 2003, 2006, 2007. +# Ivan Petrouchtchak , 2005, 2006, 2007, 2008. +# Yuri Chornoivan , 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdeclarative5\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-08 09:08+0200\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \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.03.70\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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Зарезервоване скорочення" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Конфлікт зі скороченнями стандартних програм" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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" diff --git a/po/uz/kdeclarative5.po b/po/uz/kdeclarative5.po new file mode 100644 index 0000000..2dae148 --- /dev/null +++ b/po/uz/kdeclarative5.po @@ -0,0 +1,102 @@ +# translation of kdelibs4.po to Uzbek +# Mashrab Kuvatov , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2008-05-30 17:29+0200\n" +"Last-Translator: Mashrab Kuvatov \n" +"Language-Team: Uzbek \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "dastur uchun shriftni aniqlaydi" + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Tugmalar birikmasi" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Dasturning andoza tugmalar birikmasi bilan muammo" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/uz@cyrillic/kdeclarative5.po b/po/uz@cyrillic/kdeclarative5.po new file mode 100644 index 0000000..8d9d90b --- /dev/null +++ b/po/uz@cyrillic/kdeclarative5.po @@ -0,0 +1,102 @@ +# translation of kdelibs4.po to Uzbek +# translation of kdelibs4.po to +# Copyright (C) 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. +# Mashrab Kuvatov , 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: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2009-10-17 00:34+0200\n" +"Last-Translator: Mashrab Kuvatov \n" +"Language-Team: Uzbek \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Тугмалар бирикмаси" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Дастурнинг андоза тугмалар бирикмаси билан муаммо" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/vi/kdeclarative5.po b/po/vi/kdeclarative5.po new file mode 100644 index 0000000..876e8a7 --- /dev/null +++ b/po/vi/kdeclarative5.po @@ -0,0 +1,111 @@ +# Vietnamese translation for kdelibs. +# Copyright © 2007 KDE i18n Project for Vietnamese. +# +# Clytie Siddall , 2006-2007. +# Hoàng Đức Hiếu , 2008, 2011. +# Lê Hoàng Phương , 2011, 2012. +# Phu Hung Nguyen , 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-10-23 22:24+0200\n" +"Last-Translator: Phu Hung Nguyen \n" +"Language-Team: Vietnamese \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 19.12.2\n" + +#, kde-format +msgctxt "NAME OF TRANSLATORS" +msgid "Your names" +msgstr "Clytie Siddall,Hoàng Đức Hiếu,Lê Hoàng Phương,Nguyễn Hùng Phú" + +#, kde-format +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "" +"clytie@riverland.net.au,hieu.d.hoang@gmail.com,herophuong93@gmail.com," +"phuhnguyen@disroot.org" + +#: kpackagelauncherqml/main.cpp:30 +#, kde-format +msgid "KPackage QML application shell" +msgstr "Hệ vỏ ứng dụng QML KPackage" + +#: kpackagelauncherqml/main.cpp:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "Tên riêng biệt của ứng dụng (bắt buộc)" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Phím tắt được đặt trước" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, 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:175 +#, 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:180 +#, 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" diff --git a/po/wa/kdeclarative5.po b/po/wa/kdeclarative5.po new file mode 100644 index 0000000..662ae5f --- /dev/null +++ b/po/wa/kdeclarative5.po @@ -0,0 +1,108 @@ +# translation of kdelibs4.po to Walloon +# Ratournaedje e walon des messaedjes di KDE. +# +# Lorint Hendschel , 2002. +# Pablo Saratxaga , 2002-2004, 2007. +# Jean Cayron , 2007, 2008, 2009, 2010, 2011. +# Jean Cayron , 2007. +# Jean Cayron , 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2012-07-04 17:33+0200\n" +"Last-Translator: Jean Cayron \n" +"Language-Team: Walloon \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +msgstr "definixh li fonte do programe" + +#: 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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "Rascourti rizervé" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, 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:175 +#, 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:180 +#, 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 "" diff --git a/po/xh/kdeclarative5.po b/po/xh/kdeclarative5.po new file mode 100644 index 0000000..a1bf467 --- /dev/null +++ b/po/xh/kdeclarative5.po @@ -0,0 +1,108 @@ +# 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 , 2001. +# Lwandle Mgidlana , 2002 +# Thelma Lungcuzo , 2002 +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2002-12-13 17:20SAST\n" +"Last-Translator: Lwandle Mgidlana \n" +"Language-Team: Xhosa \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:37 +#, fuzzy, kde-format +msgid "The unique name of the application (mandatory)" +msgstr "ichaza isicelo sohlobo lwamagama." + +#: 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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "Indlela emfutshane" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "Ungqubano Nesicelo Esisezantsi Sendlela emfutshane" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/zh_CN/kdeclarative5.po b/po/zh_CN/kdeclarative5.po new file mode 100644 index 0000000..b4e5beb --- /dev/null +++ b/po/zh_CN/kdeclarative5.po @@ -0,0 +1,116 @@ +# translation of kdelibs4.po to Chinese Simplified +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# Lie Ex 2007-2011. +# Wang Jian , 1998. +# Sarah Smith , 2002. +# Xiong Jiang , 2002,2003,2004. +# Funda Wang , 2002,2003,2004. +# Liang Qi , 2007. +# Feng Chao , 2010, 2012, 2014, 2019, 2020. +# Ni Hui , 2010, 2011, 2012. +# Weng Xuetian , 2011, 2012, 2013, 2015. +msgid "" +msgstr "" +"Project-Id-Version: kdeorg\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2021-01-01 14:21\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" + +#, kde-format +msgctxt "EMAIL OF TRANSLATORS" +msgid "Your emails" +msgstr "kde-china@kde.org, chaofeng111@qq.com" + +#: kpackagelauncherqml/main.cpp:30 +#, kde-format +msgid "KPackage QML application shell" +msgstr "KPackage QML 应用程序外壳" + +#: kpackagelauncherqml/main.cpp:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "保留快捷方式" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "与标准程序快捷键冲突" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 文件" diff --git a/po/zh_HK/kdeclarative5.po b/po/zh_HK/kdeclarative5.po new file mode 100644 index 0000000..81c9c00 --- /dev/null +++ b/po/zh_HK/kdeclarative5.po @@ -0,0 +1,129 @@ +# 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 , unknown. +# +# with reference from zh_CN translation (as of 2002-11-08): +# Chih-Wei Huang , 2001. +# Kenduest Lee , 2001. +# Jouston Huang (Huang, Jiun-Jeng) , 2002. +# Kenduest Lee , 2002. +# Wang Jian , 2002. +# Anthony Fok , 2002. +# Yuan-Chen Cheng , 2002. +# Wang Jian , 1998. +# Funda Wang , 2002. +# Sarah Smith , 2002. +# Xiong Jiang , 2002. +# Chia-Lin, Kao , 2004. +# Stanley Wong , 2005. +# Abel Cheung , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2006-01-04 13:32+0800\n" +"Last-Translator: Abel Cheung \n" +"Language-Team: Chinese (Hong Kong) \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:37 +#, fuzzy, kde-format +#| msgid "defines the application font" +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, fuzzy, kde-format +#| msgid "Shortcut" +msgid "Reserved Shortcut" +msgstr "快速鍵" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "與標準的應用程式快速鍵定義衝突" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 "" diff --git a/po/zh_TW/kdeclarative5.po b/po/zh_TW/kdeclarative5.po new file mode 100644 index 0000000..a1537b9 --- /dev/null +++ b/po/zh_TW/kdeclarative5.po @@ -0,0 +1,114 @@ +# translation of kdelibs4.po to Chinese Traditional +# Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Eric Cheng , unknown. +# This file referenced zh_CN translations at 2002. +# Chih-Wei Huang , 2001. +# Kenduest Lee , 2001, 2002. +# Jouston Huang (Huang, Jiun-Jeng) , 2002. +# Chia-Lin, Kao , 2004. +# Yuan-Chen Cheng , 2002. +# Goodhorse , 2008. +# Frank Weng (a.k.a. Franklin) , 2006-2009, 2010. +# Franklin Weng , 2010, 2011, 2012. +# Franklin Weng , 2010, 2011, 2012, 2013, 2014, 2015. +# pan93412 , 2019, 2020. +msgid "" +msgstr "" +"Project-Id-Version: kdelibs4\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2020-11-13 02:11+0100\n" +"PO-Revision-Date: 2020-01-09 18:07+0800\n" +"Last-Translator: pan93412 \n" +"Language-Team: Chinese \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:37 +#, kde-format +msgid "The unique name of the application (mandatory)" +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:88 +#, 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:118 +#, kde-format +msgid "Reserved Shortcut" +msgstr "保留的捷徑" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:119 +#, 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:174 +#, kde-format +msgid "Conflict with Standard Application Shortcut" +msgstr "與標準的應用程式快捷鍵定義衝突" + +#: qmlcontrols/kquickcontrols/private/keysequencehelper.cpp:175 +#, 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:180 +#, 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 檔案" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..c37e0b4 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,42 @@ +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 ${KF5_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() diff --git a/src/Messages.sh b/src/Messages.sh new file mode 100755 index 0000000..86690ed --- /dev/null +++ b/src/Messages.sh @@ -0,0 +1,18 @@ +#!/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 diff --git a/src/calendarevents/CMakeLists.txt b/src/calendarevents/CMakeLists.txt new file mode 100644 index 0000000..a4ce72a --- /dev/null +++ b/src/calendarevents/CMakeLists.txt @@ -0,0 +1,33 @@ +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 "$") +set_target_properties(KF5CalendarEvents PROPERTIES VERSION ${KDECLARATIVE_VERSION_STRING} + 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 +) diff --git a/src/calendarevents/CalendarEventsConfig.cmake.in b/src/calendarevents/CalendarEventsConfig.cmake.in new file mode 100644 index 0000000..351e0a6 --- /dev/null +++ b/src/calendarevents/CalendarEventsConfig.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(Qt5Core @REQUIRED_QT_VERSION@) + +include("${CMAKE_CURRENT_LIST_DIR}/CalendarEventsTargets.cmake") diff --git a/src/calendarevents/calendareventsplugin.cpp b/src/calendarevents/calendareventsplugin.cpp new file mode 100644 index 0000000..ff66d1e --- /dev/null +++ b/src/calendarevents/calendareventsplugin.cpp @@ -0,0 +1,24 @@ +/* + SPDX-FileCopyrightText: 2015 Martin Klapetek + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "calendareventsplugin.h" + +namespace CalendarEvents { + +CalendarEventsPlugin::CalendarEventsPlugin(QObject *parent) + : QObject(parent) +{ + +} + +CalendarEventsPlugin::~CalendarEventsPlugin() +{ + +} + +ShowEventInterface::~ShowEventInterface() = default; + +} diff --git a/src/calendarevents/calendareventsplugin.h b/src/calendarevents/calendareventsplugin.h new file mode 100644 index 0000000..bd30bb4 --- /dev/null +++ b/src/calendarevents/calendareventsplugin.h @@ -0,0 +1,245 @@ +/* + SPDX-FileCopyrightText: 2015 Martin Klapetek + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CALENDAREVENTSPLUGIN_H +#define CALENDAREVENTSPLUGIN_H + +#include +#include +#include +#include + +#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 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 &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 diff --git a/src/calendarevents/eventdata_p.cpp b/src/calendarevents/eventdata_p.cpp new file mode 100644 index 0000000..cb434f2 --- /dev/null +++ b/src/calendarevents/eventdata_p.cpp @@ -0,0 +1,157 @@ +/* + SPDX-FileCopyrightText: 2015 Martin Klapetek + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "calendareventsplugin.h" + +#include + +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; +} + +} diff --git a/src/kdeclarative/CMakeLists.txt b/src/kdeclarative/CMakeLists.txt new file mode 100644 index 0000000..65b7c35 --- /dev/null +++ b/src/kdeclarative/CMakeLists.txt @@ -0,0 +1,77 @@ + +set(kdeclarative_SRCS + configpropertymap.cpp + qmlobject.cpp + qmlobjectsharedengine.cpp + kdeclarative.cpp + private/kiconprovider.cpp + private/kioaccessmanagerfactory.cpp +) + +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 ${KF5_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 or +target_include_directories(KF5Declarative INTERFACE "$") + +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 "$") + +set_target_properties(KF5Declarative + PROPERTIES VERSION ${KDECLARATIVE_VERSION_STRING} + 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}) diff --git a/src/kdeclarative/configpropertymap.cpp b/src/kdeclarative/configpropertymap.cpp new file mode 100644 index 0000000..fe664a7 --- /dev/null +++ b/src/kdeclarative/configpropertymap.cpp @@ -0,0 +1,160 @@ +/* + SPDX-FileCopyrightText: 2013 Marco Martin + SPDX-FileCopyrightText: 2020 David Edmundson + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "configpropertymap.h" + +#include +#include +#include + +#include + +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 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()) { + return input.value().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) { + 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" diff --git a/src/kdeclarative/configpropertymap.h b/src/kdeclarative/configpropertymap.h new file mode 100644 index 0000000..2c3fdb4 --- /dev/null +++ b/src/kdeclarative/configpropertymap.h @@ -0,0 +1,83 @@ +/* + SPDX-FileCopyrightText: 2013 Marco Martin + SPDX-FileCopyrightText: 2020 David Edmundson + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CONFIGPROPERTYMAP_H +#define CONFIGPROPERTYMAP_H + +#include + +class KCoreConfigSkeleton; + +#include + +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 diff --git a/src/kdeclarative/kdeclarative.cpp b/src/kdeclarative/kdeclarative.cpp new file mode 100644 index 0000000..eb9b175 --- /dev/null +++ b/src/kdeclarative/kdeclarative.cpp @@ -0,0 +1,180 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + 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 +#include +#include + +#include +#include + +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) +{ + //get rid of stock network access manager factory + QQmlNetworkAccessManagerFactory *factory = engine->networkAccessManagerFactory(); + engine->setNetworkAccessManagerFactory(nullptr); + delete factory; + engine->setNetworkAccessManagerFactory(new KIOAccessManagerFactory()); + + /* 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 (QCoreApplication::arguments().contains(QLatin1String("-qmljsdebugger"))) { + QQmlDebuggingEnabler enabler; + } +} + +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")); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + KDeclarativePrivate::s_runtimePlatform = QStringList(env.split(QLatin1Char(':'), QString::SkipEmptyParts)); +#else + KDeclarativePrivate::s_runtimePlatform = QStringList(env.split(QLatin1Char(':'), Qt::SkipEmptyParts)); +#endif + 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; +} + +} diff --git a/src/kdeclarative/kdeclarative.h b/src/kdeclarative/kdeclarative.h new file mode 100644 index 0000000..cb3fe80 --- /dev/null +++ b/src/kdeclarative/kdeclarative.h @@ -0,0 +1,211 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KDECLARATIVE_H +#define KDECLARATIVE_H + +#include + +#include + +#include + +class QQmlEngine; + +namespace KDeclarative { + +class KDeclarativePrivate; + +/** + * @class KDeclarative::KDeclarative kdeclarative.h + * + * The KDeclarative class is used to manipulate the QQmlEngine instance used by + * the application and to get some informations 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 diff --git a/src/kdeclarative/private/kdeclarative_p.h b/src/kdeclarative/private/kdeclarative_p.h new file mode 100644 index 0000000..911271d --- /dev/null +++ b/src/kdeclarative/private/kdeclarative_p.h @@ -0,0 +1,32 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KDECLARATIVE_P_H +#define KDECLARATIVE_P_H + +#include "kdeclarative.h" +#include "qmlobject.h" + +#include +#include + +namespace KDeclarative { + +class KDeclarativePrivate +{ +public: + KDeclarativePrivate(); + + QPointer declarativeEngine; + QString translationDomain; + static QStringList s_runtimePlatform; + QPointer contextObj; + QPointer qmlObj; +}; + +} + +#endif diff --git a/src/kdeclarative/private/kiconprovider.cpp b/src/kdeclarative/private/kiconprovider.cpp new file mode 100644 index 0000000..acf4376 --- /dev/null +++ b/src/kdeclarative/private/kiconprovider.cpp @@ -0,0 +1,61 @@ +/* + SPDX-FileCopyrightText: 2011 Artur Duque de Souza + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "kiconprovider_p.h" + +#include +#include +#include +#include +#include + +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; +} + +} + diff --git a/src/kdeclarative/private/kiconprovider_p.h b/src/kdeclarative/private/kiconprovider_p.h new file mode 100644 index 0000000..8e4b591 --- /dev/null +++ b/src/kdeclarative/private/kiconprovider_p.h @@ -0,0 +1,24 @@ +/* + SPDX-FileCopyrightText: 2011 Artur Duque de Souza + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef ICON_PROVIDER_H +#define ICON_PROVIDER_H + +#include + +namespace KDeclarative { + +class KIconProvider : public QQuickImageProvider +{ + +public: + KIconProvider(); + QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override; +}; + +} + +#endif diff --git a/src/kdeclarative/private/kioaccessmanagerfactory.cpp b/src/kdeclarative/private/kioaccessmanagerfactory.cpp new file mode 100644 index 0000000..ef21d3a --- /dev/null +++ b/src/kdeclarative/private/kioaccessmanagerfactory.cpp @@ -0,0 +1,26 @@ +/* + SPDX-FileCopyrightText: 2010 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "kioaccessmanagerfactory_p.h" +#include + +namespace KDeclarative { + +KIOAccessManagerFactory::KIOAccessManagerFactory() + : QQmlNetworkAccessManagerFactory() +{ +} + +KIOAccessManagerFactory::~KIOAccessManagerFactory() +{ +} + +QNetworkAccessManager *KIOAccessManagerFactory::create(QObject *parent) +{ + return new KIO::AccessManager(parent); +} + +} diff --git a/src/kdeclarative/private/kioaccessmanagerfactory_p.h b/src/kdeclarative/private/kioaccessmanagerfactory_p.h new file mode 100644 index 0000000..dacbc01 --- /dev/null +++ b/src/kdeclarative/private/kioaccessmanagerfactory_p.h @@ -0,0 +1,24 @@ +/* + SPDX-FileCopyrightText: 2010 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KIOACCESSMANAGERFACTORY_H +#define KIOACCESSMANAGERFACTORY_H + +#include + +namespace KDeclarative { + +class KIOAccessManagerFactory : public QQmlNetworkAccessManagerFactory +{ +public: + KIOAccessManagerFactory(); + ~KIOAccessManagerFactory(); + QNetworkAccessManager *create(QObject *parent) override; +}; + +} + +#endif diff --git a/src/kdeclarative/qmlobject.cpp b/src/kdeclarative/qmlobject.cpp new file mode 100644 index 0000000..3a36e2a --- /dev/null +++ b/src/kdeclarative/qmlobject.cpp @@ -0,0 +1,364 @@ +/* + SPDX-FileCopyrightText: 2013 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "qmlobject.h" +#include "private/kdeclarative_p.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +//#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 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 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); + } + + 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); + } + 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(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" diff --git a/src/kdeclarative/qmlobject.h b/src/kdeclarative/qmlobject.h new file mode 100644 index 0000000..d4bfa43 --- /dev/null +++ b/src/kdeclarative/qmlobject.h @@ -0,0 +1,247 @@ +/* + SPDX-FileCopyrightText: 2013 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef QMLOBJECT_H +#define QMLOBJECT_H + +#include + +#include + +#include +#include + +class QQmlEngine; +class QQmlComponent; +class QQmlContext; + +namespace KDeclarative { + +class QmlObjectPrivate; + +/** + * @class KDeclarative::QmlObject qmlobject.h KDeclarative/QmlObject + * + * @author Marco Martin + * + * @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 diff --git a/src/kdeclarative/qmlobjectsharedengine.cpp b/src/kdeclarative/qmlobjectsharedengine.cpp new file mode 100644 index 0000000..2e2cce1 --- /dev/null +++ b/src/kdeclarative/qmlobjectsharedengine.cpp @@ -0,0 +1,68 @@ +/* + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "qmlobjectsharedengine.h" + +#include +#include + +#include +#include + +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(); + KDeclarative::setupEngine(s_engine.get()); + } + return s_engine.get(); + } + + //used to delete it + std::shared_ptr engineRef; + + static std::shared_ptr s_engine; +}; + +std::shared_ptr QmlObjectSharedEnginePrivate::s_engine = std::shared_ptr(); + +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" diff --git a/src/kdeclarative/qmlobjectsharedengine.h b/src/kdeclarative/qmlobjectsharedengine.h new file mode 100644 index 0000000..4f16871 --- /dev/null +++ b/src/kdeclarative/qmlobjectsharedengine.h @@ -0,0 +1,50 @@ +/* + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef QMLOBJECTSHAREDENGINE_H +#define QMLOBJECTSHAREDENGINE_H + +#include +#include +#include + +namespace KDeclarative { + +class QmlObjectSharedEnginePrivate; + +/** + * @class KDeclarative::QmlObjectSharedEngine qmlobjectsharedengine.h KDeclarative/QmlObjectSharedEngine + * + * @author Marco Martin + * + * @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 d; +}; + +} + +#endif // multiple inclusion guard diff --git a/src/kpackagelauncherqml/CMakeLists.txt b/src/kpackagelauncherqml/CMakeLists.txt new file mode 100644 index 0000000..7744b77 --- /dev/null +++ b/src/kpackagelauncherqml/CMakeLists.txt @@ -0,0 +1,21 @@ + + +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 ${INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/src/kpackagelauncherqml/main.cpp b/src/kpackagelauncherqml/main.cpp new file mode 100644 index 0000000..2f2c0d9 --- /dev/null +++ b/src/kpackagelauncherqml/main.cpp @@ -0,0 +1,123 @@ +/* + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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(obj.rootObject()); + QWindow *window = qobject_cast(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(); +} + diff --git a/src/qmlcontrols/CMakeLists.txt b/src/qmlcontrols/CMakeLists.txt new file mode 100644 index 0000000..190110e --- /dev/null +++ b/src/qmlcontrols/CMakeLists.txt @@ -0,0 +1,25 @@ + +add_subdirectory(draganddrop) +add_subdirectory(kquickcontrolsaddons) +add_subdirectory(kcmcontrols) + +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() diff --git a/src/qmlcontrols/draganddrop/CMakeLists.txt b/src/qmlcontrols/draganddrop/CMakeLists.txt new file mode 100644 index 0000000..e8127e4 --- /dev/null +++ b/src/qmlcontrols/draganddrop/CMakeLists.txt @@ -0,0 +1,22 @@ +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) diff --git a/src/qmlcontrols/draganddrop/DeclarativeDragArea.cpp b/src/qmlcontrols/draganddrop/DeclarativeDragArea.cpp new file mode 100644 index 0000000..ec674bf --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeDragArea.cpp @@ -0,0 +1,370 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + SPDX-License-Identifier: MIT +*/ + +#include "DeclarativeDragArea.h" +#include "DeclarativeMimeData.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/*! + 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; + 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; + 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; + emit startDragDistanceChanged(); +} + +// delegateImage +QVariant DeclarativeDragArea::delegateImage() const +{ + return m_delegateImage; +} + +void DeclarativeDragArea::setDelegateImage(const QVariant &image) +{ + if (image.canConvert() && image.value() == m_delegateImage) { + return; + } + + if (image.canConvert()) { + m_delegateImage = image.value(); + } else if (image.canConvert()) { + m_delegateImage = QIcon::fromTheme(image.toString()).pixmap(QSize(48, 48)).toImage(); + } else { + m_delegateImage = image.value().pixmap(QSize(48, 48)).toImage(); + } + + emit delegateImageChanged(); +} + +// enabled +bool DeclarativeDragArea::isEnabled() const +{ + return m_enabled; +} +void DeclarativeDragArea::setEnabled(bool enabled) +{ + if (enabled != m_enabled) { + m_enabled = enabled; + 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; + 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; + 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(event); + //qDebug() << "press in dragarea"; + mousePressEvent(me); + break; + } + case QEvent::MouseMove: { + QMouseEvent *me = static_cast(event); + //qDebug() << "move in dragarea"; + mouseMoveEvent(me); + break; + } + case QEvent::MouseButtonRelease: { + QMouseEvent *me = static_cast(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(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 : qAsConst(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; + emit dragActiveChanged(); + emit dragStarted(); + + Qt::DropAction action = drag->exec(m_supportedActions, m_defaultAction); + setKeepMouseGrab(false); + + m_dragActive = false; + emit dragActiveChanged(); + emit drop(action); + + ungrabMouse(); +} diff --git a/src/qmlcontrols/draganddrop/DeclarativeDragArea.h b/src/qmlcontrols/draganddrop/DeclarativeDragArea.h new file mode 100644 index 0000000..f619c00 --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeDragArea.h @@ -0,0 +1,155 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + SPDX-License-Identifier: MIT +*/ + +#ifndef DECLARATIVEDRAGAREA_H +#define DECLARATIVEDRAGAREA_H + +#include +#include +#include + +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 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 diff --git a/src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.cpp b/src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.cpp new file mode 100644 index 0000000..d844ff7 --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.cpp @@ -0,0 +1,54 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + SPDX-FileCopyrightText: 2013 Sebastian Kügler + + 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(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(); +} diff --git a/src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.h b/src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.h new file mode 100644 index 0000000..e6ba21a --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeDragDropEvent.h @@ -0,0 +1,105 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + SPDX-License-Identifier: MIT +*/ + +#ifndef DECLARATIVEDRAGDROPEVENT_H +#define DECLARATIVEDRAGDROPEVENT_H + +#include +#include "DeclarativeDropArea.h" +#include "DeclarativeMimeData.h" + +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 m_data; + QDropEvent* m_event; +}; + +#endif // DECLARATIVEDRAGDROPEVENT_H diff --git a/src/qmlcontrols/draganddrop/DeclarativeDropArea.cpp b/src/qmlcontrols/draganddrop/DeclarativeDropArea.cpp new file mode 100644 index 0000000..2cc5ec4 --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeDropArea.cpp @@ -0,0 +1,149 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + 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(candidate)) { + da->m_temporaryInhibition = inhibit; + if (inhibit) { + emit da->dragLeaveEvent(nullptr); + } + } + candidate = candidate->parentItem(); + } +} + +void DeclarativeDropArea::dragEnterEvent(QDragEnterEvent *event) +{ + if (!m_enabled || m_temporaryInhibition) { + return; + } + + DeclarativeDragDropEvent dde(event, this); + event->accept(); + + 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); + 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); + 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); + 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); + emit enabledChanged(); +} + +bool DeclarativeDropArea::preventStealing() const +{ + return m_preventStealing; +} + +void DeclarativeDropArea::setPreventStealing(bool prevent) +{ + if (prevent == m_preventStealing) { + return; + } + + m_preventStealing = prevent; + 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; +} diff --git a/src/qmlcontrols/draganddrop/DeclarativeDropArea.h b/src/qmlcontrols/draganddrop/DeclarativeDropArea.h new file mode 100644 index 0000000..f6c1db7 --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeDropArea.h @@ -0,0 +1,96 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + SPDX-License-Identifier: MIT +*/ + +#ifndef DECLARATIVEDROPAREA_H +#define DECLARATIVEDROPAREA_H + +#include + +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 + diff --git a/src/qmlcontrols/draganddrop/DeclarativeMimeData.cpp b/src/qmlcontrols/draganddrop/DeclarativeMimeData.cpp new file mode 100644 index 0000000..ae0f8a1 --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeMimeData.cpp @@ -0,0 +1,152 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + 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(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 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 urlList; + urlList.append(url); + QMimeData::setUrls(urlList); + 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 urlList; + urlList.reserve(urls.size()); + for (const QVariant &varUrl : urls) { + urlList << varUrl.toUrl(); + } + QMimeData::setUrls(urlList); + emit urlsChanged(); +} + +// color +QColor DeclarativeMimeData::color() const +{ + if (this->hasColor()) { + return qvariant_cast(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); + 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; + emit sourceChanged(); + } +} + +QByteArray DeclarativeMimeData::getDataAsByteArray(const QString& format) +{ + return data(format); +} diff --git a/src/qmlcontrols/draganddrop/DeclarativeMimeData.h b/src/qmlcontrols/draganddrop/DeclarativeMimeData.h new file mode 100644 index 0000000..e2c04ba --- /dev/null +++ b/src/qmlcontrols/draganddrop/DeclarativeMimeData.h @@ -0,0 +1,100 @@ +/* + SPDX-FileCopyrightText: 2010 BetterInbox + SPDX-FileContributor: Gregory Schlomoff + + SPDX-License-Identifier: MIT +*/ + +#ifndef DECLARATIVEMIMEDATA_H +#define DECLARATIVEMIMEDATA_H + +#include +#include +#include +#include +#include + +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 diff --git a/src/qmlcontrols/draganddrop/Mainpage.dox b/src/qmlcontrols/draganddrop/Mainpage.dox new file mode 100644 index 0000000..b92f1bf --- /dev/null +++ b/src/qmlcontrols/draganddrop/Mainpage.dox @@ -0,0 +1,15 @@ +/** @mainpage Drag and Drop + +

import org.kde.draganddrop

+ +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 diff --git a/src/qmlcontrols/draganddrop/MimeDataWrapper.cpp b/src/qmlcontrols/draganddrop/MimeDataWrapper.cpp new file mode 100644 index 0000000..c59ad80 --- /dev/null +++ b/src/qmlcontrols/draganddrop/MimeDataWrapper.cpp @@ -0,0 +1,77 @@ +/* + SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez + + SPDX-License-Identifier: MIT +*/ + +#include "MimeDataWrapper.h" +#include +#include + +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(m_data); +} diff --git a/src/qmlcontrols/draganddrop/MimeDataWrapper.h b/src/qmlcontrols/draganddrop/MimeDataWrapper.h new file mode 100644 index 0000000..de53a48 --- /dev/null +++ b/src/qmlcontrols/draganddrop/MimeDataWrapper.h @@ -0,0 +1,92 @@ +/* + SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez + + SPDX-License-Identifier: MIT +*/ + +#ifndef MIMEDATAWRAPPER_H +#define MIMEDATAWRAPPER_H + +#include +#include +#include + +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 diff --git a/src/qmlcontrols/draganddrop/draganddropplugin.cpp b/src/qmlcontrols/draganddrop/draganddropplugin.cpp new file mode 100644 index 0000000..e86513a --- /dev/null +++ b/src/qmlcontrols/draganddrop/draganddropplugin.cpp @@ -0,0 +1,26 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + 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(uri, 2, 0, "DropArea"); + qmlRegisterType(uri, 2, 0, "DragArea"); + qmlRegisterAnonymousType(uri, 1); + qmlRegisterUncreatableType(uri, 2, 0, "MimeData", QStringLiteral("MimeData cannot be created from QML.")); + qmlRegisterUncreatableType(uri, 2, 0, "DragDropEvent", QStringLiteral("DragDropEvent cannot be created from QML.")); + qmlRegisterUncreatableType(uri, 2, 0, "MimeDataWrapper", QStringLiteral("DragDropEvent cannot be created from QML.")); +} diff --git a/src/qmlcontrols/draganddrop/draganddropplugin.h b/src/qmlcontrols/draganddrop/draganddropplugin.h new file mode 100644 index 0000000..94192bb --- /dev/null +++ b/src/qmlcontrols/draganddrop/draganddropplugin.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: MIT +*/ + +#ifndef DRAGANDDROPPLUGIN_H +#define DRAGANDDROPPLUGIN_H + +#include + +class DragAndDropPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; + +#endif diff --git a/src/qmlcontrols/draganddrop/qmldir b/src/qmlcontrols/draganddrop/qmldir new file mode 100644 index 0000000..ec45a14 --- /dev/null +++ b/src/qmlcontrols/draganddrop/qmldir @@ -0,0 +1,3 @@ +module org.kde.draganddrop +plugin draganddropplugin + diff --git a/src/qmlcontrols/kcmcontrols/CMakeLists.txt b/src/qmlcontrols/kcmcontrols/CMakeLists.txt new file mode 100644 index 0000000..a2e107f --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/CMakeLists.txt @@ -0,0 +1,22 @@ +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) diff --git a/src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.cpp b/src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.cpp new file mode 100644 index 0000000..a920333 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.cpp @@ -0,0 +1,22 @@ +/* + SPDX-FileCopyrightText: 2017 Marco Martin + + SPDX-License-Identifier: MIT +*/ + +#include "kcmcontrolsplugin.h" + + +#include +#include "settingstateproxy.h" +#include "settinghighlighterprivate.h" + +void KCMControlsPlugin::registerTypes(const char *uri) +{ + Q_ASSERT(uri == QByteArray("org.kde.kcm")); + + qmlRegisterUncreatableType(uri, 1, 0, "ConfigModule", + QLatin1String("Do not create objects of type ConfigModule")); + qmlRegisterType(uri, 1, 3, "SettingStateProxy"); + qmlRegisterType("org.kde.kcm.private", 1, 3, "SettingHighlighterPrivate"); +} diff --git a/src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.h b/src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.h new file mode 100644 index 0000000..e43a7e5 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/kcmcontrolsplugin.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: MIT +*/ + +#ifndef KCMCONTROLSPLUGIN_H +#define KCMCONTROLSPLUGIN_H + +#include + +class KCMControlsPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; + +#endif diff --git a/src/qmlcontrols/kcmcontrols/qml/AbstractKCM.qml b/src/qmlcontrols/kcmcontrols/qml/AbstractKCM.qml new file mode 100644 index 0000000..fd07738 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/AbstractKCM.qml @@ -0,0 +1,93 @@ +/* + SPDX-FileCopyrightText: 2020 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +import QtQuick 2.7 +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 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 + + 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 + leftPadding: 6 // Layout_ChildMarginWidth from Breeze + topPadding: leftPadding + rightPadding: leftPadding + bottomPadding: leftPadding + } + + footer: QtControls.Control { + id: footerParent + height: contentItem ? 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); + } + } + } +} diff --git a/src/qmlcontrols/kcmcontrols/qml/GridDelegate.qml b/src/qmlcontrols/kcmcontrols/qml/GridDelegate.qml new file mode 100644 index 0000000..9dc1162 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/GridDelegate.qml @@ -0,0 +1,202 @@ +/* + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +import QtQuick 2.8 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.2 as Controls +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 + * 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 actions + + width: GridView.view.cellWidth + height: GridView.view.cellHeight + hoverEnabled: true + + 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) { + return Kirigami.Theme.highlightColor; + } else { + return Kirigami.Theme.backgroundColor; + } + } + Behavior on color { + ColorAnimation { + duration: Kirigami.Units.longDuration + easing.type: Easing.OutQuad + } + } + + Rectangle { + id: thumbnailArea + radius: Kirigami.Units.smallSpacing/2 + anchors { + fill: parent + margins: Kirigami.Units.smallSpacing + } + + color: Kirigami.Theme.backgroundColor + 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" + } + } + + Rectangle { + anchors.fill: thumbnailArea + visible: actionsRow.children.length > 0 + opacity: Kirigami.Settings.isMobile || delegate.hovered || (actionsScope.focus) ? 1 : 0 + radius: delegate.thumbnailAvailable ? 0 : thumbnailArea.radius + color: Kirigami.Settings.isMobile ? "transparent" : Qt.rgba(1, 1, 1, 0.2) + + Behavior on opacity { + PropertyAnimation { + duration: Kirigami.Units.longDuration + easing.type: Easing.OutQuad + } + } + + FocusScope { + id: actionsScope + + anchors { + right: parent.right + rightMargin: Kirigami.Units.smallSpacing + bottom: parent.bottom + bottomMargin: Kirigami.Units.smallSpacing + } + width: actionsRow.width + height: actionsRow.height + + RowLayout { + id: actionsRow + + Repeater { + model: delegate.actions + delegate: Controls.Button { + icon.name: modelData.iconName + activeFocusOnTab: focus || delegate.focus + onClicked: modelData.trigger() + enabled: modelData.enabled + visible: modelData.visible + //NOTE: there aren't any global settings where to take "official" tooltip timeouts + Controls.ToolTip.delay: 1000 + Controls.ToolTip.timeout: 5000 + Controls.ToolTip.visible: (Kirigami.Settings.isMobile ? pressed : hovered) && modelData.tooltip.length > 0 + Controls.ToolTip.text: modelData.tooltip + } + } + } + } + } + } + + ColumnLayout { + id: labelLayout + spacing: 0 + anchors { + left: thumbnail.left + right: thumbnail.right + top: thumbnail.bottom + topMargin: caption.visible ? Kirigami.Units.smallSpacing : Kirigami.Units.largeSpacing + } + + // FIXME: These labels are center-aligned with a maximum width instead + // of the more conventional combination of "Layout.fillWidth: true" + // and "horizontalAlignment: Text.AlignHCenter" because that combination + // triggers https://bugreports.qt.io/browse/QTBUG-49646 + Controls.Label { + Layout.alignment: Qt.AlignHCenter + Layout.maximumWidth: labelLayout.width + text: delegate.text + elide: Text.ElideRight + } + Controls.Label { + id: caption + Layout.alignment: Qt.AlignHCenter + Layout.maximumWidth: labelLayout.width + visible: delegate.subtitle.length > 0 + opacity: 0.6 + text: delegate.subtitle + font.pointSize: theme.smallestFont.pointSize + elide: Text.ElideRight + } + } + + Controls.ToolTip.delay: 1000 + Controls.ToolTip.timeout: 5000 + Controls.ToolTip.visible: hovered && delegate.toolTip.length > 0 + Controls.ToolTip.text: toolTip +} diff --git a/src/qmlcontrols/kcmcontrols/qml/GridView.qml b/src/qmlcontrols/kcmcontrols/qml/GridView.qml new file mode 100644 index 0000000..deafc7e --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/GridView.qml @@ -0,0 +1,47 @@ +/* + SPDX-FileCopyrightText: 2017 Marco Martin + + 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 +} diff --git a/src/qmlcontrols/kcmcontrols/qml/GridViewKCM.qml b/src/qmlcontrols/kcmcontrols/qml/GridViewKCM.qml new file mode 100644 index 0000000..87cc0ce --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/GridViewKCM.qml @@ -0,0 +1,69 @@ +/* + SPDX-FileCopyrightText: 2017 Marco Martin + + 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 colum 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 + } +} diff --git a/src/qmlcontrols/kcmcontrols/qml/ScrollView.qml b/src/qmlcontrols/kcmcontrols/qml/ScrollView.qml new file mode 100644 index 0000000..9f38e1c --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/ScrollView.qml @@ -0,0 +1,48 @@ +/* + SPDX-FileCopyrightText: 2018 Marco Martin + + 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 +} diff --git a/src/qmlcontrols/kcmcontrols/qml/ScrollViewKCM.qml b/src/qmlcontrols/kcmcontrols/qml/ScrollViewKCM.qml new file mode 100644 index 0000000..bb83848 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/ScrollViewKCM.qml @@ -0,0 +1,42 @@ +/* + SPDX-FileCopyrightText: 2017 Marco Martin + + 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 + } +} diff --git a/src/qmlcontrols/kcmcontrols/qml/SettingHighlighter.qml b/src/qmlcontrols/kcmcontrols/qml/SettingHighlighter.qml new file mode 100644 index 0000000..77ec059 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/SettingHighlighter.qml @@ -0,0 +1,44 @@ +/* + SPDX-FileCopyrightText: 2020 Kevin Ottens + SPDX-FileCopyrightText: 2020 David Redondo + + 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(); + } +} + diff --git a/src/qmlcontrols/kcmcontrols/qml/SettingStateBinding.qml b/src/qmlcontrols/kcmcontrols/qml/SettingStateBinding.qml new file mode 100644 index 0000000..07b3516 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/SettingStateBinding.qml @@ -0,0 +1,95 @@ +/* + SPDX-FileCopyrightText: 2020 Kevin Ottens + + 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(); + } +} diff --git a/src/qmlcontrols/kcmcontrols/qml/SimpleKCM.qml b/src/qmlcontrols/kcmcontrols/qml/SimpleKCM.qml new file mode 100644 index 0000000..517342a --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/SimpleKCM.qml @@ -0,0 +1,96 @@ +/* + SPDX-FileCopyrightText: 2017 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +import QtQuick 2.7 +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 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 + + 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 + } + ] +} diff --git a/src/qmlcontrols/kcmcontrols/qml/private/GridViewInternal.qml b/src/qmlcontrols/kcmcontrols/qml/private/GridViewInternal.qml new file mode 100644 index 0000000..edd7baf --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/private/GridViewInternal.qml @@ -0,0 +1,60 @@ +/* + SPDX-FileCopyrightText: 2019 Marco Martin + + 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 + + cellWidth: Math.floor(internal.availableWidth / Math.max(Math.floor(internal.availableWidth / (implicitCellWidth + Kirigami.Units.gridUnit)), 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 } + } + } +} diff --git a/src/qmlcontrols/kcmcontrols/qml/qmldir b/src/qmlcontrols/kcmcontrols/qml/qmldir new file mode 100644 index 0000000..071769d --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/qml/qmldir @@ -0,0 +1,12 @@ +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 diff --git a/src/qmlcontrols/kcmcontrols/settinghighlighterprivate.cpp b/src/qmlcontrols/kcmcontrols/settinghighlighterprivate.cpp new file mode 100644 index 0000000..e74c679 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/settinghighlighterprivate.cpp @@ -0,0 +1,128 @@ +/* + SPDX-FileCopyrightText: 2020 Kevin Ottens + SPDX-FileCopyrightText: 2020 Cyril Rossi + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "settinghighlighterprivate.h" + +#include +#include + +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 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 : qAsConst(descendant)) { + if (className.contains("FontWidget") && itemClassName(child).contains("TextField")) { + return child->property("background").value(); + } + if (itemClassName(child).contains("GridViewInternal")) { + return child; + } + if (itemClassName(child).contains("GridView")) { + return child->property("view").value(); + } + 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; + emit targetChanged(); +} + +bool SettingHighlighterPrivate::highlight() const +{ + return m_highlight; +} + +void SettingHighlighterPrivate::setHighlight(bool highlight) +{ + if (m_highlight == highlight) { + return; + } + + m_highlight = highlight; + updateTarget(); + emit highlightChanged(); +} + +bool SettingHighlighterPrivate::defaultIndicatorVisible() const +{ + return m_enabled; +} + +void SettingHighlighterPrivate::setDefaultIndicatorVisible(bool enabled) +{ + if (m_enabled == enabled) { + return; + } + + m_enabled = enabled; + updateTarget(); + + 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(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(); + } +} diff --git a/src/qmlcontrols/kcmcontrols/settinghighlighterprivate.h b/src/qmlcontrols/kcmcontrols/settinghighlighterprivate.h new file mode 100644 index 0000000..6cf275d --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/settinghighlighterprivate.h @@ -0,0 +1,48 @@ +/* + SPDX-FileCopyrightText: 2020 Kevin Ottens + SPDX-FileCopyrightText: 2020 Cyril Rossi + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef SETTINGSHIGHLIGHTERPRIVATE_H +#define SETTINGSHIGHLIGHTERPRIVATE_H + +#include +#include + +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 m_target = nullptr; + QPointer m_styleTarget = nullptr; + bool m_highlight = false; + bool m_enabled = false; +}; + +#endif diff --git a/src/qmlcontrols/kcmcontrols/settingshighlighterprivate.h b/src/qmlcontrols/kcmcontrols/settingshighlighterprivate.h new file mode 100644 index 0000000..e69de29 diff --git a/src/qmlcontrols/kcmcontrols/settingstateproxy.cpp b/src/qmlcontrols/kcmcontrols/settingstateproxy.cpp new file mode 100644 index 0000000..fe9dc2a --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/settingstateproxy.cpp @@ -0,0 +1,123 @@ +/* + SPDX-FileCopyrightText: 2020 Kevin Ottens + SPDX-FileCopyrightText: 2020 Cyril Rossi + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "settingstateproxy.h" + +#include +#include + +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; + 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; + 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; + emit immutableChanged(); + } + + if (m_defaulted != defaulted) { + m_defaulted = defaulted; + 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(item) || dynamic_cast(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); +} diff --git a/src/qmlcontrols/kcmcontrols/settingstateproxy.h b/src/qmlcontrols/kcmcontrols/settingstateproxy.h new file mode 100644 index 0000000..b5d12e2 --- /dev/null +++ b/src/qmlcontrols/kcmcontrols/settingstateproxy.h @@ -0,0 +1,77 @@ +/* + SPDX-FileCopyrightText: 2020 Kevin Ottens + SPDX-FileCopyrightText: 2020 Cyril Rossi + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef SETTINGSTATEPROXY_H +#define SETTINGSTATEPROXY_H + +#include +#include + +#include + +/** + * 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 m_configObject; + QString m_settingName; + bool m_immutable = false; + bool m_defaulted = true; +}; + +#endif diff --git a/src/qmlcontrols/kconfig/CMakeLists.txt b/src/qmlcontrols/kconfig/CMakeLists.txt new file mode 100644 index 0000000..59a68b2 --- /dev/null +++ b/src/qmlcontrols/kconfig/CMakeLists.txt @@ -0,0 +1,18 @@ +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) + diff --git a/src/qmlcontrols/kconfig/kauthorizedproxy.cpp b/src/qmlcontrols/kconfig/kauthorizedproxy.cpp new file mode 100644 index 0000000..e16cf49 --- /dev/null +++ b/src/qmlcontrols/kconfig/kauthorizedproxy.cpp @@ -0,0 +1,29 @@ +/* + SPDX-FileCopyrightText: 2016 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "kauthorizedproxy.h" + +#include + +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); +} diff --git a/src/qmlcontrols/kconfig/kauthorizedproxy.h b/src/qmlcontrols/kconfig/kauthorizedproxy.h new file mode 100644 index 0000000..91a7354 --- /dev/null +++ b/src/qmlcontrols/kconfig/kauthorizedproxy.h @@ -0,0 +1,30 @@ +/* + SPDX-FileCopyrightText: 2016 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#pragma once + +#include + +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; + +}; diff --git a/src/qmlcontrols/kconfig/kconfigplugin.cpp b/src/qmlcontrols/kconfig/kconfigplugin.cpp new file mode 100644 index 0000000..a6cd4cd --- /dev/null +++ b/src/qmlcontrols/kconfig/kconfigplugin.cpp @@ -0,0 +1,23 @@ +/* + SPDX-FileCopyrightText: 2016 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "kconfigplugin.h" + +#include + +#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(uri, 1, 0, "KAuthorized", kauthorizedProxy_singleton_provider); +} diff --git a/src/qmlcontrols/kconfig/kconfigplugin.h b/src/qmlcontrols/kconfig/kconfigplugin.h new file mode 100644 index 0000000..5324262 --- /dev/null +++ b/src/qmlcontrols/kconfig/kconfigplugin.h @@ -0,0 +1,19 @@ +/* + SPDX-FileCopyrightText: 2016 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#pragma once + +#include + +class KConfigPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; + +}; diff --git a/src/qmlcontrols/kconfig/qmldir b/src/qmlcontrols/kconfig/qmldir new file mode 100644 index 0000000..6192fec --- /dev/null +++ b/src/qmlcontrols/kconfig/qmldir @@ -0,0 +1,2 @@ +module org.kde.kconfig +plugin kconfigplugin diff --git a/src/qmlcontrols/kcoreaddons/CMakeLists.txt b/src/qmlcontrols/kcoreaddons/CMakeLists.txt new file mode 100644 index 0000000..3f77f2d --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/CMakeLists.txt @@ -0,0 +1,20 @@ +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) + diff --git a/src/qmlcontrols/kcoreaddons/formats.cpp b/src/qmlcontrols/kcoreaddons/formats.cpp new file mode 100644 index 0000000..b3f72a7 --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/formats.cpp @@ -0,0 +1,48 @@ +/* + SPDX-FileCopyrightText: 2014 Bhushan Shah + + 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(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); +} diff --git a/src/qmlcontrols/kcoreaddons/formats.h b/src/qmlcontrols/kcoreaddons/formats.h new file mode 100644 index 0000000..7b543bd --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/formats.h @@ -0,0 +1,102 @@ +/* + SPDX-FileCopyrightText: 2014 Bhushan Shah + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ + +#ifndef FORMATS_H +#define FORMATS_H + +#include + +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 diff --git a/src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.cpp b/src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.cpp new file mode 100644 index 0000000..40aebfb --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.cpp @@ -0,0 +1,35 @@ +/* + SPDX-FileCopyrightText: 2014 Bhushan Shah + SPDX-FileCopyrightText: 2014 David Edmundson + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ + +#include "kcoreaddonsplugin.h" + +#include + +#include "formats.h" +#include "kuserproxy.h" + +#include + +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(uri, 1, 0, "Format", formats_singletontype_provider); + qRegisterMetaType(); + + qmlRegisterUncreatableType(uri, 1, 0, "FormatTypes", QString()); + + qmlRegisterType(uri, 1, 0, "KUser"); +} diff --git a/src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.h b/src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.h new file mode 100644 index 0000000..1b4e5dc --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/kcoreaddonsplugin.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2014 Bhushan Shah + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL +*/ + +#ifndef KCOREADDONSPLUGIN_H +#define KCOREADDONSPLUGIN_H + +#include + +class KCoreAddonsPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; + +#endif diff --git a/src/qmlcontrols/kcoreaddons/kuserproxy.cpp b/src/qmlcontrols/kcoreaddons/kuserproxy.cpp new file mode 100644 index 0000000..cefb310 --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/kuserproxy.cpp @@ -0,0 +1,125 @@ +/* + SPDX-FileCopyrightText: 2013 Marco Martin + SPDX-FileCopyrightText: 2014 Sebastian Kügler + + SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL +*/ + +#include "kuserproxy.h" +#include +#include +#include +#include +#include + + + +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; + emit faceIconUrlChanged(); + m_temporaryEmptyFaceIconPath = false; + emit faceIconUrlChanged(); + } else if (path == etcPasswd) { + m_user = KUser(); + 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(); +} + diff --git a/src/qmlcontrols/kcoreaddons/kuserproxy.h b/src/qmlcontrols/kcoreaddons/kuserproxy.h new file mode 100644 index 0000000..5bf454c --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/kuserproxy.h @@ -0,0 +1,116 @@ +/* + SPDX-FileCopyrightText: 2013 Marco Martin + SPDX-FileCopyrightText: 2014 Sebastian Kügler + + SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL +*/ + +#ifndef KUSERPROXY_H +#define KUSERPROXY_H + +#include + +#include +#include + +/** + * 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 + diff --git a/src/qmlcontrols/kcoreaddons/qmldir b/src/qmlcontrols/kcoreaddons/qmldir new file mode 100644 index 0000000..626f8ce --- /dev/null +++ b/src/qmlcontrols/kcoreaddons/qmldir @@ -0,0 +1,3 @@ +module org.kde.kcoreaddons +plugin kcoreaddonsplugin + diff --git a/src/qmlcontrols/kioplugin/CMakeLists.txt b/src/qmlcontrols/kioplugin/CMakeLists.txt new file mode 100644 index 0000000..22a4f1e --- /dev/null +++ b/src/qmlcontrols/kioplugin/CMakeLists.txt @@ -0,0 +1,19 @@ +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) + diff --git a/src/qmlcontrols/kioplugin/kioplugin.cpp b/src/qmlcontrols/kioplugin/kioplugin.cpp new file mode 100644 index 0000000..2c1d388 --- /dev/null +++ b/src/qmlcontrols/kioplugin/kioplugin.cpp @@ -0,0 +1,18 @@ +/* + SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "kioplugin.h" + +#include + +#include "krunproxy.h" + +void KioPlugin::registerTypes(const char *uri) +{ + Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kio")); + + qmlRegisterType(uri, 1, 0, "KRun"); +} diff --git a/src/qmlcontrols/kioplugin/kioplugin.h b/src/qmlcontrols/kioplugin/kioplugin.h new file mode 100644 index 0000000..331b40f --- /dev/null +++ b/src/qmlcontrols/kioplugin/kioplugin.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef KIOPLUGIN_H +#define KIOPLUGIN_H + +#include + +class KioPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; + +#endif diff --git a/src/qmlcontrols/kioplugin/krunproxy.cpp b/src/qmlcontrols/kioplugin/krunproxy.cpp new file mode 100644 index 0000000..fb705b8 --- /dev/null +++ b/src/qmlcontrols/kioplugin/krunproxy.cpp @@ -0,0 +1,60 @@ +/* + SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "krunproxy.h" + +#include + +#include +#include +#include +#include +#include + +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; +} diff --git a/src/qmlcontrols/kioplugin/krunproxy.h b/src/qmlcontrols/kioplugin/krunproxy.h new file mode 100644 index 0000000..0957a3b --- /dev/null +++ b/src/qmlcontrols/kioplugin/krunproxy.h @@ -0,0 +1,33 @@ +/* + SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef KRUNPROXY_H +#define KRUNPROXY_H + +#include + +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 diff --git a/src/qmlcontrols/kioplugin/qmldir b/src/qmlcontrols/kioplugin/qmldir new file mode 100644 index 0000000..fa58b77 --- /dev/null +++ b/src/qmlcontrols/kioplugin/qmldir @@ -0,0 +1,3 @@ +module org.kde.kio +plugin kio + diff --git a/src/qmlcontrols/kquickcontrols/CMakeLists.txt b/src/qmlcontrols/kquickcontrols/CMakeLists.txt new file mode 100644 index 0000000..f2bee5e --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/CMakeLists.txt @@ -0,0 +1,8 @@ +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) + diff --git a/src/qmlcontrols/kquickcontrols/ColorButton.qml b/src/qmlcontrols/kquickcontrols/ColorButton.qml new file mode 100644 index 0000000..0659f83 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/ColorButton.qml @@ -0,0 +1,112 @@ +/* + SPDX-FileCopyrightText: 2015 David Edmundson + + 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 + SPDX-FileCopyrightText: 2014 David Edmundson + SPDX-FileCopyrightText: 1998 Mark Donohoe + SPDX-FileCopyrightText: 2001 Ellis Whitehead + SPDX-FileCopyrightText: 2007 Andreas Hartmetz + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "keysequencehelper.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class KeySequenceHelperPrivate +{ +public: + KeySequenceHelperPrivate(KeySequenceHelper *q); + + /** + * 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 *q) + : q(q) + , 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 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 explicitely 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; +} diff --git a/src/qmlcontrols/kquickcontrols/private/keysequencehelper.h b/src/qmlcontrols/kquickcontrols/private/keysequencehelper.h new file mode 100644 index 0000000..2bc3d04 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/private/keysequencehelper.h @@ -0,0 +1,75 @@ +/* + SPDX-FileCopyrightText: 2014 David Edmundson + SPDX-FileCopyrightText: 2020 David Redondo + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef KEYSEQUENCEHELPER_H +#define KEYSEQUENCEHELPER_H + +#include + +#include +#include + +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 diff --git a/src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.cpp b/src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.cpp new file mode 100644 index 0000000..c05de61 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.cpp @@ -0,0 +1,24 @@ +/* + SPDX-FileCopyrightText: 2014 David Edmundson + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "kquickcontrolsprivateplugin.h" + +#include + +#include "keysequencehelper.h" +#include "translationcontext.h" + +void KQuickControlsPrivatePlugin::registerTypes(const char *uri) +{ + Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.private.kquickcontrols")); + qmlRegisterType(uri, 2, 0, "KeySequenceHelper"); + qmlRegisterType(uri, 2, 0, "TranslationContext"); + // Register the Helper again publically but uncreatable, so one can access the shortcuttype enum + // values as for example "ShortcutType.StandardShortcuts" from qml + qmlRegisterUncreatableType("org.kde.kquickcontrols", 2, 0, "ShortcutType", + QStringLiteral("This is just to allow accessing the enum")); +} + diff --git a/src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.h b/src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.h new file mode 100644 index 0000000..db35247 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/private/kquickcontrolsprivateplugin.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2014 David Edmundson + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KQUICKCONTROLSPRIVATEPLUGIN_H +#define KQUICKCONTROLSPRIVATEPLUGIN_H + +#include + +class KQuickControlsPrivatePlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; + +#endif diff --git a/src/qmlcontrols/kquickcontrols/private/qmldir b/src/qmlcontrols/kquickcontrols/private/qmldir new file mode 100644 index 0000000..c210322 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/private/qmldir @@ -0,0 +1,2 @@ +module org.kde.private.kquickcontrols +plugin kquickcontrolsprivateplugin diff --git a/src/qmlcontrols/kquickcontrols/private/translationcontext.cpp b/src/qmlcontrols/kquickcontrols/private/translationcontext.cpp new file mode 100644 index 0000000..e44fc33 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/private/translationcontext.cpp @@ -0,0 +1,222 @@ +/* + SPDX-FileCopyrightText: 2014 Kevin Ottens + + 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 + +#include + +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; + 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(); +} diff --git a/src/qmlcontrols/kquickcontrols/private/translationcontext.h b/src/qmlcontrols/kquickcontrols/private/translationcontext.h new file mode 100644 index 0000000..b94bbad --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/private/translationcontext.h @@ -0,0 +1,44 @@ +/* + SPDX-FileCopyrightText: 2014 Kevin Ottens + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef TRANSLATIONCONTEXT_H +#define TRANSLATIONCONTEXT_H + +#include + +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 diff --git a/src/qmlcontrols/kquickcontrols/qmldir b/src/qmlcontrols/kquickcontrols/qmldir new file mode 100644 index 0000000..a732b58 --- /dev/null +++ b/src/qmlcontrols/kquickcontrols/qmldir @@ -0,0 +1,4 @@ +module org.kde.kquickcontrols + +KeySequenceItem 2.0 KeySequenceItem.qml +ColorButton 2.0 ColorButton.qml diff --git a/src/qmlcontrols/kquickcontrolsaddons/CMakeLists.txt b/src/qmlcontrols/kquickcontrolsaddons/CMakeLists.txt new file mode 100644 index 0000000..71aacc6 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/CMakeLists.txt @@ -0,0 +1,39 @@ +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) diff --git a/src/qmlcontrols/kquickcontrolsaddons/Mainpage.dox b/src/qmlcontrols/kquickcontrolsaddons/Mainpage.dox new file mode 100644 index 0000000..ab18724 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/Mainpage.dox @@ -0,0 +1,14 @@ +/** @mainpage Qt Extra Components + +

import org.kde.qtextracomponents

+ +- QPixmapItem +- QImageItem +- QIconItem +- MouseEventListener +- ColumnProxyModel + +*/ + +// DOXYGEN_SET_PROJECT_NAME = QtExtraComponents +// vim:ts=4:sw=4:expandtab:filetype=doxygen diff --git a/src/qmlcontrols/kquickcontrolsaddons/clipboard.cpp b/src/qmlcontrols/kquickcontrolsaddons/clipboard.cpp new file mode 100644 index 0000000..0abda56 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/clipboard.cpp @@ -0,0 +1,116 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "clipboard.h" +#include +#include +#include +#include + +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; + emit modeChanged(m_mode); +} + +void Clipboard::clipboardChanged(QClipboard::Mode m) +{ + if (m == m_mode) { + 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 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(); +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/clipboard.h b/src/qmlcontrols/kquickcontrolsaddons/clipboard.h new file mode 100644 index 0000000..53c968c --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/clipboard.h @@ -0,0 +1,59 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CLIPBOARD_H +#define CLIPBOARD_H + +#include +#include + +class ClipboardPrivate; + +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. + */ + Q_PROPERTY(QStringList formats READ formats NOTIFY contentChanged) + + public: + explicit Clipboard(QObject* parent = nullptr); + + QClipboard::Mode mode() const; + void setMode(QClipboard::Mode mode); + + Q_SCRIPTABLE QVariant contentFormat(const QString &format) const; + QVariant content() const; + void setContent(const QVariant &content); + + QStringList formats() const; + + 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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.cpp b/src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.cpp new file mode 100644 index 0000000..8778e2d --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.cpp @@ -0,0 +1,233 @@ +/* + SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez + + 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(index.model())); + } + beginResetModel(); + m_index = index; + endResetModel(); + + 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) { + 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 ColumnProxyModel::roleNames() const +{ + return m_sourceModel ? m_sourceModel->roleNames() : QHash(); +} + +bool ColumnProxyModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + return m_sourceModel && m_sourceModel->setData(sourceIndex(index), value, role); +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.h b/src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.h new file mode 100644 index 0000000..15c00f8 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/columnproxymodel.h @@ -0,0 +1,62 @@ +/* + SPDX-FileCopyrightText: 2012 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef COLUMNPROXYMODEL_H +#define COLUMNPROXYMODEL_H + +#include + +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 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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/config-kquickcontrolsaddons.h.cmake b/src/qmlcontrols/kquickcontrolsaddons/config-kquickcontrolsaddons.h.cmake new file mode 100644 index 0000000..e5dbe9d --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/config-kquickcontrolsaddons.h.cmake @@ -0,0 +1,2 @@ +// epoxy library available? +#cmakedefine01 HAVE_EPOXY diff --git a/src/qmlcontrols/kquickcontrolsaddons/eventgenerator.cpp b/src/qmlcontrols/kquickcontrolsaddons/eventgenerator.cpp new file mode 100644 index 0000000..e1fe732 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/eventgenerator.cpp @@ -0,0 +1,131 @@ +/* + SPDX-FileCopyrightText: 2015 Eike Hein + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "eventgenerator.h" + +#include +#include +#include + +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(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 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 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 items = allChildItemsRecursive(parentItem); + + for (QQuickItem *item : items) { + sendGrabEvent(item, type); + } +} + +QList EventGenerator::allChildItemsRecursive(QQuickItem *parentItem) +{ + QList itemList; + + const auto childsItems = parentItem->childItems(); + itemList.append(childsItems); + + + for (QQuickItem *childItem : childsItems) { + itemList.append(allChildItemsRecursive(childItem)); + } + + return itemList; +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/eventgenerator.h b/src/qmlcontrols/kquickcontrolsaddons/eventgenerator.h new file mode 100644 index 0000000..b76561d --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/eventgenerator.h @@ -0,0 +1,75 @@ +/* + SPDX-FileCopyrightText: 2015 Eike Hein + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + + +#ifndef EventGenerator_H +#define EventGenerator_H + +#include + +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 allChildItemsRecursive(QQuickItem *parentItem); +}; + +#endif diff --git a/src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.cpp b/src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.cpp new file mode 100644 index 0000000..0330b3e --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.cpp @@ -0,0 +1,112 @@ +/* + SPDX-FileCopyrightText: 2019 Marco Martin + SPDX-FileCopyrightText: 2014-2015 Eike Hein + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "fallbacktaphandler.h" + +#include +#include + +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); + emit acceptedButtonsChanged(); +} + +bool FallbackTapHandler::childMouseEventFilter(QQuickItem *item, QEvent *event) +{ + if (event->type() == QEvent::MouseButtonPress && item->inherits("QQuickFlickable")) { + QMouseEvent *me = static_cast(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()); + emit pressed(&eventProxy); + + } else if (event->type() == QEvent::MouseButtonRelease && item->inherits("QQuickFlickable")) { + QMouseEvent *me = static_cast(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()); + emit released(&eventProxy); + + if (QPointF(m_mouseDownPos - me->windowPos()).manhattanLength() < QGuiApplication::styleHints()->startDragDistance()) { + 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()); + 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()) { + emit tapped(&eventProxy); + } + + m_mouseDownItem.clear(); + m_mouseDownPos = QPointF(); + + emit released(&eventProxy); +} + +#include "moc_fallbacktaphandler.cpp" diff --git a/src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.h b/src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.h new file mode 100644 index 0000000..0c011f2 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/fallbacktaphandler.h @@ -0,0 +1,59 @@ +/* + SPDX-FileCopyrightText: 2019 Marco Martin + SPDX-FileCopyrightText: 2014-2015 Eike Hein + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#pragma once + +#include +#include + +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 m_mouseDownItem; + QPointF m_mouseDownPos; +}; + diff --git a/src/qmlcontrols/kquickcontrolsaddons/icondialog.cpp b/src/qmlcontrols/kquickcontrolsaddons/icondialog.cpp new file mode 100644 index 0000000..625a0f6 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/icondialog.cpp @@ -0,0 +1,172 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#include "icondialog.h" + +#include +#include + +#include +#include +#include + +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(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; + 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; + 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); + emit titleChanged(title); + } +} + +bool IconDialog::user() const +{ + return m_user; +} + +void IconDialog::setUser(bool user) +{ + if (m_user != user) { + m_user = user; + 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; + emit customLocationChanged(customLocation); + } +} + +Qt::WindowModality IconDialog::modality() const +{ + return m_modality; +} + +void IconDialog::setModality(Qt::WindowModality modality) +{ + if (m_modality != modality) { + m_modality = modality; + 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(parent()); + QQuickWindow *parentWindow = (parentItem ? parentItem->window() : qobject_cast(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)) { + emit visibleChanged(); + } + + return false; +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/icondialog.h b/src/qmlcontrols/kquickcontrolsaddons/icondialog.h new file mode 100644 index 0000000..2980e1c --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/icondialog.h @@ -0,0 +1,99 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +#ifndef ICONDIALOG_H +#define ICONDIALOG_H + +#include +#include + +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 m_dialog; + + QString m_iconName; + int m_iconSize; + bool m_user; + QString m_customLocation; + Qt::WindowModality m_modality; + bool m_visible; + +}; + +#endif // ICONDIALOG_H diff --git a/src/qmlcontrols/kquickcontrolsaddons/kcmshell.cpp b/src/qmlcontrols/kquickcontrolsaddons/kcmshell.cpp new file mode 100644 index 0000000..43f1a10 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/kcmshell.cpp @@ -0,0 +1,72 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "kcmshell.h" + +#include +#include + +#include + +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); +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/kcmshell.h b/src/qmlcontrols/kquickcontrolsaddons/kcmshell.h new file mode 100644 index 0000000..af5609e --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/kcmshell.h @@ -0,0 +1,75 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCMSHELL_H +#define KCMSHELL_H + +#include + +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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.cpp b/src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.cpp new file mode 100644 index 0000000..2db8c55 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.cpp @@ -0,0 +1,63 @@ +/* + SPDX-FileCopyrightText: 2009 Alan Alpert + SPDX-FileCopyrightText: 2010 Ménard Alexis + SPDX-FileCopyrightText: 2010 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "kquickcontrolsaddonsplugin.h" +#include "config-kquickcontrolsaddons.h" + + +#include "qpixmapitem.h" +#include "qimageitem.h" +#include "qiconitem.h" +#include "mouseeventlistener.h" +#include "columnproxymodel.h" +#include "clipboard.h" +#include "fallbacktaphandler.h" +#include "mimedatabase.h" +#include "kcmshell.h" +#include "icondialog.h" +#include "eventgenerator.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(uri, 2, 0, "QPixmapItem"); + qmlRegisterType(uri, 2, 0, "QImageItem"); + qmlRegisterType(uri, 2, 0, "QIconItem"); + qmlRegisterType(uri, 2, 0, "MouseEventListener"); + qmlRegisterType(uri, 2, 0, "ColumnProxyModel"); + qmlRegisterType(uri, 2, 0, "Clipboard"); + qmlRegisterType(uri, 2, 0, "MimeDatabase"); + qmlRegisterSingletonType(uri, 2, 0, "KCMShell", kcmshell_singleton_provider); + qmlRegisterType(uri, 2, 0, "IconDialog"); + qmlRegisterType(uri, 2, 0, "EventGenerator"); + qmlRegisterUncreatableType(uri, 2, 1, "FallbackTapHandlerMouseEvent", QStringLiteral("Cannot create items of type FallbackTapHandlerMouseEvent")); + qmlRegisterType(uri, 2, 1, "FallbackTapHandler"); + +#if HAVE_EPOXY + qmlRegisterType(uri, 2, 0, "PlotData"); + qmlRegisterType(uri, 2, 0, "Plotter"); +#endif + qmlRegisterAnonymousType(uri, 1); + qRegisterMetaType("QModelIndex"); +} + + + diff --git a/src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.h b/src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.h new file mode 100644 index 0000000..e211526 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/kquickcontrolsaddonsplugin.h @@ -0,0 +1,24 @@ +/* + SPDX-FileCopyrightText: 2009 Alan Alpert + SPDX-FileCopyrightText: 2010 Ménard Alexis + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KQUICKCONTROLSADDONSPLUGIN_H +#define KQUICKCONTROLSADDONSPLUGIN_H + +#include + + +class KQuickControlsAddonsPlugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char *uri) override; +}; + +#endif diff --git a/src/qmlcontrols/kquickcontrolsaddons/mimedatabase.cpp b/src/qmlcontrols/kquickcontrolsaddons/mimedatabase.cpp new file mode 100644 index 0000000..ef3ba5c --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/mimedatabase.cpp @@ -0,0 +1,42 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "mimedatabase.h" +#include +#include + +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); +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/mimedatabase.h b/src/qmlcontrols/kquickcontrolsaddons/mimedatabase.h new file mode 100644 index 0000000..3723554 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/mimedatabase.h @@ -0,0 +1,26 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef MIMEDATABASE_H +#define MIMEDATABASE_H + +#include +#include + +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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp new file mode 100644 index 0000000..52ac993 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp @@ -0,0 +1,397 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2013 Sebastian Kügler + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "mouseeventlistener.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +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("org.kde.kquickcontrolsaddons", 1); + qmlRegisterAnonymousType("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); + + emit cursorShapeChanged(); +} + +void MouseEventListener::setAcceptedButtons(Qt::MouseButtons buttons) +{ + if (buttons == m_acceptedButtons) { + return; + } + + m_acceptedButtons = buttons; + emit acceptedButtonsChanged(); +} + +void MouseEventListener::setHoverEnabled(bool enable) +{ + if (enable == acceptHoverEvents()) { + return; + } + + setAcceptHoverEvents(enable); + 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; + emit containsMouseChanged(true); +} + +void MouseEventListener::hoverLeaveEvent(QHoverEvent *event) +{ + Q_UNUSED(event); + + m_containsMouse = false; + 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); + 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; + emit pressed(&dme); + 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()); + 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; + emit released(&dme); + emit pressedChanged(); + + if (boundingRect().contains(me->pos()) && m_pressAndHoldTimer->isActive()) { + 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 */); + emit wheelMoved(&dwe); +} + +void MouseEventListener::handlePressAndHold() +{ + if (m_pressed) { + 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(item)) { + return false; + } + + switch (event->type()) { + case QEvent::MouseButtonPress: { + m_lastEvent = event; + QMouseEvent *me = static_cast(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; + emit pressed(&dme); + 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(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(); + emit positionChanged(&dme); + + if (dme.isAccepted()) { + return true; + } + break; + } + case QEvent::MouseMove: { + m_lastEvent = event; + QMouseEvent *me = static_cast(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 co-ordinates + //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()); + } + emit positionChanged(&dme); + + if (dme.isAccepted()) { + return true; + } + break; + } + case QEvent::MouseButtonRelease: { + m_lastEvent = event; + QMouseEvent *me = static_cast(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; + + emit released(&dme); + emit pressedChanged(); + + if (QPointF(me->screenPos() - m_buttonDownPos).manhattanLength() <= QGuiApplication::styleHints()->startDragDistance() && m_pressAndHoldTimer->isActive()) { + 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(event); + KDeclarativeWheelEvent dwe(we->position().toPoint(), we->globalPosition().toPoint(), we->angleDelta(), we->buttons(), we->modifiers(), Qt::Vertical /* HACK, deprecated, remove */); + 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; + emit pressedChanged(); + + emit canceled(); + } +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.h b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.h new file mode 100644 index 0000000..7ebb180 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.h @@ -0,0 +1,232 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2013 Sebastian Kügler + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef MOUSEEVENTLISTENER_H +#define MOUSEEVENTLISTENER_H + +#include + +/** + * 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 co-ordinates 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; + 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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/plotter.cpp b/src/qmlcontrols/kquickcontrolsaddons/plotter.cpp new file mode 100644 index 0000000..9f2ff3d --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/plotter.cpp @@ -0,0 +1,924 @@ +/* + This file is part of the KDE project + + SPDX-FileCopyrightText: 2014 Fredrik Höglund + SPDX-FileCopyrightText: 2014 Marco Martin + SPDX-FileCopyrightText: 2015 David Edmundson + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "plotter.h" + + +#include +#include + +#include +#include + +#include +#include + +#include +#include + + +#include + +#include + +//completely arbitrary +static int s_defaultSampleSize = 40; + +PlotData::PlotData(QObject *parent) + : QObject(parent), + m_min(std::numeric_limits::max()), + m_max(std::numeric_limits::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; + + 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; + 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::min(); + m_min = std::numeric_limits::max(); + for (auto v : qAsConst(m_values)) { + if (v > m_max) { + m_max = v; + } else if (v < m_min) { + m_min = v; + } + } + + emit valuesChanged(); +} + +QList 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 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 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 : qAsConst(m_plotData)) { + data->setSampleSize(size); + } + m_mutex.unlock(); + + update(); + emit sampleSizeChanged(); +} + +bool Plotter::isStacked() const +{ + return m_stacked; +} + +void Plotter::setStacked(bool stacked) +{ + if (m_stacked == stacked) { + return; + } + + m_stacked = stacked; + + emit stackedChanged(); + update(); +} + +bool Plotter::isAutoRange() const +{ + return m_autoRange; +} + +void Plotter::setAutoRange(bool autoRange) +{ + if (m_autoRange == autoRange) { + return; + } + + m_autoRange = autoRange; + + 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; + + 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; + + emit rangeMinChanged(); + normalizeData(); + update(); +} + +void Plotter::setGridColor(const QColor &color) +{ + if (m_gridColor == color) { + return; + } + + m_gridColor = color; + + 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; + 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() << value); +} + +void Plotter::addSample(const QList &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 : qAsConst(m_plotData)) { + data->addSample(value.value(i)); + ++i; + } + m_mutex.unlock(); + + normalizeData(); + + update(); +} + +void Plotter::dataSet_append(QQmlListProperty *list, PlotData *item) +{ + //encase all m_plotData access in a mutex, since rendering is usually done in another thread + Plotter *p = static_cast(list->object); + p->m_mutex.lock(); + p->m_plotData.append(item); + p->m_mutex.unlock(); +} + +int Plotter::dataSet_count(QQmlListProperty *list) +{ + Plotter *p = static_cast(list->object); + return p->m_plotData.count(); +} + +PlotData *Plotter::dataSet_at(QQmlListProperty *list, int index) +{ + Plotter *p = static_cast(list->object); + p->m_mutex.lock(); + PlotData *d = p->m_plotData.at(index); + p->m_mutex.unlock(); + return d; +} + +void Plotter::dataSet_clear(QQmlListProperty *list) +{ + Plotter *p = static_cast(list->object); + + p->m_mutex.lock(); + p->m_plotData.clear(); + p->m_mutex.unlock(); +} + + +QQmlListProperty Plotter::dataSets() +{ + return QQmlListProperty(this, nullptr, Plotter::dataSet_append, Plotter::dataSet_count, Plotter::dataSet_at, Plotter::dataSet_clear); +} + + + +// Catmull-Rom interpolation +QPainterPath Plotter::interpolate(const QVector &p, qreal x0, qreal x1) const +{ + QPainterPath path; + + const QMatrix4x4 matrix( 0, 1, 0, 0, + -1/6., 1, 1/6., 0, + 0, 1/6., 1, -1/6., + 0, 0, 1, 0); + + 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++) { + 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)); + + 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(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 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 > 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 : qAsConst(m_plotData)) { + // Interpolate the data set + const QPainterPath path = interpolate(data->m_normalizedValues, 0, roundedWidth); + + // Flatten the path + const QList 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(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(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(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(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 oldCount; + m_mutex.lock(); + for (auto data : qAsConst(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(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(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 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 { + 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"); + 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 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(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::min(); + m_min = std::numeric_limits::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 : qAsConst(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::min())) { + adjust = 1; + } else { + adjust = (height() / (adjustedMax - adjustedMin)); + } + + //normalizebased on global max and min + m_mutex.lock(); + for (auto data : qAsConst(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(); + } +} + diff --git a/src/qmlcontrols/kquickcontrolsaddons/plotter.h b/src/qmlcontrols/kquickcontrolsaddons/plotter.h new file mode 100644 index 0000000..76db6d1 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/plotter.h @@ -0,0 +1,252 @@ +/* + This file is part of the KDE project + + SPDX-FileCopyrightText: 2014 Fredrik Höglund + SPDX-FileCopyrightText: 2014 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef PLASMA_PLOTTER_H +#define PLASMA_PLOTTER_H + + +#include + +// 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 +#include +#include +#include +#include + +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 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 values() const; + + QVector 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 m_values; + + qreal m_min; + qreal m_max; + int m_sampleSize; +}; + +class Plotter : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(QQmlListProperty 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 dataSets(); + static void dataSet_append(QQmlListProperty *list, PlotData *item); + static int dataSet_count(QQmlListProperty *list); + static PlotData *dataSet_at(QQmlListProperty *list, int pos); + static void dataSet_clear(QQmlListProperty *list); + + Q_INVOKABLE void addSample(qreal value); + Q_INVOKABLE void addSample(const QList &value); + +protected: + void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; + +private: + QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) override final; + QPainterPath interpolate(const QVector &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 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 m_window; + QMutex m_mutex; +}; + +#endif diff --git a/src/qmlcontrols/kquickcontrolsaddons/qiconitem.cpp b/src/qmlcontrols/kquickcontrolsaddons/qiconitem.cpp new file mode 100644 index 0000000..e6b51b2 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qiconitem.cpp @@ -0,0 +1,159 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "qiconitem.h" + +#include +#include +#include +#include + +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()) { + m_icon = icon.value(); + } else if(icon.canConvert()) { + m_icon = QIcon::fromTheme(icon.toString()); + } else { + m_icon = QIcon(); + } + m_changed = true; + update(); + 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; + 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(); + 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(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); +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/qiconitem.h b/src/qmlcontrols/kquickcontrolsaddons/qiconitem.h new file mode 100644 index 0000000..e3093f6 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qiconitem.h @@ -0,0 +1,70 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef QICONITEM_H +#define QICONITEM_H + +#include +#include +#include + +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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/qimageitem.cpp b/src/qmlcontrols/kquickcontrolsaddons/qimageitem.cpp new file mode 100644 index 0000000..7364e42 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qimageitem.cpp @@ -0,0 +1,195 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2015 Luca Beltrame + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "qimageitem.h" + +#include + + +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(); + emit nativeWidthChanged(); + emit nativeHeightChanged(); + emit imageChanged(); + if (oldImageNull != m_image.isNull()) { + 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(); + 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(); + emit paintedHeightChanged(); + emit paintedWidthChanged(); + } +} + +void QImageItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) +{ + QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry); + updatePaintedRect(); +} diff --git a/src/qmlcontrols/kquickcontrolsaddons/qimageitem.h b/src/qmlcontrols/kquickcontrolsaddons/qimageitem.h new file mode 100644 index 0000000..00bd0be --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qimageitem.h @@ -0,0 +1,84 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2015 Luca Beltrame + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef QIMAGEITEM_H +#define QIMAGEITEM_H + +#include +#include + +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 diff --git a/src/qmlcontrols/kquickcontrolsaddons/qmldir b/src/qmlcontrols/kquickcontrolsaddons/qmldir new file mode 100644 index 0000000..1113c16 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qmldir @@ -0,0 +1,2 @@ +module org.kde.kquickcontrolsaddons +plugin kquickcontrolsaddonsplugin diff --git a/src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.cpp b/src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.cpp new file mode 100644 index 0000000..cff57a5 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.cpp @@ -0,0 +1,200 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2015 Luca Beltrame + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "qpixmapitem.h" + +#include + + +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(); + emit nativeWidthChanged(); + emit nativeHeightChanged(); + emit pixmapChanged(); + if (oldPixmapNull != m_pixmap.isNull()) { + 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(); + 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(); + emit paintedHeightChanged(); + emit paintedWidthChanged(); + } +} + +void QPixmapItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) +{ + QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry); + updatePaintedRect(); +} + diff --git a/src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.h b/src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.h new file mode 100644 index 0000000..c2765a9 --- /dev/null +++ b/src/qmlcontrols/kquickcontrolsaddons/qpixmapitem.h @@ -0,0 +1,84 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + SPDX-FileCopyrightText: 2015 Luca Beltrame + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef QPIXMAPITEM_H +#define QPIXMAPITEM_H + +#include +#include + +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 diff --git a/src/qmlcontrols/kwindowsystemplugin/CMakeLists.txt b/src/qmlcontrols/kwindowsystemplugin/CMakeLists.txt new file mode 100644 index 0000000..ce0ea74 --- /dev/null +++ b/src/qmlcontrols/kwindowsystemplugin/CMakeLists.txt @@ -0,0 +1,17 @@ +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 ${QML_INSTALL_DIR}/org/kde/kwindowsystem) + +install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/kwindowsystem) diff --git a/src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.cpp b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.cpp new file mode 100644 index 0000000..3a5738b --- /dev/null +++ b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.cpp @@ -0,0 +1,18 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "kwindowsystemplugin.h" + +#include + +#include "kwindowsystemproxy.h" + +void KWindowSystemPlugin::registerTypes(const char *uri) +{ + Q_ASSERT(QString::fromLatin1(uri) == QLatin1String("org.kde.kwindowsystem")); + + qmlRegisterType(uri, 1, 0, "KWindowSystem"); +} diff --git a/src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.h b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.h new file mode 100644 index 0000000..aef68d8 --- /dev/null +++ b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemplugin.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef KWINDOWSYSTEMPLUGIN_H +#define KWINDOWSYSTEMPLUGIN_H + +#include + +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 diff --git a/src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.cpp b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.cpp new file mode 100644 index 0000000..fcf3ac6 --- /dev/null +++ b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.cpp @@ -0,0 +1,139 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#include "kwindowsystemproxy.h" + +#include +#include + +#include + +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); +} diff --git a/src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.h b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.h new file mode 100644 index 0000000..9b1009b --- /dev/null +++ b/src/qmlcontrols/kwindowsystemplugin/kwindowsystemproxy.h @@ -0,0 +1,157 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + SPDX-License-Identifier: LGPL-2.1-or-later +*/ + +#ifndef KWINDOWSYSTEMPROXY_H +#define KWINDOWSYSTEMPROXY_H + +#include +#include + +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 diff --git a/src/qmlcontrols/kwindowsystemplugin/qmldir b/src/qmlcontrols/kwindowsystemplugin/qmldir new file mode 100644 index 0000000..83ce62b --- /dev/null +++ b/src/qmlcontrols/kwindowsystemplugin/qmldir @@ -0,0 +1,3 @@ +module org.kde.kwindowsystem +plugin kwindowsystem + diff --git a/src/quickaddons/CMakeLists.txt b/src/quickaddons/CMakeLists.txt new file mode 100644 index 0000000..ec6e7d4 --- /dev/null +++ b/src/quickaddons/CMakeLists.txt @@ -0,0 +1,85 @@ +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 or +target_include_directories(KF5QuickAddons INTERFACE "$") + +target_link_libraries(KF5QuickAddons + PUBLIC + Qt5::Quick + KF5::CoreAddons + PRIVATE + KF5::I18n + KF5::Declarative + KF5::ConfigGui +) + +set_target_properties(KF5QuickAddons + PROPERTIES VERSION ${KDECLARATIVE_VERSION_STRING} + 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}) diff --git a/src/quickaddons/configmodule.cpp b/src/quickaddons/configmodule.cpp new file mode 100644 index 0000000..0f275c6 --- /dev/null +++ b/src/quickaddons/configmodule.cpp @@ -0,0 +1,499 @@ +/* + This file is part of the KDE libraries + + SPDX-FileCopyrightText: 1999 Matthias Hoelzer-Kluepfel + SPDX-FileCopyrightText: 2001 Michael Goffioul + SPDX-FileCopyrightText: 2004 Frans Englich + SPDX-FileCopyrightText: 2009 Dario Freddi + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "configmodule.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +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 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 s_rootObjects; +}; + +QHash ConfigModulePrivate::s_rootObjects = QHash(); + + +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(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(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(object); + if (!item) { + object->deleteLater(); + return; + } + + d->subPages << item; + emit pagePushed(item); + emit depthChanged(depth()); + setCurrentIndex(d->currentIndex + 1); +} + +void ConfigModule::push(QQuickItem *item) +{ + //ensure main ui is created + if (!mainUi()) { + return; + } + + d->subPages << item; + emit pagePushed(item); + emit depthChanged(depth()); + setCurrentIndex(d->currentIndex + 1); +} + +void ConfigModule::pop() +{ + if (d->subPages.isEmpty()) { + return; + } + QQuickItem *page = d->subPages.takeLast(); + emit pageRemoved(); + 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) +{ + 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; + 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(); + } + + emit needsAuthorizationChanged(); + 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; + 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; + + 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; + + emit needsAuthorizationChanged(); + 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; + emit rootOnlyMessageChanged(); +} + +QString ConfigModule::rootOnlyMessage() const +{ + return d->_rootOnlyMessage; +} + +void ConfigModule::setUseRootOnlyMessage(bool on) +{ + if (d->_useRootOnlyMessage == on) { + return; + } + + d->_useRootOnlyMessage = on; + + 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; + + emit quickHelpChanged(); +} + +QString ConfigModule::quickHelp() const +{ + return d->_quickHelp; +} + +void ConfigModule::setNeedsSave(bool needs) +{ + if (needs == d->_needsSave) { + return; + } + + d->_needsSave = needs; + emit needsSaveChanged(); +} + +bool ConfigModule::needsSave() +{ + return d->_needsSave; +} + +void ConfigModule::setRepresentsDefaults(bool defaults) +{ + if (defaults == d->_representsDefaults) { + return; + } + + d->_representsDefaults = defaults; + 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; + emit defaultsIndicatorsVisibleChanged(); +} +} + +#include "moc_configmodule.cpp" + diff --git a/src/quickaddons/configmodule.h b/src/quickaddons/configmodule.h new file mode 100644 index 0000000..3406636 --- /dev/null +++ b/src/quickaddons/configmodule.h @@ -0,0 +1,626 @@ +/* + This file is part of the KDE libraries + + SPDX-FileCopyrightText: 1999 Matthias Hoelzer-Kluepfel + SPDX-FileCopyrightText: 2001 Michael Goffioul + SPDX-FileCopyrightText: 2004 Frans Englich + SPDX-FileCopyrightText: 2009 Dario Freddi + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CONFIGMODULE_H +#define CONFIGMODULE_H + +#include "quickaddons_export.h" + +#include +#include +#include + +#include + +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 + * + * K_PLUGIN_FACTORY(MyConfigModuleFactory, registerPlugin() ) + * \endcode + * + * The constructor of the ConfigModule then looks like this: + * \code + * YourConfigModule::YourConfigModule( QObject* parent ) + * : ConfigModule( parent ) + * { + * KAboutData *about = new KAboutData( + * , 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: + * 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 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 + diff --git a/src/quickaddons/imagetexturescache.cpp b/src/quickaddons/imagetexturescache.cpp new file mode 100644 index 0000000..1802176 --- /dev/null +++ b/src/quickaddons/imagetexturescache.cpp @@ -0,0 +1,57 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "imagetexturescache.h" +#include + +typedef QHash > > TexturesCache; + +class ImageTexturesCachePrivate +{ +public: + TexturesCache cache; +}; + +ImageTexturesCache::ImageTexturesCache() + : d(new ImageTexturesCachePrivate) +{ +} + +ImageTexturesCache::~ImageTexturesCache() +{ +} + +QSharedPointer ImageTexturesCache::loadTexture(QQuickWindow *window, const QImage &image, QQuickWindow::CreateTextureOptions options) +{ + qint64 id = image.cacheKey(); + QSharedPointer texture = d->cache.value(id).value(window).toStrongRef(); + + if (!texture) { + auto cleanAndDelete = [this, window, id](QSGTexture* texture) { + QHash >& textures = (d->cache)[id]; + textures.remove(window); + if (textures.isEmpty()) + d->cache.remove(id); + delete texture; + }; + texture = QSharedPointer(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(window->createTextureFromImage(image, options)); + } + + return texture; +} + +QSharedPointer ImageTexturesCache::loadTexture(QQuickWindow *window, const QImage &image) +{ + return loadTexture(window, image, QQuickWindow::CreateTextureOptions()); +} diff --git a/src/quickaddons/imagetexturescache.h b/src/quickaddons/imagetexturescache.h new file mode 100644 index 0000000..12621bf --- /dev/null +++ b/src/quickaddons/imagetexturescache.h @@ -0,0 +1,52 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef IMAGETEXTURESCACHE_H +#define IMAGETEXTURESCACHE_H + +#include +#include + +#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 loadTexture(QQuickWindow *window, const QImage &image, QQuickWindow::CreateTextureOptions options); + + QSharedPointer loadTexture(QQuickWindow *window, const QImage &image); + + +private: + QScopedPointer d; +}; + +#endif // IMAGETEXTURESCACHE_H diff --git a/src/quickaddons/managedconfigmodule.cpp b/src/quickaddons/managedconfigmodule.cpp new file mode 100644 index 0000000..b277708 --- /dev/null +++ b/src/quickaddons/managedconfigmodule.cpp @@ -0,0 +1,169 @@ +/* + This file is part of the KDE libraries + SPDX-FileCopyrightText: 2019 Kevin Ottens + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "managedconfigmodule.h" + +#include + +#include + +namespace KQuickAddons { + +class ManagedConfigModulePrivate +{ +public: + ManagedConfigModulePrivate(ManagedConfigModule *module): + _q(module) + { + QMetaObject::invokeMethod(_q, "_k_registerSettings", Qt::QueuedConnection); + } + + void _k_registerSettings(); + + ManagedConfigModule *_q; + QList> _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 : qAsConst(d->_skeletons)) { + if (skeleton) { + skeleton->load(); + } + } +} + +void ManagedConfigModule::save() +{ + for (const auto &skeleton : qAsConst(d->_skeletons)) { + if (skeleton) { + skeleton->save(); + } + } +} + +void ManagedConfigModule::defaults() +{ + for (const auto &skeleton : qAsConst(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(); + for (auto *skeleton : skeletons) { + _q->registerSettings(skeleton); + } +} + +void ManagedConfigModule::settingsChanged() +{ + bool needsSave = false; + bool representsDefaults = true; + for (const auto &skeleton : qAsConst(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(item) || dynamic_cast(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 &value) { return value.isNull(); } ); + d->_skeletons.erase(toRemove, d->_skeletons.end()); + + QMetaObject::invokeMethod(this, "settingsChanged", Qt::QueuedConnection); +} + +} + +#include "moc_managedconfigmodule.cpp" + diff --git a/src/quickaddons/managedconfigmodule.h b/src/quickaddons/managedconfigmodule.h new file mode 100644 index 0000000..9d3bdae --- /dev/null +++ b/src/quickaddons/managedconfigmodule.h @@ -0,0 +1,221 @@ +/* + This file is part of the KDE libraries + SPDX-FileCopyrightText: 2019 Kevin Ottens + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef MANAGEDCONFIGMODULE_H +#define MANAGEDCONFIGMODULE_H + +#include + +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 accompaning QML user interface. + * The library must contain a factory function like the following: + * + * \code + * #include + * + * K_PLUGIN_FACTORY(MyConfigModuleFactory, registerPlugin() ) + * \endcode + * + * The constructor of the ConfigModule then looks like this: + * \code + * YourConfigModule::YourConfigModule( QObject* parent ) + * : ManagedConfigModule( parent ), + * SettingsObject( this ) + * { + * KAboutData *about = new KAboutData( + * , 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 + diff --git a/src/quickaddons/managedtexturenode.cpp b/src/quickaddons/managedtexturenode.cpp new file mode 100644 index 0000000..7449f6f --- /dev/null +++ b/src/quickaddons/managedtexturenode.cpp @@ -0,0 +1,16 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "managedtexturenode.h" + +ManagedTextureNode::ManagedTextureNode() +{} + +void ManagedTextureNode::setTexture(QSharedPointer texture) +{ + m_texture = texture; + QSGSimpleTextureNode::setTexture(texture.data()); +} diff --git a/src/quickaddons/managedtexturenode.h b/src/quickaddons/managedtexturenode.h new file mode 100644 index 0000000..ffd963a --- /dev/null +++ b/src/quickaddons/managedtexturenode.h @@ -0,0 +1,44 @@ +/* + SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef MANAGEDTEXTURENODE_H +#define MANAGEDTEXTURENODE_H + +#include "quickaddons_export.h" +#include +#include +#include +#include + +/** + * @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 texture); + +private: + QSharedPointer m_texture; +}; + +#endif diff --git a/src/quickaddons/qtquicksettings.cpp b/src/quickaddons/qtquicksettings.cpp new file mode 100644 index 0000000..eada321 --- /dev/null +++ b/src/quickaddons/qtquicksettings.cpp @@ -0,0 +1,80 @@ +/* + SPDX-FileCopyrightText: 2016 David Edmundson + SPDX-FileCopyrightText: 2020 Piotr Henryk Dabrowski + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "qtquicksettings.h" +#include "renderersettings.h" + +#include +#include +#include +#include +#include +#include + +/** + * 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() +{ + 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; + } + + QOpenGLContext* gl = new QOpenGLContext(); + bool ok = gl->create(); + if (!ok) { + qWarning("Warning: fallback to QtQuick software backend."); + QQuickWindow::setSceneGraphBackend(QStringLiteral("software")); + } + delete gl; + return ok; +} + +void KQuickAddons::QtQuickSettings::init() +{ + if (!(qobject_castqApp)) { + qWarning("Error: cannot call KQuickAddons::QtQuickSettings::init() before QGuiApplication is created."); + return; + } + + PlasmaQtQuickSettings::RendererSettings s; + if (!s.renderLoop().isEmpty() && !qEnvironmentVariableIsSet("QSG_RENDER_LOOP")) { + qputenv("QSG_RENDER_LOOP", s.renderLoop().toLatin1()); + } + + if (!s.sceneGraphBackend().isEmpty()) { + QQuickWindow::setSceneGraphBackend(s.sceneGraphBackend()); + } else { + QQuickWindow::setSceneGraphBackend(QStringLiteral("")); + checkBackend(); + } + + 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); +} diff --git a/src/quickaddons/qtquicksettings.h b/src/quickaddons/qtquicksettings.h new file mode 100644 index 0000000..ac0147b --- /dev/null +++ b/src/quickaddons/qtquicksettings.h @@ -0,0 +1,35 @@ +/* + SPDX-FileCopyrightText: 2016 David Edmundson + + 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 diff --git a/src/quickaddons/quickviewsharedengine.cpp b/src/quickaddons/quickviewsharedengine.cpp new file mode 100644 index 0000000..bb87839 --- /dev/null +++ b/src/quickaddons/quickviewsharedengine.cpp @@ -0,0 +1,253 @@ +/* + This file is part of the KDE libraries + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "quickviewsharedengine.h" + +#include +#include +#include + +#include +#include + +#include +#include + +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(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(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(qmlObject->rootObject()); + + if (!item) { + return; + } + + q->setWidth(item->width()); +} + +void QuickViewSharedEnginePrivate::syncHeight() +{ + QQuickItem *item = qobject_cast(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 QuickViewSharedEngine::errors() const +{ + QList errs; + + if (d->qmlObject->mainComponent()) { + errs = d->qmlObject->mainComponent()->errors(); + } + + return errs; +} + +QSize QuickViewSharedEngine::sizeHint() const +{ + QQuickItem *item = qobject_cast(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(d->qmlObject->rootObject()); +} + +void QuickViewSharedEngine::setResizeMode(ResizeMode mode) +{ + if (d->resizeMode == mode) { + return; + } + + d->resizeMode = mode; + + emit resizeModeChanged(mode); + + QQuickItem *item = qobject_cast(d->qmlObject->rootObject()); + if (!item) { + return; + } + + d->syncResizeMode(); +} + +void QuickViewSharedEngine::setSource(const QUrl &url) +{ + if (d->qmlObject->source() == url) { + return; + } + + d->qmlObject->setSource(url); + 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(d->qmlObject->rootObject()); + if (item && d->resizeMode == SizeRootObjectToView) { + item->setSize(e->size()); + } + + QQuickWindow::resizeEvent(e); +} + +} + +#include "moc_quickviewsharedengine.cpp" + diff --git a/src/quickaddons/quickviewsharedengine.h b/src/quickaddons/quickviewsharedengine.h new file mode 100644 index 0000000..dd16c13 --- /dev/null +++ b/src/quickaddons/quickviewsharedengine.h @@ -0,0 +1,108 @@ +/* + This file is part of the KDE libraries + SPDX-FileCopyrightText: 2015 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef QUICKVIEWSHAREDENGINE_H +#define QUICKVIEWSHAREDENGINE_H + +#include "quickaddons_export.h" + +#include +#include +#include +#include +#include + +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 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 d; + + Q_PRIVATE_SLOT(d, void executionFinished()) + Q_PRIVATE_SLOT(d, void syncWidth()) + Q_PRIVATE_SLOT(d, void syncHeight()) +}; + +} + + +#endif //QuickViewSharedEngine_H + diff --git a/src/quickaddons/renderer.kcfg b/src/quickaddons/renderer.kcfg new file mode 100644 index 0000000..6c4be89 --- /dev/null +++ b/src/quickaddons/renderer.kcfg @@ -0,0 +1,21 @@ + + + + + + + + + + + + false + + + false + + + diff --git a/src/quickaddons/renderersettings.kcfgc b/src/quickaddons/renderersettings.kcfgc new file mode 100644 index 0000000..56af4bc --- /dev/null +++ b/src/quickaddons/renderersettings.kcfgc @@ -0,0 +1,4 @@ +File=renderer.kcfg +NameSpace=PlasmaQtQuickSettings +ClassName=RendererSettings +UseEnumTypes=true diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..08e535f --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,33 @@ +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() + diff --git a/tests/colorButtonTest.qml b/tests/colorButtonTest.qml new file mode 100644 index 0000000..82a3cd2 --- /dev/null +++ b/tests/colorButtonTest.qml @@ -0,0 +1,41 @@ +/* + SPDX-FileCopyrightText: 2015 David Edmundson + + 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 + } + + +} diff --git a/tests/eventgenerator.qml b/tests/eventgenerator.qml new file mode 100644 index 0000000..00f5291 --- /dev/null +++ b/tests/eventgenerator.qml @@ -0,0 +1,56 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + 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"); + } + } +} diff --git a/tests/helloworld/contents/ui/main.qml b/tests/helloworld/contents/ui/main.qml new file mode 100644 index 0000000..2703d89 --- /dev/null +++ b/tests/helloworld/contents/ui/main.qml @@ -0,0 +1,45 @@ +/* + SPDX-FileCopyrightText: 2014 Marco Martin + + 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(" ") + } + } +} diff --git a/tests/helloworld/metadata.desktop b/tests/helloworld/metadata.desktop new file mode 100644 index 0000000..719af0c --- /dev/null +++ b/tests/helloworld/metadata.desktop @@ -0,0 +1,55 @@ +[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= diff --git a/tests/helloworldnowindow/contents/ui/main.qml b/tests/helloworldnowindow/contents/ui/main.qml new file mode 100644 index 0000000..b74734e --- /dev/null +++ b/tests/helloworldnowindow/contents/ui/main.qml @@ -0,0 +1,24 @@ +/* + SPDX-FileCopyrightText: 2014 Marco Martin + + 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(" ") + } + } +} diff --git a/tests/helloworldnowindow/metadata.desktop b/tests/helloworldnowindow/metadata.desktop new file mode 100644 index 0000000..4cc9517 --- /dev/null +++ b/tests/helloworldnowindow/metadata.desktop @@ -0,0 +1,55 @@ +[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= diff --git a/tests/icondialog.qml b/tests/icondialog.qml new file mode 100644 index 0000000..791b3c6 --- /dev/null +++ b/tests/icondialog.qml @@ -0,0 +1,128 @@ +/* + SPDX-FileCopyrightText: 2015 Kai Uwe Broulik + + 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"] + } + + } +} diff --git a/tests/kdeclarativetest.cpp b/tests/kdeclarativetest.cpp new file mode 100644 index 0000000..f583262 --- /dev/null +++ b/tests/kdeclarativetest.cpp @@ -0,0 +1,32 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include +#include +#include + +#include + +#include + +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(); +} diff --git a/tests/keysequencetest.qml b/tests/keysequencetest.qml new file mode 100644 index 0000000..8090070 --- /dev/null +++ b/tests/keysequencetest.qml @@ -0,0 +1,18 @@ +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 + } +} diff --git a/tests/mouseeventlistenertest.qml b/tests/mouseeventlistenertest.qml new file mode 100644 index 0000000..50630fa --- /dev/null +++ b/tests/mouseeventlistenertest.qml @@ -0,0 +1,82 @@ +/* + SPDX-FileCopyrightText: 2014 David Edmundson + + 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 diff --git a/tests/plotter.qml b/tests/plotter.qml new file mode 100644 index 0000000..f8bdaf6 --- /dev/null +++ b/tests/plotter.qml @@ -0,0 +1,68 @@ +/* + SPDX-FileCopyrightText: 2015 Marco Martin + SPDX-FileCopyrightText: 2015 David Edmundson + + 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 + } + } +} diff --git a/tests/qiconitem_resize.qml b/tests/qiconitem_resize.qml new file mode 100644 index 0000000..ae301e5 --- /dev/null +++ b/tests/qiconitem_resize.qml @@ -0,0 +1,27 @@ +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 + } + } +} diff --git a/tests/qiconitem_test.qml b/tests/qiconitem_test.qml new file mode 100644 index 0000000..2beae44 --- /dev/null +++ b/tests/qiconitem_test.qml @@ -0,0 +1,15 @@ +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" + } +} diff --git a/tests/qimageitemtest.cpp b/tests/qimageitemtest.cpp new file mode 100644 index 0000000..cb2c019 --- /dev/null +++ b/tests/qimageitemtest.cpp @@ -0,0 +1,37 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include +#include +#include + +#include + +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(); +} diff --git a/tests/qimageitemtest.qml b/tests/qimageitemtest.qml new file mode 100644 index 0000000..0eefcfe --- /dev/null +++ b/tests/qimageitemtest.qml @@ -0,0 +1,62 @@ +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 diff --git a/tests/test.qml b/tests/test.qml new file mode 100644 index 0000000..d7777c8 --- /dev/null +++ b/tests/test.qml @@ -0,0 +1,18 @@ +/* + SPDX-FileCopyrightText: 2011 Marco Martin + + 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") + } +} diff --git a/tests/testimage.png b/tests/testimage.png new file mode 100644 index 0000000000000000000000000000000000000000..848169847afb3cd95cc5be9e800c4236bff85796 GIT binary patch literal 8850 zcmV;DB5mD?P)vPva00009a7bBm000ie z000ie0hKEb8vpMP@$1Vu;n&3@O6W>6Q3U{BF=kS;$Oo$=9Fks_ZmJrH^wtTcO#HYxZpc)39X3vqYrB z6!yNjRld8*p1CPu)~(MwE~T*IZ|ol$FnJbGLuk)!Fl0?Vg}? zzDThm%^J)aL?Wn^2sB9b1c{Igdj{FNJ(YXXL;h*2*njTki7)3yvaMqkBSOea9sjpv zZ~K-@+w%LaP5aHKD)tAI%iuzVM_;9Y++Q53{_U*dfA~#f%lXD8ibZ}r&3F%hzg zAGRBIy?#ZbyX%gu*FI$^-(hA@PpwB+y(w*#Fsj$Yt#SXI@V(z(FztKJQ8szZW7vfJ zVc*wg?CIL@os`#n9)pKa4uiQ+=`acD^DPd^*sHct^p*1Iw0bE$riN9}7{stf75NA0356#%o>V)NRkj_3?Om1kT4y9zMaeF?n%!7 zTi1vb`VQf!M&w)T&Rvv6*K#o8c|VK2*{#q}2#Xjd#%4i~C|ns3LKMstN9EA&HX-e| z!`B{6VWKiT1u?UD#5y8jf`~RN?cD5~^zze5f*!HL|Betxz9hh}cYnFoLH4K2h!X@l z-DYS6qFaz0pgj>0n1Obu5%rl(=}L#P$_aLtU%Ro4Iq@ISF8hgsfVXG!A4pe_yk%6(DG6q*VvH7lo2gT_5UR5AuE*ii1tGC2T~Dq5 zI{Y3T0SpZVJwq@(9$LTX|J=0Nz4yNtymK2%1_*mDvC(BscHQ=mn9h^uA>BG3PS`dM zw6Wpl8)5PuUvy3(z44&` z2Gx~V<1s!w2}FONn^%y0#t`_@Ewf+RG@AABGDs|i?p7?5Nr-=(I%W3Blj%}JsB@v( zPlexUvPb}#O3;Db8mza#F1~@TY*_^iVTPo0?YDN50RTh-CWSx{5D+M`$_H;84-`rQ z0_FAul!mHCOv4%qG^=xzmM{J1#>LmK+4%h9k1fTB>|2&CgItV?uoZL13za@wXA-l- z^2teDRG0nRBQ<4JvGl)`Mt0p`c!&c4vjFHga3e!>?a0H5KMG^~?R5Fp{oQ3Ac2s_{ z{Zkc9`5oIet3>|}YBc8RVF??h1J;iKN-ONmZbi;d0RU_n!#MjmgpJtWm5gp}FZcr< z3Hj~z&Zckt*TSu-qc1BdnxB6lLaMA<==9l!-*uJ&=d_UR98Vb;7AyX$5)q0{9MZJkUav>TC{TQF(CpJ>hx`x#IVJ2L;Ze(^0nyY~(DnbJN8 z1R)M>Iak_8US%N3fF;9y)Z)FW47(Uu*v|S0B#qcE@pz&ig4v^xa?C86D1G1M>-@S-&j9? zmSoz90o@tfVD8?O4kY4W2pD@qC|Y{cNq>6zP}ej+H)lq%*#45_&WgU}F$1iC_Ou1* z`iPfmNTbhZt^}G1BCmWH_DhIN`VuYOvi?ZzKcozi8jIh(WDIP%Rt(S4(0*_YGoYa+ zxFWOs+ndfi7d-Ih+`s1ZNKEYek%6uOWB>pOpt#6I@i+}3gIS?9L8mNGgJj`wE9{Cp zFlqb+Lm>k=jF!bjbI@ZTeE0AYkkQ*-tr?yBd~A6-i(Cs3E4485{0QPT9PC%LQyD=Vhnyh<%vS8f*WREi>{vt~rh3UxK4aU{Ijp)n2ke-HsnPjpdn1bH?n$9(v)^+a zL&ur*kH53w!b_Q%c+Z*P`DVlI5j5NY);$GwÃPXf@w5LuN2;|Eac{G%lUI4mJz zqNg3C{dQufSf!z3d7b*n zA2(cor(eJ4_aU`2DTMABA7;SK5tJ)>i0KO=0OJ`tYCn#r^_S>+bPlK8gA&5bL=eS! zl||N1q1|bCSIrb=#@l~$vF~{sci!v_ap|Cx~%FdG1FGN4=u)&ofqCV;ZsMe1_I6Hnep1;svJ^& zJ38DZpqXuPCXe6L*KP`+xQ2qK^DxLlhCASC7p~4BBq9jOFeI7%cHmUljJ;D} zX6$)cMO8o_gi@8*;U9l`mlSDv~{2644L?pBkB;J5ln@M}SK~xW8fBSITe@H?c zl}(Al1Y$5eb|Bb*;uP{K1KWrqq{1-Bf-NI3g$+TXa8T8KTs3fuJRCQmqk)@d)E1wB z>C>hnlg;9Z6;DG-31&t*mBN%MlVBJID#wq5RzAFT3E&_?7$8AdmncJ3wb_1>uJ|Xq z@WpLC-MI2V9X~PmA5eQ?nr0`{Bia5#&k*+N1<4tG|EJ+Y7iPHU<&h%`wv58nd04`R zEh8|51%e1&+>wSFagXcj?iRYes0oiO8;Yb9Y=OLX=!!Uv_ z=N%WO1P~r*i|cNRFC|t?C=WkxB@zR!x$w0H;I$EHb6*^Kr!M5{hOiFxF#y147iqs8 z9d0Aq-A1%I4M=(IaC8>FcHy%J#eT0MP;hq8g&#)2I)`p!;IXeuUZ;t9^X7n=@x&8P zA!OSCfJ{2Lk)MCzC2ZWd8NdDA9}tc*5FR)LeQyqCWqV%c;RiQeRdvjb8v+hFLu@4K zJTWu}K@9~*XW-}zQhqBWSv@nx5@8s^gegLhBteh}L?H!}20b>w!uwuQ`qDF0QCCqk z0mVfnXlQ7}&fU8ai^ajr$mjC_fZe<6@wqSD1jlhuRs)!^BbV#y{M4*y`(~1pS0xW) z7#s;4l8{(<+!{BZ)&f%Kqd3oDFno64D+gKC2|{q76_R1tG6qZ9Fvx@;BRJwB5%~ME zDEM&o4*fx%ME!6m5jUx}8YBp>zE%gr2-IBHb)i)6<~EqpXKy`q2Y24uAf87Z-XQQ23asg2nJa& zgb6{i;HxDeAPZhB1)>V;kVL_civcDMKJTYG1lJYEOF&v&fq zbOX{V7$tGA$m}UK@Sp)p$M3lR$9q1r`kyC0)Hdt^IRXwzNRpEJ?l<56Y}6?J=VKw{ zU?}#XIN0BGgSux*zu$ptQTL!*GTb|}NEApkKp-#}hOiJ4Vc2FY*s1T?3n2uU8Lr#A zZ|eRnOosiwW;jX~)b>6`DyG8v1{h>P6qFPVH9enhxf8&bMr=S1!eP(ULlk`?Y{ouA zjvyXIzcYr0V%`16pvb6B2*{prhQjcI5D*hLOJI_XjM)ZXJMi4z_0RWxXx+d4MJJ}= zmNwx)E`x}S!;)c0l0boA%?gTr7-S-5mIm{Y1?BwIwZGYM%a1ObdjEz|7>dIaQW;+G zTzl$&S|dihJmU|`RyLy0P{FBCKls6#*y075WR`l=NMS;+cnFceI(kgzJkj@|XI06sAqeLU&^H7R6}2FkY)Hh_Tyw+&f?L1Uq$J}T11z$ zBe$yv5w;N@mx7$wjKoYAhCTGNP=-c#zXgD>5#0xaZyl}nAF)}>mR%w@OyBurEI^IWB$i}k%dDDjmhi+Y{_W%!caKb| zhsTf!NzSQjDUD40MBFUhKiVerV}x#v1e`7)G$2BP(0#shINKaSutC-fVB-r9pPe36Z~4J+)Xui|&D-*V zf$%j1(K;FpI#wtbgWP5WQShKT_(Y}$37!9XFC7&r%O6I{!XnOfMZ$=Zm&D- zq{iH~2VBl9VCHu=bc})0JwQbY*gAXYUn7W&t>fSA@Wg*Uc5eGSZXY`4)%mt{Czj;% z>Cd#~-@aLssvOKmcGST@)h^(YzW_hK7-&zR|6xiWbf5V%7*d-JmTBGa!v*Qzjg=Vp z5gWYgR+r7x+Pgxr`*Dw*=>QKYe(_kq4466K z+7B1BZUON1+g~~3fd+s58G_`+p3cu#>`g7yGr}{6T++tYv!4&A&fnE_<|`+OUF)ZY zZ?*PLeeU5;UfdPLURgqtoH7rN z9I|*LFflO^HG#!WLxx{5U_KpElh$7KKvQ+XZoBL055;f(;$=-c2mAU%TRvU=V&gA& zD{?Gm!0(j5(s_0D;bIMMTfXq4k!tUEsm^r%Kz;Mq%PY$+kYrixh$oAR689ySJf9!t zupAbnDpu~B_f`Xd1^~}2<9lV--lr0+ZM!N`ZhMu6IyKL^de@aXC8O29kC<<(3cu<0 zEq5_A|e7-J#09amCb7B2xY{Gp?65?rTMHNgVl{gR=3#xsdPb{M$Pk7Cdx${n}$` z+h7>=h4)AxA_m|UUVZS`u*yrWN*amEHzw3~tf}?jeXPqlu+%3fMhtK#q1p#|Zf?=r zFE=Lu4A|U$^5MmH*zCI3it)!h*GERRBiEEd^@K{W4$j>TOW3jE$mIb3_YpEucyQ;{ z$F-*SU)bqB_VNAg`=&Z7GfrtQ+A`KEIH@^Tf6bPbmp+>E zTaI&7Mz8{)1j6AWjX_t7n>gh@HG0kR3wv0k)5>swxZI=XN3XD1&w3; zxJu->1D)+DB+8>;QUC;)M(6l+%q3Ie6?*mypNyAVw+j;zg*ZhLgp%?& z3?~{mzzPrP&McT2*{;;cJNDvTNXR!{d;g4EUYq*8`gGls`?8xq+37Y^_}U?Wpgn@y zAy75`IGkB?35Y~sOk}`rjBaKhc>wTaCX|mH_`&CYJ9{nw-1X;kPLy%?K53HOSIy}r zrJ}L~1}tP+U394yq`NYiww8`ZN27o58j;{6jYLEJ3Gwzky(7$J{w(E&d2KeqWKkN3X}F!^S7ykFYz*iFBk`(qu= zU20mo^iYTGLJEv8twwvU2}H~ddpdsn==Gh0?s<+C@0uCnh|bS+`OSBDoS(qZJr;B+ zL;E6J_Md)ZbbF{=VZnq;P#g*z)f;m=1EXUn;WQ_+=(e}atuhna)UEAjMcX95wD~SG z!Y3TcSGYR_E}n>@ym%aYt=4lUD*j`%`uVOPM#^o4 z&n}38328tH+1w<@{r8VA+5HzgRe5uyq5NX8H}m=LU9h&f z`-3eH&4@RC_j`A@e6Q-Nwg=A{5Y#gqyerlaiaA%49B5Tgd4?O^cXLTmT+SW;5lCV7 ze3o&8Fh2pH*b|*8w!U!6&2Mi6fQq$Sf9k*gEE!8A?t#?h{Z9~?0rJ7Lmk56a%txxq zC%$}j<t1mqLj3mj@7G)U%B&>alxcb6o?lJ*&5lTB-LB1@I~LEMzc;z$=&i)> zxas6bxb9b{m#50t?vS?bpR>yc+!l$*IKsjSS7J)yv_hysaJO%5dl@e`JPN4=pTA|o zKVACS`p2oiD>r?A%_rt@BztR09VlU~+ZotPBsMbBI#c28T&LOe#g?`+*=hAkEqW76 z_vV*g0#SL^Kc0}V>TcHY16Q?{KsXW*1V9RQC33!}+mVi}of13!`xi{SW%a_D9~pA^ zz?h#QjwJyV9VCvI)|>*}NF@0ce9mUA`$(q51$LFEV{&L9CK;-xrk{DlyOFoM2g zp7#q9hDq0!mkHplL5ok$e#`|h=&m~?IzAt6WjHVS!V}e-II)7y~3P11Yz#_7WSF zD4Mo$`Rw-D7j1ldsP!^4HUDD#HLuxuda5{&MyoKchZpi18sB$YaK|r~riT?SJ@&OM zsSPNA3O*F<3;1cm?3x8QJ~6kCsOmjLXJ&Nu5aNiMjyIny?`(R$b;XA!99;aeZ`~B$ z@XHT>?adz?e**V8FnjEoQ{Mk*Y3HoplxK%V20=>--QSkQt&c6muw&Q9JRxpMXITqa z(uVMCNK>M;xB_QSyaI8v9AObJWJwK1%OC@+367ruIFRaHX1>y5RVz~4EzPe2Nzcf}~!nu3==L>9rM5F`~giNx>?;He@Hju67K?P~#G`*+VM zvfzFe3}l4H(}^s8UY16KrQr{8R19r5T3-1z-<;EHN;y`Hc`eJ!=_RsUg8&>~GzYas zrxqTAQMjNm5tsufI7@^Pkqm?Eo-!DW?J*xuI(fup{^NH&Il1{a*@oKF*{^9f9Bc`D z*k>u|ApB@Q|49 ziOz-4>LR-wVOfMuzdM6B!xxMfqj|to5zoxrgfM8^!B(uH+b!7UlDmHNfu`S&L_hmt zOpB}x=}Rjs$5mO<#?-`IR7I!v^IX>)I8Jx}bSJej4HLEz!@(o$hZ$Ly!GW7s?;3Fw zGXnskT=C3_*?Hf>D7c@FSwfOYh}d{}qh*9hX%8orpW7!dk1Up%5{8jl&@k!T4}(kh27ZtV2g* zVPYUE%DBc|aNpc>|K;F(id1;cuUxZcjoJNLwrrWj%;u_9s|;qQHEY(GgO+^|#_pmX z@=ouT>qXYML!@Kso8O&!5~ML0F{2Cw0fqvzhADy!M4EFj!vbDT!-x)T2^eorMcMuZ zf1Vlthi}K9DTys#zB~pXE`*2?QPq=AKA9k*VrI5Np-_Wu+dF2=n6ZEF-o33$mMrOh zvd@qN<(MUe48OMfJwqYmcS03}fB#fU-KhixB#a=%6A6@sCP0#e&k8O(a8$1M*@{8{ ziVu3~=s=icFL%?O?fX9C5#7R@5qxB2V_nidFvgkclh z906u8!4ei?W+`gpCu4fanMmi-5DnF^DZv0bi0C;fu5Ck)|@$WM)eu*ht>a> zS!~+0$!Kb7D#~Os6_#b40^mdd25Io6&0B9kEPeh(l z%GFv^ACGsRnSCNs%q$UTEc8bFJGPE>&Hw?9%Az5+8_H)CXQ$(|vJa!ICJw_aD2UzX z=!I;W!2>OWKiXPb@NClq$f7&1ardcW5GGxrX5oU_*A>#=GJNf#E!BiV?;z+>me)i2WN8&7E|KBY4tky8v8uvq)8OVf#aNL9yA&|i^3<)6#%ml3& zC5Z}5PkjJyWPcmb(BppAOJj)tF>2s@KHCyQzSUQ$%?;G8*gMm2nG zFbru>lgXr5xNu4#y9BE-!KNTMxdkpKV! zI7vi7R5E*1-ymtFhGri*)dg2)q1Y`ve$@qt!Q=yAKovNAKRT)EOpBoYa&^%=hJU#PX7r<9t) z%teJY<(SZ;MfF_{jv~R;U=Ims)4Q>);wR9CgPflM5g{ZafGcrg^OsN(s$pjSNi-V0 zY2m_!BbV`W7&xW@WM)xUS7!?$Djdg|?0McPzVFY`TF=y4PiE$lks#?d$B` ze;F`>lSCqdb_GspzllRAy63Nd{cAFrJht$;k-&%#R)M5Afbv`}H%%!uPboD=DK(3k zYYPkhsDOx=i1J$N4gd#;sDp@nDP>fXKXW&pEp0A+iAWSgUp9n!-Yvg2{K(ZymMnS4 z$pA)SA5z$%b{1Ycnfa+5J9b!|ot>qw>rV7M?<{8ipw{|K-}hq&FZf3Z2GDAn=6b_0 zRuj?7mSt@tqPF__`c!*+JC~G{P(?+BFl9JC(U^Nuee+-cLnfRvEYl!(aznhb?6dQy z%^wqF0Pm11>9S?Z$+}LKA$gR<|<~cR7xe7InK<*0E&pnM4%1>K_-A^ z0Q&)K4TVClg~Q=Bxm>Pc$&w`sLs*EHt^QW{wdThbd9ELko__J0SB%{8>qy`om+yU% zOeV#mMT@M`(o&hr<)r6%()WFt$z)VC8s$(ZBmm?r%koEigZ3WY!+UrS@8O8}|Lxw? UBtdel6#xJL07*qoM6N<$g8Mt?IsgCw literal 0 HcmV?d00001 diff --git a/tests/testimage@2x.png b/tests/testimage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46539682db44358089500d48f7d44c307d770d19 GIT binary patch literal 22915 zcmV)>K!d-DP)=RNIPfGk@pau3h}?~yKVmWfZVm1m+uL<|5JW7PEnuyt4`X0;(0SBa@6SyOFF6epc% zzD@BQOT`1Glkh6$7y`QP)ACh7&$R^eSb}M-8jPBN=C4-VR~d7X^(W__6J?Caak7kF=jU}PEcf#EfaHXm7J245j`m*Fl7vqEGQ@d z)XNbWG-g2OJ{a5wgZtstf)vyWlR>@sP>xaZUV%}zGo+Pn6+Eyh>ah;ZX0ww=`nt1> z50ge98)$J@Xv&}nPd>EEHlz`;T85lC>ORVwRWI`{m8lFnoQ zwdAFyVIDZk1Z6@ABrOVm)6Aked;cYM$z7jpHV-b1*iEAM?oltt=(OG7TZ)k*m=QI& z=i!B+6@NKeE_-G6?3LM;<$b_}5C{>my?EMaZ*HGc6W@1Dqq*;z7W3dVOC={n`G$gE zI!e3?YGwsadU$s5w1;Md0_z!@Z;p4lvJ8)Lt$;+tYO&E*-L!vtP5iy#WDPwb%j)6L*o=yaTq~TmsIih%NP~`pa+6Djj-nbPc%YYoQT0%tZ z?Z{&VyBnYTQEhzZXC1P%F*;MHbEclK?iV^SdUA|$%fo#SI7D&Yj!12JWdDsb_r_lRlda6N7;_izhzOD#D3TCN181U_3f~*lXSb=V1SXyk`h$Uk zfgJ`@-}u(CuRR1d$c3LQW6GG{-2$-gLOef`Gc-l`w( za(&Pl)0%Ssp3jsYPQ3T9B>PkXLBMS#5>5;ai9<-LIMQn#8Z(e*OhKV%sw<*iNehH^ z={8Zv$52p6IPGY+nvsxEIAjAL2&N;brtOLgs|O+&I^JZ9DXearM@}+v?A0? zkzLV9auBgw&}!AgR0;HEn!*SOX!$7f&xXd0(Yn-8he5#LJ}5ZKQPztj?En1EF>mb{ z?{a+*>FZWKB5G)Ze_!Cp?t6WY}qn1p|x?IzA&JMD148Ck{fw z>A7h)VRRnVcmHT&LvY9hhv1BfD}6d&{`0LXDyqCy_hiQ=!-t3%_WmlAjJ$YCd;FhQ z(jNOFR##n~1NI33o6_5jszBBqSm)i+cE>ktY0gT&m+o2-2o70D$j;rH^q7JnS1*F# zgD;M)Of)19LsEBf^ev1u`UD<-^o4>1BLxOg!We!tEm3yW4>#xk$M;WIzkR&RHkqIU z_jnz-`()>xbJnoLt_uwro9j`tnX1|a?!>`BUHadnDv-m@1LsAYhL51zQUt*r10Q@9wnS$Mpg_yjpP3=bA_m2m}d6oCCDN!+kH_ zvh|!#f8)64pTb}rWfOr|GdJ8x?U|QX@?~ul^TEaJ~$5Qd8svu!C@;C5vK)x*NMKnX}NkK zJlxmk=M$flNWh>Vi;1kqZrQr>));T7s5oZ3HQuG02oMoN)ouAQ*?hLNTCU*cx>Z_u zR}qqj8K3}gkoS0?-Ub?XxT9VM0@L0`pkyyll{wa^31naVwQpJ~c6=|z&HTADOxLOt^Fm#Gn03HN+&II;v17cO_u8sotyo%toZ?o0= zy3F8=N=^C0-cPS=Oze49k?eH=BOOGcGPV;*73=bu!MvCmIu?Qr&f=XwXiQY1*{nhT zy^5}m=s_(HrM@|na{Mtk7zEQBIpa6(NrvyeYsp4?;C&`PudiM0v!a!sTspt~3ZEW5 z8Fn}iGTh6S4CGq`m~()A{{)li?m0_B&-pWQ7u}AJoVT5^3e|P55wecfXSvFV+u;VGlw(@Fd1QB z;9Mw;8GlPgB44<1+2k};Ap&cAX2r}rv!x^vI-$yc_MfVIZd1Yke*53gDhq7>>7tp= zsXk9Xb(#46ujmGY-RF_EY39e~g`XUqi3Ej`U*wxcdti*Ce++K~ViJ zU=R_S&1$ro^-xe?0CeubRR4T<#NfvS1VT%)77fY67^nr|jAM#tI`Taw{g|)3pI~s! zYBbWgXG>hguK3<@uTOY0dZM)={OaR5@uuhI=xAHvHP|KIWZqIO8vPrzdDpX#Z*A?o z{VR`rt}M@bp<-I#z$f!V%INLhnl?#-XC}xw7C7(^vK)$DR$YX+p6Ge4=H*D3{G5~{D z1W@Xm4X+5iFUA~0hk=3Bf#HkhBdr04dfXm$Tv#f_g$*NAed$o;jUIIcH_^NZ0xObKIRaC?RxE- zL2q)$v0kcKrK#q#4YZ!XZ8Oi%ZKmm}qb5oK4IUsN!N8wG`HGJoT<~q#@WzcN7UGSY zXOz%~bkTpkB^H8A%mk}F1TG`)##%rj|F{=Xvh<5=*&TZZTlNtN-C}?urx=P6Sb>4UV#)aUDJpf?vylVA=ELf_jka01l7B(p#9 z-Q(6*9+7g@-04Sr`y7PdINgp{pG{8Wbd4paa@agw?o8R;Lb~0eHUqqk0Hpvu^u*TE z>%Ntrxc{;#{`#+Z3=HU^t(*clO+ILm8t`=JW?xwhMJL~a!X>w`B^5&om@({Hbn~X= zQ@Dmh3Ub^Q6{wrd$OlIhsp}>HjP+(L(EDz{Zjg25jf*#I8=G>i(~>*>`EMfe?j^!J za4MIFrb5MBC!Agi0|2C4V+SGzG6i@82OI~ahp@-H_}P%Y;l!y0@hQC>qwDcFoc26W zvjts7-S32Jgq#IiP<--#V)>t5=@IOF5DdFU{bci*UuRt1I^6xU3=?t%lF|k`d}9WN zfe`^sq;S=ZC%m?9w2OA=v7d_u04EK&VU|%N z<4u`B#v-8SZ)~;PWqQHGsc{QKP^~bLnbleTN-78WIU<{jfwjsYbhT_=@ z{v7lxej*MTF`()Uh@_p0wGTk}+mJKsE0}k|CG6}6M{VtASYP)~ww(4L16wm%g~-x3 zX>l+%`jZeGI>035d8Yq)20QJ#3+LZ3WdD+V|2TU=ap2(kAgjp%4bBlQJ^o-R(?QDy ze4YXJ0iYZWs?7r}N?=ZEGKvX8aOUgqlw8j)dt>WR%Rdl9Zv_a95&AVN$uc^OL>x*H zlvE%^J!bnd+rR;cv({wQ$M-qU-*?BJ3kImBU8&jdIe)&l=AHnr8?-pmH+;t3>k_ac<9b~pwO*EL$am~`Yd6(_w`Gl;UWrWa58ZK1yR z^GrnsEa0HKh?JSV27y6I4J@pIg(aAD+zl8b7`gv~ukhUl!(b=E;DVueo)3#I_M!YF4oz6G$Krc<3U@DI!a-9&_l(0W*6+Y@mde$#@q2#hgs?v9wH zl+XMRTb6OADD1$Lb^Dl=4rVHn0rYyqWg1T1BONPU0}0>>93Le)kKTON)h zQUgc}C@3hz+&Qx_bJh$@Ei1*_>o;QmzJq9QZ^xdOELfI>rJwEH_<>T6MK;MZ+bQzm z^Yyo%cTUMyx|qyI-u=QAM*CCu=`8FUi(foljiezV(h0_xAV56_XC(>)FjsPhNCF(IwT9z5iA03vc=! zi~jxdOjhfI>Mo^k{zF{1VGIyOfTI{hRM=ee+>8U!n^^^pxJ&Vn1;UwDsz^eSgiRI{ zB;rmO0X+`_9~>jW@q~y_wZX#X2V;me0W+pe$Mx5L7N;&<0>jX8_;4kD_3Pi^(BUey zwS{3A2J-Uq5Q#=%CX+byhJ})&HTd%T?;bashZgT>d;YEM8*Y5iQ@{3F=2RCkN(?Hl zc038Fga%CrctYlo`|^wfT8V-ZtPw?5{+0dvz2o9oP#J>Fp5sAi- zlbZ{l-w%)1i-LjzXqtw`JvN&5I#5pkF~W#|1F`kfD&uRvrV{&#n2Zlf93%m6gu!Sc zP@4yKLQgFWrtPl=2V(#$kW*#kzF*VYnX?DK=jbscfvm=ANRk==ILd@2lTc7FWgIc5 z4Kce7ri^DrGKM503h(?ij!2!vjA=9Rjj#VF7A%+t!!STZ`2Fwi#nx>*AQd4P41#mF zm0*lP2!TK_h(rsaVV46d(tm|@*I$6m!F=qHg##Ck0I~oy7+~!JI+O5P5m1u`J83{k z22yNDf%_N-SU{ewjLH}2kr{Iazvt*MB!RqymlyzpK$#f3PHLcTD-#JBMcj!X?nEF{ ztxJ~CgNU&EpGh?DlL-29@Rb{`$ASg(pzCg|jOYIOB3@YcGBiztVHmx3pZtD5IOnL} zVI$tEpya@jCY7e)<>FbW>(9B30F?loS_3Suz}z@f02mC*1lqh%j_%q~sX;`yBmfS; z5&(+=%u%zIaK19YUZc(s7yDj@#xzC*NJy9}0ZY15(L@AOC6JI&m@bBc(%t8JxjGWBUvp8Pt1 zpeN#>W*;2W3uOz$TXnS82*j%Z=a4H1)BtD$U;-dF2n7@XNq}NINAmp*ham~1f>kJo zoJ2Yp9N^BKTQUJk-40xlBoK4Lu*pPH#SwGDu8@W@Ld((x$0Y23$%HO+eD*V+L{3f! zfZKAvw{s_6eeDed0s&}R&xuLK7|#9hO8n%<-@^~S|1A_16~ZtKH0*TXL}~EZ-WWrr zmV+1lv)l*}1gKU(wg?F6q>jUZ(2N%mSbQy8d~1xYTDulyXI#pRoc#<0JsAaW0H})K zZIQ@{D+EkHcK}Wu>mV%ML1SEj>+R43Z$S&aIU3*PP#E$wuT*vfshl5a6eMhALSs5O z1PBD1l909opB4f!f`kKGCE?+I=-iW?4jv-4TP?(z6;>=i1IHe_C^PVuQsVK){|+e? zbff3Atx^gL=Fi2yU3CR=b8?^*Va12e#Di-eMWikUv&lhlT7PNpy1^LU^%SGPN#ew| z2za{#p^~mRxF8sX&!BkL8n*JujPEx)=gIZ-*y-n@ed{C4jxN?n0$Kn}rZyoC2#vt? zB$&|z;W-S@K5(%I;9J139VI6>W5we~Jm|!b1VRM%<1NWHH{?*)AA+FZkOhHMLQZff zau9Rc;NgCF;fG=pmNKC;9ft5jXGSVv4om%)6-{pt5e~m)LE{>(xZ<+R0Gx^jQEIgtP9Kp z>g#Zds!hk50*t&D5t@G$TlrG7`~K|m*Z0vsKKc=~{_6o|wVn<=KnTsKhn}+oM&4#< zq0R8-?}WFo8YM+-C~r5rMmanpu_k&jB!S#?Qw5WkKAzOM2Hs2W%uR9NfD?f;0nRuW z5t1_2(Rv6kEK;zP3C=il=7G+=(72uvOGYTHTbTF{C`3Trb_d5Fe>@f)eN?8RDy8t) z<4-~nL5Qy2N<@TcGzyTyy!mr8Ee;W3digZimIcNDv)%?UaNG?_4K32AAjYtxB!uJI zYvCgetl+ry(92e{i~rH5|2Mnn(L?n7$F4y8_G?l8;kQt}U<1lNml#ekg(Jm~1X58^ zp}uj^+*ZzV`bm{WP;gR%c%E@Ql;prtNodM|Uxc7B0}=#DahNIrog46QKLpn@(}RrC z26e2bP|@(DV$mpyiV9I!kl#f- z!CVcVeI_#vI~`1&T85KPIsu~74AnEwK96`jj-o)IN9)nv-VUV{ zG)+S=*mM1YF$TdIFa(ps9(n0G$NroE8Z`1BS2TZOCw?3zLw0&%5W9&KIOE_Lj4N|T z`U7NUz7&!whOpIuh}{BPCR3&>3YLl^>V#p+I3zhxkez1Cl>0|2GtKOVz)_tZsXubf z@zcj8N^MIWGjNjuB0{82;?!j)p|G$cO@x#Zk3If3_*<+l>fY zjj6mJHWb-Nsu&VZ47Rl3C>xUOF4M$m5vWe0=zjE0Tc+eA-ABfbtdnRasBo+(!7+hl z%a&$V%!vr^Y~F$c2M)pK_xET$BJJ$}+*TqIiDKKf9hqyCQsSL=HiL+emjg)Oh~hQ4 z=LA^HZvO9k_g;79hz~Zw7_va-7N5Nxga{ae*4wJ;FmcF2%xOcL)qt?wjJVy7xD!TP zw!>11lt>&%Wy2x6qjkx&CS6;p^f(4Uk7u2`d|kR`nV@Wh9$mI^BHp49&~tIr!UYh* zt;|G(r=EHiUaz;ux`%0+aGZ|3jYNds{N^sa_uekFg~QnN&b#>QgO30Ji~zvAqvJWP zNE+>S!*3tm_w5Cva=;0~keh(HdoOK2ocq#V1?MD#d%Gp&961C9TP0y52}pq30vgxd zv5D}*%l*)}k(wb(SM^jTb|%0W@0bT;oo2*(8I3T8%vdJ1N$3Af2&7GzRyrMdp^kyJ zX`1-gtFLDU=bc-SM7(F{+5HC(;XiKpFBBFQprNr5@pu9p1RmhfN73ym;j|UiV$W}1 zr?r=y&elwhT-yUMu7Tn4qpz|RG!59__5|&CL=Cq;3tU+yJA8OOqD=V#$d@L9J1V2MmcUvlWJvBA;&sel#ZbAT~yI|w1jbPO&kj-FP;Tm z>-etU*}MgjNEC*r>w>FN3Z~iBO`B4NPO(@FhYlS^JQfEj1x*l?hryFGdIC|9h{>i^ zJN7Ao}oEcX8YB1kM#uz-J=k(%OP?YHnaM_AK3lXBW{{L77S~YonuUWGp3qIBc18Y1DnP# zpS^?wDWgcrC^!T(ZouFk7~Bt!@Iqq-7!%;>?iOXNeB8w|u#WCps(aQ0)_EGa?>nxm zGwQO*NY`k%u24RsG*d366yDjq1)g5a*)6NX>8>~9(9Z8E1_&QRplIZS^zK+HmfvLW z|9?cZdLl0Z4u)X~WPbjI@734sY!yrvc!VFeGkyZ;jN2Vcz)}eSVF)ImF%Jykg~7eh znUPwEOgRxzYP`Y#fOm++eb%u^Nu5n$`W8w?3|+_lnSayK*oOoIa)P;;mrYI0sH&=g zuiN4v5y4IgB;8VUr;BI=P=FQf8(1P z^$yJQd?JXbGvEU1I6#>$mYK?|%ON0`28|ogm=3{o2rj@OI<44uv@EQPSh@;_r|d2| z*7#Y*1}!~7fK-c;?tn3(R4awdxl&Iv?{tSThJc=*dA)7>4kVLFq9k{vG3 z>1o~Gj6xX$Len|QPSCn-L!Ek?y-#{~X%YLepHomG?lj!?WKG5EmrSi_>UE<@z_0|u z7*oI8ap{Y3yY)P;2!caE4c7B!9C6n`By8Ey;<-W);NTEUOReAw2qwUpYjegjLg+Rt z#yXAy0D@_*r82q-taEpcp=+gOV1Vk#`^y>cV#Z@I9}M2nTI}4p8=UhVJ|9XcSe6A{ z(=y^n(<4G7Bjn7r;b?IP@?|Wr)3MGvq|sR-JuMnsd%V5_KiHIIKvjm%30U$+xhMbdmNYx10rYA3S=PCvr}$wNxJQ1KlegY#Z!|7 zZWoTHTBpv(%gmfH*5z}8YX$Aof?zP9NFiW&5Otd27r6i!Ow)wu#VN{hI=nWOQW=BB zH0cV=7~m^U!ZSO9uw{aQ!K($q!87)6Ku3E)oyT32wy~1{2oBjGQV?A4Gvt%4l6s?c z@TVI#+5 z*{h6`Q_7t+Feich6JnXz{AqhQQ@Jbf=?Mv*n$_#lf@Zpc08%z^90DP|5HJ8HIS4W} z7W1aMmmH>yvDReWciwD%>d9q=7q*Yl7da*jdzFYWrjE*6zMhkIkU$9Pc?0j1rB7Ug zN(WY_$S@8}w93P1v8q4-9CEN=emM-SLlo)p2N6L_4bXcWJN2HPZ)4`injk!V8}Jeo z6ghCnf=yq;xXfDoxXRn4WZAIro-XnE%B(_@`T=lE$qwX)9@mY$Rj^2^mFF#t?Jb(QY>* zDPu^;C`-uj#iM)Xv1ddAS%DR5nsMx3O&OP*3HU@$zvwI@gE3%t^i{mtazC1^Lzpvj z5l%m6DdJWPmTkh34!{6S*ANPY;PJRNTSNrgw&9S4f~DUECEN_KY+73^Fg609( z=$l(*aEI_c7m3p=MPA`YK+CNw_bvL&IVGR1@3G+oXH@Pf>uT;S`bW(zZ}>!DUc!l@ zE-`9Zc(e3DdMr-LO)~(=!E^=22}u7x#dw4uW8esAIhY<;6q)K@bm^z&|KCeTz7!*8 zRQiJ}%0Ay*U`)GNV;cFiAiN?t8i&o&59!G3TmV|oftF)|`y6nO1Q(R~{78y}b^0^7 z7t{Plg=dFOxni=40~jTNFa|oVXyt=|c!M*Jd{60U95%~PNQ>c!wic|*UmBfzF*A5f z{oKH^3$C8?%YPop5{)*aHluLK)QWgO%lRRPkX{i$K+7F?r!146?rvfp?#GPaG5hBP zmaV#a{_Ss!SGh)uQJr#|am?qQ2V>7MFytAfUG6Gb-j8$+lED$sbE!OV^eYR!%a(s) z{;zh7Z`nqNQ5DD1S^oZPF5F-lcxfmz{W0t{VO}N=}2Az3OV3akK2afve@|KIf z@%gED^$e>ri5claVQCl+g z<`cQsUNil>pS<>{TMvw9sm7WypJuvg)3OWNoSH{l%o?v7OLyY?u1`dqBw)t?-ypIv zcP8yJJhHf5?mCCYbTH2M__e&Nf3>uBBYU5=8l4&Q5%dpEdh_XAeagoS;kPJbR+nX{ zm|?&(=%ppsOHpG+DlQlw(YMaQAh<>vH~tY4rOSVPYVC#(f;fO9AP@kkIC10S`C9oG z0G4e&hKaNWHacXTx5cj5pE-qBTIyjQ(w_7&<}*^%m7Col9kKFbHVy>!E`|{ziiEpwioWSWin5qyQ58(&PW?b>;Qs`2imf0VAQS*;rmsb zM8fw@S;5?I{Or^%lQNdoXfkdi=HKu6%!*A-Py8inH8;KXpzj4P+YCH^KF~U1 zcmJ+=wL0E)-}fPJZ;3ko+8?cWdD2_pjwa(e5ct&GJN7Iu|Hg+(eG7i<)pBB(r14uv zmDJc_-WK3t*M9WikB;8h{K!u# zV_Pp(kRQxt_mnuww*#Mi0SNhkJ1z&Rr(l3zs`u8R<5S-0^VDFT0bFTj$jJY}@@30! zUBe#APQmxWgb@e;tfkfB)i>YxR8mF0olw!)^g-%&5g;Tm>owr=w}I(i;OSFlG}15y_U}^xbDu2svda1+EI-L6S4wUY+r4(N8kBK zQbn$h*)3;D*zeyKg#boCZZmMqGr+kGK)w#VI|sP;e85s5C(0ZGS^z{mJSg*gQ`!Pr zK~%H-TC#-|a%i4JPPOHD+ZH;WsBo0YD784qQ)?rRvNL8r!uFV+#u@*4*HwG&%8H|Z zCZs?*^M_rZU%W5!_H~WszAF;4y{uDann@24pgF*d*Malj0Tyz1P`Gz0aM#5kkC^qZ zwrzpCPnf%G0=|McU{+(_j!0|JBpK(%arUxX3K7Tw6QsnR!ZgbD*RH zOs8iGNim|@obUemW8t4-m|x_rcYeL7*|+->5~iAxSMuaHF1_!4Yp^)s1(N1Y`kcP$ z^+zt`oL{a;o*S2KB?Mw1nl#stCY5-Wl*#1jTNmtIy6(V?1wP9U1{^E~?mveo68Smb zEqUoHw^vkD3~3JhOHa>xFd8_tMv|S$W0DaE0al~-+|2l@kKTIibFtx;|7-WJ`f;E@ z+?b>`B+cY*kH}kn>qq{zWw^(i$V|G*1ps?!kLR&1|FQH?V#}3LyZI8S>=|IhF$u1R zfh!H3Jvn^ZWBK;N2R;}2!v5BqSKm=4lGoMdfSz6M+Z8RJe(m?q*}Zff#DuR<15vSVh1Tw`IVL8XmUx8km;%p? z#ikQo9G7kRaT#W&6Jz6PVov}GCL$gldN-iuy-;Gzd}>)<#nu(GR+#CuWN)r6zGfb4 zy!Yj)g%8N{SAJ#9`40^%e(Up9cP)5u?|;9S;H?}$m(+MN0p%PnxcZ^bwmdk}Yx>^P ztL`&O;-3&22N9vJvPsp|Rh`z}qCQztR(O7HZf>z)njVeB!d61PT4>C??Y3)P{?|y) zJ06UM%k2@RV&zK?fOk_5Y~OyH5iZA+%Jz5XhVANw2^n4-wVO|9x0>gLox1$E6V??Z z#-wY;KpdO|jJROhHo=WoL!$7dxrJx1ub*4m za%+5A?jeoooAX4;yR$uK?7Cpymm^0qapk+sPnF-b>$>$}yS6m_s}i}9P^>ym1vKxh zyRP2->S&znYmY5`Aa5qSTGIr=Z4vC=dJxB-d^Eg%qgR7SB0{8A)`qLq%KyD?!>-XN z!;#{HA&@>GBDN75wMgTBkH>5`nnhF4aco`MCU-AZ*5 zY@a~kC;Dg7cdJD$G9)P>nFzNXI`ehgIj=p+LmtT_rPYfvBBXEIqm~O{@64oBr z3*f1doNK4|FK5Qhs)eC|50+`eO4=xyRs@1VG#p1=RWtGmLntcknsJPAhAFfB9|~`+ zy#l~rMpA|&N!BT25>r7H{H6^{FRE*+$Yg{F?CxEk4pt_1UK3vb$JOCP!*WZ+J1h-SB2jG&5lbK+Ztsr)NW>yV z2lnrp0bu`7&wJyOtCq&K#zzW@{pCV)@2j?H!$b^?v1&9`M-a>pVd}g>7{ciF7>qG^ z{rag_|E6rlpHVxaspca^Rv;6cii!$;+-H1K+Y$#(Z%FK2_RWn|Cx*?(POwxgPbvpQ z3XG>iyAzlK1OY}K!O$H1;ef!GBMw*`v5obifB)>=zk6w@Ww`P2Rj0>9{R2fMx#f&g z#@JD40$eae+F~HXL2xP|Y&Rf}6+`D9m`NLkM+fH}4Mrds@IOCPRKZrnO9@=Xo2$tx8aKk#q5-~I% zYJ_b$n6+>!e11>ncpk3-0XBW~zNxV#E075UQ3e0=f%uZJS^dRL;lE$eY#t8AoK{#W z4oMwdB~lz<$~9bP9k~F(km}wOh~S!d`hk{X!QO5Tl-{~#&5%}1zqNM7yeO}KsB~&! z3Fkn^%8`3M&Kc$&H3M7T+5?Z*txD37s6NmLukOX{MP=|9-MU+xz&fYDn&4ywG67h3 z;2v)s+kU~XcW%F-A#rGVn^`RqvK^L6K*2$JHl8yM71O~C2TX7-Gk_!_ z%}EHKKyVtNT{R$26~hqT%zjcza7~*u0j{&NSmVeOjXw|FzxO{syE*>1x8G@c>XB_N zFRZAFZ4s?@4U#I75(fYfI5_MU9f}+<0TlYmF+1m^{&UlJnk!=Y(UNAi`<^?V`m(3* z9bEqJnXeX9Mz-BsRF=C;Xsm}g7-Mc%OS#XBrxw6$W?+#3%w~>Ii4HJ=A}7@)>>wVG zlY~7f#veeo1sNCC?)zD8tFz;ptu;@7r7^jGPQ-3vuD?bf5nhNP*~kIrz?;u7E9ZDD zE;<(xyBP=D-|g5;xeq2fEv2WPCa4`UZ~uzQi1u9o-|Mq%YgdbR<>ue!P1VoV4bej! zX*g$@>D#4bZf<$zj=k+~%xyJmn5_~}WOt;l?F1tZvtEZ%gy0kpriT_`Ny(+~>A7%} z1?rqthXA{k!)jx$7Zy5yBw=Z7tkLt{H^21oaToSg#{GHxKSV)njqcG{U*gD=EfuJX zF^2r25X$G2K#~LLNDvXMn8dDa2T@y750Klv3b)3dKgB#TGL-LaJjn{=2(a$JJ>FmL z_~_+t)jjdjuE=ZuR~g%SRMc)}l58k)GI!!MnWUJ+5U=JSNcc+`rub*#q~eR<5dm;; zG$$)N2IvHE1{6wNqS{xZoSw^Z1O@4j7ztnP1K0g=-ih7I`Rfuvd+AtyfoujU5>hn19Qsf{5}2KY)9BspkpY}h{vZDn-(DG{@gyLW!s_3qEyyc>dP09-$?c%|kpu9Ya{8dI>O^b+J4 zQy`cI#yIL?dy&qGkPZuOw1r~JrhVumPK~jpmj($01r>_q<&^p#{_&-c z(8fP&Id*^zF?V$OJVJ036;6TGs3Te@5i0P)pX(YhTBePbhVZNTZ1xL7`xeKSNwefX z$zTuc{rX9pS|0mqYqIuo8>XN7N-#(aLTJ#r2Oxr}lF*n3R+SHq<3OJtg;)1u`P7eN zTJWe$wknUy-Kf| z_SYOf^?tLc@>XA|bq*IpuM$L*DVJkQG}X5uAtUek(RiS6b;VG>rMOBi+ zD33!II!>5!UKeoyKx?uFwn}DRGXjdj3@18LN6X$@|2s^zywQIfvkl@*>yazcLL5;~ zWjUKu|MhBmXOkyS4NDvVx|B=P1xm{cQ8*&IX7n=k|Dx-9$aw_9k|Ea z-}d7{*3@K__^&^m8>sZXvRX3+eX(`-{&LwzqxCh<<(BgKjB&)BaJRtL z!-53U4*IqH-_FfD^^X^peW!6yI}zCa+pjw_WFNkVh{~UH0WHJGRY9#rz7uZ32=f>%fVTt*P=8uCpEzD z3Z+6azFGG$cC~e6Mbjm4#ukQ)ql#LT|AqD5GcUXL8@)$PyzTFwp3|Zo{3}gqUJ{pW zj5C3tmIs}CdUoe}qhqXZ3uqg-Fn&EV=eTFqOuubNeD`;N=K&&dm4E&4I8?F_86z8aHrk!P!_`d=5D4Hfz;oKf;TZe?Vn)Yvw(#4V=4~sWW-;LpxFWg_U33 z+}7W@fBwWbLwfGvn|NXTOL1!I-9NT_X$cO%+c?-Z2L6I3e1DHT{Os0>ilLo7H5N9ZM?GlgbUvN z`07u^9>Cl7kq}H)Afv!HpZM_9O7Y6u%x_NPgY2}LjT|z`;4fF;jANRA5zZ|C7(7~_ z-*nANNj!7t*Jwz%)4W80PckgtH}zLb=iPbp(v=t04d(o7*RB@PnbX!7xwyGbZl7Vv zC#9DPSijv4wGcOTg#d^W}L@M>^+7r?qQEy!7>A)2xo?pR+mvtg-vb zp}uzQS`ps+_<8Nk5B;WjmOU#n6G#RaERphp1Rzo_!vJ9OR6gX?Yby>i8;u&HeaeGN ziqE_2{IjmAD%a^G-z` z^VJ>GVC~3F+R2C_*$CZkiAT(Y%?q5~4%w4F{mUh)0Udw7PmZ=``gnF=Y)@vfmaHYP>fhVi|J`MmVpY*8F~FYkyn7^ zj;d#)!9pXtAaruyNq$E_Rv;tf7i(AhHj5X|0P7GzXNUl+g~L;rvbuHLzJyWeK)^s* za6T3mbTuXEc7!gkTub2Y=J8w;A^S*A*|WL+*Dllqo#Yypk(&#MD5wZawj1`67fK?i z3`sZ)02`g8xePoJ(u#g_RNjYfnLf9)W##b|4)7>|PmRj)yOR~j2x$bCrmltwd5TXgrpPe7XOxkK=xGM41E~ku7*wJ>%Z`N_uc$8 zfU&e-i3kmv#M8M+YzeHM3QaCkzZ!! zu9O2f5e_3i)neEH(>m_>3_v=r+Ps2OP~e@`>67mC491XjB2d(|n?gi{;F0|;eU-mI zgF&5`ZprVuZEIHrf&|TB@P8?NAX*I|LpJn_J+M>U=T}6E`?W1`!Wr3fex;jiKDvp=b3F75p~s@k6crwV~bz+@x#Ymu<4(Su`zLN zt=Vv=AG?2iQ9D<7DnE`*0Sn2_R{f(lH=5**{-ygrY~MXe{NJ%lX4S;YfvoGX2jLY#c!VE1 z^Yn0s?Tlc;_19qTc*c@Rbd3lHNCqTyLNp^B##F5G3VQF4g#(p;_3G7PY3}-;6x(m; zhFz@{`r_vuU)KE3x1adTk2e2tb$SK?pS$y9{cG!v`68c8;s5{{9Z5t%RMG+Sjn{YR zO=ogq&{OM|3K-39l`J*pSKPAnz2A@85l29_i#1{a2O0S0C}PDFL=l03LpO9NgTso% z;lw4#lY|~1Fb14e_6hv|_P#wxs_VS-_nmW}{haBZ2ZKO>7?1!VTLxia6v@Q0tvKFn z951TGaZ*yb?Cd(Jq~eY9t`byj*4}K&v6DDeNu^RrDqEF6oH)B$+47@6GA_k7#CjNv zU;u$(fO$_(zwW)~oG*Xe+m9Ir7+`ow{hONUp6>hXKELyw?_Konh9n6B!66@H#q+Ob zg~$X5OckN2Bd(@Mak)`$^f(716{1uKua_ z7C&56UwIGO6o1!Ze@%bz8>G^Mn;J03LKgcn~1Th9f+rIERP>l%t8Z;%|wMoe2;In4@|#fY3KMsWsMHjjxo_X5t4snEAy^ zg-NcA?<}#d6D;Z{kqS7PlyE48pr%kQ1+cqylN^$4{Mgcu!V*qg*On5ud-9x; zG}u_*kZ?r`UCt7ut$g!5aUnSwd(r1nT>^`6G_9c9yzIJm{%5B4ZO`Kpcz8hn!a#O< z#YOjoxG)5p2z4qubvy7}GsjA`$mB?io_(ABpZ&xK*8FO)s7Jm|bO>^t2z!FFAfB>P zgy5Wo`WVCO)3NU(8ANwyHexWpxh+J5X8$yZLTEmh!h$O@aZY+8j*I2Ik-mZ?m;}xj z4USl?$(Nv)1g8#tc)sg??oWQgT~Sn@677B%ZpC{sfRk>BJ%tKRxC)vWH>zoY$K6NP zdmnh}=?6c5P4Q$m5*>nEC;s1mLKTL-N)o7sCCEY@qAkP15k9sJ{On~j1Y4lCXB1Zk zk+~*`1Y7gwig2>r30>fYObFestW)ae=R4B|``_Q|TWW2iY$!7~Its!N@cmSPzb{ts zBS#?+43!uI78e4x$xJMxEl>U0=D$0=*hgOsbO^Et;K=!wssaA82$tXe4q;9HVXVk* zY;4)~I8UMKIbL-F!6p~Ba1(2mg}4aZob$uPGd}@8%4ob|87Lw!NqCliwEV))Z*1TG z(C(d%AC*7FhN*ceiQZq62G4d?@ehRxO41+_KtzCQlZcA}VgbjbR61PpYxuFP2Nv(h zi;E6H76Cc*4NBi!G=Nf84qFFyG{byj-6I*$jZxWBM_SvofryZjdDy~%Bne6OCCtL{ zvFaA^jdX}nE4F?qVp%!&y%?Ci_=Nq!tN;36M1FP~0zne%yB|ZpKey{L z18Br$Q1g}cXGAnhU$Mx6EgTqfV3UjaMr?y{M1=9I!Z+(xyxpr=B1CuTeSz#LaJgh_%AFSblE zo8&Q;G_L2smFZY*m@}9!Dsf6cC8aSM;-YX!Lx`)&&;7l@kYt&nUi~}ni%-0CbLRKN&)pTK>D~T1h^as0$F|6mp_RA{x{oqK7HFN<#W-IAlHcB{L;IZiCpwV zK2v}cRx@ojV|U}eu5Ak_!bVNgYP>*d`8N!7QzB6Et{@vs8org8eT*hzQZ?E=HGC&l z&LAw^+OL@)&}CMfe`ogRerx;or|VbVHE;* zFTZH}SW*bYVSY(yNz=E{@{k+Et=X7$a~(t!2Q6w2;mK_Bdh5tQYl+ox_QmfANGDGF zHMcCfNx)OZXwd%gU;pSkK66Lt9qs54~q>{oJ-y|Ly-0-5wFTSAz~gt^vn}fAl_;n(i{J5t$Iv(HOvhC2TBBuf5`OzZHKq zJGP3Mp%DQj;*fZ1NSt^t#Q|KAYVH%SrsmIGkM{rs1f)waQ5-IR)4+g>3<|ZiU)#F! z=|9-KbaVA4o_*2KA;>kLtj8Y{nFw`VK`9(fiYO2~nMT$wVqqF_LzcuO002P*3l41Z zl8};?!~p=q3ZBed!jm4uruHJ#l(;1YtSloc-6Tz&0f$m3)YhNs7n?r*pYQwFHT6Yj zX4<)Pr(kBm%(rB$b_jAUaHB_r6?bO}lSCr|A?NhLkyle(q@`a7k`S;V$cBJ5ix>?U zXn1xSg6B6rX6*v{Q!CNq-qm_B(PJ#1p=*Ts{E&+ZjsrB8>vz_3<+Y#u)cd}8_KLeO zQ$hmC%oa1-$BrFyhlYlnEnBwOd-m+H4jw!x_wL=J?Ab%Ty}fgtM*8T{qqJ$$CX~x%@_nC*#iA?}3UX#jDf-9Vz5M1h~>q2og&Tf`pw_2&V<4cVm>1yxWge*v8S3yS~18-S*FWWv_mrd;!Vw zhyl>9UAyqiGtcm@UAt)CzI|fLmMtl*b=DYTMNwo+DQ&H_1Hire?z>atHg*Vdl?cN6y(SyXD<&+lz~&$eK>Vdk zfK9XA8i8O-2WeSE*_?-lLi@O=>q;}@&>|bm+)Tm(Go&q=%KDY6&|eJ%B>Mf;*qHiB zy#Ce7tB-Ab;`g%X!N|ynFQxRp@r`d3qbSM~QQ_f-AMSeo`R7wxw{G==AXr93{g!39 zVHo-VGD@i&5oH08Wm)Gf%X-bW?fqR{UB_J4Ei0v_EXyhn4i1JlqMG|$bO>^lP-fs2EKW(f-fTZb{FjiV-y+sW2r_w$J?l*eppXzkpx`XSXmDiC zI*bsSIwBLo5>|3913-WXFdUnf?X-ce60FQ(j4gsMvsjj1kNa~^;M9v6n^!-EQk zlarHULI}moU0UmYAw(K+mueS)WR9IVZL@!sh=zm^-*p`4+o@FQ)nc(YoXKP=y}iA` zu3fwI&Yd?uEWSgKt3+tRK4}rmJmV`eb(Eutm>@9CEIqW5VqVM%>TTqwOS0lTcF1_y zgfuLv(dVqjP`Iz@M`=GuIhsVq?m}dOStn@dICci8jR?q;zAh(8pwAgZX|xV6 z=tI`-y`qtVnQKzY?+78DO{dfQZQDM*Y}v9>6h#IAUV7=J@X04{pQBih~6Nge{o&+ zOX+m_Xc&f-TrQ_aMn+73f4{!flHyY65acSsV9)T}n$U64xKcQZiTW^d?qXWAl0{lu z-bgB)Lbn>kIK2$b(L7tXBi2J=Zo~uF@(58?09PO}LBJvhu1LePvdB5TSlj(@QdgKT zT0MpH!{b<^K9m%bn0+ZkG(tq*avbNMi^bypVzD^BfB*hq$BrH5b|u7IbO>^lP*IeP z7dJFZ;RZ1x6JTiidwA!PpFvv|MvHxI=jk~d>q(TCXDVD`Yhc=^@WGk`ObMUXw(%o&*-tk|xfB)KNkvYVx34&7LS z3dRs|HCYl8q!6$vg{)mb-tWbd%pe9*YvN+ti7xcU#34)$2UuJG5NxDlLmTt35aR!P zp7*6}Hv9ddp`nS#AAkI|(Iu`GH;o_-vtEK`5t)Mr4^lp#7oO({*L5Wk(bUuwmCI#O zC={q%E>k9x;cB%iMn^{-X0{y1k;WLdZQEFuC9>J9wryKSQKZ5!)Sl<*bULkSwVJjp zi!NNaKued#>951X!|3ntXDKBO4-ebKx0(rL=)8Qy)qKUX~VDeK6$MDrte};DzKZ?B958F@7xQ(&f(wFD^lrHh< zQQ{GA9iZ>7Zs=oahymHA@3e?Qjf(JX(xss@fdJc=SVh}#*OHZ}a|y6CT*rfJ#|}nI zIB;cZR@_$*ggAQs0G#m^SjXF73!ed;vMlQ#QmNFQzP`TW_uO+&=}uWbEd}s`|a$UF27}Kq_wwXD@%tZiw0D6h2AcV*R$Pkf_*gkFpu#GXc zF-9`8WsI?sM;o#ITmT?S7SzcgHbkUs+m47RGR8zv6otkZlf>*a?o%;yL_{It1-KSM zgv_jy{~Py|29PzzoF$?zW)6?j^RJH;zx|80Z9C0=n+zz9P>!ZhQBw$XHR(W0fB}{S z4`F@ZHVh050D>)5uPW0qz8rR%zTHf`E; zmgsWrYwuiKvjkyg8X6k1r>Cdo%*>3a)oNX~Z7)+wc>q=r(c7!l>U{uK0~latpQybc z=i(y_!>hRbcra+KXT6xrew>hIEdU8(o~Ae6<=UQXv@veZ#N;676i`u9(5zs=g$yz< zlPOrH52Yy&m65aPU7kn2I}6B!D3_XKld_);X*0iNC?>(+%KI^O_5><4k-R!vS~Qkr z%~zS@z9mF3PzbpU%aRBUftbNe(1roSU^1AhU%*6p1e2vPxYa&9fRA#{>pSB6{_m&L z>1Q`=*s$Oa{7%I+6NHF(_wL=C%jNQ=Qfa(Wsf-N_3={$UDu5@LIiC=svHfCP@1kJN za<7R*Dlsz~01|*;W=!hS@VXqS*@YIhmPLsf%0!q9F2IBm>6w+_i7b}T16Z4T6gj6K zLd8~|{K(AaolS-xjAPmDV zY}vBqj!K)o9$fdRJ#gTFeemExba!`CcXzk1lzNbeJ_z8$09Guu8VC!p9UGRE5OTKA)rz5&g6-H4f>19jeE-ZhaZEm!I40W_{8`0- zny(N^fC;r9Ss2W|3j>*T;Pea>hw!6b-Bn;ncvOKI{<9J9cD3WNC`s`CZbcArZ-T*D0BokDhCcF zBsuV82HoCrickK;b`A^4^khqNSH0RR!zec%6| z#bWV)y%m;I^Wlcf?k7*4^v1`>Gg|9x6h)~p3|A|q-owm~G4nbA&J_=Go1i_gu;H*X ztm8x{#Dut!%g4F?kXhHmu?}U7!7=qsoGAVij8kuV^EE3lYs_{Y5+q4DB86zo!4`ZH z%iT?om>r2sM90(V^v5502ToSi3_?>&TDWoS6_+VUipvz$N(w74Jc)Y> zn;_UutX9lIh_BnW{ju%ax1YJy_jRjr(+4Iqi=#)67L-!`VHmCmf?%^!>TOD?L8a6( zV@y|Kn!VYVcE@8h7{cN7-yzd0n+32nD`-|A5G>)u9di@Z%Mk`ge-ZtuH6SJs3B$~P z#>~I_{`bFsAzJ^N9=CkvW@a%oG?ZcHo+yfXYPH&mD2g^jQ8cKvzDH}l${5oFKz1a} z{2(Go8I$68{Y9K`o|L9ikW!+XOpTw{z`V~knF%mri2q9o?u>1ZdyDt{}e zMi`y`E|8zP>=Y=B1Is12j>B4+&yJ0ab;vOXcf^d$%yjth;k4s8UA0=RJBp&-D2i4D zL9kY9y;f_z7QjklO!`tjjyE%e5RkGpS45(WQGX9N);+9L0g&^^6my_Q!K&<=^4i4r@rBXpD)e}Y0l6t*97>40`X5L_o zSX2>{~&hMD=e5TXP?5m7)yEQClg^Ib%=*+F*QJ%ufWAB;|l zVCgudJ)choKxo19vM)39uXM;UKknGUGZ)M(PMkQA4a2ZoYn`vx>-|cp^$+qp`K^W!LQ5&n5z%qmwvSqt^_t^2M~yKfmSs&kj#H}DYBSG1`>cNEnP+(4 zzI`&A&64l?luD($RK_F6iTxd;!_(DG zJwN@4r?!6f|18Fhyjk(4CdgbcGo3hbBBzvE8wA0RYpvHQrFz0J%qgX^#+dFz`S*=6 z0st-Y5{&@_M08S0`HJuR2h!>EcWm1}4dDEZ@>aic{@Z=ez4C<*o-O_Gaih4#Mw}<2 zuk84_&;Q$Y+CDcuvV%6fr3f+~n3)b9JZK>awRc_DtJP{fK@bcOQ9&t{H^yX{ISU}q z%-zPA0)RXKKiN+p4s0X<#LOWPO#v7qq7i03Pef;!`LvYsjbgDl(cj-6?%%&ZxY<^t zlPC9jYUMIsL)Ryr-YR&@6XbH(y?eLZx^=5luh;EbttM^T7PVSU)M_=dZCgZ9