summaryrefslogtreecommitdiffstats
path: root/kde
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kde/build/digikam1
-rw-r--r--kde/build/krita1
-rw-r--r--kde/build/sddm-qt52
-rw-r--r--kde/cmake/sddm-qt51
-rw-r--r--kde/cmake/xdg-desktop-portal-kde2
-rw-r--r--kde/modules/frameworks1
-rw-r--r--kde/modules/kdepim1
-rw-r--r--kde/patch/akonadi.patch12
-rw-r--r--kde/patch/akonadi/akonadi_mariadb_qtsql.patch91
-rw-r--r--kde/patch/akonadi/akonadi_rename-header.patch77
-rw-r--r--kde/patch/akonadi/akonadi_revert-abs-path.patch70
-rw-r--r--kde/patch/akonadi4.patch1
-rw-r--r--kde/patch/amarok.patch1
-rw-r--r--kde/patch/ark.patch8
-rw-r--r--kde/patch/ark/ark_cve-2020-16116.patch47
-rw-r--r--kde/patch/ark/ark_kdebug357057.patch37
-rw-r--r--kde/patch/baloo5.patch5
-rw-r--r--kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff69
-rw-r--r--kde/patch/baloo5/baloo_def_indexing_disabled.patch12
-rw-r--r--kde/patch/calligra.patch15
-rw-r--r--kde/patch/calligra/calligra3_poppler-0.71.patch131
-rw-r--r--kde/patch/calligra/calligra3_poppler-0.72.patch29
-rw-r--r--kde/patch/calligra/calligra3_poppler-0.73.patch32
-rw-r--r--kde/patch/calligra/calligra3_qt511.patch135
-rw-r--r--kde/patch/calligra/calligra3_qt513.patch22
-rw-r--r--kde/patch/calligraplan.patch13
-rw-r--r--kde/patch/calligraplan/calligraplan.kcalcore.1.patch47
-rw-r--r--kde/patch/calligraplan/calligraplan.kcalcore.2.patch85
-rw-r--r--kde/patch/calligraplan/calligraplan.kcalendarcore.patch34
-rw-r--r--kde/patch/calligraplan/calligraplan.missingheader.patch25
-rw-r--r--kde/patch/calligraplan/calligraplan.qt-5.15.patch10
-rw-r--r--kde/patch/calligraplan/calligraplan.qt-511.patch125
-rw-r--r--kde/patch/cantor.patch4
-rw-r--r--kde/patch/cantor/cantor_julia.patch193
-rw-r--r--kde/patch/cantor/cantor_python.patch31
-rw-r--r--kde/patch/digikam.patch12
-rw-r--r--kde/patch/digikam/digikam_clang_fix.patch38
-rw-r--r--kde/patch/digikam/digikam_databasemodel.patch13337
-rw-r--r--kde/patch/digikam/digikam_imagemagick7.patch40
-rw-r--r--kde/patch/dolphin.patch1
-rw-r--r--kde/patch/falkon.patch2
-rw-r--r--kde/patch/falkon/falkon.qt-5.15.diff20
-rw-r--r--kde/patch/gwenview.patch4
-rw-r--r--kde/patch/gwenview/gwenview-17.04.1_dataloss.patch131
-rw-r--r--kde/patch/kaccounts-integration.patch4
-rw-r--r--kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch28
-rw-r--r--kde/patch/kalgebra.patch1
-rw-r--r--kde/patch/kalzium.patch3
-rw-r--r--kde/patch/kalzium/kalzium_kf_5.31.patch156
-rw-r--r--kde/patch/kate.patch5
-rw-r--r--kde/patch/kate/kate-15.12.0.patch31
-rw-r--r--kde/patch/kcalc.patch5
-rw-r--r--kde/patch/kcalc/kcalc-kdebug_360105.patch15
-rw-r--r--kde/patch/kcalcore.patch4
-rw-r--r--kde/patch/kcalcore/kcalcore_libical3.patch109
-rw-r--r--kde/patch/kcoreaddons.patch5
-rw-r--r--kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch27
-rw-r--r--kde/patch/kde-baseapps.patch5
-rw-r--r--kde/patch/kde-baseapps/dolphin_kdebug_327224.patch57
-rw-r--r--kde/patch/kde-cli-tools.patch6
-rw-r--r--kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch11
-rw-r--r--kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff59
-rw-r--r--kde/patch/kde-dev-utils.patch3
-rw-r--r--kde/patch/kde-dev-utils/build_with_kf548.patch156
-rw-r--r--kde/patch/kde-gtk-config.patch4
-rw-r--r--kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch622
-rw-r--r--kde/patch/kde-runtime.patch8
-rw-r--r--kde/patch/kde-runtime/kde-runtime.kdebug324470.diff49
-rw-r--r--kde/patch/kde-runtime/kde-runtime_gpgme.patch133
-rw-r--r--kde/patch/kde-workspace.patch4
-rw-r--r--kde/patch/kde-workspace/kde-workspace.desktopnames.diff34
-rw-r--r--kde/patch/kdeconnect-kde.patch1
-rw-r--r--kde/patch/kdelibs.patch3
-rw-r--r--kde/patch/kdelibs/fixbic-4.14.6.patch47
-rw-r--r--kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch11
-rw-r--r--kde/patch/kdelibs4support.patch4
-rw-r--r--kde/patch/kdelibs4support/update-FindGettext.patch36
-rw-r--r--kde/patch/kdenlive.patch4
-rw-r--r--kde/patch/kdenlive/kdenlive_gcc7.patch32
-rw-r--r--kde/patch/kdepim.patch4
-rw-r--r--kde/patch/kdepim/kdepim-install_kleopatra_headers.patch129
-rw-r--r--kde/patch/kdepimlibs.patch3
-rw-r--r--kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch59
-rw-r--r--kde/patch/kdepimlibs4.patch3
-rw-r--r--kde/patch/kdepimlibs4/kdepimlibs.libical3.diff184
-rw-r--r--kde/patch/kdeplasma-addons.patch4
-rw-r--r--kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch76
-rw-r--r--kde/patch/kdesdk-kioslaves.patch3
-rw-r--r--kde/patch/kdesdk-kioslaves/svn19.patch87
-rw-r--r--kde/patch/kdev-python.patch4
-rw-r--r--kde/patch/kdev-python/kdev-python-5.4.4_python38.patch560
-rw-r--r--kde/patch/kdewebdev.patch6
-rw-r--r--kde/patch/kdewebdev/include-tidy.patch13
-rw-r--r--kde/patch/kholidays.patch8
-rw-r--r--kde/patch/kholidays/kholidays_depfreeze_revert.patch61
-rw-r--r--kde/patch/kholidays/kholidays_isnan.patch30
-rw-r--r--kde/patch/kinfocenter.patch1
-rw-r--r--kde/patch/kio.patch18
-rw-r--r--kde/patch/kio/kio_KDEBUG_399709.patch44
-rw-r--r--kde/patch/kio/kio_dolphin_servicemenus.patch126
-rw-r--r--kde/patch/kio/kio_fix_url_setpath.patch65
-rw-r--r--kde/patch/kio/kio_kdelibs4_docpatch.patch22
-rw-r--r--kde/patch/kirigami2.patch8
-rw-r--r--kde/patch/kirigami2/kirigami_iconview_crash.patch143
-rw-r--r--kde/patch/kirigami2/kirigami_scrollbar.patch25
-rw-r--r--kde/patch/kmail.patch4
-rw-r--r--kde/patch/kmail/kmail_kontact_kdebug_404881.patch75
-rw-r--r--kde/patch/kmplot.patch3
-rw-r--r--kde/patch/kmplot/kmplot_isnan.patch42
-rw-r--r--kde/patch/konsole.patch16
-rw-r--r--kde/patch/konsole/konsole.cursor.antialias.patch83
-rw-r--r--kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch43
-rw-r--r--kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch58
-rw-r--r--kde/patch/konsole/konsole.term.is.konsole.patch24
-rw-r--r--kde/patch/kopete.patch9
-rw-r--r--kde/patch/kopete/kopete_kdebug376348.patch127
-rw-r--r--kde/patch/kopete/kopete_kdebug393372.patch30
-rw-r--r--kde/patch/korundum.patch5
-rw-r--r--kde/patch/korundum/korundum_ruby19.patch31
-rw-r--r--kde/patch/kpat.patch6
-rw-r--r--kde/patch/kpat/kpat_no_freecell_solver_dep.patch1475
-rw-r--r--kde/patch/krita.patch7
-rw-r--r--kde/patch/krita/krita_qt512.patch117
-rw-r--r--kde/patch/krita/krita_qt59.patch26
-rw-r--r--kde/patch/krita/krita_qtabletevents.patch67
-rw-r--r--kde/patch/krunner.patch4
-rw-r--r--kde/patch/krunner/krunner_KDEBUG_423003.patch54
-rw-r--r--kde/patch/kscreenlocker.patch13
-rw-r--r--kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch36
-rw-r--r--kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch112
-rw-r--r--kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch49
-rw-r--r--kde/patch/kstars.patch3
-rw-r--r--kde/patch/kstars/kstars_isnan.patch46
-rw-r--r--kde/patch/ksudoku.patch4
-rw-r--r--kde/patch/ksudoku/ksudoku_qwindowtitle.patch15
-rw-r--r--kde/patch/ktexteditor.patch3
-rw-r--r--kde/patch/ktexteditor/ktexteditor_fix_indentation.patch32
-rw-r--r--kde/patch/ktorrent.patch7
-rw-r--r--kde/patch/ktorrent/ktorrent_systray.patch24
-rw-r--r--kde/patch/ktorrent/ktorrent_taglib_linking.patch248
-rw-r--r--kde/patch/ktp-accounts-kcm.patch4
-rw-r--r--kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch32
-rw-r--r--kde/patch/kwin.patch11
-rw-r--r--kde/patch/kwin/kwin_cmake310.patch52
-rw-r--r--kde/patch/kwin/kwin_qt59_rootwindow_events.patch63
-rw-r--r--kde/patch/kwin/kwin_replace_logind_with_ck2.patch85
-rw-r--r--kde/patch/libkdcraw.patch3
-rw-r--r--kde/patch/libkdcraw/libkdcraw_cmake_minver.patch7
-rw-r--r--kde/patch/libkexiv2.patch3
-rw-r--r--kde/patch/libkexiv2/libkexiv2_cmake_minver.patch7
-rw-r--r--kde/patch/libkface.patch1
-rw-r--r--kde/patch/libkleo.patch4
-rw-r--r--kde/patch/libkleo/libkleo_gcc7.patch27
-rw-r--r--kde/patch/libksysguard.patch4
-rw-r--r--kde/patch/libksysguard/libksysguard_isnan.patch176
-rw-r--r--kde/patch/marble.patch4
-rw-r--r--kde/patch/marble/marble_qt4.patch47
-rw-r--r--kde/patch/messagelib.patch4
-rw-r--r--kde/patch/messagelib/messagelib_CVE-2018-19516.patch20
-rw-r--r--kde/patch/okular.patch3
-rw-r--r--kde/patch/okular/cve-2020-9359.patch32
-rw-r--r--kde/patch/oxygen-gtk2.patch1
-rw-r--r--kde/patch/oxygen-gtk3.patch3
-rw-r--r--kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch29
-rw-r--r--kde/patch/perlqt.patch1
-rw-r--r--kde/patch/plasma-browser-integration.patch1
-rw-r--r--kde/patch/plasma-desktop.patch20
-rwxr-xr-xkde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff60
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch39
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch16
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch25
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff88
-rw-r--r--kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch24
-rw-r--r--kde/patch/plasma-framework.patch11
-rw-r--r--kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch24
-rw-r--r--kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch31
-rw-r--r--kde/patch/plasma-pa.patch5
-rw-r--r--kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch583
-rw-r--r--kde/patch/plasma-wayland-protocols.patch2
-rw-r--r--kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch60
-rw-r--r--kde/patch/plasma-workspace.patch17
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch152
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch23
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch189
-rw-r--r--kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch32
-rw-r--r--kde/patch/plasma5-nm.patch14
-rw-r--r--kde/patch/plasma5-nm/plasma-nm-fixes.patch322
-rw-r--r--kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch73
-rw-r--r--kde/patch/plasma5-nm/plasma-nm_networkmanager.patch17
-rw-r--r--kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch31
-rw-r--r--kde/patch/powerdevil.patch4
-rw-r--r--kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch42
-rw-r--r--kde/patch/pykde4.patch1
-rw-r--r--kde/patch/qqc2-desktop-style.patch5
-rw-r--r--kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch51
-rw-r--r--kde/patch/sddm-theme-breeze.patch2
-rw-r--r--kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff10
-rw-r--r--kde/patch/spectacle.patch7
-rw-r--r--kde/patch/spectacle/spectacle_hidpi.patch28
-rw-r--r--kde/patch/spectacle/spectacle_rect_capture.patch52
-rw-r--r--kde/patch/strigi-multimedia.patch1
-rw-r--r--kde/patch/umbrello.patch10
-rw-r--r--kde/patch/umbrello/umbrello-4.11.4_listitem.patch13
-rw-r--r--kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch33
-rw-r--r--kde/slack-desc/akonadi2
-rw-r--r--kde/slack-desc/akonadi-calendar2
-rw-r--r--kde/slack-desc/akonadi-calendar-tools2
-rw-r--r--kde/slack-desc/akonadi-contacts6
-rw-r--r--kde/slack-desc/akonadi-import-wizard4
-rw-r--r--kde/slack-desc/akonadi-mime6
-rw-r--r--kde/slack-desc/akonadi-notes6
-rw-r--r--kde/slack-desc/akonadi-search6
-rw-r--r--kde/slack-desc/akonadiconsole2
-rw-r--r--kde/slack-desc/akregator2
-rw-r--r--kde/slack-desc/alkimia4
-rw-r--r--kde/slack-desc/analitza2
-rw-r--r--kde/slack-desc/ark2
-rw-r--r--kde/slack-desc/artikulate8
-rw-r--r--kde/slack-desc/attica-framework2
-rw-r--r--kde/slack-desc/audiocd-kio2
-rw-r--r--kde/slack-desc/baloo512
-rw-r--r--kde/slack-desc/baloo5-widgets4
-rw-r--r--kde/slack-desc/blinken2
-rw-r--r--kde/slack-desc/bluez-qt10
-rw-r--r--kde/slack-desc/bomber10
-rw-r--r--kde/slack-desc/bovo6
-rw-r--r--kde/slack-desc/breeze6
-rw-r--r--kde/slack-desc/breeze-grub2
-rw-r--r--kde/slack-desc/breeze-gtk4
-rw-r--r--kde/slack-desc/breeze-icons4
-rw-r--r--kde/slack-desc/calendarsupport2
-rw-r--r--kde/slack-desc/calligra10
-rw-r--r--kde/slack-desc/calligraplan8
-rw-r--r--kde/slack-desc/cantor10
-rw-r--r--kde/slack-desc/cervisia2
-rw-r--r--kde/slack-desc/digikam14
-rw-r--r--kde/slack-desc/discover4
-rw-r--r--kde/slack-desc/dolphin8
-rw-r--r--kde/slack-desc/dolphin-plugins2
-rw-r--r--kde/slack-desc/dragon4
-rw-r--r--kde/slack-desc/drkonqi2
-rw-r--r--kde/slack-desc/elisa6
-rw-r--r--kde/slack-desc/eventviews2
-rw-r--r--kde/slack-desc/extra-cmake-modules6
-rw-r--r--kde/slack-desc/falkon4
-rw-r--r--kde/slack-desc/ffmpegthumbs8
-rw-r--r--kde/slack-desc/filelight2
-rw-r--r--kde/slack-desc/frameworkintegration4
-rw-r--r--kde/slack-desc/granatier6
-rw-r--r--kde/slack-desc/grantlee-editor2
-rw-r--r--kde/slack-desc/grantleetheme4
-rw-r--r--kde/slack-desc/gwenview4
-rw-r--r--kde/slack-desc/incidenceeditor2
-rw-r--r--kde/slack-desc/juk8
-rw-r--r--kde/slack-desc/k3b2
-rw-r--r--kde/slack-desc/kaccounts-integration8
-rw-r--r--kde/slack-desc/kaccounts-providers8
-rw-r--r--kde/slack-desc/kactivities6
-rw-r--r--kde/slack-desc/kactivities-framework6
-rw-r--r--kde/slack-desc/kactivities-stats8
-rw-r--r--kde/slack-desc/kactivitymanagerd10
-rw-r--r--kde/slack-desc/kaddressbook2
-rw-r--r--kde/slack-desc/kajongg12
-rw-r--r--kde/slack-desc/kalarm2
-rw-r--r--kde/slack-desc/kalarmcal2
-rw-r--r--kde/slack-desc/kalgebra6
-rw-r--r--kde/slack-desc/kalzium2
-rw-r--r--kde/slack-desc/kamera4
-rw-r--r--kde/slack-desc/kamoso4
-rw-r--r--kde/slack-desc/kanagram12
-rw-r--r--kde/slack-desc/kapidox6
-rw-r--r--kde/slack-desc/kapman14
-rw-r--r--kde/slack-desc/kapptemplate6
-rw-r--r--kde/slack-desc/karchive10
-rw-r--r--kde/slack-desc/kate14
-rw-r--r--kde/slack-desc/katomic8
-rw-r--r--kde/slack-desc/kaudiocreator6
-rw-r--r--kde/slack-desc/kauth8
-rw-r--r--kde/slack-desc/kbackup8
-rw-r--r--kde/slack-desc/kblackbox6
-rw-r--r--kde/slack-desc/kblocks2
-rw-r--r--kde/slack-desc/kblog10
-rw-r--r--kde/slack-desc/kbookmarks14
-rw-r--r--kde/slack-desc/kbounce6
-rw-r--r--kde/slack-desc/kbreakout2
-rw-r--r--kde/slack-desc/kbruch2
-rw-r--r--kde/slack-desc/kcachegrind6
-rw-r--r--kde/slack-desc/kcalc2
-rw-r--r--kde/slack-desc/kcalcore8
-rw-r--r--kde/slack-desc/kcalendarcore8
-rw-r--r--kde/slack-desc/kcalutils4
-rw-r--r--kde/slack-desc/kcharselect6
-rw-r--r--kde/slack-desc/kcmutils6
-rw-r--r--kde/slack-desc/kcodecs12
-rw-r--r--kde/slack-desc/kcolorchooser2
-rw-r--r--kde/slack-desc/kcompletion16
-rw-r--r--kde/slack-desc/kconfig14
-rw-r--r--kde/slack-desc/kconfigwidgets8
-rw-r--r--kde/slack-desc/kcontacts4
-rw-r--r--kde/slack-desc/kcoreaddons12
-rw-r--r--kde/slack-desc/kcrash6
-rw-r--r--kde/slack-desc/kcron2
-rw-r--r--kde/slack-desc/kdav10
-rw-r--r--kde/slack-desc/kdbusaddons6
-rw-r--r--kde/slack-desc/kde-cli-tools8
-rw-r--r--kde/slack-desc/kde-dev-scripts2
-rw-r--r--kde/slack-desc/kde-dev-utils2
-rw-r--r--kde/slack-desc/kde-gtk-config6
-rw-r--r--kde/slack-desc/kde-wallpapers2
-rw-r--r--kde/slack-desc/kdeaccessibility1
-rw-r--r--kde/slack-desc/kdeadmin2
-rw-r--r--kde/slack-desc/kdebugsettings2
-rw-r--r--kde/slack-desc/kdeclarative12
-rw-r--r--kde/slack-desc/kdeconnect-kde4
-rw-r--r--kde/slack-desc/kdecoration8
-rw-r--r--kde/slack-desc/kded10
-rw-r--r--kde/slack-desc/kdeedu-data2
-rw-r--r--kde/slack-desc/kdegraphics-mobipocket2
-rw-r--r--kde/slack-desc/kdegraphics-thumbnailers8
-rw-r--r--kde/slack-desc/kdelibs4support10
-rw-r--r--kde/slack-desc/kdenetwork-filesharing6
-rw-r--r--kde/slack-desc/kdenlive2
-rw-r--r--kde/slack-desc/kdepim2
-rw-r--r--kde/slack-desc/kdepim-addons2
-rw-r--r--kde/slack-desc/kdepim-apps-libs6
-rw-r--r--kde/slack-desc/kdepim-runtime2
-rw-r--r--kde/slack-desc/kdesdk6
-rw-r--r--kde/slack-desc/kdesdk-kioslaves2
-rw-r--r--kde/slack-desc/kdesdk-thumbnailers6
-rw-r--r--kde/slack-desc/kdesignerplugin8
-rw-r--r--kde/slack-desc/kdesu8
-rw-r--r--kde/slack-desc/kdeutils2
-rw-r--r--kde/slack-desc/kdewebdev6
-rw-r--r--kde/slack-desc/kdewebkit14
-rw-r--r--kde/slack-desc/kdf2
-rw-r--r--kde/slack-desc/kdiagram2
-rw-r--r--kde/slack-desc/kdialog4
-rw-r--r--kde/slack-desc/kdiamond6
-rw-r--r--kde/slack-desc/kdnssd2
-rw-r--r--kde/slack-desc/kdoctools6
-rw-r--r--kde/slack-desc/keditbookmarks2
-rw-r--r--kde/slack-desc/kemoticons8
-rw-r--r--kde/slack-desc/kfilemetadata58
-rw-r--r--kde/slack-desc/kfind10
-rw-r--r--kde/slack-desc/kfloppy2
-rw-r--r--kde/slack-desc/kfourinline8
-rw-r--r--kde/slack-desc/kgamma52
-rw-r--r--kde/slack-desc/kgeography14
-rw-r--r--kde/slack-desc/kget2
-rw-r--r--kde/slack-desc/kglobalaccel8
-rw-r--r--kde/slack-desc/kgoldrunner8
-rw-r--r--kde/slack-desc/kgpg2
-rw-r--r--kde/slack-desc/kguiaddons6
-rw-r--r--kde/slack-desc/khangman6
-rw-r--r--kde/slack-desc/khelpcenter10
-rw-r--r--kde/slack-desc/kholidays8
-rw-r--r--kde/slack-desc/khotkeys12
-rw-r--r--kde/slack-desc/khtml6
-rw-r--r--kde/slack-desc/ki18n14
-rw-r--r--kde/slack-desc/kiconthemes6
-rw-r--r--kde/slack-desc/kid310
-rw-r--r--kde/slack-desc/kidentitymanagement4
-rw-r--r--kde/slack-desc/kidletime10
-rw-r--r--kde/slack-desc/kig2
-rw-r--r--kde/slack-desc/kigo14
-rw-r--r--kde/slack-desc/kile6
-rw-r--r--kde/slack-desc/killbots2
-rw-r--r--kde/slack-desc/kimageformats10
-rw-r--r--kde/slack-desc/kimagemapeditor4
-rw-r--r--kde/slack-desc/kimap2
-rw-r--r--kde/slack-desc/kinfocenter8
-rw-r--r--kde/slack-desc/kinit12
-rw-r--r--kde/slack-desc/kio16
-rw-r--r--kde/slack-desc/kio-extras4
-rw-r--r--kde/slack-desc/kipi-plugins6
-rw-r--r--kde/slack-desc/kirigami-gallery6
-rw-r--r--kde/slack-desc/kirigami28
-rw-r--r--kde/slack-desc/kiriki4
-rw-r--r--kde/slack-desc/kitemmodels6
-rw-r--r--kde/slack-desc/kitemviews8
-rw-r--r--kde/slack-desc/kiten12
-rw-r--r--kde/slack-desc/kitinerary4
-rw-r--r--kde/slack-desc/kjobwidgets6
-rw-r--r--kde/slack-desc/kjots8
-rw-r--r--kde/slack-desc/kjs8
-rw-r--r--kde/slack-desc/kjsembed6
-rw-r--r--kde/slack-desc/kjumpingcube10
-rw-r--r--kde/slack-desc/kldap2
-rw-r--r--kde/slack-desc/kleopatra2
-rw-r--r--kde/slack-desc/klettres8
-rw-r--r--kde/slack-desc/klickety8
-rw-r--r--kde/slack-desc/klines6
-rw-r--r--kde/slack-desc/kmag8
-rw-r--r--kde/slack-desc/kmahjongg6
-rw-r--r--kde/slack-desc/kmail14
-rw-r--r--kde/slack-desc/kmail-account-wizard4
-rw-r--r--kde/slack-desc/kmailtransport4
-rw-r--r--kde/slack-desc/kmbox2
-rw-r--r--kde/slack-desc/kmediaplayer6
-rw-r--r--kde/slack-desc/kmenuedit6
-rw-r--r--kde/slack-desc/kmime2
-rw-r--r--kde/slack-desc/kmines4
-rw-r--r--kde/slack-desc/kmix8
-rw-r--r--kde/slack-desc/kmousetool2
-rw-r--r--kde/slack-desc/kmouth4
-rw-r--r--kde/slack-desc/kmplot10
-rw-r--r--kde/slack-desc/kmymoney4
-rw-r--r--kde/slack-desc/knavalbattle10
-rw-r--r--kde/slack-desc/knetwalk2
-rw-r--r--kde/slack-desc/knewstuff8
-rw-r--r--kde/slack-desc/knights8
-rw-r--r--kde/slack-desc/knotes2
-rw-r--r--kde/slack-desc/knotifications6
-rw-r--r--kde/slack-desc/knotifyconfig6
-rw-r--r--kde/slack-desc/kolf4
-rw-r--r--kde/slack-desc/kollision2
-rw-r--r--kde/slack-desc/kolourpaint2
-rw-r--r--kde/slack-desc/kompare2
-rw-r--r--kde/slack-desc/konqueror10
-rw-r--r--kde/slack-desc/konquest8
-rw-r--r--kde/slack-desc/konsole6
-rw-r--r--kde/slack-desc/kontact2
-rw-r--r--kde/slack-desc/kontactinterface6
-rw-r--r--kde/slack-desc/kopete2
-rw-r--r--kde/slack-desc/korganizer2
-rw-r--r--kde/slack-desc/kpackage6
-rw-r--r--kde/slack-desc/kparts8
-rw-r--r--kde/slack-desc/kpat4
-rw-r--r--kde/slack-desc/kpeople8
-rw-r--r--kde/slack-desc/kpeoplevcard2
-rw-r--r--kde/slack-desc/kpimtextedit8
-rw-r--r--kde/slack-desc/kpkpass2
-rw-r--r--kde/slack-desc/kplotting18
-rw-r--r--kde/slack-desc/kpmcore12
-rw-r--r--kde/slack-desc/kpty8
-rw-r--r--kde/slack-desc/kqtquickcharts6
-rw-r--r--kde/slack-desc/kquickcharts12
-rw-r--r--kde/slack-desc/krdc2
-rw-r--r--kde/slack-desc/krename14
-rw-r--r--kde/slack-desc/kreversi10
-rw-r--r--kde/slack-desc/krfb2
-rw-r--r--kde/slack-desc/krita8
-rw-r--r--kde/slack-desc/kross10
-rw-r--r--kde/slack-desc/kross-interpreters2
-rw-r--r--kde/slack-desc/kruler2
-rw-r--r--kde/slack-desc/krunner10
-rw-r--r--kde/slack-desc/krusader12
-rw-r--r--kde/slack-desc/kscreen210
-rw-r--r--kde/slack-desc/kscreenlocker2
-rw-r--r--kde/slack-desc/kservice8
-rw-r--r--kde/slack-desc/kshisen4
-rw-r--r--kde/slack-desc/ksirk8
-rw-r--r--kde/slack-desc/ksmtp6
-rw-r--r--kde/slack-desc/ksnakeduel12
-rw-r--r--kde/slack-desc/kspaceduel6
-rw-r--r--kde/slack-desc/ksquares8
-rw-r--r--kde/slack-desc/ksshaskpass2
-rw-r--r--kde/slack-desc/kstars16
-rw-r--r--kde/slack-desc/ksudoku10
-rw-r--r--kde/slack-desc/ksysguard10
-rw-r--r--kde/slack-desc/ksystemlog14
-rw-r--r--kde/slack-desc/kteatime8
-rw-r--r--kde/slack-desc/ktexteditor14
-rw-r--r--kde/slack-desc/ktextwidgets6
-rw-r--r--kde/slack-desc/ktimer2
-rw-r--r--kde/slack-desc/ktimetracker6
-rw-r--r--kde/slack-desc/ktnef10
-rw-r--r--kde/slack-desc/ktorrent10
-rw-r--r--kde/slack-desc/ktouch8
-rw-r--r--kde/slack-desc/ktp-accounts-kcm4
-rw-r--r--kde/slack-desc/ktp-approver4
-rw-r--r--kde/slack-desc/ktp-auth-handler4
-rw-r--r--kde/slack-desc/ktp-call-ui4
-rw-r--r--kde/slack-desc/ktp-common-internals4
-rw-r--r--kde/slack-desc/ktp-contact-list4
-rw-r--r--kde/slack-desc/ktp-contact-runner4
-rw-r--r--kde/slack-desc/ktp-desktop-applets8
-rw-r--r--kde/slack-desc/ktp-filetransfer-handler8
-rw-r--r--kde/slack-desc/ktp-kded-module8
-rw-r--r--kde/slack-desc/ktp-send-file4
-rw-r--r--kde/slack-desc/ktp-text-ui4
-rw-r--r--kde/slack-desc/ktuberling8
-rw-r--r--kde/slack-desc/kturtle18
-rw-r--r--kde/slack-desc/kubrick12
-rw-r--r--kde/slack-desc/kunitconversion10
-rw-r--r--kde/slack-desc/kuser2
-rw-r--r--kde/slack-desc/kwallet4
-rw-r--r--kde/slack-desc/kwallet-pam2
-rw-r--r--kde/slack-desc/kwalletmanager4
-rw-r--r--kde/slack-desc/kwave12
-rw-r--r--kde/slack-desc/kwayland2
-rw-r--r--kde/slack-desc/kwayland-integration6
-rw-r--r--kde/slack-desc/kwayland-server2
-rw-r--r--kde/slack-desc/kwebkitpart4
-rw-r--r--kde/slack-desc/kwidgetsaddons14
-rw-r--r--kde/slack-desc/kwin10
-rw-r--r--kde/slack-desc/kwindowsystem12
-rw-r--r--kde/slack-desc/kwordquiz8
-rw-r--r--kde/slack-desc/kwrited6
-rw-r--r--kde/slack-desc/kxmlgui10
-rw-r--r--kde/slack-desc/kxmlrpcclient2
-rw-r--r--kde/slack-desc/labplot12
-rw-r--r--kde/slack-desc/latte-dock12
-rw-r--r--kde/slack-desc/libgravatar4
-rw-r--r--kde/slack-desc/libkcddb2
-rw-r--r--kde/slack-desc/libkcompactdisc6
-rw-r--r--kde/slack-desc/libkdcraw6
-rw-r--r--kde/slack-desc/libkdegames4
-rw-r--r--kde/slack-desc/libkdepim4
-rw-r--r--kde/slack-desc/libkeduvocdocument10
-rw-r--r--kde/slack-desc/libkexiv26
-rw-r--r--kde/slack-desc/libkgapi8
-rw-r--r--kde/slack-desc/libkgeomap10
-rw-r--r--kde/slack-desc/libkipi8
-rw-r--r--kde/slack-desc/libkleo6
-rw-r--r--kde/slack-desc/libkmahjongg8
-rw-r--r--kde/slack-desc/libkomparediff210
-rw-r--r--kde/slack-desc/libksane4
-rw-r--r--kde/slack-desc/libkscreen212
-rw-r--r--kde/slack-desc/libksieve4
-rw-r--r--kde/slack-desc/libksysguard6
-rw-r--r--kde/slack-desc/libktorrent10
-rw-r--r--kde/slack-desc/lokalize2
-rw-r--r--kde/slack-desc/lskat4
-rw-r--r--kde/slack-desc/mailcommon4
-rw-r--r--kde/slack-desc/mailimporter2
-rw-r--r--kde/slack-desc/marble15
-rw-r--r--kde/slack-desc/mbox-importer2
-rw-r--r--kde/slack-desc/messagelib2
-rw-r--r--kde/slack-desc/milou6
-rw-r--r--kde/slack-desc/minuet8
-rw-r--r--kde/slack-desc/modemmanager-qt6
-rw-r--r--kde/slack-desc/networkmanager-qt4
-rw-r--r--kde/slack-desc/okteta2
-rw-r--r--kde/slack-desc/okular10
-rw-r--r--kde/slack-desc/oxygen4
-rw-r--r--kde/slack-desc/oxygen-fonts6
-rw-r--r--kde/slack-desc/oxygen-gtk214
-rw-r--r--kde/slack-desc/oxygen-icons54
-rw-r--r--kde/slack-desc/palapeli12
-rw-r--r--kde/slack-desc/parley2
-rw-r--r--kde/slack-desc/partitionmanager10
-rw-r--r--kde/slack-desc/picmi8
-rw-r--r--kde/slack-desc/pim-data-exporter4
-rw-r--r--kde/slack-desc/pim-sieve-editor6
-rw-r--r--kde/slack-desc/pimcommon2
-rw-r--r--kde/slack-desc/plasma-browser-integration8
-rw-r--r--kde/slack-desc/plasma-desktop16
-rw-r--r--kde/slack-desc/plasma-framework8
-rw-r--r--kde/slack-desc/plasma-integration6
-rw-r--r--kde/slack-desc/plasma-pa4
-rw-r--r--kde/slack-desc/plasma-sdk2
-rw-r--r--kde/slack-desc/plasma-vault12
-rw-r--r--kde/slack-desc/plasma-wayland-protocols6
-rw-r--r--kde/slack-desc/plasma-workspace6
-rw-r--r--kde/slack-desc/plasma-workspace-wallpapers6
-rw-r--r--kde/slack-desc/plasma5-nm6
-rw-r--r--kde/slack-desc/polkit-kde-framework6
-rw-r--r--kde/slack-desc/polkit-kde-kcmodules-framework3
-rw-r--r--kde/slack-desc/powerdevil8
-rw-r--r--kde/slack-desc/poxml10
-rw-r--r--kde/slack-desc/print-manager10
-rw-r--r--kde/slack-desc/prison8
-rw-r--r--kde/slack-desc/pulseaudio-qt8
-rw-r--r--kde/slack-desc/purpose18
-rw-r--r--kde/slack-desc/qqc2-desktop-style14
-rw-r--r--kde/slack-desc/rocs12
-rw-r--r--kde/slack-desc/sddm-kcm8
-rw-r--r--kde/slack-desc/sddm-qt512
-rw-r--r--kde/slack-desc/signon-kwallet-extension6
-rw-r--r--kde/slack-desc/skanlite4
-rw-r--r--kde/slack-desc/solid12
-rw-r--r--kde/slack-desc/sonnet10
-rw-r--r--kde/slack-desc/spectacle4
-rw-r--r--kde/slack-desc/step12
-rw-r--r--kde/slack-desc/svgpart2
-rw-r--r--kde/slack-desc/sweeper2
-rw-r--r--kde/slack-desc/syndication8
-rw-r--r--kde/slack-desc/syntax-highlighting2
-rw-r--r--kde/slack-desc/systemsettings2
-rw-r--r--kde/slack-desc/threadweaver12
-rw-r--r--kde/slack-desc/umbrello2
-rw-r--r--kde/slack-desc/user-manager6
-rw-r--r--kde/slack-desc/wacomtablet8
-rw-r--r--kde/slack-desc/xdg-desktop-portal-kde2
-rw-r--r--kde/slack-desc/yakuake12
-rw-r--r--kde/slack-desc/zeroconf-ioslave2
-rwxr-xr-xkde/src/applications-extra/fetch-krita.sh52
-rwxr-xr-xkde/src/plasma-extra/fetch-wacomtablet.sh52
589 files changed, 1845 insertions, 24672 deletions
diff --git a/kde/build/digikam b/kde/build/digikam
deleted file mode 100644
index 0cfbf08..0000000
--- a/kde/build/digikam
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/kde/build/krita b/kde/build/krita
deleted file mode 100644
index 0cfbf08..0000000
--- a/kde/build/krita
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/kde/build/sddm-qt5 b/kde/build/sddm-qt5
index 7ed6ff8..1e8b314 100644
--- a/kde/build/sddm-qt5
+++ b/kde/build/sddm-qt5
@@ -1 +1 @@
-5
+6
diff --git a/kde/cmake/sddm-qt5 b/kde/cmake/sddm-qt5
index 6f187cb..cd8ebfb 100644
--- a/kde/cmake/sddm-qt5
+++ b/kde/cmake/sddm-qt5
@@ -24,6 +24,7 @@ cd build
-DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \
-DCMAKE_CXX_FLAGS_RELEASE:STRING="$SLKCFLAGS" \
-DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_MANDIR=/usr/man \
-DLIB_SUFFIX=${LIBDIRSUFFIX} \
-DBUILD_MAN_PAGES:BOOL=TRUE \
-DDBUS_CONFIG_FILENAME="org.freedesktop.sddm.conf" \
diff --git a/kde/cmake/xdg-desktop-portal-kde b/kde/cmake/xdg-desktop-portal-kde
index 74dc9f6..26bc0a8 100644
--- a/kde/cmake/xdg-desktop-portal-kde
+++ b/kde/cmake/xdg-desktop-portal-kde
@@ -18,7 +18,7 @@ cd build
-DKDE_INSTALL_SYSCONFDIR=/etc/kde \
-DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
-DBUILD_TESTING=OFF \
- -DENABLE_PIPEWIRE=OFF \
+ -DENABLE_PIPEWIRE=ON \
-DQca-qt5_DIR=/usr/lib${LIBDIRSUFFIX}/cmake/Qca \
..
diff --git a/kde/modules/frameworks b/kde/modules/frameworks
index 7c2ed82..002e935 100644
--- a/kde/modules/frameworks
+++ b/kde/modules/frameworks
@@ -51,6 +51,7 @@ syndication
kquickcharts
# Tier 3, depends on Tier 1 and 2, Qt5, system libraries:
kconfigwidgets
+kdav
kservice
kglobalaccel
kiconthemes
diff --git a/kde/modules/kdepim b/kde/modules/kdepim
index 8f5b281..eb58f35 100644
--- a/kde/modules/kdepim
+++ b/kde/modules/kdepim
@@ -37,7 +37,6 @@ incidenceeditor
messagelib
mailcommon
kleopatra
-kdav
kpkpass
kitinerary
kdepim-addons
diff --git a/kde/patch/akonadi.patch b/kde/patch/akonadi.patch
deleted file mode 100644
index ddab2a8..0000000
--- a/kde/patch/akonadi.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-# Remove hardcoded absolute path to stdlib header.
-# This is Windows-centric and breaks on any linux GCC upgrade.
-# Thanks to Gentoo where I found the following two patches at
-# https://packages.gentoo.org/packages/kde-apps/akonadi
-# No longer needed since 17.04.0.
-#cat $CWD/patch/akonadi/akonadi_revert-abs-path.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/akonadi/akonadi_rename-header.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Temporary fix for non-working Akonadi in combination with mariadb 10.2.8
-# (actually this is a bug in qtsql, not in akonadi or mariadb):
-#cat $CWD/patch/akonadi/akonadi_mariadb_qtsql.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/akonadi/akonadi_mariadb_qtsql.patch b/kde/patch/akonadi/akonadi_mariadb_qtsql.patch
deleted file mode 100644
index 7ec6d7c..0000000
--- a/kde/patch/akonadi/akonadi_mariadb_qtsql.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-Patch taken from https://cgit.kde.org/akonadi.git/patch/?id=b145f47f000978b9d39edc1882849ec7f6b3ef79
-
-Upstream bug reports:
-https://bugs.kde.org/show_bug.cgi?id=383991
-https://bugreports.qt.io/browse/QTBUG-63108
-
-From b145f47f000978b9d39edc1882849ec7f6b3ef79 Mon Sep 17 00:00:00 2001
-From: Heinz Wiesinger <pprkut@liwjatan.at>
-Date: Sun, 17 Sep 2017 10:56:44 +0200
-Subject: Only remove init connections to the database on server shutdown.
-
-Summary:
-With MariaDB 10.2 libmysqlclient was replaced with libmariadb that
-changed how establishing database connections behaves. The MySQL
-QSQL driver calls mysql_server_end() on QSqlDatabase::removeDatabase()
-if the overall connection count dropped to 0 (which it does when
-the init connection is removed).
-A future QSqlDatabase:addDatabase() would call mysql_server_init()
-again, but this no longer works with libmariadb as that one only
-allows calling mysql_server_init() once. Future calls are simply
-ignored.
-
-In order to prevent this from happening we have to keep the
-init connection open until the server shuts down, so the connection
-count only drops to 0 at shutdown and mysql_server_end() isn't
-called before.
-
-This is a workaround for QTBUG-63108
-
-CCBUG: 383991
-
-Reviewers: dvratil, mlaurent
-
-Reviewed By: dvratil
-
-Subscribers: #kde_pim
-
-Tags: #kde_pim
-
-Differential Revision: https://phabricator.kde.org/D7858
----
- src/server/akonadi.cpp | 3 ++-
- src/server/storage/dbconfigmysql.cpp | 4 +++-
- 2 files changed, 5 insertions(+), 2 deletions(-)
-
-diff --git a/src/server/akonadi.cpp b/src/server/akonadi.cpp
-index 4364e63..bcb7e88 100644
---- a/src/server/akonadi.cpp
-+++ b/src/server/akonadi.cpp
-@@ -423,13 +423,14 @@ bool AkonadiServer::createDatabase()
- success = false;
- }
- }
-- QSqlDatabase::removeDatabase(initCon);
- return success;
- }
-
- void AkonadiServer::stopDatabaseProcess()
- {
- if (!DbConfig::configuredDatabase()->useInternalServer()) {
-+ // closing initConnection this late to work around QTBUG-63108
-+ QSqlDatabase::removeDatabase(QStringLiteral("initConnection"));
- return;
- }
-
-diff --git a/src/server/storage/dbconfigmysql.cpp b/src/server/storage/dbconfigmysql.cpp
-index 2bd231d..d565706 100644
---- a/src/server/storage/dbconfigmysql.cpp
-+++ b/src/server/storage/dbconfigmysql.cpp
-@@ -492,7 +492,6 @@ bool DbConfigMysql::startInternalServer()
- }
- }
-
-- QSqlDatabase::removeDatabase(initCon);
- return success;
- }
-
-@@ -520,6 +519,9 @@ void DbConfigMysql::stopInternalServer()
- return;
- }
-
-+ // closing initConnection this late to work around QTBUG-63108
-+ QSqlDatabase::removeDatabase(QStringLiteral("initConnection"));
-+
- disconnect(mDatabaseProcess, static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
- this, &DbConfigMysql::processFinished);
-
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/akonadi/akonadi_rename-header.patch b/kde/patch/akonadi/akonadi_rename-header.patch
deleted file mode 100644
index 73347f0..0000000
--- a/kde/patch/akonadi/akonadi_rename-header.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-commit 248671e8200ff0883877b6d0e56700ef99ff3b51
-Author: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sat Jan 7 14:38:17 2017 +0100
-
- Rename exception.h to exceptionbase.h
-
- REVIEW: 129788
-
-diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
-index 6ac851e..fa996b9 100644
---- a/src/core/CMakeLists.txt
-+++ b/src/core/CMakeLists.txt
-@@ -95,7 +95,7 @@ ecm_generate_headers(AkonadiCore_base_HEADERS
- EntityDeletedAttribute
- EntityDisplayAttribute
- EntityHiddenAttribute
-- Exception
-+ ExceptionBase
- GidExtractorInterface
- IndexPolicyAttribute
- Item
-diff --git a/src/core/exception.cpp b/src/core/exception.cpp
-index f229c1a..14f7330 100644
---- a/src/core/exception.cpp
-+++ b/src/core/exception.cpp
-@@ -17,7 +17,7 @@
- 02110-1301, USA.
- */
-
--#include "exception.h"
-+#include "exceptionbase.h"
-
- #include <QString>
-
-diff --git a/src/core/exception.h b/src/core/exceptionbase.h
-similarity index 100%
-rename from src/core/exception.h
-rename to src/core/exceptionbase.h
-diff --git a/src/core/item.h b/src/core/item.h
-index de71cad..5ec62c8 100644
---- a/src/core/item.h
-+++ b/src/core/item.h
-@@ -23,7 +23,7 @@
-
- #include "akonadicore_export.h"
- #include "attribute.h"
--#include "exception.h"
-+#include "exceptionbase.h"
- #include "tag.h"
- #include "collection.h"
- #include "relation.h"
-diff --git a/src/core/itempayloadinternals_p.h b/src/core/itempayloadinternals_p.h
-index 0a4de3c..1626f10 100644
---- a/src/core/itempayloadinternals_p.h
-+++ b/src/core/itempayloadinternals_p.h
-@@ -32,7 +32,7 @@
-
- #include <boost/shared_ptr.hpp>
-
--#include "exception.h"
-+#include "exceptionbase.h"
-
- //@cond PRIVATE Doxygen 1.7.1 hangs processing this file. so skip it.
- //for more info, see https://bugzilla.gnome.org/show_bug.cgi?id=531637
-diff --git a/src/core/protocolhelper.cpp b/src/core/protocolhelper.cpp
-index f740e9d..c218f0c 100644
---- a/src/core/protocolhelper.cpp
-+++ b/src/core/protocolhelper.cpp
-@@ -23,7 +23,7 @@
- #include "collectionstatistics.h"
- #include "item_p.h"
- #include "collection_p.h"
--#include "exception.h"
-+#include "exceptionbase.h"
- #include "itemserializer_p.h"
- #include "itemserializerplugin.h"
- #include "servermanager.h"
diff --git a/kde/patch/akonadi/akonadi_revert-abs-path.patch b/kde/patch/akonadi/akonadi_revert-abs-path.patch
deleted file mode 100644
index 3b48253..0000000
--- a/kde/patch/akonadi/akonadi_revert-abs-path.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-commit d98e29a07f4acc3bf01f06f25b3eef5522397e2e
-Author: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Thu Jan 5 22:41:02 2017 +0100
-
- Revert "Workaround an include loop on case-insensitive systems"
-
- Do not hardcode absolute patchs to GCC headers.
-
- This reverts commit 59b9d6b79425c9ec1e5df059a2593580048c4adf.
-
- REVIEW: 129788
-
-diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
-index 72589cd..6ac851e 100644
---- a/src/core/CMakeLists.txt
-+++ b/src/core/CMakeLists.txt
-@@ -257,21 +257,6 @@ ecm_generate_headers(AkonadiCore_jobs_HEADERS
- RELATIVE jobs
- )
-
--# This is a workaround for conflict between our "Exception" fancy header and
--# C++ stdlib's "exception" header which occurs in case-insensitive systems.
--# For that reason we generate std_exception.h file, which contains an absolute
--# path to the stdlib's exception header file, which resolves the ambiguity
--# when including <exception> from within Akonadi.
--include(FindStdlibInclude)
--findStdlibInclude("exception" std_exception_file)
--if (NOT "${std_exception_file}" STREQUAL "")
-- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/std_exception.h.in
-- ${CMAKE_CURRENT_BINARY_DIR}/std_exception.h
-- )
--else()
-- message(FATAL_ERROR "stdlib <exception> include absolute path not found")
--endif()
--
- set(akonadicore_dbus_xml ${Akonadi_SOURCE_DIR}/src/interfaces/org.freedesktop.Akonadi.NotificationManager.xml)
- qt5_add_dbus_interface(akonadicore_dbus_SRCS ${akonadicore_dbus_xml} notificationmanagerinterface)
-
-@@ -338,7 +323,6 @@ install(TARGETS
-
- install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/akonadicore_export.h
-- ${CMAKE_CURRENT_BINARY_DIR}/std_exception.h
- ${AkonadiCore_base_HEADERS}
- ${AkonadiCore_models_HEADERS}
- ${AkonadiCore_jobs_HEADERS}
-diff --git a/src/core/exception.h b/src/core/exception.h
-index d07ca71..2a376df 100644
---- a/src/core/exception.h
-+++ b/src/core/exception.h
-@@ -20,16 +20,11 @@
- #ifndef AKONADI_EXCEPTION_H
- #define AKONADI_EXCEPTION_H
-
--// The std_exception.h file is generated at build-time and #includes C++ stdlib
--// header "exception" by aboslute path. This is to workaround an include loop on
--// case-insensitive systems, where #include <exception> includes our "Exception"
--// fancy header instead of stdlib's exception, causing an endless loop of
--// includes between "Exception" and "exception.h".
--#include "std_exception.h"
--
- #include "akonadicore_export.h"
-+#include <QObject>
-+#include <QByteArray>
-+#include <exception>
-
--class QByteArray;
- class QString;
-
- namespace Akonadi
diff --git a/kde/patch/akonadi4.patch b/kde/patch/akonadi4.patch
index 388c3ea..8ff0118 100644
--- a/kde/patch/akonadi4.patch
+++ b/kde/patch/akonadi4.patch
@@ -1,4 +1,3 @@
# Backport a patch from git master since there will not be another
# official akonadi release after the current 1.13:
cat $CWD/patch/akonadi4/akonadi_dont-leak-old-external-payload-files.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/amarok.patch b/kde/patch/amarok.patch
index 9fc3963..7ede8ad 100644
--- a/kde/patch/amarok.patch
+++ b/kde/patch/amarok.patch
@@ -1,4 +1,3 @@
# Fix a crash in KDE 4.11:
# See also https://bugs.kde.org/show_bug.cgi?id=320855
cat $CWD/patch/amarok/amarok_kdebug_320855.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ark.patch b/kde/patch/ark.patch
index 35ac2d3..3710075 100644
--- a/kde/patch/ark.patch
+++ b/kde/patch/ark.patch
@@ -1,7 +1,5 @@
-# Ark won't open RAR archives unless rar is installed (even for read access).
-# KDEBUG #357057 is fixed in 15.12.1; still needs unrar.
-#cat $CWD/patch/ark/ark_kdebug357057.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Fix a compilation issue in 18.04.0:
-cat $CWD/patch/ark/ark_include_memory.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+#cat $CWD/patch/ark/ark_include_memory.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+# Fix for CVE-2020-16116:
+cat $CWD/patch/ark/ark_cve-2020-16116.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/ark/ark_cve-2020-16116.patch b/kde/patch/ark/ark_cve-2020-16116.patch
new file mode 100644
index 0000000..b3feb1b
--- /dev/null
+++ b/kde/patch/ark/ark_cve-2020-16116.patch
@@ -0,0 +1,47 @@
+From 0df592524fed305d6fbe74ddf8a196bc9ffdb92f Mon Sep 17 00:00:00 2001
+From: Elvis Angelaccio <elvis.angelaccio@kde.org>
+Date: Wed, 29 Jul 2020 23:45:30 +0200
+Subject: [PATCH] Fix vulnerability to path traversal attacks
+
+Ark was vulnerable to directory traversal attacks because of
+missing validation of file paths in the archive.
+
+More details about this attack are available at:
+https://github.com/snyk/zip-slip-vulnerability
+
+Job::onEntry() is the only place where we can safely check the path of
+every entry in the archive. There shouldn't be a valid reason
+to have a "../" in an archive path, so we can just play safe and abort
+the LoadJob if we detect such an entry. This makes impossibile to
+extract this kind of malicious archives and perform the attack.
+
+Thanks to Albert Astals Cid for suggesting to use QDir::cleanPath()
+so that we can still allow loading of legitimate archives that
+contain "../" in their paths but still resolve inside the extraction folder.
+---
+ kerfuffle/jobs.cpp | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/kerfuffle/jobs.cpp b/kerfuffle/jobs.cpp
+index fdaa48695..f73b56f86 100644
+--- a/kerfuffle/jobs.cpp
++++ b/kerfuffle/jobs.cpp
+@@ -180,6 +180,14 @@ void Job::onError(const QString & message, const QString & details)
+
+ void Job::onEntry(Archive::Entry *entry)
+ {
++ const QString entryFullPath = entry->fullPath();
++ if (QDir::cleanPath(entryFullPath).contains(QLatin1String("../"))) {
++ qCWarning(ARK) << "Possibly malicious archive. Detected entry that could lead to a directory traversal attack:" << entryFullPath;
++ onError(i18n("Could not load the archive because it contains ill-formed entries and might be a malicious archive."), QString());
++ onFinished(false);
++ return;
++ }
++
+ emit newEntry(entry);
+ }
+
+--
+GitLab
+
+
diff --git a/kde/patch/ark/ark_kdebug357057.patch b/kde/patch/ark/ark_kdebug357057.patch
deleted file mode 100644
index 76c0bab..0000000
--- a/kde/patch/ark/ark_kdebug357057.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Elvis Angelaccio <elvis.angelaccio@kdemail.net>
-Date: Wed, 23 Dec 2015 16:19:29 +0000
-Subject: Fallback to read-only mode if there are no read-write executables
-X-Git-Url: http://quickgit.kde.org/?p=ark.git&a=commitdiff&h=087e5aab49c60ac5930742fe892fa930048e2f43
----
-Fallback to read-only mode if there are no read-write executables
-
-Commit 2d000a0 introduced executables check when loading a plugin. However the
-current behavior is too restrictive: if one wants only to open a rar or a
-zip archive, there is no need to require also the rar or zip program to be
-installed. Plus, some distributions (e.g. Archlinux) ship only unrar in their
-official repositories.
-
-With this commit, Ark is able to understand that e.g. unrar is installed but
-rar is not. In this case, Ark can and should fallback to read-only mode,
-to disable the Add/Delete actions in the toolbar.
-
-BUG: 357057
-FIXED-IN: 15.12.1
-
-CC: rthomsen6@gmail.com
----
-
-
---- a/kerfuffle/archive_kerfuffle.cpp
-+++ b/kerfuffle/archive_kerfuffle.cpp
-@@ -173,6 +173,9 @@
-
- if (iface->findExecutables(!isReadOnly)) {
- return new Archive(iface, isReadOnly, parent);
-+ } else if (!isReadOnly && iface->findExecutables(false)) {
-+ qCWarning(ARK) << "Failed to find read-write executables: falling back to read-only mode for read-write plugin" << pluginName;
-+ return new Archive(iface, true, parent);
- } else {
- qCWarning(ARK) << "Failed to find needed executables for plugin" << pluginName;
- }
-
diff --git a/kde/patch/baloo5.patch b/kde/patch/baloo5.patch
index 794bcd9..75aa4d1 100644
--- a/kde/patch/baloo5.patch
+++ b/kde/patch/baloo5.patch
@@ -1,3 +1,2 @@
-# Adapt to changes in KAboutData (will be fixed in next release):
-#cat $CWD/patch/baloo5/baloo-4.96.0_kaboutdata.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
+# Disable file indexing by default in Baloo:
+cat $CWD/patch/baloo5/baloo_def_indexing_disabled.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff b/kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff
deleted file mode 100644
index 36ec0d1..0000000
--- a/kde/patch/baloo5/baloo-4.96.0_kaboutdata.diff
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Andreas Hartmetz <ahartmetz@gmail.com>
-Date: Wed, 14 May 2014 02:36:57 +0000
-Subject: Adapt to changes in KAboutData.
-X-Git-Url: http://quickgit.kde.org/?p=baloo.git&a=commitdiff&h=46e3ea7828c8066e75bec87ba0a19d5ef3bd700a
----
-Adapt to changes in KAboutData.
----
-
-
---- a/src/file/kcm/kcm.cpp
-+++ b/src/file/kcm/kcm.cpp
-@@ -58,8 +58,8 @@
- : KCModule(parent, args)
- {
- KAboutData* about = new KAboutData(
-- "kcm_baloofile", "kcm_baloofile", i18n("Configure Desktop Search"),
-- "0.1", QString(), KAboutData::License_GPL,
-+ "kcm_baloofile", i18n("Configure Desktop Search"),
-+ "0.1", QString(), KAboutLicense::GPL,
- i18n("Copyright 2007-2010 Sebastian Trüg"));
- about->addAuthor(i18n("Sebastian Trüg"), QString(), "trueg@kde.org");
- about->addAuthor(i18n("Vishesh Handa"), QString(), "vhanda@kde.org");
-
---- a/src/file/main.cpp
-+++ b/src/file/main.cpp
-@@ -44,9 +44,9 @@
- lowerSchedulingPriority();
- lowerPriority();
-
-- KAboutData aboutData("baloo_file", "baloo_file", i18n("Baloo File"), "0.1",
-+ KAboutData aboutData("baloo_file", i18n("Baloo File"), "0.1",
- i18n("An application to handle file metadata"),
-- KAboutData::License_LGPL_V2);
-+ KAboutLicense::LGPL_V2);
- aboutData.addAuthor(i18n("Vishesh Handa"), i18n("Maintainer"), "me@vhanda.in", "http://vhanda.in");
-
- KAboutData::setApplicationData(aboutData);
-
---- a/src/tools/baloosearch/main.cpp
-+++ b/src/tools/baloosearch/main.cpp
-@@ -55,11 +55,10 @@
- int main(int argc, char* argv[])
- {
- KAboutData aboutData("baloosearch",
-- "baloosearch",
- i18n("Baloo Search"),
- "0.1",
- i18n("Baloo Search - A debugging tool"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2013, Vishesh Handa"));
- aboutData.addAuthor(i18n("Vishesh Handa"), i18n("Maintainer"), "me@vhanda.in");
-
-
---- a/src/tools/balooshow/main.cpp
-+++ b/src/tools/balooshow/main.cpp
-@@ -46,11 +46,10 @@
- int main(int argc, char* argv[])
- {
- KAboutData aboutData("balooshow",
-- "balooshow",
- i18n("Baloo Show"),
- "0.1",
- i18n("The Baloo data Viewer - A debugging tool"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2012, Vishesh Handa"));
- aboutData.addAuthor(i18n("Vishesh Handa"), i18n("Maintainer"), "me@vhanda.in");
-
diff --git a/kde/patch/baloo5/baloo_def_indexing_disabled.patch b/kde/patch/baloo5/baloo_def_indexing_disabled.patch
new file mode 100644
index 0000000..8a12e45
--- /dev/null
+++ b/kde/patch/baloo5/baloo_def_indexing_disabled.patch
@@ -0,0 +1,12 @@
+diff -uar baloo-5.72.0.orig/src/lib/baloosettings.kcfg baloo-5.72.0/src/lib/baloosettings.kcfg
+--- baloo-5.72.0.orig/src/lib/baloosettings.kcfg 2020-07-04 15:03:02.000000000 +0200
++++ baloo-5.72.0/src/lib/baloosettings.kcfg 2020-07-29 19:51:58.891567902 +0200
+@@ -9,7 +9,7 @@
+ <group name="Basic Settings">
+ <entry name="indexingEnabled" key="Indexing-Enabled" type="Bool">
+ <label>Indexing-Enabled</label>
+- <default>true</default>
++ <default>false</default>
+ </entry>
+ </group>
+ <group name="General">
diff --git a/kde/patch/calligra.patch b/kde/patch/calligra.patch
deleted file mode 100644
index a0a45af..0000000
--- a/kde/patch/calligra.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-# Fix build against Qt 5.11:
-#cat $CWD/patch/calligra/calligra3_qt511.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against Qt 5.13:
-#cat $CWD/patch/calligra/calligra3_qt513.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against poppler 0.71:
-#cat $CWD/patch/calligra/calligra3_poppler-0.71.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against poppler 0.72:
-#cat $CWD/patch/calligra/calligra3_poppler-0.72.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against poppler 0.73:
-#cat $CWD/patch/calligra/calligra3_poppler-0.73.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/calligra/calligra3_poppler-0.71.patch b/kde/patch/calligra/calligra3_poppler-0.71.patch
deleted file mode 100644
index 65284a3..0000000
--- a/kde/patch/calligra/calligra3_poppler-0.71.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-diff --git a/filters/karbon/pdf/PdfImport.cpp b/filters/karbon/pdf/PdfImport.cpp
-index 48b08dfa32d..e910dae0756 100644
---- a/filters/karbon/pdf/PdfImport.cpp
-+++ b/filters/karbon/pdf/PdfImport.cpp
-@@ -88,9 +88,9 @@ KoFilter::ConversionStatus PdfImport::convert(const QByteArray& from, const QByt
- SvgOutputDev * dev = new SvgOutputDev(m_chain->outputFile());
- if (dev->isOk()) {
- int rotate = 0;
-- GBool useMediaBox = gTrue;
-- GBool crop = gFalse;
-- GBool printing = gFalse;
-+ bool useMediaBox = true;
-+ bool crop = false;
-+ bool printing = false;
- pdfDoc->displayPages(dev, firstPage, lastPage, hDPI, vDPI, rotate, useMediaBox, crop, printing);
- dev->dumpContent();
- }
-diff --git a/filters/karbon/pdf/SvgOutputDev.cpp b/filters/karbon/pdf/SvgOutputDev.cpp
-index 5692824bc45..43205170991 100644
---- a/filters/karbon/pdf/SvgOutputDev.cpp
-+++ b/filters/karbon/pdf/SvgOutputDev.cpp
-@@ -39,7 +39,7 @@ class SvgOutputDev::Private
- {
- public:
- Private(const QString &fname)
-- : svgFile(fname), defs(0), body(0), state(gTrue)
-+ : svgFile(fname), defs(0), body(0), state(true)
- , brush(Qt::SolidPattern) {}
-
- ~Private() {
-@@ -52,7 +52,7 @@ public:
- QString defsData;
- QTextStream * defs;
- QTextStream * body;
-- GBool state;
-+ bool state;
- QSizeF pageSize;
- QPen pen;
- QBrush brush;
-@@ -62,7 +62,7 @@ SvgOutputDev::SvgOutputDev(const QString &fileName)
- : d(new Private(fileName))
- {
- if (! d->svgFile.open(QIODevice::WriteOnly)) {
-- d->state = gFalse;
-+ d->state = false;
- return;
- }
-
-@@ -75,24 +75,24 @@ SvgOutputDev::~SvgOutputDev()
- delete d;
- }
-
--GBool SvgOutputDev::isOk()
-+bool SvgOutputDev::isOk()
- {
- return d->state;
- }
-
--GBool SvgOutputDev::upsideDown()
-+bool SvgOutputDev::upsideDown()
- {
-- return gTrue;
-+ return true;
- }
-
--GBool SvgOutputDev::useDrawChar()
-+bool SvgOutputDev::useDrawChar()
- {
-- return gFalse;
-+ return false;
- }
-
--GBool SvgOutputDev::interpretType3Chars()
-+bool SvgOutputDev::interpretType3Chars()
- {
-- return gFalse;
-+ return false;
- }
-
- void SvgOutputDev::startPage(int pageNum, GfxState *state, XRef */*xref*/)
-@@ -480,7 +480,7 @@ void SvgOutputDev::drawString(GfxState * state, GooString * s)
-
- void SvgOutputDev::drawImage(GfxState *state, Object */*ref*/, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- int *maskColors, GBool /*inlineImg*/)
-+ int *maskColors, bool /*inlineImg*/)
- {
- ImageStream * imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), colorMap->getBits());
- imgStr->reset();
-@@ -549,7 +549,7 @@ void SvgOutputDev::drawImage(GfxState *state, Object */*ref*/, Stream *str,
-
- void SvgOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- GBool /*interpolate*/, int *maskColors, GBool inlineImg)
-+ bool /*interpolate*/, int *maskColors, bool inlineImg)
- {
- drawImage(state, ref, str, width, height, colorMap, maskColors, inlineImg);
- }
-diff --git a/filters/karbon/pdf/SvgOutputDev.h b/filters/karbon/pdf/SvgOutputDev.h
-index 2a4490848bf..cdb1d4e43b1 100644
---- a/filters/karbon/pdf/SvgOutputDev.h
-+++ b/filters/karbon/pdf/SvgOutputDev.h
-@@ -44,11 +44,11 @@ public:
- explicit SvgOutputDev(const QString &fileName);
- virtual ~SvgOutputDev();
-
-- GBool isOk();
-+ bool isOk();
-
-- virtual GBool upsideDown();
-- virtual GBool useDrawChar();
-- virtual GBool interpretType3Chars();
-+ virtual bool upsideDown();
-+ virtual bool useDrawChar();
-+ virtual bool interpretType3Chars();
- virtual void startPage(int pageNum, GfxState *state, XRef *xref);
- virtual void endPage();
-
-@@ -63,10 +63,10 @@ public:
- // images
- virtual void drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- int *maskColors, GBool inlineImg);
-+ int *maskColors, bool inlineImg);
- virtual void drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
-- GBool interpolate, int *maskColors, GBool inlineImg);
-+ bool interpolate, int *maskColors, bool inlineImg);
-
- // styles
- virtual void updateAll(GfxState *state);
diff --git a/kde/patch/calligra/calligra3_poppler-0.72.patch b/kde/patch/calligra/calligra3_poppler-0.72.patch
deleted file mode 100644
index 2cab98f..0000000
--- a/kde/patch/calligra/calligra3_poppler-0.72.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-diff --git a/filters/karbon/pdf/SvgOutputDev.cpp b/filters/karbon/pdf/SvgOutputDev.cpp
-index 80f01a5f76f..ea69228dbc1 100644
---- a/filters/karbon/pdf/SvgOutputDev.cpp
-+++ b/filters/karbon/pdf/SvgOutputDev.cpp
-@@ -407,7 +407,7 @@ void SvgOutputDev::drawString(GfxState * state, const GooString * s)
-
- QString str;
-
-- const char * p = s->getCString();
-+ const char * p = s->c_str();
- int len = s->getLength();
- CharCode code;
- Unicode *u = nullptr;
-@@ -459,11 +459,11 @@ void SvgOutputDev::drawString(GfxState * state, const GooString * s)
- *d->body << " y=\"" << y << "px\"";
-
- if (font && font->getFamily()) {
-- *d->body << " font-family=\"" << QString::fromLatin1(font->getFamily()->getCString()) << "\"";
-- //debugPdf << "font family:" << QString::fromLatin1( font->getFamily()->getCString() );
-+ *d->body << " font-family=\"" << QString::fromLatin1(font->getFamily()->c_str()) << "\"";
-+ //debugPdf << "font family:" << QString::fromLatin1( font->getFamily()->c_str() );
- } else if (font && font->getName()) {
-- *d->body << " font-family=\"" << QString::fromLatin1(font->getName()->getCString()) << "\"";
-- //debugPdf << "font name:" << QString::fromLatin1( font->getName()->getCString() );
-+ *d->body << " font-family=\"" << QString::fromLatin1(font->getName()->c_str()) << "\"";
-+ //debugPdf << "font name:" << QString::fromLatin1( font->getName()->c_str() );
- }
- *d->body << " font-size=\"" << qMax(state->getFontSize(), state->getTransformedFontSize()) << "px\"";
-
diff --git a/kde/patch/calligra/calligra3_poppler-0.73.patch b/kde/patch/calligra/calligra3_poppler-0.73.patch
deleted file mode 100644
index 86738de..0000000
--- a/kde/patch/calligra/calligra3_poppler-0.73.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From a1ddd91e6c354e8f0dda40f8a522053c3fa19c39 Mon Sep 17 00:00:00 2001
-From: Albert Astals Cid <aacid@kde.org>
-Date: Tue, 15 Jan 2019 22:24:08 +0100
-Subject: [PATCH] Guchar -> unsigned char
-
-It was just a typdef and it's now gone
----
- filters/karbon/pdf/SvgOutputDev.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/filters/karbon/pdf/SvgOutputDev.cpp b/filters/karbon/pdf/SvgOutputDev.cpp
-index 80f01a5f76f..1a5aa30bc40 100644
---- a/filters/karbon/pdf/SvgOutputDev.cpp
-+++ b/filters/karbon/pdf/SvgOutputDev.cpp
-@@ -496,7 +496,7 @@ void SvgOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- if (maskColors) {
- for (int y = 0; y < height; y++) {
- dest = (unsigned int *)(buffer + y * 4 * width);
-- Guchar * pix = imgStr->getLine();
-+ unsigned char * pix = imgStr->getLine();
- colorMap->getRGBLine(pix, dest, width);
-
- for (int x = 0; x < width; x++) {
-@@ -515,7 +515,7 @@ void SvgOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- } else {
- for (int y = 0; y < height; y++) {
- dest = (unsigned int *)(buffer + y * 4 * width);
-- Guchar * pix = imgStr->getLine();
-+ unsigned char * pix = imgStr->getLine();
- colorMap->getRGBLine(pix, dest, width);
- }
-
diff --git a/kde/patch/calligra/calligra3_qt511.patch b/kde/patch/calligra/calligra3_qt511.patch
deleted file mode 100644
index 0ddf0f2..0000000
--- a/kde/patch/calligra/calligra3_qt511.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From ee83e0f2c251072e47a2799619cdc79efe67e651 Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Tue, 3 Apr 2018 00:31:19 +0200
-Subject: Fix compilation with Qt 5.11 (missing include)
-
----
- stage/part/KPrPresentationTool.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/stage/part/KPrPresentationTool.cpp b/stage/part/KPrPresentationTool.cpp
-index ae743da..3007f91 100644
---- a/stage/part/KPrPresentationTool.cpp
-+++ b/stage/part/KPrPresentationTool.cpp
-@@ -32,6 +32,7 @@
- #include <QDesktopServices>
- #include <QUrl>
- #include <QDBusConnection>
-+#include <QFrame>
-
- #include <KoShape.h>
- #include <KoShapeManager.h>
----
-From a7ebecb9fbee2190e649c44ed53f1299013baa30 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sun, 18 Mar 2018 11:56:57 +0100
-Subject: Fix build with Qt 5.11 (missing headers)
-
-Reviewers: #calligra:_3.0, anthonyfieroni, danders
-
-Reviewed By: #calligra:_3.0, anthonyfieroni, danders
-
-Subscribers: anthonyfieroni, danders
-
-Tags: #calligra:_3.0
-
-Differential Revision: https://phabricator.kde.org/D11454
----
- libs/widgets/KoCsvImportDialog.cpp | 1 +
- libs/widgets/KoPageLayoutWidget.cpp | 2 ++
- plugins/chartshape/dialogs/TableEditorDialog.cpp | 1 +
- plugins/formulashape/FormulaToolWidget.cpp | 1 +
- sheets/dialogs/LayoutDialog.cpp | 1 +
- words/part/dialogs/KWAnchoringProperties.cpp | 1 +
- words/part/dialogs/KWRunAroundProperties.cpp | 2 ++
- 15 files changed, 18 insertions(+), 1 deletion(-)
-
-diff --git a/libs/widgets/KoCsvImportDialog.cpp b/libs/widgets/KoCsvImportDialog.cpp
-index 0ffdcf6..cdca006 100644
---- a/libs/widgets/KoCsvImportDialog.cpp
-+++ b/libs/widgets/KoCsvImportDialog.cpp
-@@ -21,6 +21,7 @@
- #include "KoCsvImportDialog.h"
-
- // Qt
-+#include <QButtonGroup>
- #include <QTextCodec>
- #include <QTextStream>
-
-diff --git a/libs/widgets/KoPageLayoutWidget.cpp b/libs/widgets/KoPageLayoutWidget.cpp
-index f91555c..a3816f9 100644
---- a/libs/widgets/KoPageLayoutWidget.cpp
-+++ b/libs/widgets/KoPageLayoutWidget.cpp
-@@ -23,6 +23,8 @@
-
- #include <KoUnit.h>
-
-+#include <QButtonGroup>
-+
- class Q_DECL_HIDDEN KoPageLayoutWidget::Private
- {
- public:
-diff --git a/plugins/chartshape/dialogs/TableEditorDialog.cpp b/plugins/chartshape/dialogs/TableEditorDialog.cpp
-index c0d5136..d2a772e 100644
---- a/plugins/chartshape/dialogs/TableEditorDialog.cpp
-+++ b/plugins/chartshape/dialogs/TableEditorDialog.cpp
-@@ -24,6 +24,7 @@
-
- // Qt
- #include <QAbstractItemModel>
-+#include <QAction>
-
- // Calligra
- #include <KoIcon.h>
-diff --git a/plugins/formulashape/FormulaToolWidget.cpp b/plugins/formulashape/FormulaToolWidget.cpp
-index ed10919..8f52177 100644
---- a/plugins/formulashape/FormulaToolWidget.cpp
-+++ b/plugins/formulashape/FormulaToolWidget.cpp
-@@ -30,6 +30,7 @@
- #include <QWidgetAction>
- #include <QTableWidget>
- #include <QAction>
-+#include <QHeaderView>
- #include <QMenu>
-
- FormulaToolWidget::FormulaToolWidget( KoFormulaTool* tool, QWidget* parent )
-diff --git a/sheets/dialogs/LayoutDialog.cpp b/sheets/dialogs/LayoutDialog.cpp
-index a0a9832..7d7db53 100644
---- a/sheets/dialogs/LayoutDialog.cpp
-+++ b/sheets/dialogs/LayoutDialog.cpp
-@@ -36,6 +36,7 @@
- #include <math.h>
-
- #include <QIntValidator>
-+#include <QButtonGroup>
- #include <QCheckBox>
- #include <QFrame>
- #include <QLabel>
-diff --git a/words/part/dialogs/KWAnchoringProperties.cpp b/words/part/dialogs/KWAnchoringProperties.cpp
-index d64208c..bfddb3a 100644
---- a/words/part/dialogs/KWAnchoringProperties.cpp
-+++ b/words/part/dialogs/KWAnchoringProperties.cpp
-@@ -35,6 +35,7 @@
-
- #include <kundo2command.h>
-
-+#include <QButtonGroup>
- #include <QComboBox>
-
- const int KWAnchoringProperties::vertRels[4][20] = {
-diff --git a/words/part/dialogs/KWRunAroundProperties.cpp b/words/part/dialogs/KWRunAroundProperties.cpp
-index e38599a..7e8b2d5 100644
---- a/words/part/dialogs/KWRunAroundProperties.cpp
-+++ b/words/part/dialogs/KWRunAroundProperties.cpp
-@@ -28,6 +28,8 @@
-
- #include <kundo2command.h>
-
-+#include <QButtonGroup>
-+
- KWRunAroundProperties::KWRunAroundProperties(FrameConfigSharedState *state)
- : m_state(state)
- {
---
-cgit v0.11.2
-
diff --git a/kde/patch/calligra/calligra3_qt513.patch b/kde/patch/calligra/calligra3_qt513.patch
deleted file mode 100644
index 987b353..0000000
--- a/kde/patch/calligra/calligra3_qt513.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 0c5430697bdcf41a45046107b28014e40c49a11a Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Tue, 23 Jul 2019 13:02:34 +0200
-Subject: [PATCH] Fix compilation with Qt 5.13 (missing include)
-
----
- sheets/plugins/calendar/CalendarToolWidget.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/sheets/plugins/calendar/CalendarToolWidget.cpp b/sheets/plugins/calendar/CalendarToolWidget.cpp
-index b10b23022a2..0c5eeb68cf3 100644
---- a/sheets/plugins/calendar/CalendarToolWidget.cpp
-+++ b/sheets/plugins/calendar/CalendarToolWidget.cpp
-@@ -30,6 +30,7 @@
- #include <kdatepicker.h>
-
- #include <QPushButton>
-+#include <QDate>
-
- namespace Calligra
- {
-
diff --git a/kde/patch/calligraplan.patch b/kde/patch/calligraplan.patch
index 4cc1f85..5895d0c 100644
--- a/kde/patch/calligraplan.patch
+++ b/kde/patch/calligraplan.patch
@@ -1,11 +1,2 @@
-# Fix build against Qt 5.11 (fixed in 3.2.0):
-#cat $CWD/patch/calligraplan/calligraplan.qt-511.patch | patch -p2 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix build against kcalendarcore (fixed in 3.2.0):
-#cat $CWD/patch/calligraplan/calligraplan.kcalcore.1.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/calligraplan/calligraplan.kcalcore.2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/calligraplan/calligraplan.kcalendarcore.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix missing include (fixed in 3.2.0):
-#cat $CWD/patch/calligraplan/calligraplan.missingheader.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
+# Fix build against Qt 5.15:
+cat $CWD/patch/calligraplan/calligraplan.qt-5.15.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/calligraplan/calligraplan.kcalcore.1.patch b/kde/patch/calligraplan/calligraplan.kcalcore.1.patch
deleted file mode 100644
index dcbe903..0000000
--- a/kde/patch/calligraplan/calligraplan.kcalcore.1.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 3a01affd66f8dfdcc124e23595217f3ae5a09723 Mon Sep 17 00:00:00 2001
-From: Dag Andersen <danders@get2net.dk>
-Date: Thu, 20 Jun 2019 10:52:00 +0200
-Subject: ICal: Adapt to api changes in KCalCore
-
----
- CMakeLists.txt | 37 +++++++++++-----------
- src/CMakeLists.txt | 4 +++
- .../filters/icalendar/export/icalendarexport.cpp | 5 +++
- 3 files changed, 27 insertions(+), 19 deletions(-)
-
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index 0dabbaf..49fa642 100644
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -75,6 +75,10 @@ if ("${KF5CalendarCore_VERSION}" VERSION_GREATER 5.6.40)
- set(HAVE_QDATETIME_KCALCORE TRUE)
- endif()
-
-+if ("${KF5CalendarCore_VERSION}" VERSION_GREATER 5.11.42)
-+ set(KCALCORE_HAVE_NO_PERSION_PTR TRUE)
-+endif()
-+
- if (PLANCHARTDEBUG)
- add_definitions(-DPLAN_CHART_DEBUG)
- endif ()
-diff --git a/src/plugins/filters/icalendar/export/icalendarexport.cpp b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-index cd75598..ce29bfe 100644
---- a/src/plugins/filters/icalendar/export/icalendarexport.cpp
-+++ b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-@@ -141,8 +141,13 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- todo->setOrganizer(node->projectNode()->leader());
- }
- if ( node->type() != Node::Type_Project && ! node->leader().isEmpty()) {
-+#if KCALCORE_HAVE_NO_PERSION_PTR
-+ KCalCore::Person p = KCalCore::Person::fromFullName(node->leader());
-+ KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p.name(), p.email()));
-+#else
- KCalCore::Person::Ptr p = KCalCore::Person::fromFullName(node->leader());
- KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p->name(), p->email()));
-+#endif
- a->setRole(KCalCore::Attendee::NonParticipant);
- todo->addAttendee(a);
- }
---
-cgit v1.1
-
diff --git a/kde/patch/calligraplan/calligraplan.kcalcore.2.patch b/kde/patch/calligraplan/calligraplan.kcalcore.2.patch
deleted file mode 100644
index 5c118e1..0000000
--- a/kde/patch/calligraplan/calligraplan.kcalcore.2.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From a9eaf1c98ed408fd6e8897fa9e2f99ed17db1ebc Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Tue, 23 Jul 2019 12:26:17 +0200
-Subject: Port to KCalCore API changes
-
-The code is in #if 0, but I tested compilation of this in the calligra
-stable branch:
-https://commits.kde.org/calligra/2d484fda1b31a72659088a4bfce5c3708e923cb0
-
-So you can use KCalCore again if you want :-)
-It's turning into a KF5 framework so the API will be stable from now on.
-
-CCMAIL: danders@get2net.dk
----
- .../filters/icalendar/export/icalendarexport.cpp | 20 +++++++++++++++++---
- 1 file changed, 17 insertions(+), 3 deletions(-)
-
-diff --git a/src/plugins/filters/icalendar/export/icalendarexport.cpp b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-index b21320f..828b641 100644
---- a/src/plugins/filters/icalendar/export/icalendarexport.cpp
-+++ b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-@@ -35,6 +35,7 @@
- #include <kcalcore/attachment.h>
- #include <kcalcore/icalformat.h>
- #include <kcalcore/memorycalendar.h>
-+#include <kcalcore_version.h>
-
- #include <QTextCodec>
- #include <QByteArray>
-@@ -355,14 +356,15 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- todo->setOrganizer(node->projectNode()->leader());
- }
- if ( node->type() != Node::Type_Project && ! node->leader().isEmpty()) {
--#if KCALCORE_HAVE_NO_PERSION_PTR
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
- KCalCore::Person p = KCalCore::Person::fromFullName(node->leader());
-- KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p.name(), p.email()));
-+ KCalCore::Attendee a(p.name(), p.email());
-+ a.setRole(KCalCore::Attendee::NonParticipant);
- #else
- KCalCore::Person::Ptr p = KCalCore::Person::fromFullName(node->leader());
- KCalCore::Attendee::Ptr a(new KCalCore::Attendee(p->name(), p->email()));
--#endif
- a->setRole(KCalCore::Attendee::NonParticipant);
-+#endif
- todo->addAttendee(a);
- }
- DateTime st = node->startTime(id);
-@@ -381,13 +383,21 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- const QList<Resource*> lst = task->requestedResources();
- foreach(const Resource *r, lst) {
- if (r->type() == Resource::Type_Work) {
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
-+ todo->addAttendee(KCalCore::Attendee(r->name(), r->email()));
-+#else
- todo->addAttendee(KCalCore::Attendee::Ptr(new KCalCore::Attendee(r->name(), r->email())));
-+#endif
- }
- }
- } else {
- foreach(const Resource *r, s->resources()) {
- if (r->type() == Resource::Type_Work) {
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
-+ todo->addAttendee(KCalCore::Attendee(r->name(), r->email()));
-+#else
- todo->addAttendee(KCalCore::Attendee::Ptr(new KCalCore::Attendee(r->name(), r->email())));
-+#endif
- }
- }
-
-@@ -398,7 +408,11 @@ void ICalendarExport::createTodos(KCalCore::Calendar::Ptr cal, const Node *node,
- todo->setPercentComplete(task->completion().percentFinished());
- }
- foreach(const Document *doc, node->documents().documents()) {
-+#if KCALCORE_VERSION >= QT_VERSION_CHECK(5, 11, 80)
-+ todo->addAttachment(KCalCore::Attachment(doc->url().url()));
-+#else
- todo->addAttachment(KCalCore::Attachment::Ptr(new KCalCore::Attachment(doc->url().url())));
-+#endif
- }
- if (! parent.isNull()) {
- todo->setRelatedTo(parent->uid(), KCalCore::Incidence::RelTypeParent);
---
-cgit v1.1
-
diff --git a/kde/patch/calligraplan/calligraplan.kcalendarcore.patch b/kde/patch/calligraplan/calligraplan.kcalendarcore.patch
deleted file mode 100644
index 42aa135..0000000
--- a/kde/patch/calligraplan/calligraplan.kcalendarcore.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 2f5505cf03ff865349d06e1d5c39007c52e7cd10 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <asturm@gentoo.org>
-Date: Fri, 16 Aug 2019 15:49:09 +0200
-Subject: [PATCH] Fix headers after kcalcore->kcalendercore rename happened
-
----
- .../filters/icalendar/export/icalendarexport.cpp | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/plugins/filters/icalendar/export/icalendarexport.cpp b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-index bb6b097d..729d6e50 100644
---- a/src/plugins/filters/icalendar/export/icalendarexport.cpp
-+++ b/src/plugins/filters/icalendar/export/icalendarexport.cpp
-@@ -31,11 +31,11 @@
- #include <kptdocuments.h>
- #include "kptdebug.h"
-
--#include <kcalcore/attendee.h>
--#include <kcalcore/attachment.h>
--#include <kcalcore/icalformat.h>
--#include <kcalcore/memorycalendar.h>
--#include <kcalcore_version.h>
-+#include <kcalendarcore/attendee.h>
-+#include <kcalendarcore/attachment.h>
-+#include <kcalendarcore/icalformat.h>
-+#include <kcalendarcore/memorycalendar.h>
-+#include <kcalcore_version.h>
-
- #include <QTextCodec>
- #include <QByteArray>
---
-2.22.1
-
-
diff --git a/kde/patch/calligraplan/calligraplan.missingheader.patch b/kde/patch/calligraplan/calligraplan.missingheader.patch
deleted file mode 100644
index b5941c5..0000000
--- a/kde/patch/calligraplan/calligraplan.missingheader.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From fe36bf6f0dc1f0c1e927850dd78093cfe3b7aae2 Mon Sep 17 00:00:00 2001
-From: Albert Astals Cid <aacid@kde.org>
-Date: Sun, 28 Jul 2019 00:07:33 +0200
-Subject: Fix compile on CI
-
-src/workpackage/view.h:148:31: error: field m_scheduleActions has incomplete type QMap<QAction*, KPlato::Schedule*>
----
- src/workpackage/view.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/workpackage/view.h b/src/workpackage/view.h
-index 6cae32b..cd2fc4e 100644
---- a/src/workpackage/view.h
-+++ b/src/workpackage/view.h
-@@ -24,6 +24,7 @@
-
- #include <KoView.h>
-
-+#include <QMap>
- #include <QStackedWidget>
-
- class QPrinter;
---
-cgit v1.1
-
diff --git a/kde/patch/calligraplan/calligraplan.qt-5.15.patch b/kde/patch/calligraplan/calligraplan.qt-5.15.patch
new file mode 100644
index 0000000..c8962a1
--- /dev/null
+++ b/kde/patch/calligraplan/calligraplan.qt-5.15.patch
@@ -0,0 +1,10 @@
+--- ./src/libs/ui/kptganttitemdelegate.cpp.orig 2019-12-12 05:48:13.000000000 -0600
++++ ./src/libs/ui/kptganttitemdelegate.cpp 2020-07-18 14:48:48.058351438 -0500
+@@ -28,6 +28,7 @@
+ #include <QModelIndex>
+ #include <QApplication>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QLocale>
+
+ #include <KLocalizedString>
diff --git a/kde/patch/calligraplan/calligraplan.qt-511.patch b/kde/patch/calligraplan/calligraplan.qt-511.patch
deleted file mode 100644
index c0776fa..0000000
--- a/kde/patch/calligraplan/calligraplan.qt-511.patch
+++ /dev/null
@@ -1,125 +0,0 @@
-From f53805bdc108b608e40f217e6a78e7e4df4284f2 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sun, 18 Mar 2018 11:56:57 +0100
-Subject: [PATCH] Fix build with Qt 5.11 (missing headers)
-
-Reviewers: #calligra:_3.0
-
-Tags: #calligra:_3.0
-
-Differential Revision: https://phabricator.kde.org/D11454
----
- plan/src/kptview.h | 1 +
- plan/src/kptviewlist.cpp | 1 +
- plan/src/libs/ui/kptaccountseditor.cpp | 1 +
- plan/src/libs/ui/kptdocumentspanel.h | 1 +
- plan/src/libs/ui/kptitemviewsettup.cpp | 2 +-
- plan/src/libs/ui/kpttaskeditor.cpp | 1 +
- plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp | 1 +
- plan/src/libs/widgets/KoPageLayoutWidget.cpp | 2 ++
- 15 files changed, 18 insertions(+), 1 deletion(-)
-
-diff --git a/plan/src/kptview.h b/plan/src/kptview.h
-index 44d11935e71..a98e55342db 100644
---- a/plan/src/kptview.h
-+++ b/plan/src/kptview.h
-@@ -28,6 +28,7 @@
- #include "kptcontext.h"
- #include "kptviewbase.h"
-
-+#include <QActionGroup>
- #include <QDockWidget>
- #include <QMap>
-
-diff --git a/plan/src/kptviewlist.cpp b/plan/src/kptviewlist.cpp
-index f34e702e055..0e6db7b2ffe 100644
---- a/plan/src/kptviewlist.cpp
-+++ b/plan/src/kptviewlist.cpp
-@@ -25,6 +25,7 @@
- #include <QStyle>
- #include <QBrush>
- #include <QContextMenuEvent>
-+#include <QHeaderView>
- #include <QMenu>
-
- #include <kmessagebox.h>
-diff --git a/plan/src/libs/ui/kptaccountseditor.cpp b/plan/src/libs/ui/kptaccountseditor.cpp
-index 7991fafd779..54e3a87c94f 100644
---- a/plan/src/libs/ui/kptaccountseditor.cpp
-+++ b/plan/src/libs/ui/kptaccountseditor.cpp
-@@ -40,6 +40,7 @@
- #include <QContextMenuEvent>
- #include <QMenu>
- #include <QAction>
-+#include <QHeaderView>
-
- #include <KLocalizedString>
- #include <kactioncollection.h>
-diff --git a/plan/src/libs/ui/kptdocumentspanel.h b/plan/src/libs/ui/kptdocumentspanel.h
-index 00ea3af80b2..491cb1ebb86 100644
---- a/plan/src/libs/ui/kptdocumentspanel.h
-+++ b/plan/src/libs/ui/kptdocumentspanel.h
-@@ -26,6 +26,7 @@
-
- #include "kptdocuments.h"
-
-+#include <QModelIndexList>
- #include <QWidget>
- #include <kundo2qstack.h>
-
-diff --git a/plan/src/libs/ui/kptitemviewsettup.cpp b/plan/src/libs/ui/kptitemviewsettup.cpp
-index d1c3b1fc157..7c97a070b9a 100644
---- a/plan/src/libs/ui/kptitemviewsettup.cpp
-+++ b/plan/src/libs/ui/kptitemviewsettup.cpp
-@@ -25,9 +25,9 @@
-
- #include "KoPageLayoutWidget.h"
-
-+#include <QHeaderView>
- #include <QPushButton>
-
--
- namespace KPlato
- {
-
-diff --git a/plan/src/libs/ui/kpttaskeditor.cpp b/plan/src/libs/ui/kpttaskeditor.cpp
-index 21546118d33..91db5acbb18 100644
---- a/plan/src/libs/ui/kpttaskeditor.cpp
-+++ b/plan/src/libs/ui/kpttaskeditor.cpp
-@@ -45,6 +45,7 @@
- #include <QVBoxLayout>
- #include <QDragMoveEvent>
- #include <QAction>
-+#include <QHeaderView>
- #include <QMenu>
-
- #include <kactionmenu.h>
-diff --git a/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp b/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp
-index 344ebc2b599..9146f06ab8c 100644
---- a/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp
-+++ b/plan/src/libs/ui/reportsgenerator/ReportsGeneratorView.cpp
-@@ -31,6 +31,7 @@
- #include <KFile>
-
- #include <QAction>
-+#include <QHeaderView>
- #include <QTreeView>
- #include <QStandardItemModel>
- #include <QModelIndex>
-diff --git a/plan/src/libs/widgets/KoPageLayoutWidget.cpp b/plan/src/libs/widgets/KoPageLayoutWidget.cpp
-index c9e17b748a9..b67e9848807 100644
---- a/plan/src/libs/widgets/KoPageLayoutWidget.cpp
-+++ b/plan/src/libs/widgets/KoPageLayoutWidget.cpp
-@@ -23,6 +23,8 @@
-
- #include <KoUnit.h>
-
-+#include <QButtonGroup>
-+
- class Q_DECL_HIDDEN KoPageLayoutWidget::Private
- {
- public:
---
-2.16.2
-
-
diff --git a/kde/patch/cantor.patch b/kde/patch/cantor.patch
deleted file mode 100644
index 54f2b47..0000000
--- a/kde/patch/cantor.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix build against KF 5.31.0 (repaired in 16.12.3):
-#cat $CWD/patch/cantor/cantor_python.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cat $CWD/patch/cantor/cantor_julia.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/cantor/cantor_julia.patch b/kde/patch/cantor/cantor_julia.patch
deleted file mode 100644
index 5c381ca..0000000
--- a/kde/patch/cantor/cantor_julia.patch
+++ /dev/null
@@ -1,193 +0,0 @@
-Patch taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/plain/kde-apps/cantor/files/cantor-16.12.2-julia-kf-5.31.patch
-
-From 45322d9f58f50df3d4d5755d4199e579f6fd8646 Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Sat, 11 Feb 2017 22:46:35 +0100
-Subject: [PATCH] [julia] Fix build with -fno-operator-names
-
-REVIEW: 129942
----
- src/backends/julia/juliaexpression.cpp | 6 +++---
- src/backends/julia/juliaextensions.cpp | 4 ++--
- src/backends/julia/juliahighlighter.cpp | 4 ++--
- src/backends/julia/juliakeywords.cpp | 10 +++++-----
- src/backends/julia/juliaserver/juliaserver.cpp | 4 ++--
- src/backends/julia/juliaserver/main.cpp | 4 ++--
- src/backends/julia/juliasession.cpp | 4 ++--
- 7 files changed, 18 insertions(+), 18 deletions(-)
-
-diff --git a/src/backends/julia/juliaexpression.cpp b/src/backends/julia/juliaexpression.cpp
-index 27cdd85..618200d 100644
---- a/src/backends/julia/juliaexpression.cpp
-+++ b/src/backends/julia/juliaexpression.cpp
-@@ -40,7 +40,7 @@ void JuliaExpression::evaluate()
-
- // Plots integration
- m_plot_filename.clear();
-- if (juliaSession->integratePlots() and checkPlotShowingCommands()) {
-+ if (juliaSession->integratePlots() && checkPlotShowingCommands()) {
- // Simply add plot saving command to the end of execution
- QStringList inlinePlotFormats;
- inlinePlotFormats << QLatin1String("svg");
-@@ -73,8 +73,8 @@ void JuliaExpression::finalize()
- setResult(new Cantor::TextResult(juliaSession->getOutput()));
- setStatus(Cantor::Expression::Error);
- } else {
-- if (not m_plot_filename.isEmpty()
-- and QFileInfo(m_plot_filename).exists()) {
-+ if (!m_plot_filename.isEmpty()
-+ && QFileInfo(m_plot_filename).exists()) {
- // If we have plot in result, show it
- setResult(
- new Cantor::ImageResult(QUrl::fromLocalFile(m_plot_filename)));
-diff --git a/src/backends/julia/juliaextensions.cpp b/src/backends/julia/juliaextensions.cpp
-index 4585c6f..ad5e3a9 100644
---- a/src/backends/julia/juliaextensions.cpp
-+++ b/src/backends/julia/juliaextensions.cpp
-@@ -138,7 +138,7 @@ QString JuliaPlotExtension::plotFunction2d(
- {
- auto new_left = left;
- auto new_right = right;
-- if (new_left.isEmpty() and new_right.isEmpty()) {
-+ if (new_left.isEmpty() && new_right.isEmpty()) {
- new_left = QLatin1String("-1");
- new_right = QLatin1String("1");
- } else if (new_left.isEmpty()) {
-@@ -165,7 +165,7 @@ QString JuliaPlotExtension::plotFunction3d(
- {
-
- auto update_interval = [](Interval &interval) {
-- if (interval.first.isEmpty() and interval.second.isEmpty()) {
-+ if (interval.first.isEmpty() && interval.second.isEmpty()) {
- interval.first = QLatin1String("-1");
- interval.second = QLatin1String("1");
- } else if (interval.first.isEmpty()) {
-diff --git a/src/backends/julia/juliahighlighter.cpp b/src/backends/julia/juliahighlighter.cpp
-index 4795361..f7d3622 100644
---- a/src/backends/julia/juliahighlighter.cpp
-+++ b/src/backends/julia/juliahighlighter.cpp
-@@ -98,7 +98,7 @@ void JuliaHighlighter::highlightBlock(const QString &text)
- while (pos < text.length()) {
- // Trying to close current environments
- bool triggered = false;
-- for (int i = 0; i < flags.size() and not triggered; i++) {
-+ for (int i = 0; i < flags.size() && !triggered; i++) {
- int flag = flags[i];
- QRegExp &regexp = regexps_ends[i];
- QTextCharFormat &format = formats[i];
-@@ -144,7 +144,7 @@ void JuliaHighlighter::highlightBlock(const QString &text)
- singleLineCommentStart.indexIn(text, pos);
-
- if (singleLineCommentStartPos != -1
-- and singleLineCommentStartPos < minPos) {
-+ && singleLineCommentStartPos < minPos) {
- // single line comment starts earlier
- setFormat(pos, text.length() - pos, commentFormat());
- break;
-diff --git a/src/backends/julia/juliakeywords.cpp b/src/backends/julia/juliakeywords.cpp
-index f0a5846..8a0efec 100644
---- a/src/backends/julia/juliakeywords.cpp
-+++ b/src/backends/julia/juliakeywords.cpp
-@@ -62,11 +62,11 @@ void JuliaKeywords::loadFromFile()
- const QStringRef name = xml.name();
-
- if (name == QLatin1String("keywords")
-- or name == QLatin1String("variables")
-- or name == QLatin1String("plot_showing_commands")) {
-+ || name == QLatin1String("variables")
-+ || name == QLatin1String("plot_showing_commands")) {
- while (xml.readNextStartElement()) {
- Q_ASSERT(
-- xml.isStartElement() and xml.name() == QLatin1String("word")
-+ xml.isStartElement() && xml.name() == QLatin1String("word")
- );
-
- const QString text = xml.readElementText();
-@@ -91,7 +91,7 @@ void JuliaKeywords::loadFromFile()
-
- void JuliaKeywords::addVariable(const QString &variable)
- {
-- if (not m_variables.contains(variable)) {
-+ if (!m_variables.contains(variable)) {
- m_variables << variable;
- }
- }
-@@ -104,7 +104,7 @@ void JuliaKeywords::clearVariables()
-
- void JuliaKeywords::addFunction(const QString &function)
- {
-- if (not m_functions.contains(function)) {
-+ if (!m_functions.contains(function)) {
- m_functions << function;
- }
- }
-diff --git a/src/backends/julia/juliaserver/juliaserver.cpp b/src/backends/julia/juliaserver/juliaserver.cpp
-index c9beb4c..91585cf 100644
---- a/src/backends/julia/juliaserver/juliaserver.cpp
-+++ b/src/backends/julia/juliaserver/juliaserver.cpp
-@@ -47,7 +47,7 @@ void JuliaServer::runJuliaCommand(const QString &command)
- {
- // Redirect stdout, stderr to temprorary files
- QTemporaryFile output, error;
-- if (not output.open() or not error.open()) {
-+ if (!output.open() || !error.open()) {
- qFatal("Unable to create temprorary files for stdout/stderr");
- return;
- }
-@@ -90,7 +90,7 @@ void JuliaServer::runJuliaCommand(const QString &command)
- bool is_nothing = jl_unbox_bool(
- static_cast<jl_value_t *>(jl_call2(equality, nothing, val))
- );
-- if (not is_nothing) {
-+ if (!is_nothing) {
- jl_static_show(JL_STDOUT, val);
- }
- m_was_exception = false;
-diff --git a/src/backends/julia/juliaserver/main.cpp b/src/backends/julia/juliaserver/main.cpp
-index ad7e4d9..11687ec 100644
---- a/src/backends/julia/juliaserver/main.cpp
-+++ b/src/backends/julia/juliaserver/main.cpp
-@@ -30,7 +30,7 @@ int main(int argc, char *argv[])
- {
- QCoreApplication app(argc, argv);
-
-- if (not QDBusConnection::sessionBus().isConnected()) {
-+ if (!QDBusConnection::sessionBus().isConnected()) {
- qWarning() << "Can't connect to the D-Bus session bus.\n"
- "To start it, run: eval `dbus-launch --auto-syntax`";
- return 1;
-@@ -39,7 +39,7 @@ int main(int argc, char *argv[])
- const QString &serviceName =
- QString::fromLatin1("org.kde.Cantor.Julia-%1").arg(app.applicationPid());
-
-- if (not QDBusConnection::sessionBus().registerService(serviceName)) {
-+ if (!QDBusConnection::sessionBus().registerService(serviceName)) {
- qWarning() << QDBusConnection::sessionBus().lastError().message();
- return 2;
- }
-diff --git a/src/backends/julia/juliasession.cpp b/src/backends/julia/juliasession.cpp
-index 425e6cb..9183e11 100644
---- a/src/backends/julia/juliasession.cpp
-+++ b/src/backends/julia/juliasession.cpp
-@@ -86,7 +86,7 @@ void JuliaSession::login()
- QDBusConnection::sessionBus()
- );
-
-- if (not m_interface->isValid()) {
-+ if (!m_interface->isValid()) {
- qWarning() << QDBusConnection::sessionBus().lastError().message();
- return;
- }
-@@ -213,7 +213,7 @@ bool JuliaSession::getWasException()
- {
- const QDBusReply<bool> &reply =
- m_interface->call(QLatin1String("getWasException"));
-- return reply.isValid() and reply.value();
-+ return reply.isValid() && reply.value();
- }
-
- void JuliaSession::listVariables()
---
-2.10.2
-
diff --git a/kde/patch/cantor/cantor_python.patch b/kde/patch/cantor/cantor_python.patch
deleted file mode 100644
index aa2b398..0000000
--- a/kde/patch/cantor/cantor_python.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-Patch taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/plain/kde-apps/cantor/files/cantor-16.12.2-python-kf-5.31.patch
-
-commit 4b8ef6bed62daced90c7826985650c2a813d2996
-Author: Jonathan Riddell <jr@jriddell.org>
-Date: Wed Feb 8 14:56:48 2017 +0000
-
- remove modern C++ use to fix compile with current KDE policy
-
-diff --git a/src/backends/python/pythonhighlighter.cpp b/src/backends/python/pythonhighlighter.cpp
-index 4064524..87b10dd 100644
---- a/src/backends/python/pythonhighlighter.cpp
-+++ b/src/backends/python/pythonhighlighter.cpp
-@@ -87,7 +87,7 @@ void PythonHighlighter::highlightBlock(const QString &text)
- while (pos < text.length()) {
- // Trying to close current environments
- bool triggered = false;
-- for (int i = 0; i < flags.size() and not triggered; i++) {
-+ for (int i = 0; i < flags.size() && !triggered; i++) {
- int flag = flags[i];
- QRegExp &regexp = regexps[i];
- QTextCharFormat &format = formats[i];
-@@ -126,7 +126,7 @@ void PythonHighlighter::highlightBlock(const QString &text)
- singleLineCommentStart.indexIn(text, pos);
-
- if (singleLineCommentStartPos != -1
-- and singleLineCommentStartPos < minPos) {
-+ && singleLineCommentStartPos < minPos) {
- setFormat(pos, text.length() - pos, commentFormat());
- break;
- } else if (minRegexp) {
diff --git a/kde/patch/digikam.patch b/kde/patch/digikam.patch
deleted file mode 100644
index 8f50ec2..0000000
--- a/kde/patch/digikam.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-# Fix compilation with clang.
-# Fixed in digikam 5.5.0.
-#cat $CWD/patch/digikam/digikam_clang_fix.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix linking issue, backport from git master:
-#cd core
-# cat $CWD/patch/digikam/digikam_databasemodel.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-#cd -
-
-# Fix crashes with imagemagick 7 (fixed post digikam 6.4.0):
-cat $CWD/patch/digikam/digikam_imagemagick7.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/digikam/digikam_clang_fix.patch b/kde/patch/digikam/digikam_clang_fix.patch
deleted file mode 100644
index a4d77b0..0000000
--- a/kde/patch/digikam/digikam_clang_fix.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-Taken from:
-http://pkgs.fedoraproject.org/cgit/rpms/digikam.git/
-And added and extra '/core/' path componenent.
-
-From 86cd0d1d89c8b4d13f06dc8a353bdd99f13c4758 Mon Sep 17 00:00:00 2001
-From: Gilles Caulier <caulier.gilles@gmail.com>
-Date: Wed, 18 Jan 2017 10:13:20 +0100
-Subject: [PATCH 2/2] Fix compilation with clang
-
----
- libs/dmetadata/metaengine_p.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/core/libs/dmetadata/metaengine_p.cpp b/core/libs/dmetadata/metaengine_p.cpp
-index 2c83b58..2b44e06 100644
---- a/core/libs/dmetadata/metaengine_p.cpp
-+++ b/core/libs/dmetadata/metaengine_p.cpp
-@@ -49,7 +49,7 @@ extern "C"
- #include "digikam_debug.h"
-
- // Pragma directives to reduce warnings from Exiv2.
--#if not defined(__APPLE__) && defined(__GNUC__)
-+#if !defined(__APPLE__) && defined(__GNUC__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- #endif
-@@ -723,7 +723,7 @@ void MetaEngine::Private::loadSidecarData(Exiv2::Image::AutoPtr xmpsidecar)
- } // namespace Digikam
-
- // Restore warnings
--#if not defined(__APPLE__) && defined(__GNUC__)
-+#if !defined(__APPLE__) && defined(__GNUC__)
- #pragma GCC diagnostic pop
- #endif
-
---
-2.9.3
-
diff --git a/kde/patch/digikam/digikam_databasemodel.patch b/kde/patch/digikam/digikam_databasemodel.patch
deleted file mode 100644
index 8b2fff7..0000000
--- a/kde/patch/digikam/digikam_databasemodel.patch
+++ /dev/null
@@ -1,13337 +0,0 @@
-From 7e00441c257e7e9e5dc5ab983fc06046fb72b0c5 Mon Sep 17 00:00:00 2001
-From: Gilles Caulier <caulier.gilles@gmail.com>
-Date: Sat, 22 Jul 2017 15:46:08 +0200
-Subject: fix broken linking stage under MacOS with macports. move database
- models into libdigikamdatabase. Let's others model in place to be included
- into libdigikamcore
-
----
- libs/database/CMakeLists.txt | 16 +-
- libs/database/models/imagefiltermodel.cpp | 1116 ++++++++++++++++++
- libs/database/models/imagefiltermodel.h | 299 +++++
- libs/database/models/imagefiltermodelpriv.cpp | 258 ++++
- libs/database/models/imagefiltermodelpriv.h | 159 +++
- libs/database/models/imagefiltermodelthreads.cpp | 40 +
- libs/database/models/imagefiltermodelthreads.h | 100 ++
- libs/database/models/imagefiltersettings.cpp | 952 +++++++++++++++
- libs/database/models/imagefiltersettings.h | 349 ++++++
- libs/database/models/imagelistmodel.cpp | 70 ++
- libs/database/models/imagelistmodel.h | 63 +
- libs/database/models/imagemodel.cpp | 1368 ++++++++++++++++++++++
- libs/database/models/imagemodel.h | 364 ++++++
- libs/database/models/imagesortsettings.cpp | 400 +++++++
- libs/database/models/imagesortsettings.h | 225 ++++
- libs/database/models/imagethumbnailmodel.cpp | 323 +++++
- libs/database/models/imagethumbnailmodel.h | 140 +++
- libs/database/models/imageversionsmodel.cpp | 183 +++
- libs/database/models/imageversionsmodel.h | 75 ++
- libs/models/CMakeLists.txt | 15 +-
- libs/models/imagefiltermodel.cpp | 1116 ------------------
- libs/models/imagefiltermodel.h | 299 -----
- libs/models/imagefiltermodelpriv.cpp | 258 ----
- libs/models/imagefiltermodelpriv.h | 159 ---
- libs/models/imagefiltermodelthreads.cpp | 40 -
- libs/models/imagefiltermodelthreads.h | 100 --
- libs/models/imagefiltersettings.cpp | 952 ---------------
- libs/models/imagefiltersettings.h | 349 ------
- libs/models/imagelistmodel.cpp | 70 --
- libs/models/imagelistmodel.h | 63 -
- libs/models/imagemodel.cpp | 1368 ----------------------
- libs/models/imagemodel.h | 364 ------
- libs/models/imagesortsettings.cpp | 400 -------
- libs/models/imagesortsettings.h | 225 ----
- libs/models/imagethumbnailmodel.cpp | 323 -----
- libs/models/imagethumbnailmodel.h | 140 ---
- libs/models/imageversionsmodel.cpp | 183 ---
- libs/models/imageversionsmodel.h | 75 --
- 38 files changed, 6499 insertions(+), 6500 deletions(-)
- create mode 100644 libs/database/models/imagefiltermodel.cpp
- create mode 100644 libs/database/models/imagefiltermodel.h
- create mode 100644 libs/database/models/imagefiltermodelpriv.cpp
- create mode 100644 libs/database/models/imagefiltermodelpriv.h
- create mode 100644 libs/database/models/imagefiltermodelthreads.cpp
- create mode 100644 libs/database/models/imagefiltermodelthreads.h
- create mode 100644 libs/database/models/imagefiltersettings.cpp
- create mode 100644 libs/database/models/imagefiltersettings.h
- create mode 100644 libs/database/models/imagelistmodel.cpp
- create mode 100644 libs/database/models/imagelistmodel.h
- create mode 100644 libs/database/models/imagemodel.cpp
- create mode 100644 libs/database/models/imagemodel.h
- create mode 100644 libs/database/models/imagesortsettings.cpp
- create mode 100644 libs/database/models/imagesortsettings.h
- create mode 100644 libs/database/models/imagethumbnailmodel.cpp
- create mode 100644 libs/database/models/imagethumbnailmodel.h
- create mode 100644 libs/database/models/imageversionsmodel.cpp
- create mode 100644 libs/database/models/imageversionsmodel.h
- delete mode 100644 libs/models/imagefiltermodel.cpp
- delete mode 100644 libs/models/imagefiltermodel.h
- delete mode 100644 libs/models/imagefiltermodelpriv.cpp
- delete mode 100644 libs/models/imagefiltermodelpriv.h
- delete mode 100644 libs/models/imagefiltermodelthreads.cpp
- delete mode 100644 libs/models/imagefiltermodelthreads.h
- delete mode 100644 libs/models/imagefiltersettings.cpp
- delete mode 100644 libs/models/imagefiltersettings.h
- delete mode 100644 libs/models/imagelistmodel.cpp
- delete mode 100644 libs/models/imagelistmodel.h
- delete mode 100644 libs/models/imagemodel.cpp
- delete mode 100644 libs/models/imagemodel.h
- delete mode 100644 libs/models/imagesortsettings.cpp
- delete mode 100644 libs/models/imagesortsettings.h
- delete mode 100644 libs/models/imagethumbnailmodel.cpp
- delete mode 100644 libs/models/imagethumbnailmodel.h
- delete mode 100644 libs/models/imageversionsmodel.cpp
- delete mode 100644 libs/models/imageversionsmodel.h
-
-diff --git a/libs/database/CMakeLists.txt b/libs/database/CMakeLists.txt
-index 7d05536..a431a36 100644
---- a/libs/database/CMakeLists.txt
-+++ b/libs/database/CMakeLists.txt
-@@ -13,6 +13,18 @@ endif (POLICY CMP0063)
- # Boost uses operator names (and, not, ...)
- string(REPLACE "-fno-operator-names" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
-
-+set(libdatabasemodels_SRCS
-+ models/imagemodel.cpp
-+ models/imagefiltermodel.cpp
-+ models/imagefiltermodelpriv.cpp
-+ models/imagefiltermodelthreads.cpp
-+ models/imagefiltersettings.cpp
-+ models/imagelistmodel.cpp
-+ models/imagesortsettings.cpp
-+ models/imagethumbnailmodel.cpp
-+ models/imageversionsmodel.cpp
-+)
-+
- set(libdatabasecore_SRCS
- server/databaseserverstarter.cpp
- server/databaseservererror.cpp
-@@ -152,10 +164,10 @@ if(ENABLE_DBUS)
- include_directories($<TARGET_PROPERTY:Qt5::DBus,INTERFACE_INCLUDE_DIRECTORIES>)
- endif()
-
--add_library(digikamdatabase_src OBJECT ${digikamdatabase_LIB_SRCS})
-+add_library(digikamdatabase_src OBJECT ${digikamdatabase_LIB_SRCS} ${libdatabasemodels_SRCS})
- add_library(digikamdatabasemain_src OBJECT ${libdatabaseutils_SRCS} ${libimgqsort_SRCS})
- add_library(digikamdatabasecore_src OBJECT ${libdatabasecore_SRCS})
--add_library(digikamdatabase SHARED $<TARGET_OBJECTS:digikamdatabase_src> $<TARGET_OBJECTS:digikamdatabasemodels_src>)
-+add_library(digikamdatabase $<TARGET_OBJECTS:digikamdatabase_src>)
-
- generate_export_header(digikamdatabase
- BASE_NAME digikam_database
-diff --git a/libs/database/models/imagefiltermodel.cpp b/libs/database/models/imagefiltermodel.cpp
-new file mode 100644
-index 0000000..3d57e05
---- /dev/null
-+++ b/libs/database/models/imagefiltermodel.cpp
-@@ -0,0 +1,1116 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltermodel.h"
-+#include "imagefiltermodelpriv.h"
-+#include "imagefiltermodelthreads.h"
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbaccess.h"
-+#include "coredbchangesets.h"
-+#include "coredbwatch.h"
-+#include "imageinfolist.h"
-+#include "imagemodel.h"
-+
-+namespace Digikam
-+{
-+
-+ImageSortFilterModel::ImageSortFilterModel(QObject* parent)
-+ : DCategorizedSortFilterProxyModel(parent), m_chainedModel(0)
-+{
-+}
-+
-+void ImageSortFilterModel::setSourceImageModel(ImageModel* source)
-+{
-+ if (m_chainedModel)
-+ {
-+ m_chainedModel->setSourceImageModel(source);
-+ }
-+ else
-+ {
-+ setDirectSourceImageModel(source);
-+ }
-+}
-+
-+void ImageSortFilterModel::setSourceFilterModel(ImageSortFilterModel* source)
-+{
-+ if (source)
-+ {
-+ ImageModel* const model = sourceImageModel();
-+
-+ if (model)
-+ {
-+ source->setSourceImageModel(model);
-+ }
-+ }
-+
-+ m_chainedModel = source;
-+ setSourceModel(source);
-+}
-+
-+void ImageSortFilterModel::setDirectSourceImageModel(ImageModel* model)
-+{
-+ setSourceModel(model);
-+}
-+
-+void ImageSortFilterModel::setSourceModel(QAbstractItemModel* model)
-+{
-+ // made it protected, only setSourceImageModel is public
-+ DCategorizedSortFilterProxyModel::setSourceModel(model);
-+}
-+
-+ImageModel* ImageSortFilterModel::sourceImageModel() const
-+{
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->sourceImageModel();
-+ }
-+
-+ return static_cast<ImageModel*>(sourceModel());
-+}
-+
-+ImageSortFilterModel* ImageSortFilterModel::sourceFilterModel() const
-+{
-+ return m_chainedModel;
-+}
-+
-+ImageFilterModel* ImageSortFilterModel::imageFilterModel() const
-+{
-+ // reimplemented in ImageFilterModel
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->imageFilterModel();
-+ }
-+
-+ return 0;
-+}
-+
-+QModelIndex ImageSortFilterModel::mapToSourceImageModel(const QModelIndex& index) const
-+{
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->mapToSourceImageModel(mapToSource(index));
-+ }
-+
-+ return mapToSource(index);
-+}
-+
-+QModelIndex ImageSortFilterModel::mapFromSourceImageModel(const QModelIndex& albummodel_index) const
-+{
-+ if (m_chainedModel)
-+ {
-+ return mapFromSource(m_chainedModel->mapFromSourceImageModel(albummodel_index));
-+ }
-+
-+ return mapFromSource(albummodel_index);
-+}
-+
-+
-+QModelIndex ImageSortFilterModel::mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const
-+{
-+ if (m_chainedModel)
-+ {
-+ return m_chainedModel->mapToSourceImageModel(sourceModel_index);
-+ }
-+ return sourceModel_index;
-+}
-+
-+// -------------- Convenience mappers -------------------------------------------------------------------
-+
-+QList<QModelIndex> ImageSortFilterModel::mapListToSource(const QList<QModelIndex>& indexes) const
-+{
-+ QList<QModelIndex> sourceIndexes;
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ sourceIndexes << mapToSourceImageModel(index);
-+ }
-+ return sourceIndexes;
-+}
-+
-+QList<QModelIndex> ImageSortFilterModel::mapListFromSource(const QList<QModelIndex>& sourceIndexes) const
-+{
-+ QList<QModelIndex> indexes;
-+ foreach(const QModelIndex& index, sourceIndexes)
-+ {
-+ indexes << mapFromSourceImageModel(index);
-+ }
-+ return indexes;
-+}
-+
-+ImageInfo ImageSortFilterModel::imageInfo(const QModelIndex& index) const
-+{
-+ return sourceImageModel()->imageInfo(mapToSourceImageModel(index));
-+}
-+
-+qlonglong ImageSortFilterModel::imageId(const QModelIndex& index) const
-+{
-+ return sourceImageModel()->imageId(mapToSourceImageModel(index));
-+}
-+
-+QList<ImageInfo> ImageSortFilterModel::imageInfos(const QList<QModelIndex>& indexes) const
-+{
-+ QList<ImageInfo> infos;
-+ ImageModel* const model = sourceImageModel();
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ infos << model->imageInfo(mapToSourceImageModel(index));
-+ }
-+
-+ return infos;
-+}
-+
-+QList<qlonglong> ImageSortFilterModel::imageIds(const QList<QModelIndex>& indexes) const
-+{
-+ QList<qlonglong> ids;
-+ ImageModel* const model = sourceImageModel();
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ ids << model->imageId(mapToSourceImageModel(index));
-+ }
-+
-+ return ids;
-+}
-+
-+QModelIndex ImageSortFilterModel::indexForPath(const QString& filePath) const
-+{
-+ return mapFromSourceImageModel(sourceImageModel()->indexForPath(filePath));
-+}
-+
-+QModelIndex ImageSortFilterModel::indexForImageInfo(const ImageInfo& info) const
-+{
-+ return mapFromSourceImageModel(sourceImageModel()->indexForImageInfo(info));
-+}
-+
-+QModelIndex ImageSortFilterModel::indexForImageId(qlonglong id) const
-+{
-+ return mapFromSourceImageModel(sourceImageModel()->indexForImageId(id));
-+}
-+
-+QList<ImageInfo> ImageSortFilterModel::imageInfosSorted() const
-+{
-+ QList<ImageInfo> infos;
-+ const int size = rowCount();
-+ ImageModel* const model = sourceImageModel();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ infos << model->imageInfo(mapToSourceImageModel(index(i, 0)));
-+ }
-+
-+ return infos;
-+}
-+
-+// --------------------------------------------------------------------------------------------
-+
-+ImageFilterModel::ImageFilterModel(QObject* parent)
-+ : ImageSortFilterModel(parent),
-+ d_ptr(new ImageFilterModelPrivate)
-+{
-+ d_ptr->init(this);
-+}
-+
-+ImageFilterModel::ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent)
-+ : ImageSortFilterModel(parent),
-+ d_ptr(&dd)
-+{
-+ d_ptr->init(this);
-+}
-+
-+ImageFilterModel::~ImageFilterModel()
-+{
-+ Q_D(ImageFilterModel);
-+ delete d;
-+}
-+
-+void ImageFilterModel::setDirectSourceImageModel(ImageModel* sourceModel)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ if (d->imageModel)
-+ {
-+ d->imageModel->unsetPreprocessor(d);
-+ disconnect(d->imageModel, SIGNAL(modelReset()),
-+ this, SLOT(slotModelReset()));
-+ slotModelReset();
-+ }
-+
-+ d->imageModel = sourceModel;
-+
-+ if (d->imageModel)
-+ {
-+ d->imageModel->setPreprocessor(d);
-+
-+ connect(d->imageModel, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)),
-+ d, SLOT(preprocessInfos(QList<ImageInfo>,QList<QVariant>)));
-+
-+ connect(d->imageModel, SIGNAL(processAdded(QList<ImageInfo>,QList<QVariant>)),
-+ d, SLOT(processAddedInfos(QList<ImageInfo>,QList<QVariant>)));
-+
-+ connect(d, SIGNAL(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)),
-+ d->imageModel, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
-+
-+ connect(d, SIGNAL(reAddingFinished()),
-+ d->imageModel, SLOT(reAddingFinished()));
-+
-+ connect(d->imageModel, SIGNAL(modelReset()),
-+ this, SLOT(slotModelReset()));
-+
-+ connect(d->imageModel, SIGNAL(imageChange(ImageChangeset,QItemSelection)),
-+ this, SLOT(slotImageChange(ImageChangeset)));
-+
-+ connect(d->imageModel, SIGNAL(imageTagChange(ImageTagChangeset,QItemSelection)),
-+ this, SLOT(slotImageTagChange(ImageTagChangeset)));
-+ }
-+
-+ setSourceModel(d->imageModel);
-+}
-+
-+QVariant ImageFilterModel::data(const QModelIndex& index, int role) const
-+{
-+ Q_D(const ImageFilterModel);
-+
-+ if (!index.isValid())
-+ {
-+ return QVariant();
-+ }
-+
-+ switch (role)
-+ {
-+ // Attention: This breaks should there ever be another filter model between this and the ImageModel
-+
-+ case DCategorizedSortFilterProxyModel::CategoryDisplayRole:
-+ return categoryIdentifier(d->imageModel->imageInfoRef(mapToSource(index)));
-+ case CategorizationModeRole:
-+ return d->sorter.categorizationMode;
-+ case SortOrderRole:
-+ return d->sorter.sortRole;
-+ //case CategoryCountRole:
-+ // return categoryCount(d->imageModel->imageInfoRef(mapToSource(index)));
-+ case CategoryAlbumIdRole:
-+ return d->imageModel->imageInfoRef(mapToSource(index)).albumId();
-+ case CategoryFormatRole:
-+ return d->imageModel->imageInfoRef(mapToSource(index)).format();
-+ case GroupIsOpenRole:
-+ return d->groupFilter.isAllOpen() ||
-+ d->groupFilter.isOpen(d->imageModel->imageInfoRef(mapToSource(index)).id());
-+ case ImageFilterModelPointerRole:
-+ return QVariant::fromValue(const_cast<ImageFilterModel*>(this));
-+ }
-+
-+ return DCategorizedSortFilterProxyModel::data(index, role);
-+}
-+
-+ImageFilterModel* ImageFilterModel::imageFilterModel() const
-+{
-+ return const_cast<ImageFilterModel*>(this);
-+}
-+
-+DatabaseFields::Set ImageFilterModel::suggestedWatchFlags() const
-+{
-+ DatabaseFields::Set watchFlags;
-+ watchFlags |= DatabaseFields::Name | DatabaseFields::FileSize | DatabaseFields::ModificationDate;
-+ watchFlags |= DatabaseFields::Rating | DatabaseFields::CreationDate | DatabaseFields::Orientation |
-+ DatabaseFields::Width | DatabaseFields::Height;
-+ watchFlags |= DatabaseFields::Comment;
-+ watchFlags |= DatabaseFields::ImageRelations;
-+ return watchFlags;
-+}
-+
-+// -------------- Filter settings --------------
-+
-+void ImageFilterModel::setDayFilter(const QList<QDateTime>& days)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setDayFilter(days);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-+ ImageFilterSettings::MatchingCondition matchingCond,
-+ bool showUnTagged, const QList<int>& clTagIds, const QList<int>& plTagIds)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setTagFilter(includedTags, excludedTags, matchingCond, showUnTagged, clTagIds, plTagIds);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setRatingFilter(rating, ratingCond, isUnratedExcluded);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setUrlWhitelist(const QList<QUrl> urlList, const QString& id)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setUrlWhitelist(urlList, id);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setIdWhitelist(idList, id);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setMimeTypeFilter(int mimeTypeFilter)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setMimeTypeFilter(mimeTypeFilter);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setGeolocationFilter(condition);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setTextFilter(const SearchTextFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->filter.setTextFilter(settings);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+void ImageFilterModel::setImageFilterSettings(const ImageFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ d->version++;
-+ d->filter = settings;
-+ d->filterCopy = settings;
-+ d->versionFilterCopy = d->versionFilter;
-+ d->groupFilterCopy = d->groupFilter;
-+
-+ d->needPrepareComments = settings.isFilteringByText();
-+ d->needPrepareTags = settings.isFilteringByTags();
-+ d->needPrepareGroups = true;
-+ d->needPrepare = d->needPrepareComments || d->needPrepareTags || d->needPrepareGroups;
-+
-+ d->hasOneMatch = false;
-+ d->hasOneMatchForText = false;
-+ }
-+
-+ d->filterResults.clear();
-+
-+ //d->categoryCountHashInt.clear();
-+ //d->categoryCountHashString.clear();
-+ if (d->imageModel)
-+ {
-+ d->infosToProcess(d->imageModel->imageInfos());
-+ }
-+
-+ emit filterSettingsChanged(settings);
-+}
-+
-+void ImageFilterModel::setVersionManagerSettings(const VersionManagerSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->versionFilter.setVersionManagerSettings(settings);
-+ setVersionImageFilterSettings(d->versionFilter);
-+}
-+
-+void ImageFilterModel::setExceptionList(const QList<qlonglong>& idList, const QString& id)
-+{
-+ Q_D(ImageFilterModel);
-+ d->versionFilter.setExceptionList(idList, id);
-+ setVersionImageFilterSettings(d->versionFilter);
-+}
-+
-+void ImageFilterModel::setVersionImageFilterSettings(const VersionImageFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->versionFilter = settings;
-+ slotUpdateFilter();
-+}
-+
-+bool ImageFilterModel::isGroupOpen(qlonglong group) const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->groupFilter.isOpen(group);
-+}
-+
-+bool ImageFilterModel::isAllGroupsOpen() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->groupFilter.isAllOpen();
-+}
-+
-+void ImageFilterModel::setGroupOpen(qlonglong group, bool open)
-+{
-+ Q_D(ImageFilterModel);
-+ d->groupFilter.setOpen(group, open);
-+ setGroupImageFilterSettings(d->groupFilter);
-+}
-+
-+void ImageFilterModel::toggleGroupOpen(qlonglong group)
-+{
-+ setGroupOpen(group, !isGroupOpen(group));
-+}
-+
-+void ImageFilterModel::setAllGroupsOpen(bool open)
-+{
-+ Q_D(ImageFilterModel);
-+ d->groupFilter.setAllOpen(open);
-+ setGroupImageFilterSettings(d->groupFilter);
-+}
-+
-+void ImageFilterModel::setGroupImageFilterSettings(const GroupImageFilterSettings& settings)
-+{
-+ Q_D(ImageFilterModel);
-+ d->groupFilter = settings;
-+ slotUpdateFilter();
-+}
-+
-+void ImageFilterModel::slotUpdateFilter()
-+{
-+ Q_D(ImageFilterModel);
-+ setImageFilterSettings(d->filter);
-+}
-+
-+ImageFilterSettings ImageFilterModel::imageFilterSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->filter;
-+}
-+
-+ImageSortSettings ImageFilterModel::imageSortSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->sorter;
-+}
-+
-+VersionImageFilterSettings ImageFilterModel::versionImageFilterSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->versionFilter;
-+}
-+
-+GroupImageFilterSettings ImageFilterModel::groupImageFilterSettings() const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->groupFilter;
-+}
-+
-+void ImageFilterModel::slotModelReset()
-+{
-+ Q_D(ImageFilterModel);
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ // discard all packages on the way that are marked as send out for re-add
-+ d->lastDiscardVersion = d->version;
-+ d->sentOutForReAdd = 0;
-+ // discard all packages on the way
-+ d->version++;
-+ d->sentOut = 0;
-+
-+ d->hasOneMatch = false;
-+ d->hasOneMatchForText = false;
-+ }
-+ d->filterResults.clear();
-+}
-+
-+bool ImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
-+{
-+ Q_D(const ImageFilterModel);
-+
-+ if (source_parent.isValid())
-+ {
-+ return false;
-+ }
-+
-+ qlonglong id = d->imageModel->imageId(source_row);
-+ QHash<qlonglong, bool>::const_iterator it = d->filterResults.constFind(id);
-+
-+ if (it != d->filterResults.constEnd())
-+ {
-+ return it.value();
-+ }
-+
-+ // usually done in thread and cache, unless source model changed
-+ ImageInfo info = d->imageModel->imageInfo(source_row);
-+ bool match = d->filter.matches(info);
-+ match = match ? d->versionFilter.matches(info) : false;
-+
-+ return match ? d->groupFilter.matches(info) : false;
-+}
-+
-+void ImageFilterModel::setSendImageInfoSignals(bool sendSignals)
-+{
-+ if (sendSignals)
-+ {
-+ connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-+ this, SLOT(slotRowsInserted(QModelIndex,int,int)));
-+
-+ connect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-+ this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-+ }
-+ else
-+ {
-+ disconnect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-+ this, SLOT(slotRowsInserted(QModelIndex,int,int)));
-+
-+ disconnect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-+ this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-+ }
-+}
-+
-+void ImageFilterModel::slotRowsInserted(const QModelIndex& /*parent*/, int start, int end)
-+{
-+ QList<ImageInfo> infos;
-+
-+ for (int i=start; i<=end; ++i)
-+ {
-+ infos << imageInfo(index(i, 0));
-+ }
-+
-+ emit imageInfosAdded(infos);
-+}
-+
-+void ImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& /*parent*/, int start, int end)
-+{
-+ QList<ImageInfo> infos;
-+
-+ for (int i=start; i<=end; ++i)
-+ {
-+ infos << imageInfo(index(i, 0));
-+ }
-+
-+ emit imageInfosAboutToBeRemoved(infos);
-+}
-+
-+// -------------- Threaded preparation & filtering --------------
-+
-+void ImageFilterModel::addPrepareHook(ImageFilterModelPrepareHook* hook)
-+{
-+ Q_D(ImageFilterModel);
-+ QMutexLocker lock(&d->mutex);
-+ d->prepareHooks << hook;
-+}
-+
-+void ImageFilterModel::removePrepareHook(ImageFilterModelPrepareHook* hook)
-+{
-+ Q_D(ImageFilterModel);
-+ QMutexLocker lock(&d->mutex);
-+ d->prepareHooks.removeAll(hook);
-+}
-+
-+void ImageFilterModelPreparer::process(ImageFilterModelTodoPackage package)
-+{
-+ if (!checkVersion(package))
-+ {
-+ emit discarded(package);
-+ return;
-+ }
-+
-+ // get thread-local copy
-+ bool needPrepareTags, needPrepareComments, needPrepareGroups;
-+ QList<ImageFilterModelPrepareHook*> prepareHooks;
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ needPrepareTags = d->needPrepareTags;
-+ needPrepareComments = d->needPrepareComments;
-+ needPrepareGroups = d->needPrepareGroups;
-+ prepareHooks = d->prepareHooks;
-+ }
-+
-+ //TODO: Make efficient!!
-+ if (needPrepareComments)
-+ {
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ info.comment();
-+ }
-+ }
-+
-+ if (!checkVersion(package))
-+ {
-+ emit discarded(package);
-+ return;
-+ }
-+
-+ // The downside of QVector: At some point, we may need a QList for an API.
-+ // Nonetheless, QList and ImageInfo is fast. We could as well
-+ // reimplement ImageInfoList to ImageInfoVector (internally with templates?)
-+ ImageInfoList infoList;
-+
-+ if (needPrepareTags || needPrepareGroups)
-+ {
-+ infoList = package.infos.toList();
-+ }
-+
-+ if (needPrepareTags)
-+ {
-+ infoList.loadTagIds();
-+ }
-+
-+ if (needPrepareGroups)
-+ {
-+ infoList.loadGroupImageIds();
-+ }
-+
-+ foreach(ImageFilterModelPrepareHook* hook, prepareHooks)
-+ {
-+ hook->prepare(package.infos);
-+ }
-+
-+ emit processed(package);
-+}
-+
-+void ImageFilterModelFilterer::process(ImageFilterModelTodoPackage package)
-+{
-+ if (!checkVersion(package))
-+ {
-+ emit discarded(package);
-+ return;
-+ }
-+
-+ // get thread-local copy
-+ ImageFilterSettings localFilter;
-+ VersionImageFilterSettings localVersionFilter;
-+ GroupImageFilterSettings localGroupFilter;
-+ bool hasOneMatch;
-+ bool hasOneMatchForText;
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ localFilter = d->filterCopy;
-+ localVersionFilter = d->versionFilterCopy;
-+ localGroupFilter = d->groupFilterCopy;
-+ hasOneMatch = d->hasOneMatch;
-+ hasOneMatchForText = d->hasOneMatchForText;
-+ }
-+
-+ // Actual filtering. The variants to spare checking hasOneMatch over and over again.
-+ if (hasOneMatch && hasOneMatchForText)
-+ {
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ package.filterResults[info.id()] = localFilter.matches(info) &&
-+ localVersionFilter.matches(info) &&
-+ localGroupFilter.matches(info);
-+ }
-+ }
-+ else if (hasOneMatch)
-+ {
-+ bool matchForText;
-+
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ package.filterResults[info.id()] = localFilter.matches(info, &matchForText) &&
-+ localVersionFilter.matches(info) &&
-+ localGroupFilter.matches(info);
-+
-+ if (matchForText)
-+ {
-+ hasOneMatchForText = true;
-+ }
-+ }
-+ }
-+ else
-+ {
-+ bool result, matchForText;
-+
-+ foreach(const ImageInfo& info, package.infos)
-+ {
-+ result = localFilter.matches(info, &matchForText) &&
-+ localVersionFilter.matches(info) &&
-+ localGroupFilter.matches(info);
-+ package.filterResults[info.id()] = result;
-+
-+ if (result)
-+ {
-+ hasOneMatch = true;
-+ }
-+
-+ if (matchForText)
-+ {
-+ hasOneMatchForText = true;
-+ }
-+ }
-+ }
-+
-+ if (checkVersion(package))
-+ {
-+ QMutexLocker lock(&d->mutex);
-+ d->hasOneMatch = hasOneMatch;
-+ d->hasOneMatchForText = hasOneMatchForText;
-+ }
-+
-+ emit processed(package);
-+}
-+
-+// -------------- Sorting and Categorization -------------------------------------------------------
-+
-+void ImageFilterModel::setImageSortSettings(const ImageSortSettings& sorter)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter = sorter;
-+ setCategorizedModel(d->sorter.categorizationMode != ImageSortSettings::NoCategories);
-+ invalidate();
-+}
-+
-+void ImageFilterModel::setCategorizationMode(ImageSortSettings::CategorizationMode mode)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setCategorizationMode(mode);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setCategorizationSortOrder(ImageSortSettings::SortOrder order)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setCategorizationSortOrder(order);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setSortRole(ImageSortSettings::SortRole role)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setSortRole(role);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setSortOrder(ImageSortSettings::SortOrder order)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setSortOrder(order);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+void ImageFilterModel::setStringTypeNatural(bool natural)
-+{
-+ Q_D(ImageFilterModel);
-+ d->sorter.setStringTypeNatural(natural);
-+ setImageSortSettings(d->sorter);
-+}
-+
-+int ImageFilterModel::compareCategories(const QModelIndex& left, const QModelIndex& right) const
-+{
-+ // source indexes
-+ Q_D(const ImageFilterModel);
-+
-+ if (!d->sorter.isCategorized())
-+ {
-+ return 0;
-+ }
-+
-+ if (!left.isValid() || !right.isValid())
-+ {
-+ return -1;
-+ }
-+
-+ const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-+ const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
-+
-+ // Check grouping
-+ qlonglong leftGroupImageId = leftInfo.groupImageId();
-+ qlonglong rightGroupImageId = rightInfo.groupImageId();
-+
-+ return compareInfosCategories(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-+ rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
-+}
-+
-+bool ImageFilterModel::subSortLessThan(const QModelIndex& left, const QModelIndex& right) const
-+{
-+ // source indexes
-+ Q_D(const ImageFilterModel);
-+
-+ if (!left.isValid() || !right.isValid())
-+ {
-+ return true;
-+ }
-+
-+ if (left == right)
-+ {
-+ return false;
-+ }
-+
-+ const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-+ const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
-+
-+ if (leftInfo == rightInfo)
-+ {
-+ return d->sorter.lessThan(left.data(ImageModel::ExtraDataRole), right.data(ImageModel::ExtraDataRole));
-+ }
-+
-+ // Check grouping
-+ qlonglong leftGroupImageId = leftInfo.groupImageId();
-+ qlonglong rightGroupImageId = rightInfo.groupImageId();
-+
-+ // Either no grouping (-1), or same group image, or same image
-+ if (leftGroupImageId == rightGroupImageId)
-+ {
-+ return infosLessThan(leftInfo, rightInfo);
-+ }
-+
-+ // We have grouping to handle
-+
-+ // Is one grouped on the other? Sort behind leader.
-+ if (leftGroupImageId == rightInfo.id())
-+ {
-+ return false;
-+ }
-+ if (rightGroupImageId == leftInfo.id())
-+ {
-+ return true;
-+ }
-+
-+ // Use the group leader for sorting
-+ return infosLessThan(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-+ rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
-+}
-+
-+int ImageFilterModel::compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ // Note: reimplemented in ImageAlbumFilterModel
-+ Q_D(const ImageFilterModel);
-+ return d->sorter.compareCategories(left, right);
-+}
-+
-+// Feel free to optimize. QString::number is 3x slower.
-+static inline QString fastNumberToString(int id)
-+{
-+ const int size = sizeof(int) * 2;
-+ char c[size+1];
-+ c[size] = '\0';
-+ char* p = c;
-+ int number = id;
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ *p = 'a' + (number & 0xF);
-+ number >>= 4;
-+ ++p;
-+ }
-+
-+ return QString::fromLatin1(c);
-+}
-+
-+QString ImageFilterModel::categoryIdentifier(const ImageInfo& i) const
-+{
-+ Q_D(const ImageFilterModel);
-+
-+ if (!d->sorter.isCategorized())
-+ {
-+ return QString();
-+ }
-+
-+ qlonglong groupedImageId = i.groupImageId();
-+ ImageInfo info = groupedImageId == -1 ? i : ImageInfo(groupedImageId);
-+
-+ switch (d->sorter.categorizationMode)
-+ {
-+ case ImageSortSettings::NoCategories:
-+ return QString();
-+ case ImageSortSettings::OneCategory:
-+ return QString();
-+ case ImageSortSettings::CategoryByAlbum:
-+ return fastNumberToString(info.albumId());
-+ case ImageSortSettings::CategoryByFormat:
-+ return info.format();
-+ default:
-+ return QString();
-+ }
-+}
-+
-+bool ImageFilterModel::infosLessThan(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ Q_D(const ImageFilterModel);
-+ return d->sorter.lessThan(left, right);
-+}
-+
-+// -------------- Watching changes -----------------------------------------------------------------
-+
-+void ImageFilterModel::slotImageTagChange(const ImageTagChangeset& changeset)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ if (!d->imageModel || d->imageModel->isEmpty())
-+ {
-+ return;
-+ }
-+
-+ // already scheduled to re-filter?
-+ if (d->updateFilterTimer->isActive())
-+ {
-+ return;
-+ }
-+
-+ // do we filter at all?
-+ if (!d->versionFilter.isFilteringByTags() &&
-+ !d->filter.isFilteringByTags() &&
-+ !d->filter.isFilteringByText())
-+ {
-+ return;
-+ }
-+
-+ // is one of our images affected?
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ // if one matching image id is found, trigger a refresh
-+ if (d->imageModel->hasImage(id))
-+ {
-+ d->updateFilterTimer->start();
-+ return;
-+ }
-+ }
-+}
-+
-+void ImageFilterModel::slotImageChange(const ImageChangeset& changeset)
-+{
-+ Q_D(ImageFilterModel);
-+
-+ if (!d->imageModel || d->imageModel->isEmpty())
-+ {
-+ return;
-+ }
-+
-+ // already scheduled to re-filter?
-+ if (d->updateFilterTimer->isActive())
-+ {
-+ return;
-+ }
-+
-+ // is one of the values affected that we filter or sort by?
-+ DatabaseFields::Set set = changeset.changes();
-+ bool sortAffected = (set & d->sorter.watchFlags());
-+ bool filterAffected = (set & d->filter.watchFlags()) || (set & d->groupFilter.watchFlags());
-+
-+ if (!sortAffected && !filterAffected)
-+ {
-+ return;
-+ }
-+
-+ // is one of our images affected?
-+ bool imageAffected = false;
-+
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ // if one matching image id is found, trigger a refresh
-+ if (d->imageModel->hasImage(id))
-+ {
-+ imageAffected = true;
-+ break;
-+ }
-+ }
-+
-+ if (!imageAffected)
-+ {
-+ return;
-+ }
-+
-+ if (filterAffected)
-+ {
-+ d->updateFilterTimer->start();
-+ }
-+ else
-+ {
-+ invalidate(); // just resort, reuse filter results
-+ }
-+}
-+
-+// -------------------------------------------------------------------------------------------------------
-+
-+NoDuplicatesImageFilterModel::NoDuplicatesImageFilterModel(QObject* parent)
-+ : ImageSortFilterModel(parent)
-+{
-+}
-+
-+bool NoDuplicatesImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
-+{
-+ QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
-+
-+ if (index.data(ImageModel::ExtraDataDuplicateCount).toInt() <= 1)
-+ {
-+ return true;
-+ }
-+
-+ QModelIndex previousIndex = sourceModel()->index(source_row - 1, 0, source_parent);
-+
-+ if (!previousIndex.isValid())
-+ {
-+ return true;
-+ }
-+
-+ if (sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(index)) == sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(previousIndex)))
-+ {
-+ return false;
-+ }
-+ return true;
-+}
-+
-+/*
-+void NoDuplicatesImageFilterModel::setSourceModel(QAbstractItemModel* model)
-+{
-+ if (sourceModel())
-+ {
-+ }
-+
-+ ImageSortFilterModel::setSourceModel(model);
-+
-+ if (sourceModel())
-+ {
-+ connect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-+ this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-+ }
-+}
-+
-+void NoDuplicatesImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& parent, int begin, int end)
-+{
-+ bool needInvalidate = false;
-+
-+ for (int i = begin; i<=end; ++i)
-+ {
-+ QModelIndex index = sourceModel()->index(i, 0, parent);
-+
-+ // filtered out by us?
-+ if (!mapFromSource(index).isValid())
-+ {
-+ continue;
-+ }
-+
-+ QModelIndex sourceIndex = mapFromDirectSourceToSourceImageModel(index);
-+ qlonglong id = sourceImageModel()->imageId(sourceIndex);
-+
-+ if (sourceImageModel()->numberOfIndexesForImageId(id) > 1)
-+ {
-+ needInvalidate = true;
-+ }
-+ }
-+}*/
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltermodel.h b/libs/database/models/imagefiltermodel.h
-new file mode 100644
-index 0000000..d131b3e
---- /dev/null
-+++ b/libs/database/models/imagefiltermodel.h
-@@ -0,0 +1,299 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERMODEL_H
-+#define IMAGEFILTERMODEL_H
-+
-+// Local includes
-+
-+#include "dcategorizedsortfilterproxymodel.h"
-+#include "textfilter.h"
-+#include "imagefiltersettings.h"
-+#include "imagemodel.h"
-+#include "imagesortsettings.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageChangeset;
-+class ImageFilterModel;
-+class ImageTagChangeset;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelPrepareHook
-+{
-+public:
-+
-+ virtual ~ImageFilterModelPrepareHook() {};
-+ virtual void prepare(const QVector<ImageInfo>& infos) = 0;
-+};
-+
-+// -----------------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageSortFilterModel : public DCategorizedSortFilterProxyModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageSortFilterModel(QObject* parent = 0);
-+
-+ void setSourceImageModel(ImageModel* model);
-+ ImageModel* sourceImageModel() const;
-+
-+ void setSourceFilterModel(ImageSortFilterModel* model);
-+ ImageSortFilterModel* sourceFilterModel() const;
-+
-+ QModelIndex mapToSourceImageModel(const QModelIndex& index) const;
-+ QModelIndex mapFromSourceImageModel(const QModelIndex& imagemodel_index) const;
-+ QModelIndex mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const;
-+
-+ /// Convenience methods mapped to ImageModel.
-+ /// Mentioned indexes returned come from the source image model.
-+ QList<QModelIndex> mapListToSource(const QList<QModelIndex>& indexes) const;
-+ QList<QModelIndex> mapListFromSource(const QList<QModelIndex>& sourceIndexes) const;
-+
-+ ImageInfo imageInfo(const QModelIndex& index) const;
-+ qlonglong imageId(const QModelIndex& index) const;
-+ QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-+ QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
-+
-+ QModelIndex indexForPath(const QString& filePath) const;
-+ QModelIndex indexForImageInfo(const ImageInfo& info) const;
-+ QModelIndex indexForImageId(qlonglong id) const;
-+
-+ /** Returns a list of all image infos, sorted according to this model.
-+ * If you do not need a sorted list, use ImageModel's imageInfos() method.
-+ */
-+ QList<ImageInfo> imageInfosSorted() const;
-+
-+ /// Returns this, any chained ImageFilterModel, or 0.
-+ virtual ImageFilterModel* imageFilterModel() const;
-+
-+protected:
-+
-+ /// Reimplement if needed. Called only when model shall be set as (direct) sourceModel.
-+ virtual void setDirectSourceImageModel(ImageModel* model);
-+
-+ // made protected
-+ virtual void setSourceModel(QAbstractItemModel* model);
-+
-+protected:
-+
-+ ImageSortFilterModel* m_chainedModel;
-+};
-+
-+// -----------------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModel : public ImageSortFilterModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ enum ImageFilterModelRoles
-+ {
-+ /// Returns the current categorization mode
-+ CategorizationModeRole = ImageModel::FilterModelRoles + 1,
-+ /// Returns the current sort order
-+ SortOrderRole = ImageModel::FilterModelRoles + 2,
-+ // / Returns the number of items in the index' category
-+ //CategoryCountRole = ImageModel::FilterModelRoles + 3,
-+ /// Returns the id of the PAlbum of the index which is used for category
-+ CategoryAlbumIdRole = ImageModel::FilterModelRoles + 3,
-+ /// Returns the format of the index which is used for category
-+ CategoryFormatRole = ImageModel::FilterModelRoles + 4,
-+ /// Returns true if the given image is a group leader, and the group is opened
-+ GroupIsOpenRole = ImageModel::FilterModelRoles + 5,
-+ ImageFilterModelPointerRole = ImageModel::FilterModelRoles + 50
-+ };
-+
-+public:
-+
-+ explicit ImageFilterModel(QObject* parent = 0);
-+ ~ImageFilterModel();
-+
-+ /** Add a hook to get added images for preparation tasks before they are added in the model */
-+ void addPrepareHook(ImageFilterModelPrepareHook* hook);
-+ void removePrepareHook(ImageFilterModelPrepareHook* hook);
-+
-+ /** Returns a set of DatabaseFields suggested to set as watch flags on the source ImageModel.
-+ * The contained flags will be those that this model can sort or filter by. */
-+ DatabaseFields::Set suggestedWatchFlags() const;
-+
-+ ImageFilterSettings imageFilterSettings() const;
-+ VersionImageFilterSettings versionImageFilterSettings() const;
-+ GroupImageFilterSettings groupImageFilterSettings() const;
-+ ImageSortSettings imageSortSettings() const;
-+
-+ // group is identified by the id of its group leader
-+ bool isGroupOpen(qlonglong group) const;
-+ bool isAllGroupsOpen() const;
-+
-+ /// Enables sending imageInfosAdded and imageInfosAboutToBeRemoved
-+ void setSendImageInfoSignals(bool sendSignals);
-+
-+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+ virtual ImageFilterModel* imageFilterModel() const;
-+
-+public Q_SLOTS:
-+
-+ /** Changes the current version image filter settings and refilters. */
-+ void setVersionImageFilterSettings(const VersionImageFilterSettings& settings);
-+
-+ /** Changes the current version image filter settings and refilters. */
-+ void setGroupImageFilterSettings(const GroupImageFilterSettings& settings);
-+
-+ /** Adjust the current ImageFilterSettings.
-+ * Equivalent to retrieving the current filter settings, adjusting the parameter
-+ * and calling setImageFilterSettings.
-+ * Provided for convenience.
-+ * It is encouraged to use setImageFilterSettings if you change more than one
-+ * parameter at a time.
-+ */
-+ void setDayFilter(const QList<QDateTime>& days);
-+ void setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-+ ImageFilterSettings::MatchingCondition matchingCond, bool showUnTagged,
-+ const QList<int>& clTagIds, const QList<int>& plTagIds);
-+ void setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded);
-+ void setMimeTypeFilter(int mimeTypeFilter);
-+ void setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition);
-+ void setTextFilter(const SearchTextFilterSettings& settings);
-+
-+ void setCategorizationMode(ImageSortSettings::CategorizationMode mode);
-+ void setCategorizationSortOrder(ImageSortSettings::SortOrder order);
-+ void setSortRole(ImageSortSettings::SortRole role);
-+ void setSortOrder(ImageSortSettings::SortOrder order);
-+ void setStringTypeNatural(bool natural);
-+ void setUrlWhitelist(const QList<QUrl> urlList, const QString& id);
-+ void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
-+
-+ void setVersionManagerSettings(const VersionManagerSettings& settings);
-+ void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
-+
-+ void setGroupOpen(qlonglong group, bool open);
-+ void toggleGroupOpen(qlonglong group);
-+ void setAllGroupsOpen(bool open);
-+
-+ /** Changes the current image filter settings and refilters. */
-+ virtual void setImageFilterSettings(const ImageFilterSettings& settings);
-+
-+ /** Changes the current image sort settings and resorts. */
-+ virtual void setImageSortSettings(const ImageSortSettings& settings);
-+
-+Q_SIGNALS:
-+
-+ /// Signals that the set filter matches at least one index
-+ void filterMatches(bool matches);
-+
-+ /** Signals that the set text filter matches at least one entry.
-+ If no text filter is set, this signal is emitted
-+ with 'false' when filterMatches() is emitted.
-+ */
-+ void filterMatchesForText(bool matchesByText);
-+
-+ /** Emitted when the filter settings have been changed
-+ (the model may not yet have been updated)
-+ */
-+ void filterSettingsChanged(const ImageFilterSettings& settings);
-+
-+ /** These signals need to be explicitly enabled with setSendImageInfoSignals()
-+ */
-+ void imageInfosAdded(const QList<ImageInfo>& infos);
-+ void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
-+
-+public:
-+
-+ // Declared as public because of use in sub-classes.
-+ class ImageFilterModelPrivate;
-+
-+protected:
-+
-+ ImageFilterModelPrivate* const d_ptr;
-+
-+protected:
-+
-+ ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent);
-+
-+ virtual void setDirectSourceImageModel(ImageModel* model);
-+
-+ virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
-+
-+ virtual int compareCategories(const QModelIndex& left, const QModelIndex& right) const;
-+ virtual bool subSortLessThan(const QModelIndex& left, const QModelIndex& right) const;
-+ //virtual int categoryCount(const ImageInfo& info) const;
-+
-+ /** Reimplement to customize category sorting,
-+ * Return negative if category of left < category right,
-+ * Return 0 if left and right are in the same category, else return positive.
-+ */
-+ virtual int compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Reimplement to customize sorting. Do not take categories into account here.
-+ */
-+ virtual bool infosLessThan(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Returns a unique identifier for the category if info. The string need not be for user display.
-+ */
-+ virtual QString categoryIdentifier(const ImageInfo& info) const;
-+
-+protected Q_SLOTS:
-+
-+ void slotModelReset();
-+ void slotUpdateFilter();
-+
-+ void slotImageTagChange(const ImageTagChangeset& changeset);
-+ void slotImageChange(const ImageChangeset& changeset);
-+
-+ void slotRowsInserted(const QModelIndex& parent, int start, int end);
-+ void slotRowsAboutToBeRemoved(const QModelIndex& parent, int start, int end);
-+
-+private:
-+
-+ Q_DECLARE_PRIVATE(ImageFilterModel)
-+};
-+
-+// -----------------------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT NoDuplicatesImageFilterModel : public ImageSortFilterModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit NoDuplicatesImageFilterModel(QObject* parent = 0);
-+
-+protected:
-+
-+ virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
-+};
-+
-+} // namespace Digikam
-+
-+Q_DECLARE_METATYPE(Digikam::ImageFilterModel*)
-+
-+#endif // IMAGEMODEL_H
-diff --git a/libs/database/models/imagefiltermodelpriv.cpp b/libs/database/models/imagefiltermodelpriv.cpp
-new file mode 100644
-index 0000000..07d9e79
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelpriv.cpp
-@@ -0,0 +1,258 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltermodelpriv.h"
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "imagefiltermodelthreads.h"
-+
-+namespace Digikam
-+{
-+
-+ImageFilterModel::ImageFilterModelPrivate::ImageFilterModelPrivate()
-+{
-+ imageModel = 0;
-+ version = 0;
-+ lastDiscardVersion = 0;
-+ sentOut = 0;
-+ sentOutForReAdd = 0;
-+ updateFilterTimer = 0;
-+ needPrepare = false;
-+ needPrepareComments = false;
-+ needPrepareTags = false;
-+ needPrepareGroups = false;
-+ preparer = 0;
-+ filterer = 0;
-+ hasOneMatch = false;
-+ hasOneMatchForText = false;
-+
-+ setupWorkers();
-+}
-+
-+ImageFilterModel::ImageFilterModelPrivate::~ImageFilterModelPrivate()
-+{
-+ // facilitate thread stopping
-+ ++version;
-+ preparer->deactivate();
-+ filterer->deactivate();
-+ delete preparer;
-+ delete filterer;
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::init(ImageFilterModel* _q)
-+{
-+ q = _q;
-+
-+ updateFilterTimer = new QTimer(this);
-+ updateFilterTimer->setSingleShot(true);
-+ updateFilterTimer->setInterval(250);
-+
-+ connect(updateFilterTimer, SIGNAL(timeout()),
-+ q, SLOT(slotUpdateFilter()));
-+
-+ // inter-thread redirection
-+ qRegisterMetaType<ImageFilterModelTodoPackage>("ImageFilterModelTodoPackage");
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ infosToProcess(infos, extraValues, true);
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ // These have already been added, we just process them afterwards
-+ infosToProcess(infos, extraValues, false);
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::setupWorkers()
-+{
-+ preparer = new ImageFilterModelPreparer(this);
-+ filterer = new ImageFilterModelFilterer(this);
-+
-+ // A package in constructed in infosToProcess.
-+ // Normal flow is infosToProcess -> preparer::process -> filterer::process -> packageFinished.
-+ // If no preparation is needed, the first step is skipped.
-+ // If filter version changes, both will discard old package and send them to packageDiscarded.
-+
-+ connect(this, SIGNAL(packageToPrepare(ImageFilterModelTodoPackage)),
-+ preparer, SLOT(process(ImageFilterModelTodoPackage)));
-+
-+ connect(this, SIGNAL(packageToFilter(ImageFilterModelTodoPackage)),
-+ filterer, SLOT(process(ImageFilterModelTodoPackage)));
-+
-+ connect(preparer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-+ filterer, SLOT(process(ImageFilterModelTodoPackage)));
-+
-+ connect(filterer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-+ this, SLOT(packageFinished(ImageFilterModelTodoPackage)));
-+
-+ connect(preparer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-+ this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
-+
-+ connect(filterer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-+ this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos)
-+{
-+ infosToProcess(infos, QList<QVariant>(), false);
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ filterer->schedule();
-+
-+ if (needPrepare)
-+ {
-+ preparer->schedule();
-+ }
-+
-+ Q_ASSERT(extraValues.isEmpty() || infos.size() == extraValues.size());
-+
-+ // prepare and filter in chunks
-+ const int size = infos.size();
-+ const int maxChunkSize = needPrepare ? PrepareChunkSize : FilterChunkSize;
-+ const bool hasExtraValues = !extraValues.isEmpty();
-+ QList<ImageInfo>::const_iterator it = infos.constBegin(), end;
-+ QList<QVariant>::const_iterator xit = extraValues.constBegin(), xend;
-+ int index = 0;
-+ QVector<ImageInfo> infoVector;
-+ QVector<QVariant> extraValueVector;
-+
-+ while (it != infos.constEnd())
-+ {
-+ const int chunkSize = qMin(maxChunkSize, size - index);
-+ infoVector.resize(chunkSize);
-+ end = it + chunkSize;
-+ qCopy(it, end, infoVector.begin());
-+
-+ if (hasExtraValues)
-+ {
-+ extraValueVector.resize(chunkSize);
-+ xend = xit + chunkSize;
-+ qCopy(xit, xend, extraValueVector.begin());
-+ xit = xend;
-+ }
-+
-+ it = end;
-+ index += chunkSize;
-+
-+ ++sentOut;
-+
-+ if (forReAdd)
-+ {
-+ ++sentOutForReAdd;
-+ }
-+
-+ if (needPrepare)
-+ {
-+ emit packageToPrepare(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-+ }
-+ else
-+ {
-+ emit packageToFilter(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-+ }
-+ }
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::packageFinished(const ImageFilterModelTodoPackage& package)
-+{
-+ // check if it got discarded on the journey
-+ if (package.version != version)
-+ {
-+ packageDiscarded(package);
-+ return;
-+ }
-+
-+ // incorporate result
-+ QHash<qlonglong, bool>::const_iterator it = package.filterResults.constBegin();
-+
-+ for (; it != package.filterResults.constEnd(); ++it)
-+ {
-+ filterResults.insert(it.key(), it.value());
-+ }
-+
-+ // re-add if necessary
-+ if (package.isForReAdd)
-+ {
-+ emit reAddImageInfos(package.infos.toList(), package.extraValues.toList());
-+
-+ if (sentOutForReAdd == 1) // last package
-+ {
-+ emit reAddingFinished();
-+ }
-+ }
-+
-+ // decrement counters
-+ --sentOut;
-+
-+ if (package.isForReAdd)
-+ {
-+ --sentOutForReAdd;
-+ }
-+
-+ // If all packages have returned, filtered and readded, and no more are expected,
-+ // and there is need to tell the filter result to the view, do that
-+ if (sentOut == 0 && sentOutForReAdd == 0 && !imageModel->isRefreshing())
-+ {
-+ q->invalidate(); // use invalidate, not invalidateFilter only. Sorting may have changed as well.
-+ emit (q->filterMatches(hasOneMatch));
-+ emit (q->filterMatchesForText(hasOneMatchForText));
-+ filterer->deactivate();
-+ preparer->deactivate();
-+ }
-+}
-+
-+void ImageFilterModel::ImageFilterModelPrivate::packageDiscarded(const ImageFilterModelTodoPackage& package)
-+{
-+ // Either, the model was reset, or the filter changed
-+ // In the former case throw all away, in the latter case, recycle
-+ if (package.version > lastDiscardVersion)
-+ {
-+ // Recycle packages: Send again with current version
-+ // Do not increment sentOut or sentOutForReAdd here: it was not decremented!
-+
-+ if (needPrepare)
-+ {
-+ emit packageToPrepare(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-+ }
-+ else
-+ {
-+ emit packageToFilter(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-+ }
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltermodelpriv.h b/libs/database/models/imagefiltermodelpriv.h
-new file mode 100644
-index 0000000..a9e3f22
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelpriv.h
-@@ -0,0 +1,159 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-11
-+ * Description : Qt item model for database entries - private shared header
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERMODELPRIV_H
-+#define IMAGEFILTERMODELPRIV_H
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QMutex>
-+#include <QMutexLocker>
-+#include <QSet>
-+#include <QThread>
-+#include <QTimer>
-+#include <QWaitCondition>
-+
-+// Local includes
-+
-+#include "imageinfo.h"
-+#include "imagefiltermodel.h"
-+
-+#include "digikam_export.h"
-+// Yes, we need the EXPORT macro in a private header because
-+// this private header is shared across binary objects.
-+// This does NOT make this classes here any more public!
-+
-+namespace Digikam
-+{
-+
-+const int PrepareChunkSize = 101;
-+const int FilterChunkSize = 2001;
-+
-+class ImageFilterModelTodoPackage
-+{
-+public:
-+
-+ ImageFilterModelTodoPackage()
-+ : version(0), isForReAdd(false)
-+ {
-+ }
-+
-+ ImageFilterModelTodoPackage(const QVector<ImageInfo>& infos, const QVector<QVariant>& extraValues, int version, bool isForReAdd)
-+ : infos(infos), extraValues(extraValues), version(version), isForReAdd(isForReAdd)
-+ {
-+ }
-+
-+ QVector<ImageInfo> infos;
-+ QVector<QVariant> extraValues;
-+ unsigned int version;
-+ bool isForReAdd;
-+ QHash<qlonglong, bool> filterResults;
-+};
-+
-+// ------------------------------------------------------------------------------------------------
-+
-+class ImageFilterModelPreparer;
-+class ImageFilterModelFilterer;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModel::ImageFilterModelPrivate : public QObject
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ ImageFilterModelPrivate();
-+ ~ImageFilterModelPrivate();
-+
-+ void init(ImageFilterModel* q);
-+ void setupWorkers();
-+ void infosToProcess(const QList<ImageInfo>& infos);
-+ void infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd = true);
-+
-+public:
-+
-+ ImageFilterModel* q;
-+
-+ ImageModel* imageModel;
-+
-+ ImageFilterSettings filter;
-+ ImageSortSettings sorter;
-+ VersionImageFilterSettings versionFilter;
-+ GroupImageFilterSettings groupFilter;
-+
-+ volatile unsigned int version;
-+ unsigned int lastDiscardVersion;
-+ unsigned int lastFilteredVersion;
-+ int sentOut;
-+ int sentOutForReAdd;
-+
-+ QTimer* updateFilterTimer;
-+
-+ bool needPrepare;
-+ bool needPrepareComments;
-+ bool needPrepareTags;
-+ bool needPrepareGroups;
-+
-+ QMutex mutex;
-+ ImageFilterSettings filterCopy;
-+ VersionImageFilterSettings versionFilterCopy;
-+ GroupImageFilterSettings groupFilterCopy;
-+ ImageFilterModelPreparer* preparer;
-+ ImageFilterModelFilterer* filterer;
-+
-+ QHash<qlonglong, bool> filterResults;
-+ bool hasOneMatch;
-+ bool hasOneMatchForText;
-+
-+ QList<ImageFilterModelPrepareHook*> prepareHooks;
-+
-+/*
-+ QHash<int, QSet<qlonglong> > categoryCountHashInt;
-+ QHash<QString, QSet<qlonglong> > categoryCountHashString;
-+
-+public:
-+
-+ void cacheCategoryCount(int id, qlonglong imageid) const
-+ { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashInt[id].insert(imageid); }
-+ void cacheCategoryCount(const QString& id, qlonglong imageid) const
-+ { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashString[id].insert(imageid); }
-+*/
-+
-+public Q_SLOTS:
-+
-+ void preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void packageFinished(const ImageFilterModelTodoPackage& package);
-+ void packageDiscarded(const ImageFilterModelTodoPackage& package);
-+
-+Q_SIGNALS:
-+
-+ void packageToPrepare(const ImageFilterModelTodoPackage& package);
-+ void packageToFilter(const ImageFilterModelTodoPackage& package);
-+ void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void reAddingFinished();
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGEFILTERMODELPRIV_H
-diff --git a/libs/database/models/imagefiltermodelthreads.cpp b/libs/database/models/imagefiltermodelthreads.cpp
-new file mode 100644
-index 0000000..aa5c462
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelthreads.cpp
-@@ -0,0 +1,40 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltermodel.h"
-+#include "imagefiltermodelpriv.h"
-+#include "imagefiltermodelthreads.h"
-+
-+namespace Digikam
-+{
-+
-+ImageFilterModelWorker::ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d)
-+ : d(d)
-+{
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltermodelthreads.h b/libs/database/models/imagefiltermodelthreads.h
-new file mode 100644
-index 0000000..83fa987
---- /dev/null
-+++ b/libs/database/models/imagefiltermodelthreads.h
-@@ -0,0 +1,100 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-11
-+ * Description : Qt item model for database entries - private header
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERMODELTHREADS_H
-+#define IMAGEFILTERMODELTHREADS_H
-+
-+// Qt includes
-+
-+#include <QThread>
-+
-+// Local includes
-+
-+#include "digikam_export.h"
-+#include "workerobject.h"
-+
-+namespace Digikam
-+{
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelWorker : public WorkerObject
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d);
-+
-+ bool checkVersion(const ImageFilterModelTodoPackage& package)
-+ {
-+ return d->version == package.version;
-+ }
-+
-+public Q_SLOTS:
-+
-+ virtual void process(ImageFilterModelTodoPackage package) = 0;
-+
-+Q_SIGNALS:
-+
-+ void processed(const ImageFilterModelTodoPackage& package);
-+ void discarded(const ImageFilterModelTodoPackage& package);
-+
-+protected:
-+
-+ ImageFilterModel::ImageFilterModelPrivate* d;
-+};
-+
-+// -----------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelPreparer : public ImageFilterModelWorker
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageFilterModelPreparer(ImageFilterModel::ImageFilterModelPrivate* const d)
-+ : ImageFilterModelWorker(d)
-+ {
-+ }
-+
-+ void process(ImageFilterModelTodoPackage package);
-+};
-+
-+// ----------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterModelFilterer : public ImageFilterModelWorker
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageFilterModelFilterer(ImageFilterModel::ImageFilterModelPrivate* const d)
-+ : ImageFilterModelWorker(d)
-+ {
-+ }
-+
-+ void process(ImageFilterModelTodoPackage package);
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGEFILTERMODELTHREADS_H
-diff --git a/libs/database/models/imagefiltersettings.cpp b/libs/database/models/imagefiltersettings.cpp
-new file mode 100644
-index 0000000..b61e7f9
---- /dev/null
-+++ b/libs/database/models/imagefiltersettings.cpp
-@@ -0,0 +1,952 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Filter values for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagefiltersettings.h"
-+
-+// C++ includes
-+
-+#include <cmath>
-+
-+// Qt includes
-+
-+#include <QDateTime>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbfields.h"
-+#include "digikam_globals.h"
-+#include "imageinfo.h"
-+#include "tagscache.h"
-+#include "versionmanagersettings.h"
-+
-+namespace Digikam
-+{
-+
-+ImageFilterSettings::ImageFilterSettings()
-+{
-+ m_untaggedFilter = false;
-+ m_isUnratedExcluded = false;
-+ m_ratingFilter = 0;
-+ m_mimeTypeFilter = MimeFilter::AllFiles;
-+ m_ratingCond = GreaterEqualCondition;
-+ m_matchingCond = OrCondition;
-+ m_geolocationCondition = GeolocationNoFilter;
-+}
-+
-+DatabaseFields::Set ImageFilterSettings::watchFlags() const
-+{
-+ DatabaseFields::Set set;
-+
-+ if (isFilteringByDay())
-+ {
-+ set |= DatabaseFields::CreationDate;
-+ }
-+
-+ if (isFilteringByText())
-+ {
-+ set |= DatabaseFields::Name;
-+ set |= DatabaseFields::Comment;
-+ }
-+
-+ if (isFilteringByRating())
-+ {
-+ set |= DatabaseFields::Rating;
-+ }
-+
-+ if (isFilteringByTypeMime())
-+ {
-+ set |= DatabaseFields::Category;
-+ set |= DatabaseFields::Format;
-+ }
-+
-+ if (isFilteringByGeolocation())
-+ {
-+ set |= DatabaseFields::ImagePositionsAll;
-+ }
-+
-+ if (isFilteringByColorLabels())
-+ {
-+ set |= DatabaseFields::ColorLabel;
-+ }
-+
-+ if (isFilteringByPickLabels())
-+ {
-+ set |= DatabaseFields::PickLabel;
-+ }
-+
-+ return set;
-+}
-+
-+bool ImageFilterSettings::isFilteringByDay() const
-+{
-+ if (!m_dayFilter.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByTags() const
-+{
-+ if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty() || m_untaggedFilter)
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByColorLabels() const
-+{
-+ if (!m_colorLabelTagFilter.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByPickLabels() const
-+{
-+ if (!m_pickLabelTagFilter.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByText() const
-+{
-+ if (!m_textFilterSettings.text.isEmpty())
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByTypeMime() const
-+{
-+ if (m_mimeTypeFilter != MimeFilter::AllFiles)
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringByGeolocation() const
-+{
-+ return (m_geolocationCondition != GeolocationNoFilter);
-+}
-+
-+bool ImageFilterSettings::isFilteringByRating() const
-+{
-+ if (m_ratingFilter != 0 || m_ratingCond != GreaterEqualCondition || m_isUnratedExcluded)
-+ {
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
-+bool ImageFilterSettings::isFilteringInternally() const
-+{
-+ return (isFiltering() || !m_urlWhitelists.isEmpty() || !m_idWhitelists.isEmpty());
-+}
-+
-+bool ImageFilterSettings::isFiltering() const
-+{
-+ return isFilteringByDay() ||
-+ isFilteringByTags() ||
-+ isFilteringByText() ||
-+ isFilteringByRating() ||
-+ isFilteringByTypeMime() ||
-+ isFilteringByColorLabels() ||
-+ isFilteringByPickLabels() ||
-+ isFilteringByGeolocation();
-+}
-+
-+void ImageFilterSettings::setDayFilter(const QList<QDateTime>& days)
-+{
-+ m_dayFilter.clear();
-+
-+ for (QList<QDateTime>::const_iterator it = days.constBegin(); it != days.constEnd(); ++it)
-+ {
-+ m_dayFilter.insert(*it, true);
-+ }
-+}
-+
-+void ImageFilterSettings::setTagFilter(const QList<int>& includedTags,
-+ const QList<int>& excludedTags,
-+ MatchingCondition matchingCondition,
-+ bool showUnTagged,
-+ const QList<int>& clTagIds,
-+ const QList<int>& plTagIds)
-+{
-+ m_includeTagFilter = includedTags;
-+ m_excludeTagFilter = excludedTags;
-+ m_matchingCond = matchingCondition;
-+ m_untaggedFilter = showUnTagged;
-+ m_colorLabelTagFilter = clTagIds;
-+ m_pickLabelTagFilter = plTagIds;
-+}
-+
-+void ImageFilterSettings::setRatingFilter(int rating, RatingCondition ratingCondition, bool isUnratedExcluded)
-+{
-+ m_ratingFilter = rating;
-+ m_ratingCond = ratingCondition;
-+ m_isUnratedExcluded = isUnratedExcluded;
-+}
-+
-+void ImageFilterSettings::setMimeTypeFilter(int mime)
-+{
-+ m_mimeTypeFilter = (MimeFilter::TypeMimeFilter)mime;
-+}
-+
-+void ImageFilterSettings::setGeolocationFilter(const GeolocationCondition& condition)
-+{
-+ m_geolocationCondition = condition;
-+}
-+
-+void ImageFilterSettings::setTextFilter(const SearchTextFilterSettings& settings)
-+{
-+ m_textFilterSettings = settings;
-+}
-+
-+void ImageFilterSettings::setTagNames(const QHash<int, QString>& hash)
-+{
-+ m_tagNameHash = hash;
-+}
-+
-+void ImageFilterSettings::setAlbumNames(const QHash<int, QString>& hash)
-+{
-+ m_albumNameHash = hash;
-+}
-+
-+void ImageFilterSettings::setUrlWhitelist(const QList<QUrl>& urlList, const QString& id)
-+{
-+ if (urlList.isEmpty())
-+ {
-+ m_urlWhitelists.remove(id);
-+ }
-+ else
-+ {
-+ m_urlWhitelists.insert(id, urlList);
-+ }
-+}
-+
-+void ImageFilterSettings::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
-+{
-+ if (idList.isEmpty())
-+ {
-+ m_idWhitelists.remove(id);
-+ }
-+ else
-+ {
-+ m_idWhitelists.insert(id, idList);
-+ }
-+}
-+
-+template <class ContainerA, class ContainerB>
-+bool containsAnyOf(const ContainerA& listA, const ContainerB& listB)
-+{
-+ foreach (const typename ContainerA::value_type& a, listA)
-+ {
-+ if (listB.contains(a))
-+ {
-+ return true;
-+ }
-+ }
-+ return false;
-+}
-+
-+template <class ContainerA, typename Value, class ContainerB>
-+bool containsNoneOfExcept(const ContainerA& list, const ContainerB& noneOfList, const Value& exception)
-+{
-+ foreach (const typename ContainerB::value_type& n, noneOfList)
-+ {
-+ if (n != exception && list.contains(n))
-+ {
-+ return false;
-+ }
-+ }
-+ return true;
-+}
-+
-+bool ImageFilterSettings::matches(const ImageInfo& info, bool* const foundText) const
-+{
-+ if (foundText)
-+ {
-+ *foundText = false;
-+ }
-+
-+ if (!isFilteringInternally())
-+ {
-+ return true;
-+ }
-+
-+ bool match = false;
-+
-+ if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty())
-+ {
-+ QList<int> tagIds = info.tagIds();
-+ QList<int>::const_iterator it;
-+
-+ match = m_includeTagFilter.isEmpty();
-+
-+ if (m_matchingCond == OrCondition)
-+ {
-+ for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-+ {
-+ if (tagIds.contains(*it))
-+ {
-+ match = true;
-+ break;
-+ }
-+ }
-+
-+ match |= (m_untaggedFilter && tagIds.isEmpty());
-+ }
-+ else // AND matching condition...
-+ {
-+ // m_untaggedFilter and non-empty tag filter, combined with AND, is logically no match
-+ if (!m_untaggedFilter)
-+ {
-+ for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-+ {
-+ if (!tagIds.contains(*it))
-+ {
-+ break;
-+ }
-+ }
-+
-+ if (it == m_includeTagFilter.end())
-+ {
-+ match = true;
-+ }
-+ }
-+ }
-+
-+ for (it = m_excludeTagFilter.begin(); it != m_excludeTagFilter.end(); ++it)
-+ {
-+ if (tagIds.contains(*it))
-+ {
-+ match = false;
-+ break;
-+ }
-+ }
-+ }
-+ else if (m_untaggedFilter)
-+ {
-+ match = !TagsCache::instance()->containsPublicTags(info.tagIds());
-+ }
-+ else
-+ {
-+ match = true;
-+ }
-+
-+ //-- Filter by pick labels ------------------------------------------------
-+
-+ if (!m_pickLabelTagFilter.isEmpty())
-+ {
-+ QList<int> tagIds = info.tagIds();
-+ bool matchPL = false;
-+
-+ if (containsAnyOf(m_pickLabelTagFilter, tagIds))
-+ {
-+ matchPL = true;
-+ }
-+ else if (!matchPL)
-+ {
-+ int noPickLabelTagId = TagsCache::instance()->tagForPickLabel(NoPickLabel);
-+
-+ if (m_pickLabelTagFilter.contains(noPickLabelTagId))
-+ {
-+ // Searching for "has no ColorLabel" requires special handling:
-+ // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-+ matchPL = containsNoneOfExcept(tagIds, TagsCache::instance()->pickLabelTags(), noPickLabelTagId);
-+ }
-+ }
-+
-+ match &= matchPL;
-+ }
-+
-+ //-- Filter by color labels ------------------------------------------------
-+
-+ if (!m_colorLabelTagFilter.isEmpty())
-+ {
-+ QList<int> tagIds = info.tagIds();
-+ bool matchCL = false;
-+
-+ if (containsAnyOf(m_colorLabelTagFilter, tagIds))
-+ {
-+ matchCL = true;
-+ }
-+ else if (!matchCL)
-+ {
-+ int noColorLabelTagId = TagsCache::instance()->tagForColorLabel(NoColorLabel);
-+
-+ if (m_colorLabelTagFilter.contains(noColorLabelTagId))
-+ {
-+ // Searching for "has no ColorLabel" requires special handling:
-+ // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-+ matchCL = containsNoneOfExcept(tagIds, TagsCache::instance()->colorLabelTags(), noColorLabelTagId);
-+ }
-+ }
-+
-+ match &= matchCL;
-+ }
-+
-+ //-- Filter by date -----------------------------------------------------------
-+
-+ if (!m_dayFilter.isEmpty())
-+ {
-+ match &= m_dayFilter.contains(QDateTime(info.dateTime().date(), QTime()));
-+ }
-+
-+ //-- Filter by rating ---------------------------------------------------------
-+
-+ if (m_ratingFilter >= 0)
-+ {
-+ // for now we treat -1 (no rating) just like a rating of 0.
-+ int rating = info.rating();
-+
-+ if (rating == -1)
-+ {
-+ rating = 0;
-+ }
-+
-+ if(m_isUnratedExcluded && rating == 0)
-+ {
-+ match = false;
-+ }
-+ else
-+ {
-+ if (m_ratingCond == GreaterEqualCondition)
-+ {
-+ // If the rating is not >=, i.e it is <, then it does not match.
-+ if (rating < m_ratingFilter)
-+ {
-+ match = false;
-+ }
-+ }
-+ else if (m_ratingCond == EqualCondition)
-+ {
-+ // If the rating is not =, i.e it is !=, then it does not match.
-+ if (rating != m_ratingFilter)
-+ {
-+ match = false;
-+ }
-+ }
-+ else
-+ {
-+ // If the rating is not <=, i.e it is >, then it does not match.
-+ if (rating > m_ratingFilter)
-+ {
-+ match = false;
-+ }
-+ }
-+ }
-+ }
-+
-+ // -- Filter by mime type -----------------------------------------------------
-+
-+ switch (m_mimeTypeFilter)
-+ {
-+ // info.format is a standardized string: Only one possibility per mime type
-+ case MimeFilter::ImageFiles:
-+ {
-+ if (info.category() != DatabaseItem::Image)
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::JPGFiles:
-+ {
-+ if (info.format() != QLatin1String("JPG"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::PNGFiles:
-+ {
-+ if (info.format() != QLatin1String("PNG"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::TIFFiles:
-+ {
-+ if (info.format() != QLatin1String("TIFF"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::DNGFiles:
-+ {
-+ if (info.format() != QLatin1String("RAW-DNG"))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::NoRAWFiles:
-+ {
-+ if (info.format().startsWith(QLatin1String("RAW")))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::RAWFiles:
-+ {
-+ if (!info.format().startsWith(QLatin1String("RAW")))
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::MoviesFiles:
-+ {
-+ if (info.category() != DatabaseItem::Video)
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::AudioFiles:
-+ {
-+ if (info.category() != DatabaseItem::Audio)
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ case MimeFilter::RasterFiles:
-+ {
-+ if (info.format() != QLatin1String("PSD") && // Adobe Photoshop Document
-+ info.format() != QLatin1String("PSB") && // Adobe Photoshop Big
-+ info.format() != QLatin1String("XCF") && // Gimp
-+ info.format() != QLatin1String("KRA") && // Krita
-+ info.format() != QLatin1String("ORA") // Open Raster
-+ )
-+ {
-+ match = false;
-+ }
-+
-+ break;
-+ }
-+ default:
-+ {
-+ // All Files: do nothing...
-+ break;
-+ }
-+ }
-+
-+ //-- Filter by geolocation ----------------------------------------------------
-+
-+ if (m_geolocationCondition!=GeolocationNoFilter)
-+ {
-+ if (m_geolocationCondition==GeolocationNoCoordinates)
-+ {
-+ if (info.hasCoordinates())
-+ {
-+ match = false;
-+ }
-+ }
-+ else if (m_geolocationCondition==GeolocationHasCoordinates)
-+ {
-+ if (!info.hasCoordinates())
-+ {
-+ match = false;
-+ }
-+ }
-+ }
-+
-+ //-- Filter by text -----------------------------------------------------------
-+
-+ if (!m_textFilterSettings.text.isEmpty())
-+ {
-+ bool textMatch = false;
-+
-+ // Image name
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageName &&
-+ info.name().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Image title
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageTitle &&
-+ info.title().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Image comment
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageComment &&
-+ info.comment().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Tag names
-+ foreach(int id, info.tagIds())
-+ {
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::TagName &&
-+ m_tagNameHash.value(id).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+ }
-+
-+ // Album names
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::AlbumName &&
-+ m_albumNameHash.value(info.albumId()).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-+ {
-+ textMatch = true;
-+ }
-+
-+ // Image Aspect Ratio
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageAspectRatio)
-+ {
-+ QRegExp expRatio (QLatin1String("^\\d+:\\d+$"));
-+ QRegExp expFloat (QLatin1String("^\\d+(.\\d+)?$"));
-+
-+ if (expRatio.indexIn(m_textFilterSettings.text) > -1 && m_textFilterSettings.text.contains(QRegExp(QLatin1String(":\\d+"))))
-+ {
-+ QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-+ QStringList numberStringList = trimmedTextFilterSettingsText.split(QLatin1String(":"), QString::SkipEmptyParts);
-+
-+ if (numberStringList.length() == 2)
-+ {
-+ QString numString = (QString)numberStringList.at(0), denomString = (QString)numberStringList.at(1);
-+ bool canConverseNum = false;
-+ bool canConverseDenom = false;
-+ int num = numString.toInt(&canConverseNum, 10), denom = denomString.toInt(&canConverseDenom, 10);
-+
-+ if (canConverseNum && canConverseDenom)
-+ {
-+ if (fabs(info.aspectRatio() - (double)num / denom) < 0.1)
-+ textMatch = true;
-+ }
-+ }
-+ }
-+ else if (expFloat.indexIn(m_textFilterSettings.text) > -1)
-+ {
-+ QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-+ bool canConverse = false;
-+ double ratio = trimmedTextFilterSettingsText.toDouble(&canConverse);
-+
-+ if (canConverse)
-+ {
-+ if (fabs(info.aspectRatio() - ratio) < 0.1)
-+ textMatch = true;
-+ }
-+ }
-+ }
-+
-+ // Image Pixel Size
-+ // See bug #341053 for details.
-+
-+ if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImagePixelSize)
-+ {
-+ QSize size = info.dimensions();
-+ int pixelSize = size.height()*size.width();
-+ QString text = m_textFilterSettings.text;
-+
-+ if(text.contains(QRegExp(QLatin1String("^>\\d{1,15}$"))) && pixelSize > (text.remove(0,1)).toInt())
-+ {
-+ textMatch = true;
-+ }
-+ else if(text.contains(QRegExp(QLatin1String("^<\\d{1,15}$"))) && pixelSize < (text.remove(0,1)).toInt())
-+ {
-+ textMatch = true;
-+ }
-+ else if(text.contains(QRegExp(QLatin1String("^\\d+$"))) && pixelSize == text.toInt())
-+ {
-+ textMatch = true;
-+ }
-+ }
-+
-+ match &= textMatch;
-+
-+ if (foundText)
-+ {
-+ *foundText = textMatch;
-+ }
-+ }
-+
-+ // -- filter by URL-whitelists ------------------------------------------------
-+ // NOTE: whitelists are always AND for now.
-+
-+ if (match)
-+ {
-+ const QUrl url = info.fileUrl();
-+
-+ for (QHash<QString, QList<QUrl>>::const_iterator it = m_urlWhitelists.constBegin();
-+ it!=m_urlWhitelists.constEnd(); ++it)
-+ {
-+ match = it->contains(url);
-+
-+ if (!match)
-+ {
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (match)
-+ {
-+ const qlonglong id = info.id();
-+
-+ for (QHash<QString, QList<qlonglong> >::const_iterator it = m_idWhitelists.constBegin();
-+ it!=m_idWhitelists.constEnd(); ++it)
-+ {
-+ match = it->contains(id);
-+
-+ if (!match)
-+ {
-+ break;
-+ }
-+ }
-+ }
-+
-+ return match;
-+}
-+
-+// -------------------------------------------------------------------------------------------------
-+
-+VersionImageFilterSettings::VersionImageFilterSettings()
-+{
-+ m_includeTagFilter = 0;
-+ m_exceptionTagFilter = 0;
-+}
-+
-+VersionImageFilterSettings::VersionImageFilterSettings(const VersionManagerSettings& settings)
-+{
-+ setVersionManagerSettings(settings);
-+}
-+
-+bool VersionImageFilterSettings::operator==(const VersionImageFilterSettings& other) const
-+{
-+ return m_excludeTagFilter == other.m_excludeTagFilter &&
-+ m_exceptionLists == other.m_exceptionLists;
-+}
-+
-+bool VersionImageFilterSettings::matches(const ImageInfo& info) const
-+{
-+ if (!isFiltering())
-+ {
-+ return true;
-+ }
-+
-+ const qlonglong id = info.id();
-+
-+ for (QHash<QString, QList<qlonglong> >::const_iterator it = m_exceptionLists.constBegin();
-+ it != m_exceptionLists.constEnd(); ++it)
-+ {
-+ if (it->contains(id))
-+ {
-+ return true;
-+ }
-+ }
-+
-+ bool match = true;
-+ QList<int> tagIds = info.tagIds();
-+
-+ if (!tagIds.contains(m_includeTagFilter))
-+ {
-+ for (QList<int>::const_iterator it = m_excludeTagFilter.begin();
-+ it != m_excludeTagFilter.end(); ++it)
-+ {
-+ if (tagIds.contains(*it))
-+ {
-+ match = false;
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (!match)
-+ {
-+ if (tagIds.contains(m_exceptionTagFilter))
-+ {
-+ match = true;
-+ }
-+ }
-+
-+ return match;
-+}
-+
-+bool VersionImageFilterSettings::isHiddenBySettings(const ImageInfo& info) const
-+{
-+ QList<int> tagIds = info.tagIds();
-+
-+ foreach(int tagId, m_excludeTagFilter)
-+ {
-+ if (tagIds.contains(tagId))
-+ {
-+ return true;
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+bool VersionImageFilterSettings::isExemptedBySettings(const ImageInfo& info) const
-+{
-+ return info.tagIds().contains(m_exceptionTagFilter);
-+}
-+
-+void VersionImageFilterSettings::setVersionManagerSettings(const VersionManagerSettings& settings)
-+{
-+ m_excludeTagFilter.clear();
-+
-+ if (!settings.enabled)
-+ {
-+ return;
-+ }
-+
-+ if (!(settings.showInViewFlags & VersionManagerSettings::ShowOriginal))
-+ {
-+ m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::originalVersion());
-+ }
-+
-+ if (!(settings.showInViewFlags & VersionManagerSettings::ShowIntermediates))
-+ {
-+ m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::intermediateVersion());
-+ }
-+
-+ m_includeTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::currentVersion());
-+ m_exceptionTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::versionAlwaysVisible());
-+}
-+
-+void VersionImageFilterSettings::setExceptionList(const QList<qlonglong>& idList, const QString& id)
-+{
-+ if (idList.isEmpty())
-+ {
-+ m_exceptionLists.remove(id);
-+ }
-+ else
-+ {
-+ m_exceptionLists.insert(id, idList);
-+ }
-+}
-+
-+bool VersionImageFilterSettings::isFiltering() const
-+{
-+ return !m_excludeTagFilter.isEmpty();
-+}
-+
-+bool VersionImageFilterSettings::isFilteringByTags() const
-+{
-+ return isFiltering();
-+}
-+
-+// -------------------------------------------------------------------------------------------------
-+
-+GroupImageFilterSettings::GroupImageFilterSettings()
-+ : m_allOpen(false)
-+{
-+}
-+
-+bool GroupImageFilterSettings::operator==(const GroupImageFilterSettings& other) const
-+{
-+ return (m_allOpen == other.m_allOpen &&
-+ m_openGroups == other.m_openGroups);
-+}
-+
-+bool GroupImageFilterSettings::matches(const ImageInfo& info) const
-+{
-+ if (m_allOpen)
-+ {
-+ return true;
-+ }
-+
-+ if (info.isGrouped())
-+ {
-+ return m_openGroups.contains(info.groupImage().id());
-+ }
-+ return true;
-+}
-+
-+void GroupImageFilterSettings::setOpen(qlonglong group, bool open)
-+{
-+ if (open)
-+ {
-+ m_openGroups << group;
-+ }
-+ else
-+ {
-+ m_openGroups.remove(group);
-+ }
-+}
-+
-+bool GroupImageFilterSettings::isOpen(qlonglong group) const
-+{
-+ return m_openGroups.contains(group);
-+}
-+
-+void GroupImageFilterSettings::setAllOpen(bool open)
-+{
-+ m_allOpen = open;
-+}
-+
-+bool GroupImageFilterSettings::isAllOpen() const
-+{
-+ return m_allOpen;
-+}
-+
-+bool GroupImageFilterSettings::isFiltering() const
-+{
-+ return !m_allOpen;
-+}
-+
-+DatabaseFields::Set GroupImageFilterSettings::watchFlags() const
-+{
-+ return DatabaseFields::ImageRelations;
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagefiltersettings.h b/libs/database/models/imagefiltersettings.h
-new file mode 100644
-index 0000000..0e7beae
---- /dev/null
-+++ b/libs/database/models/imagefiltersettings.h
-@@ -0,0 +1,349 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Filter values for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-+ * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEFILTERSETTINGS_H
-+#define IMAGEFILTERSETTINGS_H
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QList>
-+#include <QMap>
-+#include <QString>
-+#include <QSet>
-+#include <QUrl>
-+
-+// Local includes
-+
-+#include "searchtextbar.h"
-+#include "mimefilter.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageInfo;
-+class VersionManagerSettings;
-+
-+namespace DatabaseFields
-+{
-+ class Set;
-+}
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT SearchTextFilterSettings : public SearchTextSettings
-+{
-+
-+public:
-+
-+ enum TextFilterFields
-+ {
-+ None = 0x00,
-+ ImageName = 0x01,
-+ ImageTitle = 0x02,
-+ ImageComment = 0x04,
-+ TagName = 0x08,
-+ AlbumName = 0x10,
-+ ImageAspectRatio = 0x20,
-+ ImagePixelSize = 0x40,
-+ All = ImageName | ImageTitle | ImageComment | TagName | AlbumName | ImageAspectRatio | ImagePixelSize
-+ };
-+
-+public:
-+
-+ SearchTextFilterSettings()
-+ {
-+ textFields = None;
-+ }
-+
-+ explicit SearchTextFilterSettings(const SearchTextSettings& settings)
-+ {
-+ caseSensitive = settings.caseSensitive;
-+ text = settings.text;
-+ textFields = None;
-+ }
-+
-+ TextFilterFields textFields;
-+};
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT ImageFilterSettings
-+{
-+public:
-+
-+ ImageFilterSettings();
-+
-+ /**
-+ * Returns true if the given ImageInfo matches the filter criteria.
-+ * Optionally, foundText is set to true if it matched by text search.
-+ */
-+ bool matches(const ImageInfo& info, bool* const foundText = 0) const;
-+
-+public:
-+
-+ /// --- Tags filter ---
-+
-+ /// Possible logical matching condition used to sort tags id.
-+ enum MatchingCondition
-+ {
-+ OrCondition,
-+ AndCondition
-+ };
-+
-+ void setTagFilter(const QList<int>& includedTags,
-+ const QList<int>& excludedTags,
-+ MatchingCondition matchingCond,
-+ bool showUnTagged,
-+ const QList<int>& clTagIds,
-+ const QList<int>& plTagIds);
-+
-+public:
-+
-+ /// --- Rating filter ---
-+
-+ /// Possible conditions used to filter rating: >=, =, <=
-+ enum RatingCondition
-+ {
-+ GreaterEqualCondition,
-+ EqualCondition,
-+ LessEqualCondition
-+ };
-+
-+ void setRatingFilter(int rating, RatingCondition ratingCond, bool isUnratedExcluded);
-+
-+public:
-+
-+ /// --- Date filter ---
-+ void setDayFilter(const QList<QDateTime>& days);
-+
-+public:
-+
-+ /// --- Text filter ---
-+ void setTextFilter(const SearchTextFilterSettings& settings);
-+ void setTagNames(const QHash<int, QString>& tagNameHash);
-+ void setAlbumNames(const QHash<int, QString>& albumNameHash);
-+
-+public:
-+
-+ /// --- Mime filter ---
-+ void setMimeTypeFilter(int mimeTypeFilter);
-+
-+public:
-+
-+ /// --- Geolocation filter
-+ enum GeolocationCondition
-+ {
-+ GeolocationNoFilter = 0,
-+ GeolocationNoCoordinates = 1 << 1,
-+ GeolocationHasCoordinates = 1 << 2
-+ };
-+
-+ void setGeolocationFilter(const GeolocationCondition& condition);
-+
-+public:
-+
-+ /// Returns if the day is a filter criteria
-+ bool isFilteringByDay() const;
-+
-+ /// Returns if the type mime is a filter criteria
-+ bool isFilteringByTypeMime() const;
-+
-+ /// Returns whether geolocation is a filter criteria
-+ bool isFilteringByGeolocation() const;
-+
-+ /// Returns if the rating is a filter criteria
-+ bool isFilteringByRating() const;
-+
-+ /// Returns if the pick labels is a filter criteria
-+ bool isFilteringByPickLabels() const;
-+
-+ /// Returns if the color labels is a filter criteria
-+ bool isFilteringByColorLabels() const;
-+
-+ /// Returns if the tag is a filter criteria
-+ bool isFilteringByTags() const;
-+
-+ /// Returns if the text (including comment) is a filter criteria
-+ bool isFilteringByText() const;
-+
-+ /// Returns if images will be filtered by these criteria at all
-+ bool isFiltering() const;
-+
-+public:
-+
-+ /// --- URL whitelist filter
-+ void setUrlWhitelist(const QList<QUrl>& urlList, const QString& id);
-+
-+public:
-+
-+ /// --- ID whitelist filter
-+ void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
-+
-+public:
-+
-+ /// --- Change notification ---
-+
-+ /** Returns database fields a change in which would affect the current filtering.
-+ * To find out if an image tag change affects filtering, test isFilteringByTags().
-+ * The text filter will also be affected by changes in tags and album names.
-+ */
-+ DatabaseFields::Set watchFlags() const;
-+
-+private:
-+
-+ /**
-+ * @brief Returns whether some internal filtering (whitelist by id or URL) or normal filtering is going on
-+ */
-+ bool isFilteringInternally() const;
-+
-+private:
-+
-+ /// --- Tags filter ---
-+ bool m_untaggedFilter;
-+ QList<int> m_includeTagFilter;
-+ QList<int> m_excludeTagFilter;
-+ MatchingCondition m_matchingCond;
-+ QList<int> m_colorLabelTagFilter;
-+ QList<int> m_pickLabelTagFilter;
-+
-+ /// --- Rating filter ---
-+ int m_ratingFilter;
-+ RatingCondition m_ratingCond;
-+ bool m_isUnratedExcluded;
-+
-+ /// --- Date filter ---
-+ QMap<QDateTime, bool> m_dayFilter;
-+
-+ /// --- Text filter ---
-+ SearchTextFilterSettings m_textFilterSettings;
-+
-+ /// Helpers for text search: Set these if you want to search album or tag names with text search
-+ QHash<int, QString> m_tagNameHash;
-+ QHash<int, QString> m_albumNameHash;
-+
-+ /// --- Mime filter ---
-+ MimeFilter::TypeMimeFilter m_mimeTypeFilter;
-+
-+ /// --- Geolocation filter
-+ GeolocationCondition m_geolocationCondition;
-+
-+ /// --- URL whitelist filter
-+ QHash<QString,QList<QUrl>> m_urlWhitelists;
-+
-+ /// --- ID whitelist filter
-+ QHash<QString,QList<qlonglong> > m_idWhitelists;
-+};
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT VersionImageFilterSettings
-+{
-+public:
-+
-+ VersionImageFilterSettings();
-+ explicit VersionImageFilterSettings(const VersionManagerSettings& settings);
-+
-+ bool operator==(const VersionImageFilterSettings& other) const;
-+
-+ /**
-+ * Returns true if the given ImageInfo matches the filter criteria.
-+ */
-+ bool matches(const ImageInfo& info) const;
-+
-+ bool isHiddenBySettings(const ImageInfo& info) const;
-+ bool isExemptedBySettings(const ImageInfo& info) const;
-+
-+ /// --- Tags filter ---
-+
-+ void setVersionManagerSettings(const VersionManagerSettings& settings);
-+
-+ /**
-+ * Add list with exceptions: These images will be exempted from filtering by this filter
-+ */
-+ void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
-+
-+ /// Returns if images will be filtered by these criteria at all
-+ bool isFiltering() const;
-+
-+ /// Returns if the tag is a filter criteria
-+ bool isFilteringByTags() const;
-+
-+ /// DatabaseFields::Set watchFlags() const: Would return 0
-+
-+protected:
-+
-+ QList<int> m_excludeTagFilter;
-+ int m_includeTagFilter;
-+ int m_exceptionTagFilter;
-+ QHash<QString,QList<qlonglong> > m_exceptionLists;
-+};
-+
-+// ---------------------------------------------------------------------------------------
-+
-+class DIGIKAM_DATABASE_EXPORT GroupImageFilterSettings
-+{
-+public:
-+
-+ GroupImageFilterSettings();
-+
-+ bool operator==(const GroupImageFilterSettings& other) const;
-+
-+ /**
-+ * Returns true if the given ImageInfo matches the filter criteria.
-+ */
-+ bool matches(const ImageInfo& info) const;
-+
-+ /**
-+ * Open or close a group.
-+ */
-+ void setOpen(qlonglong group, bool open);
-+ bool isOpen(qlonglong group) const;
-+
-+ /**
-+ * Open all groups
-+ */
-+ void setAllOpen(bool open);
-+ bool isAllOpen() const;
-+
-+ /// Returns if images will be filtered by these criteria at all
-+ bool isFiltering() const;
-+
-+ DatabaseFields::Set watchFlags() const;
-+
-+protected:
-+
-+ bool m_allOpen;
-+ QSet<qlonglong> m_openGroups;
-+};
-+
-+} // namespace Digikam
-+
-+Q_DECLARE_METATYPE(Digikam::ImageFilterSettings::GeolocationCondition)
-+
-+#endif // IMAGEFILTERSETTINGS_H
-diff --git a/libs/database/models/imagelistmodel.cpp b/libs/database/models/imagelistmodel.cpp
-new file mode 100644
-index 0000000..fafce34
---- /dev/null
-+++ b/libs/database/models/imagelistmodel.cpp
-@@ -0,0 +1,70 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-12-06
-+ * Description : An image model based on a static list
-+ *
-+ * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagelistmodel.h"
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbaccess.h"
-+#include "coredbchangesets.h"
-+#include "coredbwatch.h"
-+#include "imageinfo.h"
-+#include "imageinfolist.h"
-+
-+namespace Digikam
-+{
-+
-+ImageListModel::ImageListModel(QObject* parent)
-+ : ImageThumbnailModel(parent)
-+{
-+ connect(CoreDbAccess::databaseWatch(), SIGNAL(collectionImageChange(CollectionImageChangeset)),
-+ this, SLOT(slotCollectionImageChange(CollectionImageChangeset)));
-+}
-+
-+ImageListModel::~ImageListModel()
-+{
-+}
-+
-+void ImageListModel::slotCollectionImageChange(const CollectionImageChangeset& changeset)
-+{
-+ if (isEmpty())
-+ {
-+ return;
-+ }
-+
-+ switch (changeset.operation())
-+ {
-+ case CollectionImageChangeset::Added:
-+ break;
-+ case CollectionImageChangeset::Removed:
-+ case CollectionImageChangeset::RemovedAll:
-+ removeImageInfos(ImageInfoList(changeset.ids()));
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagelistmodel.h b/libs/database/models/imagelistmodel.h
-new file mode 100644
-index 0000000..a225b1b
---- /dev/null
-+++ b/libs/database/models/imagelistmodel.h
-@@ -0,0 +1,63 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-12-06
-+ * Description : An image model based on a static list
-+ *
-+ * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGELISTMODEL_H
-+#define IMAGELISTMODEL_H
-+
-+// Local includes
-+
-+#include "imagethumbnailmodel.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageChangeset;
-+class CollectionImageChangeset;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageListModel : public ImageThumbnailModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageListModel(QObject* parent = 0);
-+ ~ImageListModel();
-+
-+ // NOTE: necessary methods to add and remove ImageInfos to the model are inherited from ImageModel
-+
-+Q_SIGNALS:
-+
-+ /**
-+ * Emitted when images are removed from the model because they are removed in the database
-+ */
-+ void imageInfosRemoved(const QList<ImageInfo>& infos);
-+
-+protected Q_SLOTS:
-+
-+ void slotCollectionImageChange(const CollectionImageChangeset& changeset);
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGELISTMODEL_H
-diff --git a/libs/database/models/imagemodel.cpp b/libs/database/models/imagemodel.cpp
-new file mode 100644
-index 0000000..41b43cf
---- /dev/null
-+++ b/libs/database/models/imagemodel.cpp
-@@ -0,0 +1,1368 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagemodel.h"
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QItemSelection>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "coredbchangesets.h"
-+#include "coredbfields.h"
-+#include "coredbwatch.h"
-+#include "imageinfo.h"
-+#include "imageinfolist.h"
-+#include "abstractitemdragdrophandler.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageModel::Private
-+{
-+public:
-+
-+ Private()
-+ {
-+ preprocessor = 0;
-+ keepFilePathCache = false;
-+ sendRemovalSignals = false;
-+ incrementalUpdater = 0;
-+ refreshing = false;
-+ reAdding = false;
-+ incrementalRefreshRequested = false;
-+ }
-+
-+ ImageInfoList infos;
-+ QList<QVariant> extraValues;
-+ QHash<qlonglong, int> idHash;
-+
-+ bool keepFilePathCache;
-+ QHash<QString, qlonglong> filePathHash;
-+
-+ bool sendRemovalSignals;
-+
-+ QObject* preprocessor;
-+ bool refreshing;
-+ bool reAdding;
-+ bool incrementalRefreshRequested;
-+
-+ DatabaseFields::Set watchFlags;
-+
-+ class ImageModelIncrementalUpdater* incrementalUpdater;
-+
-+ ImageInfoList pendingInfos;
-+ QList<QVariant> pendingExtraValues;
-+
-+ inline bool isValid(const QModelIndex& index)
-+ {
-+ if (!index.isValid())
-+ {
-+ return false;
-+ }
-+
-+ if (index.row() < 0 || index.row() >= infos.size())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index" << index;
-+ return false;
-+ }
-+
-+ return true;
-+ }
-+ inline bool extraValueValid(const QModelIndex& index)
-+ {
-+ // we assume isValid() being called before, no duplicate checks
-+ if (index.row() >= extraValues.size())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index for extraData" << index;
-+ return false;
-+ }
-+
-+ return true;
-+ }
-+};
-+
-+typedef QPair<int, int> IntPair; // to make foreach macro happy
-+typedef QList<IntPair> IntPairList;
-+
-+class ImageModelIncrementalUpdater
-+{
-+public:
-+
-+ explicit ImageModelIncrementalUpdater(ImageModel::Private* d);
-+
-+ void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void aboutToBeRemovedInModel(const IntPairList& aboutToBeRemoved);
-+ QList<IntPair> oldIndexes();
-+
-+ static QList<IntPair> toContiguousPairs(const QList<int>& ids);
-+
-+public:
-+
-+ QHash<qlonglong, int> oldIds;
-+ QList<QVariant> oldExtraValues;
-+ QList<ImageInfo> newInfos;
-+ QList<QVariant> newExtraValues;
-+ QList<IntPairList> modelRemovals;
-+};
-+
-+ImageModel::ImageModel(QObject* parent)
-+ : QAbstractListModel(parent),
-+ d(new Private)
-+{
-+ connect(CoreDbAccess::databaseWatch(), SIGNAL(imageChange(ImageChangeset)),
-+ this, SLOT(slotImageChange(ImageChangeset)));
-+
-+ connect(CoreDbAccess::databaseWatch(), SIGNAL(imageTagChange(ImageTagChangeset)),
-+ this, SLOT(slotImageTagChange(ImageTagChangeset)));
-+}
-+
-+ImageModel::~ImageModel()
-+{
-+ delete d->incrementalUpdater;
-+ delete d;
-+}
-+
-+// ------------ Access methods -------------
-+
-+void ImageModel::setKeepsFilePathCache(bool keepCache)
-+{
-+ d->keepFilePathCache = keepCache;
-+}
-+
-+bool ImageModel::keepsFilePathCache() const
-+{
-+ return d->keepFilePathCache;
-+}
-+
-+bool ImageModel::isEmpty() const
-+{
-+ return d->infos.isEmpty();
-+}
-+
-+void ImageModel::setWatchFlags(const DatabaseFields::Set& set)
-+{
-+ d->watchFlags = set;
-+}
-+
-+ImageInfo ImageModel::imageInfo(const QModelIndex& index) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return ImageInfo();
-+ }
-+
-+ return d->infos.at(index.row());
-+}
-+
-+ImageInfo& ImageModel::imageInfoRef(const QModelIndex& index) const
-+{
-+ return d->infos[index.row()];
-+}
-+
-+qlonglong ImageModel::imageId(const QModelIndex& index) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return 0;
-+ }
-+
-+ return d->infos.at(index.row()).id();
-+}
-+
-+QList<ImageInfo> ImageModel::imageInfos(const QList<QModelIndex>& indexes) const
-+{
-+ QList<ImageInfo> infos;
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ infos << imageInfo(index);
-+ }
-+
-+ return infos;
-+}
-+
-+QList<qlonglong> ImageModel::imageIds(const QList<QModelIndex>& indexes) const
-+{
-+ QList<qlonglong> ids;
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ ids << imageId(index);
-+ }
-+
-+ return ids;
-+}
-+
-+ImageInfo ImageModel::imageInfo(int row) const
-+{
-+ if (row >= d->infos.size())
-+ {
-+ return ImageInfo();
-+ }
-+
-+ return d->infos.at(row);
-+}
-+
-+ImageInfo& ImageModel::imageInfoRef(int row) const
-+{
-+ return d->infos[row];
-+}
-+
-+qlonglong ImageModel::imageId(int row) const
-+{
-+ if (row < 0 || row >= d->infos.size())
-+ {
-+ return -1;
-+ }
-+
-+ return d->infos.at(row).id();
-+}
-+
-+QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info) const
-+{
-+ return indexForImageId(info.id());
-+}
-+
-+QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const
-+{
-+ return indexForImageId(info.id(), extraValue);
-+}
-+
-+QList<QModelIndex> ImageModel::indexesForImageInfo(const ImageInfo& info) const
-+{
-+ return indexesForImageId(info.id());
-+}
-+
-+QModelIndex ImageModel::indexForImageId(qlonglong id) const
-+{
-+ int index = d->idHash.value(id, -1);
-+
-+ if (index != -1)
-+ {
-+ return createIndex(index, 0);
-+ }
-+
-+ return QModelIndex();
-+}
-+
-+QModelIndex ImageModel::indexForImageId(qlonglong id, const QVariant& extraValue) const
-+{
-+ if (d->extraValues.isEmpty())
-+ return indexForImageId(id);
-+
-+ QHash<qlonglong, int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ if (d->extraValues.at(it.value()) == extraValue)
-+ return createIndex(it.value(), 0);
-+ }
-+
-+ return QModelIndex();
-+}
-+
-+QList<QModelIndex> ImageModel::indexesForImageId(qlonglong id) const
-+{
-+ QList<QModelIndex> indexes;
-+ QHash<qlonglong, int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ indexes << createIndex(it.value(), 0);
-+ }
-+
-+ return indexes;
-+}
-+
-+int ImageModel::numberOfIndexesForImageInfo(const ImageInfo& info) const
-+{
-+ return numberOfIndexesForImageId(info.id());
-+}
-+
-+int ImageModel::numberOfIndexesForImageId(qlonglong id) const
-+{
-+ if (d->extraValues.isEmpty())
-+ {
-+ return 0;
-+ }
-+
-+ int count = 0;
-+ QHash<qlonglong,int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ ++count;
-+ }
-+
-+ return count;
-+}
-+
-+// static method
-+ImageInfo ImageModel::retrieveImageInfo(const QModelIndex& index)
-+{
-+ if (!index.isValid())
-+ {
-+ return ImageInfo();
-+ }
-+
-+ ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-+ int row = index.data(ImageModelInternalId).toInt();
-+
-+ if (!model)
-+ {
-+ return ImageInfo();
-+ }
-+
-+ return model->imageInfo(row);
-+}
-+
-+// static method
-+qlonglong ImageModel::retrieveImageId(const QModelIndex& index)
-+{
-+ if (!index.isValid())
-+ {
-+ return 0;
-+ }
-+
-+ ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-+ int row = index.data(ImageModelInternalId).toInt();
-+
-+ if (!model)
-+ {
-+ return 0;
-+ }
-+
-+ return model->imageId(row);
-+}
-+
-+QModelIndex ImageModel::indexForPath(const QString& filePath) const
-+{
-+ if (d->keepFilePathCache)
-+ {
-+ return indexForImageId(d->filePathHash.value(filePath));
-+ }
-+ else
-+ {
-+ const int size = d->infos.size();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ if (d->infos.at(i).filePath() == filePath)
-+ {
-+ return createIndex(i, 0);
-+ }
-+ }
-+ }
-+
-+ return QModelIndex();
-+}
-+
-+QList<QModelIndex> ImageModel::indexesForPath(const QString& filePath) const
-+{
-+ if (d->keepFilePathCache)
-+ {
-+ return indexesForImageId(d->filePathHash.value(filePath));
-+ }
-+ else
-+ {
-+ QList<QModelIndex> indexes;
-+ const int size = d->infos.size();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ if (d->infos.at(i).filePath() == filePath)
-+ {
-+ indexes << createIndex(i, 0);
-+ }
-+ }
-+
-+ return indexes;
-+ }
-+}
-+
-+ImageInfo ImageModel::imageInfo(const QString& filePath) const
-+{
-+ if (d->keepFilePathCache)
-+ {
-+ qlonglong id = d->filePathHash.value(filePath);
-+
-+ if (id)
-+ {
-+ int index = d->idHash.value(id, -1);
-+
-+ if (index != -1)
-+ {
-+ return d->infos.at(index);
-+ }
-+ }
-+ }
-+ else
-+ {
-+ foreach(const ImageInfo& info, d->infos)
-+ {
-+ if (info.filePath() == filePath)
-+ {
-+ return info;
-+ }
-+ }
-+ }
-+
-+ return ImageInfo();
-+}
-+
-+QList<ImageInfo> ImageModel::imageInfos(const QString& filePath) const
-+{
-+ QList<ImageInfo> infos;
-+
-+ if (d->keepFilePathCache)
-+ {
-+ qlonglong id = d->filePathHash.value(filePath);
-+
-+ if (id)
-+ {
-+ foreach(int index, d->idHash.values(id))
-+ {
-+ infos << d->infos.at(index);
-+ }
-+ }
-+ }
-+ else
-+ {
-+ foreach(const ImageInfo& info, d->infos)
-+ {
-+ if (info.filePath() == filePath)
-+ {
-+ infos << info;
-+ }
-+ }
-+ }
-+
-+ return infos;
-+}
-+
-+void ImageModel::addImageInfo(const ImageInfo& info)
-+{
-+ addImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfos(const QList<ImageInfo>& infos)
-+{
-+ addImageInfos(infos, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ if (d->incrementalUpdater)
-+ {
-+ d->incrementalUpdater->appendInfos(infos, extraValues);
-+ }
-+ else
-+ {
-+ appendInfos(infos, extraValues);
-+ }
-+}
-+
-+void ImageModel::addImageInfoSynchronously(const ImageInfo& info)
-+{
-+ addImageInfosSynchronously(QList<ImageInfo>() << info, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos)
-+{
-+ addImageInfos(infos, QList<QVariant>());
-+}
-+
-+void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ publiciseInfos(infos, extraValues);
-+ emit processAdded(infos, extraValues);
-+}
-+
-+void ImageModel::ensureHasImageInfo(const ImageInfo& info)
-+{
-+ ensureHasImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
-+}
-+
-+void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos)
-+{
-+ ensureHasImageInfos(infos, QList<QVariant>());
-+}
-+
-+void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (extraValues.isEmpty())
-+ {
-+ if (!d->pendingExtraValues.isEmpty())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-+ return;
-+ }
-+ }
-+ else
-+ {
-+ if (d->pendingInfos.size() != d->pendingExtraValues.size())
-+ {
-+ qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-+ return;
-+ }
-+ }
-+
-+ d->pendingInfos << infos;
-+ d->pendingExtraValues << extraValues;
-+ cleanSituationChecks();
-+}
-+
-+void ImageModel::clearImageInfos()
-+{
-+ d->infos.clear();
-+ d->extraValues.clear();
-+ d->idHash.clear();
-+ d->filePathHash.clear();
-+ delete d->incrementalUpdater;
-+ d->incrementalUpdater = 0;
-+ d->pendingInfos.clear();
-+ d->pendingExtraValues.clear();
-+ d->refreshing = false;
-+ d->reAdding = false;
-+ d->incrementalRefreshRequested = false;
-+
-+ beginResetModel();
-+ endResetModel();
-+
-+ imageInfosCleared();
-+}
-+
-+void ImageModel::setImageInfos(const QList<ImageInfo>& infos)
-+{
-+ clearImageInfos();
-+ addImageInfos(infos);
-+}
-+
-+QList<ImageInfo> ImageModel::imageInfos() const
-+{
-+ return d->infos;
-+}
-+
-+QList<qlonglong> ImageModel::imageIds() const
-+{
-+ return d->idHash.keys();
-+}
-+
-+bool ImageModel::hasImage(qlonglong id) const
-+{
-+ return d->idHash.contains(id);
-+}
-+
-+bool ImageModel::hasImage(const ImageInfo& info) const
-+{
-+ return d->idHash.contains(info.id());
-+}
-+
-+bool ImageModel::hasImage(const ImageInfo& info, const QVariant& extraValue) const
-+{
-+ return hasImage(info.id(), extraValue);
-+}
-+
-+bool ImageModel::hasImage(qlonglong id, const QVariant& extraValue) const
-+{
-+ if (d->extraValues.isEmpty())
-+ return hasImage(id);
-+
-+ QHash<qlonglong, int>::const_iterator it;
-+
-+ for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-+ {
-+ if (d->extraValues.at(it.value()) == extraValue)
-+ return true;
-+ }
-+
-+ return false;;
-+}
-+
-+QList<ImageInfo> ImageModel::uniqueImageInfos() const
-+{
-+ if (d->extraValues.isEmpty())
-+ {
-+ return d->infos;
-+ }
-+
-+ QList<ImageInfo> uniqueInfos;
-+ const int size = d->infos.size();
-+
-+ for (int i=0; i<size; ++i)
-+ {
-+ const ImageInfo& info = d->infos.at(i);
-+
-+ if (d->idHash.value(info.id()) == i)
-+ {
-+ uniqueInfos << info;
-+ }
-+ }
-+
-+ return uniqueInfos;
-+}
-+
-+void ImageModel::emitDataChangedForAll()
-+{
-+ if (d->infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ QModelIndex first = createIndex(0, 0);
-+ QModelIndex last = createIndex(d->infos.size() - 1, 0);
-+ emit dataChanged(first, last);
-+}
-+
-+void ImageModel::emitDataChangedForSelection(const QItemSelection& selection)
-+{
-+ if (!selection.isEmpty())
-+ {
-+ foreach(const QItemSelectionRange& range, selection)
-+ {
-+ emit dataChanged(range.topLeft(), range.bottomRight());
-+ }
-+ }
-+}
-+
-+void ImageModel::ensureHasGroupedImages(const ImageInfo& groupLeader)
-+{
-+ ensureHasImageInfos(groupLeader.groupedImages());
-+}
-+
-+// ------------ Preprocessing -------------
-+
-+void ImageModel::setPreprocessor(QObject* preprocessor)
-+{
-+ unsetPreprocessor(d->preprocessor);
-+ d->preprocessor = preprocessor;
-+}
-+
-+void ImageModel::unsetPreprocessor(QObject* preprocessor)
-+{
-+ if (preprocessor && d->preprocessor == preprocessor)
-+ {
-+ disconnect(this, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)), 0, 0);
-+ disconnect(d->preprocessor, 0, this, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
-+ disconnect(d->preprocessor, 0, this, SLOT(reAddingFinished()));
-+ }
-+}
-+
-+void ImageModel::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ if (d->preprocessor)
-+ {
-+ d->reAdding = true;
-+ emit preprocess(infos, extraValues);
-+ }
-+ else
-+ {
-+ publiciseInfos(infos, extraValues);
-+ }
-+}
-+
-+void ImageModel::appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ // This method does deduplication. It is private because in context of readding or refreshing it is of no use.
-+
-+ if (extraValues.isEmpty())
-+ {
-+ QList<ImageInfo> checkedInfos;
-+
-+ foreach (const ImageInfo& info, infos)
-+ {
-+ if (!hasImage(info))
-+ {
-+ checkedInfos << info;
-+ }
-+ }
-+
-+ appendInfos(checkedInfos, QList<QVariant>());
-+ }
-+ else
-+ {
-+ QList<ImageInfo> checkedInfos;
-+ QList<QVariant> checkedExtraValues;
-+ const int size = infos.size();
-+
-+ for (int i=0; i<size; i++)
-+ {
-+ if (!hasImage(infos[i], extraValues[i]))
-+ {
-+ checkedInfos << infos[i];
-+ checkedExtraValues << extraValues[i];
-+ }
-+ }
-+
-+ appendInfos(checkedInfos, checkedExtraValues);
-+ }
-+}
-+
-+void ImageModel::reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ // addImageInfos -> appendInfos -> preprocessor -> reAddImageInfos
-+ publiciseInfos(infos, extraValues);
-+}
-+
-+void ImageModel::reAddingFinished()
-+{
-+ d->reAdding = false;
-+ cleanSituationChecks();
-+}
-+
-+void ImageModel::startRefresh()
-+{
-+ d->refreshing = true;
-+}
-+
-+void ImageModel::finishRefresh()
-+{
-+ d->refreshing = false;
-+ cleanSituationChecks();
-+}
-+
-+bool ImageModel::isRefreshing() const
-+{
-+ return d->refreshing;
-+}
-+
-+void ImageModel::cleanSituationChecks()
-+{
-+ // For starting an incremental refresh we want a clear situation:
-+ // Any remaining batches from non-incremental refreshing subclasses have been received in appendInfos(),
-+ // any batches sent to preprocessor for re-adding have been re-added.
-+ if (d->refreshing || d->reAdding)
-+ {
-+ return;
-+ }
-+
-+ if (!d->pendingInfos.isEmpty())
-+ {
-+ appendInfosChecked(d->pendingInfos, d->pendingExtraValues);
-+ d->pendingInfos.clear();
-+ d->pendingExtraValues.clear();
-+ cleanSituationChecks();
-+ return;
-+ }
-+
-+ if (d->incrementalRefreshRequested)
-+ {
-+ d->incrementalRefreshRequested = false;
-+ emit readyForIncrementalRefresh();
-+ }
-+ else
-+ {
-+ emit allRefreshingFinished();
-+ }
-+}
-+
-+void ImageModel::publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ Q_ASSERT(infos.size() == extraValues.size() || (extraValues.isEmpty() && d->extraValues.isEmpty()));
-+
-+ emit imageInfosAboutToBeAdded(infos);
-+ const int firstNewIndex = d->infos.size();
-+ const int lastNewIndex = d->infos.size() + infos.size() - 1;
-+ beginInsertRows(QModelIndex(), firstNewIndex, lastNewIndex);
-+ d->infos << infos;
-+ d->extraValues << extraValues;
-+
-+ for (int i=firstNewIndex; i<=lastNewIndex; ++i)
-+ {
-+ const ImageInfo& info = d->infos.at(i);
-+ qlonglong id = info.id();
-+ d->idHash.insertMulti(id, i);
-+
-+ if (d->keepFilePathCache)
-+ {
-+ d->filePathHash[info.filePath()] = id;
-+ }
-+ }
-+
-+ endInsertRows();
-+ emit imageInfosAdded(infos);
-+}
-+
-+void ImageModel::requestIncrementalRefresh()
-+{
-+ if (d->reAdding)
-+ {
-+ d->incrementalRefreshRequested = true;
-+ }
-+ else
-+ {
-+ emit readyForIncrementalRefresh();
-+ }
-+}
-+
-+bool ImageModel::hasIncrementalRefreshPending() const
-+{
-+ return d->incrementalRefreshRequested;
-+}
-+
-+void ImageModel::startIncrementalRefresh()
-+{
-+ delete d->incrementalUpdater;
-+
-+ d->incrementalUpdater = new ImageModelIncrementalUpdater(d);
-+}
-+
-+void ImageModel::finishIncrementalRefresh()
-+{
-+ if (!d->incrementalUpdater)
-+ {
-+ return;
-+ }
-+
-+ // remove old entries
-+ QList<QPair<int, int> > pairs = d->incrementalUpdater->oldIndexes();
-+ removeRowPairs(pairs);
-+
-+ // add new indexes
-+ appendInfos(d->incrementalUpdater->newInfos, d->incrementalUpdater->newExtraValues);
-+
-+ delete d->incrementalUpdater;
-+ d->incrementalUpdater = 0;
-+}
-+
-+void ImageModel::removeIndex(const QModelIndex& index)
-+{
-+ removeIndexes(QList<QModelIndex>() << index);
-+}
-+
-+void ImageModel::removeIndexes(const QList<QModelIndex>& indexes)
-+{
-+ QList<int> listIndexes;
-+
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ if (d->isValid(index))
-+ {
-+ listIndexes << index.row();
-+ }
-+ }
-+
-+ if (listIndexes.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
-+}
-+
-+void ImageModel::removeImageInfo(const ImageInfo& info)
-+{
-+ removeImageInfos(QList<ImageInfo>() << info);
-+}
-+
-+void ImageModel::removeImageInfos(const QList<ImageInfo>& infos)
-+{
-+ QList<int> listIndexes;
-+
-+ foreach(const ImageInfo& info, infos)
-+ {
-+ QModelIndex index = indexForImageId(info.id());
-+
-+ if (index.isValid())
-+ {
-+ listIndexes << index.row();
-+ }
-+ }
-+ removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
-+}
-+
-+void ImageModel::removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (extraValues.isEmpty())
-+ {
-+ removeImageInfos(infos);
-+ return;
-+ }
-+
-+ QList<int> listIndexes;
-+
-+ for (int i=0; i<infos.size(); ++i)
-+ {
-+ QModelIndex index = indexForImageId(infos.at(i).id(), extraValues.at(i));
-+
-+ if (index.isValid())
-+ {
-+ listIndexes << index.row();
-+ }
-+ }
-+
-+ removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
-+}
-+
-+void ImageModel::setSendRemovalSignals(bool send)
-+{
-+ d->sendRemovalSignals = send;
-+}
-+
-+template <class List, typename T>
-+static bool pairsContain(const List& list, T value)
-+{
-+ typename List::const_iterator middle;
-+ typename List::const_iterator begin = list.begin();
-+ typename List::const_iterator end = list.end();
-+ int n = int(end - begin);
-+ int half;
-+
-+ while (n > 0)
-+ {
-+ half = n >> 1;
-+ middle = begin + half;
-+
-+ if (middle->first <= value && middle->second >= value)
-+ {
-+ return true;
-+ }
-+ else if (middle->second < value)
-+ {
-+ begin = middle + 1;
-+ n -= half + 1;
-+ }
-+ else
-+ {
-+ n = half;
-+ }
-+ }
-+
-+ return false;
-+}
-+
-+void ImageModel::removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove)
-+{
-+ if (d->incrementalUpdater)
-+ {
-+ d->incrementalUpdater->aboutToBeRemovedInModel(toRemove);
-+ }
-+
-+ removeRowPairs(toRemove);
-+}
-+
-+void ImageModel::removeRowPairs(const QList<QPair<int, int> >& toRemove)
-+{
-+ if (toRemove.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ // Remove old indexes
-+ // Keep in mind that when calling beginRemoveRows all structures announced to be removed
-+ // must still be valid, and this includes our hashes as well, which limits what we can optimize
-+
-+ int removedRows = 0, offset = 0;
-+ typedef QPair<int, int> IntPair; // to make foreach macro happy
-+
-+ foreach(const IntPair& pair, toRemove)
-+ {
-+ const int begin = pair.first - offset;
-+ const int end = pair.second - offset; // inclusive
-+ removedRows = end - begin + 1;
-+
-+ // when removing from the list, all subsequent indexes are affected
-+ offset += removedRows;
-+
-+ QList<ImageInfo> removedInfos;
-+
-+ if (d->sendRemovalSignals)
-+ {
-+ qCopy(d->infos.begin() + begin, d->infos.begin() + end, removedInfos.begin());
-+ emit imageInfosAboutToBeRemoved(removedInfos);
-+ }
-+
-+ imageInfosAboutToBeRemoved(begin, end);
-+ beginRemoveRows(QModelIndex(), begin, end);
-+
-+ // update idHash - which points to indexes of d->infos, and these change now!
-+ QHash<qlonglong, int>::iterator it;
-+
-+ for (it = d->idHash.begin(); it != d->idHash.end(); )
-+ {
-+ if (it.value() >= begin)
-+ {
-+ if (it.value() > end)
-+ {
-+ // after the removed interval: adjust index
-+ it.value() -= removedRows;
-+ }
-+ else
-+ {
-+ // in the removed interval
-+ it = d->idHash.erase(it);
-+ continue;
-+ }
-+ }
-+
-+ ++it;
-+ }
-+
-+ // remove from list
-+ d->infos.erase(d->infos.begin() + begin, d->infos.begin() + (end + 1));
-+
-+ if (!d->extraValues.isEmpty())
-+ {
-+ d->extraValues.erase(d->extraValues.begin() + begin, d->extraValues.begin() + (end + 1));
-+ }
-+
-+ endRemoveRows();
-+
-+ if (d->sendRemovalSignals)
-+ {
-+ emit imageInfosRemoved(removedInfos);
-+ }
-+ }
-+
-+ // tidy up: remove old indexes from file path hash now
-+ if (d->keepFilePathCache)
-+ {
-+ QHash<QString, qlonglong>::iterator it;
-+
-+ for (it = d->filePathHash.begin(); it != d->filePathHash.end(); )
-+ {
-+ if (pairsContain(toRemove, it.value()))
-+ {
-+ it = d->filePathHash.erase(it);
-+ }
-+ else
-+ {
-+ ++it;
-+ }
-+ }
-+ }
-+}
-+
-+ImageModelIncrementalUpdater::ImageModelIncrementalUpdater(ImageModel::Private* d)
-+{
-+ oldIds = d->idHash;
-+ oldExtraValues = d->extraValues;
-+}
-+
-+void ImageModelIncrementalUpdater::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
-+{
-+ if (extraValues.isEmpty())
-+ {
-+ foreach(const ImageInfo& info, infos)
-+ {
-+ QHash<qlonglong,int>::iterator it = oldIds.find(info.id());
-+
-+ if (it != oldIds.end())
-+ {
-+ oldIds.erase(it);
-+ }
-+ else
-+ {
-+ newInfos << info;
-+ }
-+ }
-+ }
-+ else
-+ {
-+ for (int i=0; i<infos.size(); ++i)
-+ {
-+ const ImageInfo& info = infos.at(i);
-+ bool found = false;
-+ QHash<qlonglong,int>::iterator it;
-+
-+ for (it = oldIds.find(info.id()); it != oldIds.end() && it.key() == info.id(); ++it)
-+ {
-+ // first check is for bug #262596. Not sure if needed.
-+ if (it.value() < oldExtraValues.size() && extraValues.at(i) == oldExtraValues.at(it.value()))
-+ {
-+ found = true;
-+ break;
-+ }
-+ }
-+
-+ if (found)
-+ {
-+ oldIds.erase(it);
-+ // do not erase from oldExtraValues - oldIds is a hash id -> index.
-+ }
-+ else
-+ {
-+ newInfos << info;
-+ newExtraValues << extraValues.at(i);
-+ }
-+ }
-+ }
-+}
-+
-+void ImageModelIncrementalUpdater::aboutToBeRemovedInModel(const IntPairList& toRemove)
-+{
-+ modelRemovals << toRemove;
-+}
-+
-+QList<QPair<int, int> > ImageModelIncrementalUpdater::oldIndexes()
-+{
-+ // first, apply all changes to indexes by direct removal in model
-+ // while the updater was active
-+ foreach(const IntPairList& list, modelRemovals)
-+ {
-+ int removedRows = 0, offset = 0;
-+
-+ foreach(const IntPair& pair, list)
-+ {
-+ const int begin = pair.first - offset;
-+ const int end = pair.second - offset; // inclusive
-+ removedRows = end - begin + 1;
-+
-+ // when removing from the list, all subsequent indexes are affected
-+ offset += removedRows;
-+
-+ // update idHash - which points to indexes of d->infos, and these change now!
-+ QHash<qlonglong, int>::iterator it;
-+
-+ for (it = oldIds.begin(); it != oldIds.end(); )
-+ {
-+ if (it.value() >= begin)
-+ {
-+ if (it.value() > end)
-+ {
-+ // after the removed interval: adjust index
-+ it.value() -= removedRows;
-+ }
-+ else
-+ {
-+ // in the removed interval
-+ it = oldIds.erase(it);
-+ continue;
-+ }
-+ }
-+
-+ ++it;
-+ }
-+ }
-+ }
-+
-+ modelRemovals.clear();
-+
-+ return toContiguousPairs(oldIds.values());
-+}
-+
-+QList<QPair<int, int> > ImageModelIncrementalUpdater::toContiguousPairs(const QList<int>& unsorted)
-+{
-+ // Take the given indices and return them as contiguous pairs [begin, end]
-+
-+ QList<QPair<int, int> > pairs;
-+
-+ if (unsorted.isEmpty())
-+ {
-+ return pairs;
-+ }
-+
-+ QList<int> indices(unsorted);
-+ qSort(indices);
-+
-+ QPair<int, int> pair(indices.first(), indices.first());
-+
-+ for (int i=1; i<indices.size(); ++i)
-+ {
-+ const int &index = indices.at(i);
-+
-+ if (index == pair.second + 1)
-+ {
-+ pair.second = index;
-+ continue;
-+ }
-+
-+ pairs << pair; // insert last pair
-+ pair.first = index;
-+ pair.second = index;
-+ }
-+
-+ pairs << pair;
-+
-+ return pairs;
-+}
-+
-+// ------------ QAbstractItemModel implementation -------------
-+
-+QVariant ImageModel::data(const QModelIndex& index, int role) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return QVariant();
-+ }
-+
-+ switch (role)
-+ {
-+ case Qt::DisplayRole:
-+ case Qt::ToolTipRole:
-+ return d->infos.at(index.row()).name();
-+
-+ case ImageModelPointerRole:
-+ return QVariant::fromValue(const_cast<ImageModel*>(this));
-+
-+ case ImageModelInternalId:
-+ return index.row();
-+
-+ case CreationDateRole:
-+ return d->infos.at(index.row()).dateTime();
-+
-+ case ExtraDataRole:
-+
-+ if (d->extraValueValid(index))
-+ {
-+ return d->extraValues.at(index.row());
-+ }
-+ else
-+ {
-+ return QVariant();
-+ }
-+
-+ case ExtraDataDuplicateCount:
-+ {
-+ qlonglong id = d->infos.at(index.row()).id();
-+ return numberOfIndexesForImageId(id);
-+ }
-+ }
-+
-+ return QVariant();
-+}
-+
-+QVariant ImageModel::headerData(int section, Qt::Orientation orientation, int role) const
-+{
-+ Q_UNUSED(section)
-+ Q_UNUSED(orientation)
-+ Q_UNUSED(role)
-+ return QVariant();
-+}
-+
-+int ImageModel::rowCount(const QModelIndex& parent) const
-+{
-+ if (parent.isValid())
-+ {
-+ return 0;
-+ }
-+
-+ return d->infos.size();
-+}
-+
-+Qt::ItemFlags ImageModel::flags(const QModelIndex& index) const
-+{
-+ if (!d->isValid(index))
-+ {
-+ return 0;
-+ }
-+
-+ Qt::ItemFlags f = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
-+
-+ f |= dragDropFlags(index);
-+
-+ return f;
-+}
-+
-+QModelIndex ImageModel::index(int row, int column, const QModelIndex& parent) const
-+{
-+ if (column != 0 || row < 0 || parent.isValid() || row >= d->infos.size())
-+ {
-+ return QModelIndex();
-+ }
-+
-+ return createIndex(row, 0);
-+}
-+
-+// ------------ Database watch -------------
-+
-+void ImageModel::slotImageChange(const ImageChangeset& changeset)
-+{
-+ if (d->infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ if (d->watchFlags & changeset.changes())
-+ {
-+ QItemSelection items;
-+
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ QModelIndex index = indexForImageId(id);
-+
-+ if (index.isValid())
-+ {
-+ items.select(index, index);
-+ }
-+ }
-+
-+ if (!items.isEmpty())
-+ {
-+ emitDataChangedForSelection(items);
-+ emit imageChange(changeset, items);
-+ }
-+ }
-+}
-+
-+void ImageModel::slotImageTagChange(const ImageTagChangeset& changeset)
-+{
-+ if (d->infos.isEmpty())
-+ {
-+ return;
-+ }
-+
-+ QItemSelection items;
-+
-+ foreach(const qlonglong& id, changeset.ids())
-+ {
-+ QModelIndex index = indexForImageId(id);
-+
-+ if (index.isValid())
-+ {
-+ items.select(index, index);
-+ }
-+ }
-+
-+ if (!items.isEmpty())
-+ {
-+ emitDataChangedForSelection(items);
-+ emit imageTagChange(changeset, items);
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagemodel.h b/libs/database/models/imagemodel.h
-new file mode 100644
-index 0000000..dcf94c2
---- /dev/null
-+++ b/libs/database/models/imagemodel.h
-@@ -0,0 +1,364 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEMODEL_H
-+#define IMAGEMODEL_H
-+
-+// Qt includes
-+
-+#include <QAbstractListModel>
-+
-+// Local includes
-+
-+#include "dragdropimplementations.h"
-+#include "imageinfo.h"
-+#include "digikam_export.h"
-+
-+class QItemSelection;
-+
-+namespace Digikam
-+{
-+
-+class ImageChangeset;
-+class ImageTagChangeset;
-+
-+namespace DatabaseFields
-+{
-+class Set;
-+}
-+
-+class DIGIKAM_DATABASE_EXPORT ImageModel : public QAbstractListModel, public DragDropModelImplementation
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ enum ImageModelRoles
-+ {
-+ /// An ImageModel* pointer to this model
-+ ImageModelPointerRole = Qt::UserRole,
-+ ImageModelInternalId = Qt::UserRole + 1,
-+ /// Returns a thumbnail pixmap. May be implemented by subclasses.
-+ /// Returns either a valid pixmap or a null QVariant.
-+ ThumbnailRole = Qt::UserRole + 2,
-+ /// Returns a QDateTime with the creation date
-+ CreationDateRole = Qt::UserRole + 3,
-+ /// Return (optional) extraData field
-+ ExtraDataRole = Qt::UserRole + 5,
-+ /// Returns the number of duplicate indexes for the same image id
-+ ExtraDataDuplicateCount = Qt::UserRole + 6,
-+
-+ // Roles which are defined here but not implemented by ImageModel
-+ /// Returns position of item in Left Light Table preview.
-+ LTLeftPanelRole = Qt::UserRole + 50,
-+ /// Returns position of item in Right Light Table preview.
-+ LTRightPanelRole = Qt::UserRole + 51,
-+
-+ // For use by subclasses
-+ SubclassRoles = Qt::UserRole + 100,
-+ // For use by filter models
-+ FilterModelRoles = Qt::UserRole + 500
-+ };
-+
-+public:
-+
-+ explicit ImageModel(QObject* parent = 0);
-+ ~ImageModel();
-+
-+ /** If a cache is kept, lookup by file path is fast,
-+ * without a cache it is O(n). Default is false.
-+ */
-+ void setKeepsFilePathCache(bool keepCache);
-+ bool keepsFilePathCache() const;
-+
-+ /** Set a set of database fields to watch.
-+ * If either of these is changed, dataChanged() will be emitted.
-+ * Default is no flag (no signal will be emitted).
-+ */
-+ void setWatchFlags(const DatabaseFields::Set& set);
-+
-+ /** Returns the ImageInfo object, reference or image id from the underlying data
-+ * pointed to by the index.
-+ * If the index is not valid, imageInfo will return a null ImageInfo, imageId will
-+ * return 0, imageInfoRef must not be called with an invalid index.
-+ */
-+ ImageInfo imageInfo(const QModelIndex& index) const;
-+ ImageInfo& imageInfoRef(const QModelIndex& index) const;
-+ qlonglong imageId(const QModelIndex& index) const;
-+ QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-+ QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
-+
-+ /** Returns the ImageInfo object, reference or image id from the underlying data
-+ * of the given row (parent is the invalid QModelIndex, column is 0).
-+ * Note that imageInfoRef will crash if index is invalid.
-+ */
-+ ImageInfo imageInfo(int row) const;
-+ ImageInfo& imageInfoRef(int row) const;
-+ qlonglong imageId(int row) const;
-+
-+ /** Return the index for the given ImageInfo or id, if contained in this model.
-+ */
-+ QModelIndex indexForImageInfo(const ImageInfo& info) const;
-+ QModelIndex indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const;
-+ QModelIndex indexForImageId(qlonglong id) const;
-+ QModelIndex indexForImageId(qlonglong id, const QVariant& extraValue) const;
-+ QList<QModelIndex> indexesForImageInfo(const ImageInfo& info) const;
-+ QList<QModelIndex> indexesForImageId(qlonglong id) const;
-+
-+ int numberOfIndexesForImageInfo(const ImageInfo& info) const;
-+ int numberOfIndexesForImageId(qlonglong id) const;
-+
-+ /** Returns the index or ImageInfo object from the underlying data
-+ * for the given file path. This is fast if keepsFilePathCache is enabled.
-+ * The file path is as returned by ImageInfo.filePath().
-+ * In case of multiple occurrences of the same file, the simpler variants return
-+ * any one found first, use the QList methods to retrieve all occurrences.
-+ */
-+ QModelIndex indexForPath(const QString& filePath) const;
-+ ImageInfo imageInfo(const QString& filePath) const;
-+ QList<QModelIndex> indexesForPath(const QString& filePath) const;
-+ QList<ImageInfo> imageInfos(const QString& filePath) const;
-+
-+ /** Main entry point for subclasses adding image infos to the model.
-+ * If you list entries not unique per image id, you must add an extraValue
-+ * so that every entry is unique by imageId and extraValues.
-+ * Please note that these methods do not prevent addition of duplicate entries.
-+ */
-+ void addImageInfo(const ImageInfo& info);
-+ void addImageInfos(const QList<ImageInfo>& infos);
-+ void addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /** Clears image infos and resets model.
-+ */
-+ void clearImageInfos();
-+
-+ /** Clears and adds the infos.
-+ */
-+ void setImageInfos(const QList<ImageInfo>& infos);
-+
-+ /**
-+ * Directly remove the given indexes or infos from the model.
-+ */
-+ void removeIndex(const QModelIndex& indexes);
-+ void removeIndexes(const QList<QModelIndex>& indexes);
-+ void removeImageInfo(const ImageInfo& info);
-+ void removeImageInfos(const QList<ImageInfo>& infos);
-+ void removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /**
-+ * addImageInfo() is asynchronous if a prepocessor is set.
-+ * This method first adds the info, synchronously.
-+ * Only afterwards, the preprocessor will have the opportunity to process it.
-+ * This method also bypasses any incremental updates.
-+ * Please note that these methods do not prevent addition of duplicate entries.
-+ */
-+ void addImageInfoSynchronously(const ImageInfo& info);
-+ void addImageInfosSynchronously(const QList<ImageInfo>& infos);
-+ void addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /**
-+ * Add the given entries. Method returns immediately, the
-+ * addition may happen later asynchronously.
-+ * These methods prevent the addition of duplicate entries.
-+ */
-+ void ensureHasImageInfo(const ImageInfo& info);
-+ void ensureHasImageInfos(const QList<ImageInfo>& infos);
-+ void ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+
-+ /**
-+ * Ensure that all images grouped on the given leader are contained in the model.
-+ */
-+ void ensureHasGroupedImages(const ImageInfo& groupLeader);
-+
-+ QList<ImageInfo> imageInfos() const;
-+ QList<qlonglong> imageIds() const;
-+ QList<ImageInfo> uniqueImageInfos() const;
-+
-+ bool hasImage(qlonglong id) const;
-+ bool hasImage(const ImageInfo& info) const;
-+ bool hasImage(const ImageInfo& info, const QVariant& extraValue) const;
-+ bool hasImage(qlonglong id, const QVariant& extraValue) const;
-+
-+ bool isEmpty() const;
-+
-+ // Drag and Drop
-+ DECLARE_MODEL_DRAG_DROP_METHODS
-+
-+ /**
-+ * Install an object as a preprocessor for ImageInfos added to this model.
-+ * For every QList of ImageInfos added to addImageInfo, the signal preprocess()
-+ * will be emitted. The preprocessor may process the items and shall then readd
-+ * them by calling reAddImageInfos(). It may take some time to process.
-+ * It shall discard any held infos when the modelReset() signal is sent.
-+ * It shall call readdFinished() when no reset occurred and all infos on the way have been readded.
-+ * This means that only after calling this method, you shall make three connections
-+ * (preprocess -> your slot, your signal -> reAddImageInfos, your signal -> reAddingFinished)
-+ * and make or already hold a connection modelReset() -> your slot.
-+ * There is only one preprocessor at a time, a previously set object will be disconnected.
-+ */
-+ void setPreprocessor(QObject* processor);
-+ void unsetPreprocessor(QObject* processor);
-+
-+ /**
-+ * Returns true if this model is currently refreshing.
-+ * For a preprocessor this means that, although the preprocessor may currently have
-+ * processed all it got, more batches are to be expected.
-+ */
-+ bool isRefreshing() const;
-+
-+ /**
-+ * Enable sending of imageInfosAboutToBeRemoved and imageInfosRemoved signals.
-+ * Default: false
-+ */
-+ void setSendRemovalSignals(bool send);
-+
-+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
-+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
-+ virtual Qt::ItemFlags flags(const QModelIndex& index) const;
-+ virtual QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const;
-+
-+ /** Retrieves the imageInfo object from the data() method of the given index.
-+ * The index may be from a QSortFilterProxyModel as long as an ImageModel is at the end. */
-+ static ImageInfo retrieveImageInfo(const QModelIndex& index);
-+ static qlonglong retrieveImageId(const QModelIndex& index);
-+
-+Q_SIGNALS:
-+
-+ /** Informs that ImageInfos will be added to the model.
-+ * This signal is sent before the model data is changed and views are informed.
-+ */
-+ void imageInfosAboutToBeAdded(const QList<ImageInfo>& infos);
-+
-+ /** Informs that ImageInfos have been added to the model.
-+ * This signal is sent after the model data is changed and views are informed.
-+ */
-+ void imageInfosAdded(const QList<ImageInfo>& infos);
-+
-+ /** Informs that ImageInfos will be removed from the model.
-+ * This signal is sent before the model data is changed and views are informed.
-+ * Note: You need to explicitly enable sending of this signal. It is not sent
-+ * in clearImageInfos().
-+ */
-+ void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
-+
-+ /** Informs that ImageInfos have been removed from the model.
-+ * This signal is sent after the model data is changed and views are informed. *
-+ * Note: You need to explicitly enable sending of this signal. It is not sent
-+ * in clearImageInfos().
-+ */
-+ void imageInfosRemoved(const QList<ImageInfo>& infos);
-+
-+ /** Connect to this signal only if you are the current preprocessor.
-+ */
-+ void preprocess(const QList<ImageInfo>& infos, const QList<QVariant>&);
-+ void processAdded(const QList<ImageInfo>& infos, const QList<QVariant>&);
-+
-+ /** If an ImageChangeset affected indexes of this model with changes as set in watchFlags(),
-+ * this signal contains the changeset and the affected indexes.
-+ */
-+ void imageChange(const ImageChangeset&, const QItemSelection&);
-+
-+ /** If an ImageTagChangeset affected indexes of this model,
-+ * this signal contains the changeset and the affected indexes.
-+ */
-+ void imageTagChange(const ImageTagChangeset&, const QItemSelection&);
-+
-+ /** Signals that the model is right now ready to start an incremental refresh.
-+ * This is guaranteed only for the scope of emitting this signal.
-+ */
-+ void readyForIncrementalRefresh();
-+
-+ /** Signals that the model has finished currently with all scheduled
-+ * refreshing, full or incremental, and all preprocessing.
-+ * The model is in polished, clean situation right now.
-+ */
-+ void allRefreshingFinished();
-+
-+public Q_SLOTS:
-+
-+ void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void reAddingFinished();
-+
-+protected:
-+
-+ /** Subclasses that add ImageInfos in batches shall call startRefresh()
-+ * when they start sending batches and finishRefresh() when they have finished.
-+ * No incremental refreshes will be started while listing.
-+ * A clearImageInfos() always stops listing, calling finishRefresh() is then not necessary.
-+ */
-+ void startRefresh();
-+ void finishRefresh();
-+
-+ /** As soon as the model is ready to start an incremental refresh, the signal
-+ * readyForIncrementalRefresh() will be emitted. The signal will be emitted inline
-+ * if the model is ready right now.
-+ */
-+ void requestIncrementalRefresh();
-+ bool hasIncrementalRefreshPending() const;
-+
-+ /** Starts an incremental refresh operation. You shall only call this method from a slot
-+ * connected to readyForIncrementalRefresh(). To initiate an incremental refresh,
-+ * call requestIncrementalRefresh().
-+ */
-+ void startIncrementalRefresh();
-+ void finishIncrementalRefresh();
-+
-+ void emitDataChangedForAll();
-+ void emitDataChangedForSelection(const QItemSelection& selection);
-+
-+ // Called when the internal storage is cleared
-+ virtual void imageInfosCleared() {};
-+
-+ // Called before rowsAboutToBeRemoved
-+ virtual void imageInfosAboutToBeRemoved(int /*begin*/, int /*end*/) {};
-+
-+protected Q_SLOTS:
-+
-+ virtual void slotImageChange(const ImageChangeset& changeset);
-+ virtual void slotImageTagChange(const ImageTagChangeset& changeset);
-+
-+private:
-+
-+ void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-+ void cleanSituationChecks();
-+ void removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove);
-+ void removeRowPairs(const QList<QPair<int, int> >& toRemove);
-+
-+public:
-+
-+ // Declared public because it's used in ImageModelIncrementalUpdater class
-+ class Private;
-+
-+private:
-+
-+ Private* const d;
-+};
-+
-+} // namespace Digikam
-+
-+Q_DECLARE_METATYPE(Digikam::ImageModel*)
-+
-+#endif // IMAGEMODEL_H
-diff --git a/libs/database/models/imagesortsettings.cpp b/libs/database/models/imagesortsettings.cpp
-new file mode 100644
-index 0000000..39ee6e1
---- /dev/null
-+++ b/libs/database/models/imagesortsettings.cpp
-@@ -0,0 +1,400 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Filter values for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagesortsettings.h"
-+
-+// Qt includes
-+
-+#include <QDateTime>
-+#include <QRectF>
-+
-+// Local includes
-+
-+#include "coredbfields.h"
-+#include "imageinfo.h"
-+
-+namespace Digikam
-+{
-+
-+ImageSortSettings::ImageSortSettings()
-+{
-+ categorizationMode = NoCategories;
-+ categorizationSortOrder = DefaultOrder;
-+ categorizationCaseSensitivity = Qt::CaseSensitive;
-+ sortRole = SortByFileName;
-+ sortOrder = DefaultOrder;
-+ strTypeNatural = true;
-+ sortCaseSensitivity = Qt::CaseSensitive;
-+ currentCategorizationSortOrder = Qt::AscendingOrder;
-+ currentSortOrder = Qt::AscendingOrder;
-+}
-+
-+bool ImageSortSettings::operator==(const ImageSortSettings& other) const
-+{
-+ return
-+ categorizationMode == other.categorizationMode &&
-+ categorizationSortOrder == other.categorizationSortOrder &&
-+ categorizationCaseSensitivity == other.categorizationCaseSensitivity &&
-+ sortRole == other.sortRole &&
-+ sortOrder == other.sortOrder &&
-+ sortCaseSensitivity == other.sortCaseSensitivity;
-+}
-+
-+void ImageSortSettings::setCategorizationMode(CategorizationMode mode)
-+{
-+ categorizationMode = mode;
-+
-+ if (categorizationSortOrder == DefaultOrder)
-+ {
-+ currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-+ }
-+}
-+
-+void ImageSortSettings::setCategorizationSortOrder(SortOrder order)
-+{
-+ categorizationSortOrder = order;
-+
-+ if (categorizationSortOrder == DefaultOrder)
-+ {
-+ currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-+ }
-+ else
-+ {
-+ currentCategorizationSortOrder = (Qt::SortOrder)categorizationSortOrder;
-+ }
-+}
-+
-+void ImageSortSettings::setSortRole(SortRole role)
-+{
-+ sortRole = role;
-+
-+ if (sortOrder == DefaultOrder)
-+ {
-+ currentSortOrder = defaultSortOrderForSortRole(sortRole);
-+ }
-+}
-+
-+void ImageSortSettings::setSortOrder(SortOrder order)
-+{
-+ sortOrder = order;
-+
-+ if (sortOrder == DefaultOrder)
-+ {
-+ currentSortOrder = defaultSortOrderForSortRole(sortRole);
-+ }
-+ else
-+ {
-+ currentSortOrder = (Qt::SortOrder)order;
-+ }
-+}
-+
-+void ImageSortSettings::setStringTypeNatural(bool natural)
-+{
-+ strTypeNatural = natural;
-+}
-+
-+Qt::SortOrder ImageSortSettings::defaultSortOrderForCategorizationMode(CategorizationMode mode)
-+{
-+ switch (mode)
-+ {
-+ case NoCategories:
-+ case OneCategory:
-+ case CategoryByAlbum:
-+ case CategoryByFormat:
-+ default:
-+ return Qt::AscendingOrder;
-+ }
-+}
-+
-+Qt::SortOrder ImageSortSettings::defaultSortOrderForSortRole(SortRole role)
-+{
-+ switch (role)
-+ {
-+ case SortByFileName:
-+ case SortByFilePath:
-+ return Qt::AscendingOrder;
-+ case SortByFileSize:
-+ return Qt::DescendingOrder;
-+ case SortByModificationDate:
-+ case SortByCreationDate:
-+ return Qt::AscendingOrder;
-+ case SortByRating:
-+ case SortByImageSize:
-+ return Qt::DescendingOrder;
-+ case SortByAspectRatio:
-+ return Qt::DescendingOrder;
-+ case SortBySimilarity:
-+ return Qt::DescendingOrder;
-+ default:
-+ return Qt::AscendingOrder;
-+ }
-+}
-+
-+int ImageSortSettings::compareCategories(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ switch (categorizationMode)
-+ {
-+ case NoCategories:
-+ case OneCategory:
-+ return 0;
-+ case CategoryByAlbum:
-+ {
-+ int leftAlbum = left.albumId();
-+ int rightAlbum = right.albumId();
-+
-+ // return comparation result
-+ if (leftAlbum == rightAlbum)
-+ {
-+ return 0;
-+ }
-+ else if (lessThanByOrder(leftAlbum, rightAlbum, currentCategorizationSortOrder))
-+ {
-+ return -1;
-+ }
-+ else
-+ {
-+ return 1;
-+ }
-+ }
-+ case CategoryByFormat:
-+ {
-+ return naturalCompare(left.format(), right.format(),
-+ currentCategorizationSortOrder, categorizationCaseSensitivity, strTypeNatural);
-+ }
-+ default:
-+ return 0;
-+ }
-+}
-+
-+bool ImageSortSettings::lessThan(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ int result = compare(left, right, sortRole);
-+
-+ if (result != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ // are they identical?
-+ if (left == right)
-+ {
-+ return false;
-+ }
-+
-+ // If left and right equal for first sort order, use a hierarchy of all sort orders
-+ if ( (result = compare(left, right, SortByFileName)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByCreationDate)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByModificationDate)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByFilePath)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortByFileSize)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ( (result = compare(left, right, SortBySimilarity)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ return false;
-+}
-+
-+int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right) const
-+{
-+ return compare(left, right, sortRole);
-+}
-+
-+int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right, SortRole role) const
-+{
-+ switch (role)
-+ {
-+ case SortByFileName:
-+ {
-+ bool versioning = (left.name().contains(QLatin1String("_v"), Qt::CaseInsensitive) ||
-+ right.name().contains(QLatin1String("_v"), Qt::CaseInsensitive));
-+ return naturalCompare(left.name(), right.name(), currentSortOrder, sortCaseSensitivity, strTypeNatural, versioning);
-+ }
-+ case SortByFilePath:
-+ return naturalCompare(left.filePath(), right.filePath(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-+ case SortByFileSize:
-+ return compareByOrder(left.fileSize(), right.fileSize(), currentSortOrder);
-+ case SortByModificationDate:
-+ return compareByOrder(left.modDateTime(), right.modDateTime(), currentSortOrder);
-+ case SortByCreationDate:
-+ return compareByOrder(left.dateTime(), right.dateTime(), currentSortOrder);
-+ case SortByRating:
-+ // I have the feeling that inverting the sort order for rating is the natural order
-+ return - compareByOrder(left.rating(), right.rating(), currentSortOrder);
-+ case SortByImageSize:
-+ {
-+ QSize leftSize = left.dimensions();
-+ QSize rightSize = right.dimensions();
-+ int leftPixels = leftSize.width() * leftSize.height();
-+ int rightPixels = rightSize.width() * rightSize.height();
-+ return compareByOrder(leftPixels, rightPixels, currentSortOrder);
-+ }
-+ case SortByAspectRatio:
-+ {
-+ QSize leftSize = left.dimensions();
-+ QSize rightSize = right.dimensions();
-+ int leftAR = (double(leftSize.width()) / double(leftSize.height())) * 1000000;
-+ int rightAR = (double(rightSize.width()) / double(rightSize.height())) * 1000000;
-+ return compareByOrder(leftAR, rightAR, currentSortOrder);
-+ }
-+ case SortBySimilarity:
-+ {
-+ qlonglong leftReferenceImageId = left.currentReferenceImage();
-+ qlonglong rightReferenceImageId = right.currentReferenceImage();
-+ // make sure that the original image has always the highest similarity.
-+ double leftSimilarity = left.id() == leftReferenceImageId ? 1.1 : left.currentSimilarity();
-+ double rightSimilarity = right.id() == rightReferenceImageId ? 1.1 : right.currentSimilarity();
-+ return compareByOrder(leftSimilarity, rightSimilarity, currentSortOrder);
-+ }
-+ default:
-+ return 1;
-+ }
-+}
-+
-+bool ImageSortSettings::lessThan(const QVariant& left, const QVariant& right) const
-+{
-+ if (left.type() != right.type())
-+ {
-+ return false;
-+ }
-+
-+ switch (left.type())
-+ {
-+ case QVariant::Int:
-+ return compareByOrder(left.toInt(), right.toInt(), currentSortOrder);
-+ case QVariant::UInt:
-+ return compareByOrder(left.toUInt(), right.toUInt(), currentSortOrder);
-+ case QVariant::LongLong:
-+ return compareByOrder(left.toLongLong(), right.toLongLong(), currentSortOrder);
-+ case QVariant::ULongLong:
-+ return compareByOrder(left.toULongLong(), right.toULongLong(), currentSortOrder);
-+ case QVariant::Double:
-+ return compareByOrder(left.toDouble(), right.toDouble(), currentSortOrder);
-+ case QVariant::Date:
-+ return compareByOrder(left.toDate(), right.toDate(), currentSortOrder);
-+ case QVariant::DateTime:
-+ return compareByOrder(left.toDateTime(), right.toDateTime(), currentSortOrder);
-+ case QVariant::Time:
-+ return compareByOrder(left.toTime(), right.toTime(), currentSortOrder);
-+ case QVariant::Rect:
-+ case QVariant::RectF:
-+ {
-+ QRectF rectLeft = left.toRectF();
-+ QRectF rectRight = right.toRectF();
-+ int result;
-+
-+ if ((result = compareByOrder(rectLeft.top(), rectRight.top(), currentSortOrder)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ if ((result = compareByOrder(rectLeft.left(), rectRight.left(), currentSortOrder)) != 0)
-+ {
-+ return result < 0;
-+ }
-+
-+ QSizeF sizeLeft = rectLeft.size(), sizeRight = rectRight.size();
-+
-+ if ((result = compareByOrder(sizeLeft.width()*sizeLeft.height(), sizeRight.width()*sizeRight.height(), currentSortOrder)) != 0)
-+ {
-+ return result < 0;
-+ }
-+ // FIXME: fall through?? If not, add "break" here
-+ }
-+ default:
-+ return naturalCompare(left.toString(), right.toString(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-+ }
-+}
-+
-+DatabaseFields::Set ImageSortSettings::watchFlags() const
-+{
-+ DatabaseFields::Set set;
-+
-+ switch (sortRole)
-+ {
-+ case SortByFileName:
-+ set |= DatabaseFields::Name;
-+ break;
-+ case SortByFilePath:
-+ set |= DatabaseFields::Name;
-+ break;
-+ case SortByFileSize:
-+ set |= DatabaseFields::FileSize;
-+ break;
-+ case SortByModificationDate:
-+ set |= DatabaseFields::ModificationDate;
-+ break;
-+ case SortByCreationDate:
-+ set |= DatabaseFields::CreationDate;
-+ break;
-+ case SortByRating:
-+ set |= DatabaseFields::Rating;
-+ break;
-+ case SortByImageSize:
-+ set |= DatabaseFields::Width | DatabaseFields::Height;
-+ break;
-+ case SortByAspectRatio:
-+ set |= DatabaseFields::Width | DatabaseFields::Height;
-+ break;
-+ case SortBySimilarity:
-+ // TODO: Not sure what to do here....
-+ set |= DatabaseFields::Name;
-+ break;
-+ }
-+
-+ switch (categorizationMode)
-+ {
-+ case NoCategories:
-+ case OneCategory:
-+ case CategoryByAlbum:
-+ break;
-+ case CategoryByFormat:
-+ set |= DatabaseFields::Format;
-+ break;
-+ }
-+
-+ return set;
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagesortsettings.h b/libs/database/models/imagesortsettings.h
-new file mode 100644
-index 0000000..2a5fd8c
---- /dev/null
-+++ b/libs/database/models/imagesortsettings.h
-@@ -0,0 +1,225 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-05-31
-+ * Description : Sort settings for use with ImageFilterModel
-+ *
-+ * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ *
-+ * 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, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGESORTSETTINGS_H
-+#define IMAGESORTSETTINGS_H
-+
-+// Qt includes
-+
-+#include <QHash>
-+#include <QList>
-+#include <QMap>
-+#include <QString>
-+#include <QCollator>
-+
-+// Local includes
-+
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageInfo;
-+
-+namespace DatabaseFields
-+{
-+ class Set;
-+}
-+
-+class DIGIKAM_DATABASE_EXPORT ImageSortSettings
-+{
-+public:
-+
-+ ImageSortSettings();
-+
-+ bool operator==(const ImageSortSettings& other) const;
-+
-+ /** Compares the categories of left and right.
-+ * Return -1 if left is less than right, 0 if both fall in the same category,
-+ * and 1 if left is greater than right.
-+ * Adheres to set categorization mode and current category sort order.
-+ */
-+ int compareCategories(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Returns true if left is less than right.
-+ * Adheres to current sort role and sort order.
-+ */
-+ bool lessThan(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Compares the ImageInfos left and right.
-+ * Return -1 if left is less than right, 1 if left is greater than right,
-+ * and 0 if left equals right comparing the current sort role's value.
-+ * Adheres to set sort role and sort order.
-+ */
-+ int compare(const ImageInfo& left, const ImageInfo& right) const;
-+
-+ /** Returns true if left QVariant is less than right.
-+ * Adheres to current sort role and sort order.
-+ * Use for extraValue, if necessary.
-+ */
-+ bool lessThan(const QVariant& left, const QVariant& right) const;
-+
-+ enum SortOrder
-+ {
-+ AscendingOrder = Qt::AscendingOrder,
-+ DescendingOrder = Qt::DescendingOrder,
-+ DefaultOrder /// sort order depends on the chosen sort role
-+ };
-+
-+ /// --- Categories ---
-+
-+ enum CategorizationMode
-+ {
-+ NoCategories, /// categorization switched off
-+ OneCategory, /// all items in one global category
-+ CategoryByAlbum,
-+ CategoryByFormat
-+ };
-+
-+ CategorizationMode categorizationMode;
-+ SortOrder categorizationSortOrder;
-+
-+ void setCategorizationMode(CategorizationMode mode);
-+ void setCategorizationSortOrder(SortOrder order);
-+
-+ /// Only Ascending or Descending, never DefaultOrder
-+ Qt::SortOrder currentCategorizationSortOrder;
-+ Qt::CaseSensitivity categorizationCaseSensitivity;
-+
-+ bool isCategorized() const { return categorizationMode >= CategoryByAlbum; }
-+
-+ /// --- Image Sorting ---
-+
-+ enum SortRole
-+ {
-+ // Note: For legacy reasons, the order of the first five entries must remain unchanged
-+ SortByFileName,
-+ SortByFilePath,
-+ SortByCreationDate,
-+ SortByFileSize,
-+ SortByRating,
-+ SortByModificationDate,
-+ SortByImageSize, // pixel number
-+ SortByAspectRatio, // width / height * 100000
-+ SortBySimilarity
-+ };
-+
-+ SortRole sortRole;
-+ SortOrder sortOrder;
-+ bool strTypeNatural;
-+
-+ void setSortRole(SortRole role);
-+ void setSortOrder(SortOrder order);
-+ void setStringTypeNatural(bool natural);
-+
-+ Qt::SortOrder currentSortOrder;
-+ Qt::CaseSensitivity sortCaseSensitivity;
-+
-+ int compare(const ImageInfo& left, const ImageInfo& right, SortRole sortRole) const;
-+
-+ // --- ---
-+
-+ static Qt::SortOrder defaultSortOrderForCategorizationMode(CategorizationMode mode);
-+ static Qt::SortOrder defaultSortOrderForSortRole(SortRole role);
-+
-+ /// --- Change notification ---
-+
-+ /** Returns database fields a change in which would affect the current sorting.
-+ */
-+ DatabaseFields::Set watchFlags() const;
-+
-+ /// --- Utilities ---
-+
-+ /** Returns a < b if sortOrder is Ascending, or b < a if order is descending.
-+ */
-+ template <typename T>
-+ static inline bool lessThanByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-+ {
-+ if (sortOrder == Qt::AscendingOrder)
-+ {
-+ return a < b;
-+ }
-+ else
-+ {
-+ return b < a;
-+ }
-+ }
-+
-+ /** Returns the usual compare result of -1, 0, or 1 for lessThan, equals and greaterThan.
-+ */
-+ template <typename T>
-+ static inline int compareValue(const T& a, const T& b)
-+ {
-+ if (a == b)
-+ {
-+ return 0;
-+ }
-+
-+ if (a < b)
-+ {
-+ return -1;
-+ }
-+ else
-+ {
-+ return 1;
-+ }
-+ }
-+
-+ /** Takes a typical result from a compare method (0 is equal, -1 is less than, 1 is greater than)
-+ * and applies the given sort order to it.
-+ */
-+ static inline int compareByOrder(int compareResult, Qt::SortOrder sortOrder)
-+ {
-+ if (sortOrder == Qt::AscendingOrder)
-+ {
-+ return compareResult;
-+ }
-+ else
-+ {
-+ return - compareResult;
-+ }
-+ }
-+
-+ template <typename T>
-+ static inline int compareByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-+ {
-+ return compareByOrder(compareValue(a, b), sortOrder);
-+ }
-+
-+ /** Compares the two string by natural comparison and adheres to given sort order
-+ */
-+ static inline int naturalCompare(const QString& a, const QString& b, Qt::SortOrder sortOrder,
-+ Qt::CaseSensitivity caseSensitive = Qt::CaseSensitive,
-+ bool natural = true, bool versioning = false)
-+ {
-+ QCollator collator;
-+ collator.setNumericMode(natural);
-+ collator.setIgnorePunctuation(versioning);
-+ collator.setCaseSensitivity(caseSensitive);
-+ return (compareByOrder(collator.compare(a, b), sortOrder));
-+ }
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGESORTSETTINGS_H
-diff --git a/libs/database/models/imagethumbnailmodel.cpp b/libs/database/models/imagethumbnailmodel.cpp
-new file mode 100644
-index 0000000..b7f5661
---- /dev/null
-+++ b/libs/database/models/imagethumbnailmodel.cpp
-@@ -0,0 +1,323 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries with support for thumbnail loading
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imagethumbnailmodel.h"
-+
-+// Qt includes
-+
-+#include <QHash>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "thumbnailloadthread.h"
-+#include "digikam_export.h"
-+#include "digikam_globals.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageThumbnailModel::ImageThumbnailModelPriv
-+{
-+public:
-+
-+ ImageThumbnailModelPriv() :
-+ thread(0),
-+ preloadThread(0),
-+ thumbSize(0),
-+ lastGlobalThumbSize(0),
-+ preloadThumbSize(0),
-+ emitDataChanged(true)
-+ {
-+ staticListContainingThumbnailRole << ImageModel::ThumbnailRole;
-+ }
-+
-+ ThumbnailLoadThread* thread;
-+ ThumbnailLoadThread* preloadThread;
-+ ThumbnailSize thumbSize;
-+ ThumbnailSize lastGlobalThumbSize;
-+ ThumbnailSize preloadThumbSize;
-+ QRect detailRect;
-+ QVector<int> staticListContainingThumbnailRole;
-+
-+ bool emitDataChanged;
-+
-+ int preloadThumbnailSize() const
-+ {
-+ if (preloadThumbSize.size())
-+ {
-+ return preloadThumbSize.size();
-+ }
-+
-+ return thumbSize.size();
-+ }
-+};
-+
-+ImageThumbnailModel::ImageThumbnailModel(QObject* parent)
-+ : ImageModel(parent), d(new ImageThumbnailModelPriv)
-+{
-+ setKeepsFilePathCache(true);
-+}
-+
-+ImageThumbnailModel::~ImageThumbnailModel()
-+{
-+ delete d->preloadThread;
-+ delete d;
-+}
-+
-+void ImageThumbnailModel::setThumbnailLoadThread(ThumbnailLoadThread* thread)
-+{
-+ d->thread = thread;
-+
-+ connect(d->thread, SIGNAL(signalThumbnailLoaded(LoadingDescription,QPixmap)),
-+ this, SLOT(slotThumbnailLoaded(LoadingDescription,QPixmap)));
-+}
-+
-+ThumbnailLoadThread* ImageThumbnailModel::thumbnailLoadThread() const
-+{
-+ return d->thread;
-+}
-+
-+ThumbnailSize ImageThumbnailModel::thumbnailSize() const
-+{
-+ return d->thumbSize;
-+}
-+
-+void ImageThumbnailModel::setThumbnailSize(const ThumbnailSize& size)
-+{
-+ d->lastGlobalThumbSize = size;
-+ d->thumbSize = size;
-+}
-+
-+void ImageThumbnailModel::setPreloadThumbnailSize(const ThumbnailSize& size)
-+{
-+ d->preloadThumbSize = size;
-+}
-+
-+void ImageThumbnailModel::setEmitDataChanged(bool emitSignal)
-+{
-+ d->emitDataChanged = emitSignal;
-+}
-+
-+void ImageThumbnailModel::setPreloadThumbnails(bool preload)
-+{
-+ if (preload)
-+ {
-+ if (!d->preloadThread)
-+ {
-+ d->preloadThread = new ThumbnailLoadThread;
-+ d->preloadThread->setPixmapRequested(false);
-+ d->preloadThread->setPriority(QThread::LowestPriority);
-+ }
-+
-+ connect(this, SIGNAL(allRefreshingFinished()),
-+ this, SLOT(preloadAllThumbnails()));
-+ }
-+ else
-+ {
-+ delete d->preloadThread;
-+ d->preloadThread = 0;
-+ disconnect(this, SIGNAL(allRefreshingFinished()),
-+ this, SLOT(preloadAllThumbnails()));
-+ }
-+}
-+
-+void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare)
-+{
-+ prepareThumbnails(indexesToPrepare, d->thumbSize);
-+}
-+
-+void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize)
-+{
-+ if (!d->thread)
-+ {
-+ return;
-+ }
-+
-+ QList<ThumbnailIdentifier> ids;
-+ foreach(const QModelIndex& index, indexesToPrepare)
-+ {
-+ ids << imageInfoRef(index).thumbnailIdentifier();
-+ }
-+ d->thread->findGroup(ids, thumbSize.size());
-+}
-+
-+void ImageThumbnailModel::preloadThumbnails(const QList<ImageInfo>& infos)
-+{
-+ if (!d->preloadThread)
-+ {
-+ return;
-+ }
-+
-+ QList<ThumbnailIdentifier> ids;
-+ foreach(const ImageInfo& info, infos)
-+ {
-+ ids << info.thumbnailIdentifier();
-+ }
-+ d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
-+}
-+
-+void ImageThumbnailModel::preloadThumbnails(const QList<QModelIndex>& indexesToPreload)
-+{
-+ if (!d->preloadThread)
-+ {
-+ return;
-+ }
-+
-+ QList<ThumbnailIdentifier> ids;
-+ foreach(const QModelIndex& index, indexesToPreload)
-+ {
-+ ids << imageInfoRef(index).thumbnailIdentifier();
-+ }
-+ d->preloadThread->stopAllTasks();
-+ d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
-+}
-+
-+void ImageThumbnailModel::preloadAllThumbnails()
-+{
-+ preloadThumbnails(imageInfos());
-+}
-+
-+void ImageThumbnailModel::imageInfosCleared()
-+{
-+ if (d->preloadThread)
-+ {
-+ d->preloadThread->stopAllTasks();
-+ }
-+}
-+
-+QVariant ImageThumbnailModel::data(const QModelIndex& index, int role) const
-+{
-+ if (role == ThumbnailRole && d->thread && index.isValid())
-+ {
-+ QPixmap thumbnail;
-+ ImageInfo info = imageInfo(index);
-+ QString path = info.filePath();
-+
-+ if (info.isNull())
-+ {
-+ return QVariant(QVariant::Pixmap);
-+ }
-+
-+ if (!d->detailRect.isNull())
-+ {
-+ if (d->thread->find(info.thumbnailIdentifier(), d->detailRect, thumbnail, d->thumbSize.size()))
-+ {
-+ return thumbnail;
-+ }
-+ }
-+ else
-+ {
-+ if (d->thread->find(info.thumbnailIdentifier(), thumbnail, d->thumbSize.size()))
-+ {
-+ return thumbnail;
-+ }
-+ }
-+
-+ return QVariant(QVariant::Pixmap);
-+ }
-+
-+ return ImageModel::data(index, role);
-+}
-+
-+bool ImageThumbnailModel::setData(const QModelIndex& index, const QVariant& value, int role)
-+{
-+ if (role == ThumbnailRole)
-+ {
-+ switch (value.type())
-+ {
-+ case QVariant::Invalid:
-+ d->thumbSize = d->lastGlobalThumbSize;
-+ d->detailRect = QRect();
-+ break;
-+
-+ case QVariant::Int:
-+
-+ if (value.isNull())
-+ {
-+ d->thumbSize = d->lastGlobalThumbSize;
-+ }
-+ else
-+ {
-+ d->thumbSize = value.toInt();
-+ }
-+ break;
-+
-+ case QVariant::Rect:
-+
-+ if (value.isNull())
-+ {
-+ d->detailRect = QRect();
-+ }
-+ else
-+ {
-+ d->detailRect = value.toRect();
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+ }
-+
-+ return ImageModel::setData(index, value, role);
-+}
-+
-+void ImageThumbnailModel::slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb)
-+{
-+ if (thumb.isNull())
-+ {
-+ return;
-+ }
-+
-+ // In case of multiple occurrence, we currently do not know which thumbnail is this. Signal change on all.
-+ QModelIndexList indexes;
-+ ThumbnailIdentifier thumbId = loadingDescription.thumbnailIdentifier();
-+ if (thumbId.filePath.isEmpty())
-+ {
-+ indexes = indexesForImageId(thumbId.id);
-+ }
-+ else
-+ {
-+ indexes = indexesForPath(thumbId.filePath);
-+ }
-+ foreach(const QModelIndex& index, indexes)
-+ {
-+ if (thumb.isNull())
-+ {
-+ emit thumbnailFailed(index, loadingDescription.previewParameters.size);
-+ }
-+ else
-+ {
-+ emit thumbnailAvailable(index, loadingDescription.previewParameters.size);
-+
-+ if (d->emitDataChanged)
-+ {
-+ emit dataChanged(index, index, d->staticListContainingThumbnailRole);
-+ }
-+ }
-+ }
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imagethumbnailmodel.h b/libs/database/models/imagethumbnailmodel.h
-new file mode 100644
-index 0000000..366ca65
---- /dev/null
-+++ b/libs/database/models/imagethumbnailmodel.h
-@@ -0,0 +1,140 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2009-03-05
-+ * Description : Qt item model for database entries with support for thumbnail loading
-+ *
-+ * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-+ * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGETHUMBNAILMODEL_H
-+#define IMAGETHUMBNAILMODEL_H
-+
-+// Local includes
-+
-+#include "imagemodel.h"
-+#include "thumbnailsize.h"
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class LoadingDescription;
-+class ThumbnailLoadThread;
-+
-+class DIGIKAM_DATABASE_EXPORT ImageThumbnailModel : public ImageModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ /**
-+ * An ImageModel that supports thumbnail loading.
-+ * You need to set a ThumbnailLoadThread to enable thumbnail loading.
-+ * Adjust the thumbnail size to your needs.
-+ * Note that setKeepsFilePathCache is enabled per default.
-+ */
-+ explicit ImageThumbnailModel(QObject* parent);
-+ ~ImageThumbnailModel();
-+
-+ /** Enable thumbnail loading and set the thread that shall be used.
-+ * The thumbnail size of this thread will be adjusted.
-+ */
-+ void setThumbnailLoadThread(ThumbnailLoadThread* thread);
-+ ThumbnailLoadThread* thumbnailLoadThread() const;
-+
-+ /// Set the thumbnail size to use
-+ void setThumbnailSize(const ThumbnailSize& thumbSize);
-+
-+ /// If you want to fix a size for preloading, do it here.
-+ void setPreloadThumbnailSize(const ThumbnailSize& thumbSize);
-+
-+ void setExifRotate(bool rotate);
-+
-+ /**
-+ * Enable emitting dataChanged() when a thumbnail becomes available.
-+ * The thumbnailAvailable() signal will be emitted in any case.
-+ * Default is true.
-+ */
-+ void setEmitDataChanged(bool emitSignal);
-+
-+ /**
-+ * Enable preloading of thumbnails:
-+ * If preloading is enabled, for every entry in the model a thumbnail generation is started.
-+ * Default: false.
-+ */
-+ void setPreloadThumbnails(bool preload);
-+
-+ ThumbnailSize thumbnailSize() const;
-+
-+ /**
-+ * Handles the ThumbnailRole.
-+ * If the pixmap is available, returns it in the QVariant.
-+ * If it still needs to be loaded, returns a null QVariant and emits
-+ * thumbnailAvailable() as soon as it is available.
-+ */
-+ virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+
-+ /**
-+ * You can override the current thumbnail size by giving an integer value for ThumbnailRole.
-+ * Set a null QVariant to use the thumbnail size set by setThumbnailSize() again.
-+ * The index given here is ignored for this purpose.
-+ */
-+ virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::DisplayRole);
-+
-+public Q_SLOTS:
-+
-+ /** Prepare the thumbnail loading for the given indexes
-+ */
-+ void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare);
-+ void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize);
-+
-+ /**
-+ * Preload thumbnail for the given infos resp. indexes.
-+ * Note: Use setPreloadThumbnails to automatically preload all entries in the model.
-+ * Note: This only ensures thumbnail generation. It is not guaranteed that pixmaps
-+ * are stored in the cache. For thumbnails that are expect to be drawn immediately,
-+ * include them in prepareThumbnails().
-+ * Note: Stops preloading of previously added thumbnails.
-+ */
-+ void preloadThumbnails(const QList<ImageInfo>&);
-+ void preloadThumbnails(const QList<QModelIndex>&);
-+ void preloadAllThumbnails();
-+
-+Q_SIGNALS:
-+
-+ void thumbnailAvailable(const QModelIndex& index, int requestedSize);
-+ void thumbnailFailed(const QModelIndex& index, int requestedSize);
-+
-+protected:
-+
-+ virtual void imageInfosCleared();
-+
-+protected Q_SLOTS:
-+
-+ void slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb);
-+
-+private:
-+
-+ class ImageThumbnailModelPriv;
-+ ImageThumbnailModelPriv* const d;
-+};
-+
-+} // namespace Digikam
-+
-+#endif /* IMAGETHUMBNAILMODEL_H */
-diff --git a/libs/database/models/imageversionsmodel.cpp b/libs/database/models/imageversionsmodel.cpp
-new file mode 100644
-index 0000000..e6ba582
---- /dev/null
-+++ b/libs/database/models/imageversionsmodel.cpp
-@@ -0,0 +1,183 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-07-13
-+ * Description : Model for image versions
-+ *
-+ * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#include "imageversionsmodel.h"
-+
-+// KDE includes
-+
-+#include <klocalizedstring.h>
-+
-+// Local includes
-+
-+#include "digikam_debug.h"
-+#include "workingwidget.h"
-+
-+namespace Digikam
-+{
-+
-+class ImageVersionsModel::Private
-+{
-+public:
-+
-+ Private()
-+ {
-+ data = 0;
-+ paintTree = false;
-+ }
-+
-+ ///Complete paths with filenames and tree level
-+ QList<QPair<QString, int> >* data;
-+ ///This is for delegate to paint it as selected
-+ QString currentSelectedImage;
-+ ///If true, the delegate will paint items as a tree
-+ ///if false, it will be painted as a list
-+ bool paintTree;
-+};
-+
-+ImageVersionsModel::ImageVersionsModel(QObject* parent)
-+ : QAbstractListModel(parent),
-+ d(new Private)
-+{
-+ d->data = new QList<QPair<QString, int> >;
-+}
-+
-+ImageVersionsModel::~ImageVersionsModel()
-+{
-+ //qDeleteAll(d->data);
-+ delete d;
-+}
-+
-+Qt::ItemFlags ImageVersionsModel::flags(const QModelIndex& index) const
-+{
-+ if (!index.isValid())
-+ {
-+ return 0;
-+ }
-+
-+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
-+}
-+
-+QVariant ImageVersionsModel::data(const QModelIndex& index, int role) const
-+{
-+ if (!index.isValid())
-+ {
-+ return QVariant();
-+ }
-+
-+ if (role == Qt::DisplayRole && !d->data->isEmpty())
-+ {
-+ return d->data->at(index.row()).first;
-+ }
-+ else if (role == Qt::UserRole && !d->data->isEmpty())
-+ {
-+ return d->data->at(index.row()).second;
-+ }
-+ else if (role == Qt::DisplayRole && d->data->isEmpty())
-+ {
-+ //TODO: make this text Italic
-+ return QVariant(QString(i18n("No image selected")));
-+ }
-+
-+ return QVariant();
-+}
-+
-+int ImageVersionsModel::rowCount(const QModelIndex& parent) const
-+{
-+ Q_UNUSED(parent)
-+ return d->data->count();
-+}
-+
-+void ImageVersionsModel::setupModelData(QList<QPair<QString, int> >& data)
-+{
-+ beginResetModel();
-+
-+ d->data->clear();
-+
-+ if (!data.isEmpty())
-+ {
-+ d->data->append(data);
-+ }
-+ else
-+ {
-+ d->data->append(qMakePair(QString(i18n("This is the original image")), 0));
-+ }
-+
-+ endResetModel();
-+}
-+
-+void ImageVersionsModel::clearModelData()
-+{
-+ beginResetModel();
-+
-+ if (!d->data->isEmpty())
-+ {
-+ d->data->clear();
-+ }
-+
-+ endResetModel();
-+}
-+
-+void ImageVersionsModel::slotAnimationStep()
-+{
-+ emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, 1));
-+}
-+
-+QString ImageVersionsModel::currentSelectedImage() const
-+{
-+ return d->currentSelectedImage;
-+}
-+
-+void ImageVersionsModel::setCurrentSelectedImage(const QString& path)
-+{
-+ d->currentSelectedImage = path;
-+}
-+
-+QModelIndex ImageVersionsModel::currentSelectedImageIndex() const
-+{
-+ return index(listIndexOf(d->currentSelectedImage), 0);
-+}
-+
-+bool ImageVersionsModel::paintTree() const
-+{
-+ return d->paintTree;
-+}
-+
-+void ImageVersionsModel::setPaintTree(bool paint)
-+{
-+ d->paintTree = paint;
-+}
-+
-+int ImageVersionsModel::listIndexOf(const QString& item) const
-+{
-+ for (int i = 0; i < d->data->size(); ++i)
-+ {
-+ if (d->data->at(i).first == item)
-+ {
-+ return i;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+} // namespace Digikam
-diff --git a/libs/database/models/imageversionsmodel.h b/libs/database/models/imageversionsmodel.h
-new file mode 100644
-index 0000000..ed08529
---- /dev/null
-+++ b/libs/database/models/imageversionsmodel.h
-@@ -0,0 +1,75 @@
-+/* ============================================================
-+ *
-+ * This file is a part of digiKam project
-+ * http://www.digikam.org
-+ *
-+ * Date : 2010-07-13
-+ * Description : Model for image versions
-+ *
-+ * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-+ *
-+ * This program is free software; you can redistribute it
-+ * and/or modify it under the terms of the GNU General
-+ * Public License as published by the Free Software Foundation;
-+ * either version 2, 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.
-+ *
-+ * ============================================================ */
-+
-+#ifndef IMAGEVERSIONSMODEL_H
-+#define IMAGEVERSIONSMODEL_H
-+
-+// Qt includes
-+
-+#include <QModelIndex>
-+#include <QPixmap>
-+
-+// Local includes
-+
-+#include "digikam_export.h"
-+
-+namespace Digikam
-+{
-+
-+class DIGIKAM_DATABASE_EXPORT ImageVersionsModel : public QAbstractListModel
-+{
-+ Q_OBJECT
-+
-+public:
-+
-+ explicit ImageVersionsModel(QObject* parent = 0);
-+ ~ImageVersionsModel();
-+
-+ Qt::ItemFlags flags(const QModelIndex& index) const;
-+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-+ int rowCount(const QModelIndex& parent = QModelIndex()) const;
-+
-+ void setupModelData(QList<QPair<QString, int> >& data);
-+ void clearModelData();
-+
-+ QString currentSelectedImage() const;
-+ void setCurrentSelectedImage(const QString& path);
-+ QModelIndex currentSelectedImageIndex() const;
-+
-+ bool paintTree() const;
-+ int listIndexOf(const QString& item) const;
-+
-+public Q_SLOTS:
-+
-+ void slotAnimationStep();
-+ void setPaintTree(bool paint);
-+
-+private:
-+
-+ class Private;
-+ Private* const d;
-+};
-+
-+} // namespace Digikam
-+
-+#endif // IMAGEVERSIONSMODEL_H
-diff --git a/libs/models/CMakeLists.txt b/libs/models/CMakeLists.txt
-index cbabfaa..804456b 100644
---- a/libs/models/CMakeLists.txt
-+++ b/libs/models/CMakeLists.txt
-@@ -9,18 +9,6 @@ if (POLICY CMP0063)
- cmake_policy(SET CMP0063 NEW)
- endif (POLICY CMP0063)
-
--set(libdatabasemodels_SRCS
-- imagemodel.cpp
-- imagefiltermodel.cpp
-- imagefiltermodelpriv.cpp
-- imagefiltermodelthreads.cpp
-- imagefiltersettings.cpp
-- imagelistmodel.cpp
-- imagesortsettings.cpp
-- imagethumbnailmodel.cpp
-- imageversionsmodel.cpp
--)
--
- set(libalbummodels_SRCS
- imagealbummodel.cpp
- imagealbumfiltermodel.cpp
-@@ -52,5 +40,4 @@ endif()
- #for digikam core lib
- add_library(digikamgenericmodels_src OBJECT ${libgenericmodels_SRCS})
-
--add_library(digikamdatabasemodels_src OBJECT ${libdatabasemodels_SRCS})
--add_library(digikammodels_src OBJECT ${libalbummodels_SRCS} ${libgenericmodels_SRCS})
-+add_library(digikammodels_src OBJECT ${libalbummodels_SRCS} ${libgenericmodels_SRCS})
-diff --git a/libs/models/imagefiltermodel.cpp b/libs/models/imagefiltermodel.cpp
-deleted file mode 100644
-index 3d57e05..0000000
---- a/libs/models/imagefiltermodel.cpp
-+++ /dev/null
-@@ -1,1116 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltermodel.h"
--#include "imagefiltermodelpriv.h"
--#include "imagefiltermodelthreads.h"
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbaccess.h"
--#include "coredbchangesets.h"
--#include "coredbwatch.h"
--#include "imageinfolist.h"
--#include "imagemodel.h"
--
--namespace Digikam
--{
--
--ImageSortFilterModel::ImageSortFilterModel(QObject* parent)
-- : DCategorizedSortFilterProxyModel(parent), m_chainedModel(0)
--{
--}
--
--void ImageSortFilterModel::setSourceImageModel(ImageModel* source)
--{
-- if (m_chainedModel)
-- {
-- m_chainedModel->setSourceImageModel(source);
-- }
-- else
-- {
-- setDirectSourceImageModel(source);
-- }
--}
--
--void ImageSortFilterModel::setSourceFilterModel(ImageSortFilterModel* source)
--{
-- if (source)
-- {
-- ImageModel* const model = sourceImageModel();
--
-- if (model)
-- {
-- source->setSourceImageModel(model);
-- }
-- }
--
-- m_chainedModel = source;
-- setSourceModel(source);
--}
--
--void ImageSortFilterModel::setDirectSourceImageModel(ImageModel* model)
--{
-- setSourceModel(model);
--}
--
--void ImageSortFilterModel::setSourceModel(QAbstractItemModel* model)
--{
-- // made it protected, only setSourceImageModel is public
-- DCategorizedSortFilterProxyModel::setSourceModel(model);
--}
--
--ImageModel* ImageSortFilterModel::sourceImageModel() const
--{
-- if (m_chainedModel)
-- {
-- return m_chainedModel->sourceImageModel();
-- }
--
-- return static_cast<ImageModel*>(sourceModel());
--}
--
--ImageSortFilterModel* ImageSortFilterModel::sourceFilterModel() const
--{
-- return m_chainedModel;
--}
--
--ImageFilterModel* ImageSortFilterModel::imageFilterModel() const
--{
-- // reimplemented in ImageFilterModel
-- if (m_chainedModel)
-- {
-- return m_chainedModel->imageFilterModel();
-- }
--
-- return 0;
--}
--
--QModelIndex ImageSortFilterModel::mapToSourceImageModel(const QModelIndex& index) const
--{
-- if (m_chainedModel)
-- {
-- return m_chainedModel->mapToSourceImageModel(mapToSource(index));
-- }
--
-- return mapToSource(index);
--}
--
--QModelIndex ImageSortFilterModel::mapFromSourceImageModel(const QModelIndex& albummodel_index) const
--{
-- if (m_chainedModel)
-- {
-- return mapFromSource(m_chainedModel->mapFromSourceImageModel(albummodel_index));
-- }
--
-- return mapFromSource(albummodel_index);
--}
--
--
--QModelIndex ImageSortFilterModel::mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const
--{
-- if (m_chainedModel)
-- {
-- return m_chainedModel->mapToSourceImageModel(sourceModel_index);
-- }
-- return sourceModel_index;
--}
--
--// -------------- Convenience mappers -------------------------------------------------------------------
--
--QList<QModelIndex> ImageSortFilterModel::mapListToSource(const QList<QModelIndex>& indexes) const
--{
-- QList<QModelIndex> sourceIndexes;
-- foreach(const QModelIndex& index, indexes)
-- {
-- sourceIndexes << mapToSourceImageModel(index);
-- }
-- return sourceIndexes;
--}
--
--QList<QModelIndex> ImageSortFilterModel::mapListFromSource(const QList<QModelIndex>& sourceIndexes) const
--{
-- QList<QModelIndex> indexes;
-- foreach(const QModelIndex& index, sourceIndexes)
-- {
-- indexes << mapFromSourceImageModel(index);
-- }
-- return indexes;
--}
--
--ImageInfo ImageSortFilterModel::imageInfo(const QModelIndex& index) const
--{
-- return sourceImageModel()->imageInfo(mapToSourceImageModel(index));
--}
--
--qlonglong ImageSortFilterModel::imageId(const QModelIndex& index) const
--{
-- return sourceImageModel()->imageId(mapToSourceImageModel(index));
--}
--
--QList<ImageInfo> ImageSortFilterModel::imageInfos(const QList<QModelIndex>& indexes) const
--{
-- QList<ImageInfo> infos;
-- ImageModel* const model = sourceImageModel();
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- infos << model->imageInfo(mapToSourceImageModel(index));
-- }
--
-- return infos;
--}
--
--QList<qlonglong> ImageSortFilterModel::imageIds(const QList<QModelIndex>& indexes) const
--{
-- QList<qlonglong> ids;
-- ImageModel* const model = sourceImageModel();
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- ids << model->imageId(mapToSourceImageModel(index));
-- }
--
-- return ids;
--}
--
--QModelIndex ImageSortFilterModel::indexForPath(const QString& filePath) const
--{
-- return mapFromSourceImageModel(sourceImageModel()->indexForPath(filePath));
--}
--
--QModelIndex ImageSortFilterModel::indexForImageInfo(const ImageInfo& info) const
--{
-- return mapFromSourceImageModel(sourceImageModel()->indexForImageInfo(info));
--}
--
--QModelIndex ImageSortFilterModel::indexForImageId(qlonglong id) const
--{
-- return mapFromSourceImageModel(sourceImageModel()->indexForImageId(id));
--}
--
--QList<ImageInfo> ImageSortFilterModel::imageInfosSorted() const
--{
-- QList<ImageInfo> infos;
-- const int size = rowCount();
-- ImageModel* const model = sourceImageModel();
--
-- for (int i=0; i<size; ++i)
-- {
-- infos << model->imageInfo(mapToSourceImageModel(index(i, 0)));
-- }
--
-- return infos;
--}
--
--// --------------------------------------------------------------------------------------------
--
--ImageFilterModel::ImageFilterModel(QObject* parent)
-- : ImageSortFilterModel(parent),
-- d_ptr(new ImageFilterModelPrivate)
--{
-- d_ptr->init(this);
--}
--
--ImageFilterModel::ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent)
-- : ImageSortFilterModel(parent),
-- d_ptr(&dd)
--{
-- d_ptr->init(this);
--}
--
--ImageFilterModel::~ImageFilterModel()
--{
-- Q_D(ImageFilterModel);
-- delete d;
--}
--
--void ImageFilterModel::setDirectSourceImageModel(ImageModel* sourceModel)
--{
-- Q_D(ImageFilterModel);
--
-- if (d->imageModel)
-- {
-- d->imageModel->unsetPreprocessor(d);
-- disconnect(d->imageModel, SIGNAL(modelReset()),
-- this, SLOT(slotModelReset()));
-- slotModelReset();
-- }
--
-- d->imageModel = sourceModel;
--
-- if (d->imageModel)
-- {
-- d->imageModel->setPreprocessor(d);
--
-- connect(d->imageModel, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)),
-- d, SLOT(preprocessInfos(QList<ImageInfo>,QList<QVariant>)));
--
-- connect(d->imageModel, SIGNAL(processAdded(QList<ImageInfo>,QList<QVariant>)),
-- d, SLOT(processAddedInfos(QList<ImageInfo>,QList<QVariant>)));
--
-- connect(d, SIGNAL(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)),
-- d->imageModel, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
--
-- connect(d, SIGNAL(reAddingFinished()),
-- d->imageModel, SLOT(reAddingFinished()));
--
-- connect(d->imageModel, SIGNAL(modelReset()),
-- this, SLOT(slotModelReset()));
--
-- connect(d->imageModel, SIGNAL(imageChange(ImageChangeset,QItemSelection)),
-- this, SLOT(slotImageChange(ImageChangeset)));
--
-- connect(d->imageModel, SIGNAL(imageTagChange(ImageTagChangeset,QItemSelection)),
-- this, SLOT(slotImageTagChange(ImageTagChangeset)));
-- }
--
-- setSourceModel(d->imageModel);
--}
--
--QVariant ImageFilterModel::data(const QModelIndex& index, int role) const
--{
-- Q_D(const ImageFilterModel);
--
-- if (!index.isValid())
-- {
-- return QVariant();
-- }
--
-- switch (role)
-- {
-- // Attention: This breaks should there ever be another filter model between this and the ImageModel
--
-- case DCategorizedSortFilterProxyModel::CategoryDisplayRole:
-- return categoryIdentifier(d->imageModel->imageInfoRef(mapToSource(index)));
-- case CategorizationModeRole:
-- return d->sorter.categorizationMode;
-- case SortOrderRole:
-- return d->sorter.sortRole;
-- //case CategoryCountRole:
-- // return categoryCount(d->imageModel->imageInfoRef(mapToSource(index)));
-- case CategoryAlbumIdRole:
-- return d->imageModel->imageInfoRef(mapToSource(index)).albumId();
-- case CategoryFormatRole:
-- return d->imageModel->imageInfoRef(mapToSource(index)).format();
-- case GroupIsOpenRole:
-- return d->groupFilter.isAllOpen() ||
-- d->groupFilter.isOpen(d->imageModel->imageInfoRef(mapToSource(index)).id());
-- case ImageFilterModelPointerRole:
-- return QVariant::fromValue(const_cast<ImageFilterModel*>(this));
-- }
--
-- return DCategorizedSortFilterProxyModel::data(index, role);
--}
--
--ImageFilterModel* ImageFilterModel::imageFilterModel() const
--{
-- return const_cast<ImageFilterModel*>(this);
--}
--
--DatabaseFields::Set ImageFilterModel::suggestedWatchFlags() const
--{
-- DatabaseFields::Set watchFlags;
-- watchFlags |= DatabaseFields::Name | DatabaseFields::FileSize | DatabaseFields::ModificationDate;
-- watchFlags |= DatabaseFields::Rating | DatabaseFields::CreationDate | DatabaseFields::Orientation |
-- DatabaseFields::Width | DatabaseFields::Height;
-- watchFlags |= DatabaseFields::Comment;
-- watchFlags |= DatabaseFields::ImageRelations;
-- return watchFlags;
--}
--
--// -------------- Filter settings --------------
--
--void ImageFilterModel::setDayFilter(const QList<QDateTime>& days)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setDayFilter(days);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-- ImageFilterSettings::MatchingCondition matchingCond,
-- bool showUnTagged, const QList<int>& clTagIds, const QList<int>& plTagIds)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setTagFilter(includedTags, excludedTags, matchingCond, showUnTagged, clTagIds, plTagIds);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setRatingFilter(rating, ratingCond, isUnratedExcluded);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setUrlWhitelist(const QList<QUrl> urlList, const QString& id)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setUrlWhitelist(urlList, id);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setIdWhitelist(idList, id);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setMimeTypeFilter(int mimeTypeFilter)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setMimeTypeFilter(mimeTypeFilter);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setGeolocationFilter(condition);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setTextFilter(const SearchTextFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->filter.setTextFilter(settings);
-- setImageFilterSettings(d->filter);
--}
--
--void ImageFilterModel::setImageFilterSettings(const ImageFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
--
-- {
-- QMutexLocker lock(&d->mutex);
-- d->version++;
-- d->filter = settings;
-- d->filterCopy = settings;
-- d->versionFilterCopy = d->versionFilter;
-- d->groupFilterCopy = d->groupFilter;
--
-- d->needPrepareComments = settings.isFilteringByText();
-- d->needPrepareTags = settings.isFilteringByTags();
-- d->needPrepareGroups = true;
-- d->needPrepare = d->needPrepareComments || d->needPrepareTags || d->needPrepareGroups;
--
-- d->hasOneMatch = false;
-- d->hasOneMatchForText = false;
-- }
--
-- d->filterResults.clear();
--
-- //d->categoryCountHashInt.clear();
-- //d->categoryCountHashString.clear();
-- if (d->imageModel)
-- {
-- d->infosToProcess(d->imageModel->imageInfos());
-- }
--
-- emit filterSettingsChanged(settings);
--}
--
--void ImageFilterModel::setVersionManagerSettings(const VersionManagerSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->versionFilter.setVersionManagerSettings(settings);
-- setVersionImageFilterSettings(d->versionFilter);
--}
--
--void ImageFilterModel::setExceptionList(const QList<qlonglong>& idList, const QString& id)
--{
-- Q_D(ImageFilterModel);
-- d->versionFilter.setExceptionList(idList, id);
-- setVersionImageFilterSettings(d->versionFilter);
--}
--
--void ImageFilterModel::setVersionImageFilterSettings(const VersionImageFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->versionFilter = settings;
-- slotUpdateFilter();
--}
--
--bool ImageFilterModel::isGroupOpen(qlonglong group) const
--{
-- Q_D(const ImageFilterModel);
-- return d->groupFilter.isOpen(group);
--}
--
--bool ImageFilterModel::isAllGroupsOpen() const
--{
-- Q_D(const ImageFilterModel);
-- return d->groupFilter.isAllOpen();
--}
--
--void ImageFilterModel::setGroupOpen(qlonglong group, bool open)
--{
-- Q_D(ImageFilterModel);
-- d->groupFilter.setOpen(group, open);
-- setGroupImageFilterSettings(d->groupFilter);
--}
--
--void ImageFilterModel::toggleGroupOpen(qlonglong group)
--{
-- setGroupOpen(group, !isGroupOpen(group));
--}
--
--void ImageFilterModel::setAllGroupsOpen(bool open)
--{
-- Q_D(ImageFilterModel);
-- d->groupFilter.setAllOpen(open);
-- setGroupImageFilterSettings(d->groupFilter);
--}
--
--void ImageFilterModel::setGroupImageFilterSettings(const GroupImageFilterSettings& settings)
--{
-- Q_D(ImageFilterModel);
-- d->groupFilter = settings;
-- slotUpdateFilter();
--}
--
--void ImageFilterModel::slotUpdateFilter()
--{
-- Q_D(ImageFilterModel);
-- setImageFilterSettings(d->filter);
--}
--
--ImageFilterSettings ImageFilterModel::imageFilterSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->filter;
--}
--
--ImageSortSettings ImageFilterModel::imageSortSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->sorter;
--}
--
--VersionImageFilterSettings ImageFilterModel::versionImageFilterSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->versionFilter;
--}
--
--GroupImageFilterSettings ImageFilterModel::groupImageFilterSettings() const
--{
-- Q_D(const ImageFilterModel);
-- return d->groupFilter;
--}
--
--void ImageFilterModel::slotModelReset()
--{
-- Q_D(ImageFilterModel);
-- {
-- QMutexLocker lock(&d->mutex);
-- // discard all packages on the way that are marked as send out for re-add
-- d->lastDiscardVersion = d->version;
-- d->sentOutForReAdd = 0;
-- // discard all packages on the way
-- d->version++;
-- d->sentOut = 0;
--
-- d->hasOneMatch = false;
-- d->hasOneMatchForText = false;
-- }
-- d->filterResults.clear();
--}
--
--bool ImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
--{
-- Q_D(const ImageFilterModel);
--
-- if (source_parent.isValid())
-- {
-- return false;
-- }
--
-- qlonglong id = d->imageModel->imageId(source_row);
-- QHash<qlonglong, bool>::const_iterator it = d->filterResults.constFind(id);
--
-- if (it != d->filterResults.constEnd())
-- {
-- return it.value();
-- }
--
-- // usually done in thread and cache, unless source model changed
-- ImageInfo info = d->imageModel->imageInfo(source_row);
-- bool match = d->filter.matches(info);
-- match = match ? d->versionFilter.matches(info) : false;
--
-- return match ? d->groupFilter.matches(info) : false;
--}
--
--void ImageFilterModel::setSendImageInfoSignals(bool sendSignals)
--{
-- if (sendSignals)
-- {
-- connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-- this, SLOT(slotRowsInserted(QModelIndex,int,int)));
--
-- connect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-- this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-- }
-- else
-- {
-- disconnect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
-- this, SLOT(slotRowsInserted(QModelIndex,int,int)));
--
-- disconnect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-- this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-- }
--}
--
--void ImageFilterModel::slotRowsInserted(const QModelIndex& /*parent*/, int start, int end)
--{
-- QList<ImageInfo> infos;
--
-- for (int i=start; i<=end; ++i)
-- {
-- infos << imageInfo(index(i, 0));
-- }
--
-- emit imageInfosAdded(infos);
--}
--
--void ImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& /*parent*/, int start, int end)
--{
-- QList<ImageInfo> infos;
--
-- for (int i=start; i<=end; ++i)
-- {
-- infos << imageInfo(index(i, 0));
-- }
--
-- emit imageInfosAboutToBeRemoved(infos);
--}
--
--// -------------- Threaded preparation & filtering --------------
--
--void ImageFilterModel::addPrepareHook(ImageFilterModelPrepareHook* hook)
--{
-- Q_D(ImageFilterModel);
-- QMutexLocker lock(&d->mutex);
-- d->prepareHooks << hook;
--}
--
--void ImageFilterModel::removePrepareHook(ImageFilterModelPrepareHook* hook)
--{
-- Q_D(ImageFilterModel);
-- QMutexLocker lock(&d->mutex);
-- d->prepareHooks.removeAll(hook);
--}
--
--void ImageFilterModelPreparer::process(ImageFilterModelTodoPackage package)
--{
-- if (!checkVersion(package))
-- {
-- emit discarded(package);
-- return;
-- }
--
-- // get thread-local copy
-- bool needPrepareTags, needPrepareComments, needPrepareGroups;
-- QList<ImageFilterModelPrepareHook*> prepareHooks;
-- {
-- QMutexLocker lock(&d->mutex);
-- needPrepareTags = d->needPrepareTags;
-- needPrepareComments = d->needPrepareComments;
-- needPrepareGroups = d->needPrepareGroups;
-- prepareHooks = d->prepareHooks;
-- }
--
-- //TODO: Make efficient!!
-- if (needPrepareComments)
-- {
-- foreach(const ImageInfo& info, package.infos)
-- {
-- info.comment();
-- }
-- }
--
-- if (!checkVersion(package))
-- {
-- emit discarded(package);
-- return;
-- }
--
-- // The downside of QVector: At some point, we may need a QList for an API.
-- // Nonetheless, QList and ImageInfo is fast. We could as well
-- // reimplement ImageInfoList to ImageInfoVector (internally with templates?)
-- ImageInfoList infoList;
--
-- if (needPrepareTags || needPrepareGroups)
-- {
-- infoList = package.infos.toList();
-- }
--
-- if (needPrepareTags)
-- {
-- infoList.loadTagIds();
-- }
--
-- if (needPrepareGroups)
-- {
-- infoList.loadGroupImageIds();
-- }
--
-- foreach(ImageFilterModelPrepareHook* hook, prepareHooks)
-- {
-- hook->prepare(package.infos);
-- }
--
-- emit processed(package);
--}
--
--void ImageFilterModelFilterer::process(ImageFilterModelTodoPackage package)
--{
-- if (!checkVersion(package))
-- {
-- emit discarded(package);
-- return;
-- }
--
-- // get thread-local copy
-- ImageFilterSettings localFilter;
-- VersionImageFilterSettings localVersionFilter;
-- GroupImageFilterSettings localGroupFilter;
-- bool hasOneMatch;
-- bool hasOneMatchForText;
-- {
-- QMutexLocker lock(&d->mutex);
-- localFilter = d->filterCopy;
-- localVersionFilter = d->versionFilterCopy;
-- localGroupFilter = d->groupFilterCopy;
-- hasOneMatch = d->hasOneMatch;
-- hasOneMatchForText = d->hasOneMatchForText;
-- }
--
-- // Actual filtering. The variants to spare checking hasOneMatch over and over again.
-- if (hasOneMatch && hasOneMatchForText)
-- {
-- foreach(const ImageInfo& info, package.infos)
-- {
-- package.filterResults[info.id()] = localFilter.matches(info) &&
-- localVersionFilter.matches(info) &&
-- localGroupFilter.matches(info);
-- }
-- }
-- else if (hasOneMatch)
-- {
-- bool matchForText;
--
-- foreach(const ImageInfo& info, package.infos)
-- {
-- package.filterResults[info.id()] = localFilter.matches(info, &matchForText) &&
-- localVersionFilter.matches(info) &&
-- localGroupFilter.matches(info);
--
-- if (matchForText)
-- {
-- hasOneMatchForText = true;
-- }
-- }
-- }
-- else
-- {
-- bool result, matchForText;
--
-- foreach(const ImageInfo& info, package.infos)
-- {
-- result = localFilter.matches(info, &matchForText) &&
-- localVersionFilter.matches(info) &&
-- localGroupFilter.matches(info);
-- package.filterResults[info.id()] = result;
--
-- if (result)
-- {
-- hasOneMatch = true;
-- }
--
-- if (matchForText)
-- {
-- hasOneMatchForText = true;
-- }
-- }
-- }
--
-- if (checkVersion(package))
-- {
-- QMutexLocker lock(&d->mutex);
-- d->hasOneMatch = hasOneMatch;
-- d->hasOneMatchForText = hasOneMatchForText;
-- }
--
-- emit processed(package);
--}
--
--// -------------- Sorting and Categorization -------------------------------------------------------
--
--void ImageFilterModel::setImageSortSettings(const ImageSortSettings& sorter)
--{
-- Q_D(ImageFilterModel);
-- d->sorter = sorter;
-- setCategorizedModel(d->sorter.categorizationMode != ImageSortSettings::NoCategories);
-- invalidate();
--}
--
--void ImageFilterModel::setCategorizationMode(ImageSortSettings::CategorizationMode mode)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setCategorizationMode(mode);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setCategorizationSortOrder(ImageSortSettings::SortOrder order)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setCategorizationSortOrder(order);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setSortRole(ImageSortSettings::SortRole role)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setSortRole(role);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setSortOrder(ImageSortSettings::SortOrder order)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setSortOrder(order);
-- setImageSortSettings(d->sorter);
--}
--
--void ImageFilterModel::setStringTypeNatural(bool natural)
--{
-- Q_D(ImageFilterModel);
-- d->sorter.setStringTypeNatural(natural);
-- setImageSortSettings(d->sorter);
--}
--
--int ImageFilterModel::compareCategories(const QModelIndex& left, const QModelIndex& right) const
--{
-- // source indexes
-- Q_D(const ImageFilterModel);
--
-- if (!d->sorter.isCategorized())
-- {
-- return 0;
-- }
--
-- if (!left.isValid() || !right.isValid())
-- {
-- return -1;
-- }
--
-- const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-- const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
--
-- // Check grouping
-- qlonglong leftGroupImageId = leftInfo.groupImageId();
-- qlonglong rightGroupImageId = rightInfo.groupImageId();
--
-- return compareInfosCategories(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-- rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
--}
--
--bool ImageFilterModel::subSortLessThan(const QModelIndex& left, const QModelIndex& right) const
--{
-- // source indexes
-- Q_D(const ImageFilterModel);
--
-- if (!left.isValid() || !right.isValid())
-- {
-- return true;
-- }
--
-- if (left == right)
-- {
-- return false;
-- }
--
-- const ImageInfo& leftInfo = d->imageModel->imageInfoRef(left);
-- const ImageInfo& rightInfo = d->imageModel->imageInfoRef(right);
--
-- if (leftInfo == rightInfo)
-- {
-- return d->sorter.lessThan(left.data(ImageModel::ExtraDataRole), right.data(ImageModel::ExtraDataRole));
-- }
--
-- // Check grouping
-- qlonglong leftGroupImageId = leftInfo.groupImageId();
-- qlonglong rightGroupImageId = rightInfo.groupImageId();
--
-- // Either no grouping (-1), or same group image, or same image
-- if (leftGroupImageId == rightGroupImageId)
-- {
-- return infosLessThan(leftInfo, rightInfo);
-- }
--
-- // We have grouping to handle
--
-- // Is one grouped on the other? Sort behind leader.
-- if (leftGroupImageId == rightInfo.id())
-- {
-- return false;
-- }
-- if (rightGroupImageId == leftInfo.id())
-- {
-- return true;
-- }
--
-- // Use the group leader for sorting
-- return infosLessThan(leftGroupImageId == -1 ? leftInfo : ImageInfo(leftGroupImageId),
-- rightGroupImageId == -1 ? rightInfo : ImageInfo(rightGroupImageId));
--}
--
--int ImageFilterModel::compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const
--{
-- // Note: reimplemented in ImageAlbumFilterModel
-- Q_D(const ImageFilterModel);
-- return d->sorter.compareCategories(left, right);
--}
--
--// Feel free to optimize. QString::number is 3x slower.
--static inline QString fastNumberToString(int id)
--{
-- const int size = sizeof(int) * 2;
-- char c[size+1];
-- c[size] = '\0';
-- char* p = c;
-- int number = id;
--
-- for (int i=0; i<size; ++i)
-- {
-- *p = 'a' + (number & 0xF);
-- number >>= 4;
-- ++p;
-- }
--
-- return QString::fromLatin1(c);
--}
--
--QString ImageFilterModel::categoryIdentifier(const ImageInfo& i) const
--{
-- Q_D(const ImageFilterModel);
--
-- if (!d->sorter.isCategorized())
-- {
-- return QString();
-- }
--
-- qlonglong groupedImageId = i.groupImageId();
-- ImageInfo info = groupedImageId == -1 ? i : ImageInfo(groupedImageId);
--
-- switch (d->sorter.categorizationMode)
-- {
-- case ImageSortSettings::NoCategories:
-- return QString();
-- case ImageSortSettings::OneCategory:
-- return QString();
-- case ImageSortSettings::CategoryByAlbum:
-- return fastNumberToString(info.albumId());
-- case ImageSortSettings::CategoryByFormat:
-- return info.format();
-- default:
-- return QString();
-- }
--}
--
--bool ImageFilterModel::infosLessThan(const ImageInfo& left, const ImageInfo& right) const
--{
-- Q_D(const ImageFilterModel);
-- return d->sorter.lessThan(left, right);
--}
--
--// -------------- Watching changes -----------------------------------------------------------------
--
--void ImageFilterModel::slotImageTagChange(const ImageTagChangeset& changeset)
--{
-- Q_D(ImageFilterModel);
--
-- if (!d->imageModel || d->imageModel->isEmpty())
-- {
-- return;
-- }
--
-- // already scheduled to re-filter?
-- if (d->updateFilterTimer->isActive())
-- {
-- return;
-- }
--
-- // do we filter at all?
-- if (!d->versionFilter.isFilteringByTags() &&
-- !d->filter.isFilteringByTags() &&
-- !d->filter.isFilteringByText())
-- {
-- return;
-- }
--
-- // is one of our images affected?
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- // if one matching image id is found, trigger a refresh
-- if (d->imageModel->hasImage(id))
-- {
-- d->updateFilterTimer->start();
-- return;
-- }
-- }
--}
--
--void ImageFilterModel::slotImageChange(const ImageChangeset& changeset)
--{
-- Q_D(ImageFilterModel);
--
-- if (!d->imageModel || d->imageModel->isEmpty())
-- {
-- return;
-- }
--
-- // already scheduled to re-filter?
-- if (d->updateFilterTimer->isActive())
-- {
-- return;
-- }
--
-- // is one of the values affected that we filter or sort by?
-- DatabaseFields::Set set = changeset.changes();
-- bool sortAffected = (set & d->sorter.watchFlags());
-- bool filterAffected = (set & d->filter.watchFlags()) || (set & d->groupFilter.watchFlags());
--
-- if (!sortAffected && !filterAffected)
-- {
-- return;
-- }
--
-- // is one of our images affected?
-- bool imageAffected = false;
--
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- // if one matching image id is found, trigger a refresh
-- if (d->imageModel->hasImage(id))
-- {
-- imageAffected = true;
-- break;
-- }
-- }
--
-- if (!imageAffected)
-- {
-- return;
-- }
--
-- if (filterAffected)
-- {
-- d->updateFilterTimer->start();
-- }
-- else
-- {
-- invalidate(); // just resort, reuse filter results
-- }
--}
--
--// -------------------------------------------------------------------------------------------------------
--
--NoDuplicatesImageFilterModel::NoDuplicatesImageFilterModel(QObject* parent)
-- : ImageSortFilterModel(parent)
--{
--}
--
--bool NoDuplicatesImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
--{
-- QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
--
-- if (index.data(ImageModel::ExtraDataDuplicateCount).toInt() <= 1)
-- {
-- return true;
-- }
--
-- QModelIndex previousIndex = sourceModel()->index(source_row - 1, 0, source_parent);
--
-- if (!previousIndex.isValid())
-- {
-- return true;
-- }
--
-- if (sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(index)) == sourceImageModel()->imageId(mapFromDirectSourceToSourceImageModel(previousIndex)))
-- {
-- return false;
-- }
-- return true;
--}
--
--/*
--void NoDuplicatesImageFilterModel::setSourceModel(QAbstractItemModel* model)
--{
-- if (sourceModel())
-- {
-- }
--
-- ImageSortFilterModel::setSourceModel(model);
--
-- if (sourceModel())
-- {
-- connect(sourceModel(), SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
-- this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int)));
-- }
--}
--
--void NoDuplicatesImageFilterModel::slotRowsAboutToBeRemoved(const QModelIndex& parent, int begin, int end)
--{
-- bool needInvalidate = false;
--
-- for (int i = begin; i<=end; ++i)
-- {
-- QModelIndex index = sourceModel()->index(i, 0, parent);
--
-- // filtered out by us?
-- if (!mapFromSource(index).isValid())
-- {
-- continue;
-- }
--
-- QModelIndex sourceIndex = mapFromDirectSourceToSourceImageModel(index);
-- qlonglong id = sourceImageModel()->imageId(sourceIndex);
--
-- if (sourceImageModel()->numberOfIndexesForImageId(id) > 1)
-- {
-- needInvalidate = true;
-- }
-- }
--}*/
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltermodel.h b/libs/models/imagefiltermodel.h
-deleted file mode 100644
-index d131b3e..0000000
---- a/libs/models/imagefiltermodel.h
-+++ /dev/null
-@@ -1,299 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERMODEL_H
--#define IMAGEFILTERMODEL_H
--
--// Local includes
--
--#include "dcategorizedsortfilterproxymodel.h"
--#include "textfilter.h"
--#include "imagefiltersettings.h"
--#include "imagemodel.h"
--#include "imagesortsettings.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageChangeset;
--class ImageFilterModel;
--class ImageTagChangeset;
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelPrepareHook
--{
--public:
--
-- virtual ~ImageFilterModelPrepareHook() {};
-- virtual void prepare(const QVector<ImageInfo>& infos) = 0;
--};
--
--// -----------------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageSortFilterModel : public DCategorizedSortFilterProxyModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageSortFilterModel(QObject* parent = 0);
--
-- void setSourceImageModel(ImageModel* model);
-- ImageModel* sourceImageModel() const;
--
-- void setSourceFilterModel(ImageSortFilterModel* model);
-- ImageSortFilterModel* sourceFilterModel() const;
--
-- QModelIndex mapToSourceImageModel(const QModelIndex& index) const;
-- QModelIndex mapFromSourceImageModel(const QModelIndex& imagemodel_index) const;
-- QModelIndex mapFromDirectSourceToSourceImageModel(const QModelIndex& sourceModel_index) const;
--
-- /// Convenience methods mapped to ImageModel.
-- /// Mentioned indexes returned come from the source image model.
-- QList<QModelIndex> mapListToSource(const QList<QModelIndex>& indexes) const;
-- QList<QModelIndex> mapListFromSource(const QList<QModelIndex>& sourceIndexes) const;
--
-- ImageInfo imageInfo(const QModelIndex& index) const;
-- qlonglong imageId(const QModelIndex& index) const;
-- QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-- QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
--
-- QModelIndex indexForPath(const QString& filePath) const;
-- QModelIndex indexForImageInfo(const ImageInfo& info) const;
-- QModelIndex indexForImageId(qlonglong id) const;
--
-- /** Returns a list of all image infos, sorted according to this model.
-- * If you do not need a sorted list, use ImageModel's imageInfos() method.
-- */
-- QList<ImageInfo> imageInfosSorted() const;
--
-- /// Returns this, any chained ImageFilterModel, or 0.
-- virtual ImageFilterModel* imageFilterModel() const;
--
--protected:
--
-- /// Reimplement if needed. Called only when model shall be set as (direct) sourceModel.
-- virtual void setDirectSourceImageModel(ImageModel* model);
--
-- // made protected
-- virtual void setSourceModel(QAbstractItemModel* model);
--
--protected:
--
-- ImageSortFilterModel* m_chainedModel;
--};
--
--// -----------------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModel : public ImageSortFilterModel
--{
-- Q_OBJECT
--
--public:
--
-- enum ImageFilterModelRoles
-- {
-- /// Returns the current categorization mode
-- CategorizationModeRole = ImageModel::FilterModelRoles + 1,
-- /// Returns the current sort order
-- SortOrderRole = ImageModel::FilterModelRoles + 2,
-- // / Returns the number of items in the index' category
-- //CategoryCountRole = ImageModel::FilterModelRoles + 3,
-- /// Returns the id of the PAlbum of the index which is used for category
-- CategoryAlbumIdRole = ImageModel::FilterModelRoles + 3,
-- /// Returns the format of the index which is used for category
-- CategoryFormatRole = ImageModel::FilterModelRoles + 4,
-- /// Returns true if the given image is a group leader, and the group is opened
-- GroupIsOpenRole = ImageModel::FilterModelRoles + 5,
-- ImageFilterModelPointerRole = ImageModel::FilterModelRoles + 50
-- };
--
--public:
--
-- explicit ImageFilterModel(QObject* parent = 0);
-- ~ImageFilterModel();
--
-- /** Add a hook to get added images for preparation tasks before they are added in the model */
-- void addPrepareHook(ImageFilterModelPrepareHook* hook);
-- void removePrepareHook(ImageFilterModelPrepareHook* hook);
--
-- /** Returns a set of DatabaseFields suggested to set as watch flags on the source ImageModel.
-- * The contained flags will be those that this model can sort or filter by. */
-- DatabaseFields::Set suggestedWatchFlags() const;
--
-- ImageFilterSettings imageFilterSettings() const;
-- VersionImageFilterSettings versionImageFilterSettings() const;
-- GroupImageFilterSettings groupImageFilterSettings() const;
-- ImageSortSettings imageSortSettings() const;
--
-- // group is identified by the id of its group leader
-- bool isGroupOpen(qlonglong group) const;
-- bool isAllGroupsOpen() const;
--
-- /// Enables sending imageInfosAdded and imageInfosAboutToBeRemoved
-- void setSendImageInfoSignals(bool sendSignals);
--
-- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-- virtual ImageFilterModel* imageFilterModel() const;
--
--public Q_SLOTS:
--
-- /** Changes the current version image filter settings and refilters. */
-- void setVersionImageFilterSettings(const VersionImageFilterSettings& settings);
--
-- /** Changes the current version image filter settings and refilters. */
-- void setGroupImageFilterSettings(const GroupImageFilterSettings& settings);
--
-- /** Adjust the current ImageFilterSettings.
-- * Equivalent to retrieving the current filter settings, adjusting the parameter
-- * and calling setImageFilterSettings.
-- * Provided for convenience.
-- * It is encouraged to use setImageFilterSettings if you change more than one
-- * parameter at a time.
-- */
-- void setDayFilter(const QList<QDateTime>& days);
-- void setTagFilter(const QList<int>& includedTags, const QList<int>& excludedTags,
-- ImageFilterSettings::MatchingCondition matchingCond, bool showUnTagged,
-- const QList<int>& clTagIds, const QList<int>& plTagIds);
-- void setRatingFilter(int rating, ImageFilterSettings::RatingCondition ratingCond, bool isUnratedExcluded);
-- void setMimeTypeFilter(int mimeTypeFilter);
-- void setGeolocationFilter(const ImageFilterSettings::GeolocationCondition& condition);
-- void setTextFilter(const SearchTextFilterSettings& settings);
--
-- void setCategorizationMode(ImageSortSettings::CategorizationMode mode);
-- void setCategorizationSortOrder(ImageSortSettings::SortOrder order);
-- void setSortRole(ImageSortSettings::SortRole role);
-- void setSortOrder(ImageSortSettings::SortOrder order);
-- void setStringTypeNatural(bool natural);
-- void setUrlWhitelist(const QList<QUrl> urlList, const QString& id);
-- void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
--
-- void setVersionManagerSettings(const VersionManagerSettings& settings);
-- void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
--
-- void setGroupOpen(qlonglong group, bool open);
-- void toggleGroupOpen(qlonglong group);
-- void setAllGroupsOpen(bool open);
--
-- /** Changes the current image filter settings and refilters. */
-- virtual void setImageFilterSettings(const ImageFilterSettings& settings);
--
-- /** Changes the current image sort settings and resorts. */
-- virtual void setImageSortSettings(const ImageSortSettings& settings);
--
--Q_SIGNALS:
--
-- /// Signals that the set filter matches at least one index
-- void filterMatches(bool matches);
--
-- /** Signals that the set text filter matches at least one entry.
-- If no text filter is set, this signal is emitted
-- with 'false' when filterMatches() is emitted.
-- */
-- void filterMatchesForText(bool matchesByText);
--
-- /** Emitted when the filter settings have been changed
-- (the model may not yet have been updated)
-- */
-- void filterSettingsChanged(const ImageFilterSettings& settings);
--
-- /** These signals need to be explicitly enabled with setSendImageInfoSignals()
-- */
-- void imageInfosAdded(const QList<ImageInfo>& infos);
-- void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
--
--public:
--
-- // Declared as public because of use in sub-classes.
-- class ImageFilterModelPrivate;
--
--protected:
--
-- ImageFilterModelPrivate* const d_ptr;
--
--protected:
--
-- ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent);
--
-- virtual void setDirectSourceImageModel(ImageModel* model);
--
-- virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
--
-- virtual int compareCategories(const QModelIndex& left, const QModelIndex& right) const;
-- virtual bool subSortLessThan(const QModelIndex& left, const QModelIndex& right) const;
-- //virtual int categoryCount(const ImageInfo& info) const;
--
-- /** Reimplement to customize category sorting,
-- * Return negative if category of left < category right,
-- * Return 0 if left and right are in the same category, else return positive.
-- */
-- virtual int compareInfosCategories(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Reimplement to customize sorting. Do not take categories into account here.
-- */
-- virtual bool infosLessThan(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Returns a unique identifier for the category if info. The string need not be for user display.
-- */
-- virtual QString categoryIdentifier(const ImageInfo& info) const;
--
--protected Q_SLOTS:
--
-- void slotModelReset();
-- void slotUpdateFilter();
--
-- void slotImageTagChange(const ImageTagChangeset& changeset);
-- void slotImageChange(const ImageChangeset& changeset);
--
-- void slotRowsInserted(const QModelIndex& parent, int start, int end);
-- void slotRowsAboutToBeRemoved(const QModelIndex& parent, int start, int end);
--
--private:
--
-- Q_DECLARE_PRIVATE(ImageFilterModel)
--};
--
--// -----------------------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT NoDuplicatesImageFilterModel : public ImageSortFilterModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit NoDuplicatesImageFilterModel(QObject* parent = 0);
--
--protected:
--
-- virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
--};
--
--} // namespace Digikam
--
--Q_DECLARE_METATYPE(Digikam::ImageFilterModel*)
--
--#endif // IMAGEMODEL_H
-diff --git a/libs/models/imagefiltermodelpriv.cpp b/libs/models/imagefiltermodelpriv.cpp
-deleted file mode 100644
-index 07d9e79..0000000
---- a/libs/models/imagefiltermodelpriv.cpp
-+++ /dev/null
-@@ -1,258 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltermodelpriv.h"
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "imagefiltermodelthreads.h"
--
--namespace Digikam
--{
--
--ImageFilterModel::ImageFilterModelPrivate::ImageFilterModelPrivate()
--{
-- imageModel = 0;
-- version = 0;
-- lastDiscardVersion = 0;
-- sentOut = 0;
-- sentOutForReAdd = 0;
-- updateFilterTimer = 0;
-- needPrepare = false;
-- needPrepareComments = false;
-- needPrepareTags = false;
-- needPrepareGroups = false;
-- preparer = 0;
-- filterer = 0;
-- hasOneMatch = false;
-- hasOneMatchForText = false;
--
-- setupWorkers();
--}
--
--ImageFilterModel::ImageFilterModelPrivate::~ImageFilterModelPrivate()
--{
-- // facilitate thread stopping
-- ++version;
-- preparer->deactivate();
-- filterer->deactivate();
-- delete preparer;
-- delete filterer;
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::init(ImageFilterModel* _q)
--{
-- q = _q;
--
-- updateFilterTimer = new QTimer(this);
-- updateFilterTimer->setSingleShot(true);
-- updateFilterTimer->setInterval(250);
--
-- connect(updateFilterTimer, SIGNAL(timeout()),
-- q, SLOT(slotUpdateFilter()));
--
-- // inter-thread redirection
-- qRegisterMetaType<ImageFilterModelTodoPackage>("ImageFilterModelTodoPackage");
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- infosToProcess(infos, extraValues, true);
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- // These have already been added, we just process them afterwards
-- infosToProcess(infos, extraValues, false);
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::setupWorkers()
--{
-- preparer = new ImageFilterModelPreparer(this);
-- filterer = new ImageFilterModelFilterer(this);
--
-- // A package in constructed in infosToProcess.
-- // Normal flow is infosToProcess -> preparer::process -> filterer::process -> packageFinished.
-- // If no preparation is needed, the first step is skipped.
-- // If filter version changes, both will discard old package and send them to packageDiscarded.
--
-- connect(this, SIGNAL(packageToPrepare(ImageFilterModelTodoPackage)),
-- preparer, SLOT(process(ImageFilterModelTodoPackage)));
--
-- connect(this, SIGNAL(packageToFilter(ImageFilterModelTodoPackage)),
-- filterer, SLOT(process(ImageFilterModelTodoPackage)));
--
-- connect(preparer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-- filterer, SLOT(process(ImageFilterModelTodoPackage)));
--
-- connect(filterer, SIGNAL(processed(ImageFilterModelTodoPackage)),
-- this, SLOT(packageFinished(ImageFilterModelTodoPackage)));
--
-- connect(preparer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-- this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
--
-- connect(filterer, SIGNAL(discarded(ImageFilterModelTodoPackage)),
-- this, SLOT(packageDiscarded(ImageFilterModelTodoPackage)));
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos)
--{
-- infosToProcess(infos, QList<QVariant>(), false);
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- filterer->schedule();
--
-- if (needPrepare)
-- {
-- preparer->schedule();
-- }
--
-- Q_ASSERT(extraValues.isEmpty() || infos.size() == extraValues.size());
--
-- // prepare and filter in chunks
-- const int size = infos.size();
-- const int maxChunkSize = needPrepare ? PrepareChunkSize : FilterChunkSize;
-- const bool hasExtraValues = !extraValues.isEmpty();
-- QList<ImageInfo>::const_iterator it = infos.constBegin(), end;
-- QList<QVariant>::const_iterator xit = extraValues.constBegin(), xend;
-- int index = 0;
-- QVector<ImageInfo> infoVector;
-- QVector<QVariant> extraValueVector;
--
-- while (it != infos.constEnd())
-- {
-- const int chunkSize = qMin(maxChunkSize, size - index);
-- infoVector.resize(chunkSize);
-- end = it + chunkSize;
-- qCopy(it, end, infoVector.begin());
--
-- if (hasExtraValues)
-- {
-- extraValueVector.resize(chunkSize);
-- xend = xit + chunkSize;
-- qCopy(xit, xend, extraValueVector.begin());
-- xit = xend;
-- }
--
-- it = end;
-- index += chunkSize;
--
-- ++sentOut;
--
-- if (forReAdd)
-- {
-- ++sentOutForReAdd;
-- }
--
-- if (needPrepare)
-- {
-- emit packageToPrepare(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-- }
-- else
-- {
-- emit packageToFilter(ImageFilterModelTodoPackage(infoVector, extraValueVector, version, forReAdd));
-- }
-- }
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::packageFinished(const ImageFilterModelTodoPackage& package)
--{
-- // check if it got discarded on the journey
-- if (package.version != version)
-- {
-- packageDiscarded(package);
-- return;
-- }
--
-- // incorporate result
-- QHash<qlonglong, bool>::const_iterator it = package.filterResults.constBegin();
--
-- for (; it != package.filterResults.constEnd(); ++it)
-- {
-- filterResults.insert(it.key(), it.value());
-- }
--
-- // re-add if necessary
-- if (package.isForReAdd)
-- {
-- emit reAddImageInfos(package.infos.toList(), package.extraValues.toList());
--
-- if (sentOutForReAdd == 1) // last package
-- {
-- emit reAddingFinished();
-- }
-- }
--
-- // decrement counters
-- --sentOut;
--
-- if (package.isForReAdd)
-- {
-- --sentOutForReAdd;
-- }
--
-- // If all packages have returned, filtered and readded, and no more are expected,
-- // and there is need to tell the filter result to the view, do that
-- if (sentOut == 0 && sentOutForReAdd == 0 && !imageModel->isRefreshing())
-- {
-- q->invalidate(); // use invalidate, not invalidateFilter only. Sorting may have changed as well.
-- emit (q->filterMatches(hasOneMatch));
-- emit (q->filterMatchesForText(hasOneMatchForText));
-- filterer->deactivate();
-- preparer->deactivate();
-- }
--}
--
--void ImageFilterModel::ImageFilterModelPrivate::packageDiscarded(const ImageFilterModelTodoPackage& package)
--{
-- // Either, the model was reset, or the filter changed
-- // In the former case throw all away, in the latter case, recycle
-- if (package.version > lastDiscardVersion)
-- {
-- // Recycle packages: Send again with current version
-- // Do not increment sentOut or sentOutForReAdd here: it was not decremented!
--
-- if (needPrepare)
-- {
-- emit packageToPrepare(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-- }
-- else
-- {
-- emit packageToFilter(ImageFilterModelTodoPackage(package.infos, package.extraValues, version, package.isForReAdd));
-- }
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltermodelpriv.h b/libs/models/imagefiltermodelpriv.h
-deleted file mode 100644
-index a9e3f22..0000000
---- a/libs/models/imagefiltermodelpriv.h
-+++ /dev/null
-@@ -1,159 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-11
-- * Description : Qt item model for database entries - private shared header
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERMODELPRIV_H
--#define IMAGEFILTERMODELPRIV_H
--
--// Qt includes
--
--#include <QHash>
--#include <QMutex>
--#include <QMutexLocker>
--#include <QSet>
--#include <QThread>
--#include <QTimer>
--#include <QWaitCondition>
--
--// Local includes
--
--#include "imageinfo.h"
--#include "imagefiltermodel.h"
--
--#include "digikam_export.h"
--// Yes, we need the EXPORT macro in a private header because
--// this private header is shared across binary objects.
--// This does NOT make this classes here any more public!
--
--namespace Digikam
--{
--
--const int PrepareChunkSize = 101;
--const int FilterChunkSize = 2001;
--
--class ImageFilterModelTodoPackage
--{
--public:
--
-- ImageFilterModelTodoPackage()
-- : version(0), isForReAdd(false)
-- {
-- }
--
-- ImageFilterModelTodoPackage(const QVector<ImageInfo>& infos, const QVector<QVariant>& extraValues, int version, bool isForReAdd)
-- : infos(infos), extraValues(extraValues), version(version), isForReAdd(isForReAdd)
-- {
-- }
--
-- QVector<ImageInfo> infos;
-- QVector<QVariant> extraValues;
-- unsigned int version;
-- bool isForReAdd;
-- QHash<qlonglong, bool> filterResults;
--};
--
--// ------------------------------------------------------------------------------------------------
--
--class ImageFilterModelPreparer;
--class ImageFilterModelFilterer;
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModel::ImageFilterModelPrivate : public QObject
--{
-- Q_OBJECT
--
--public:
--
-- ImageFilterModelPrivate();
-- ~ImageFilterModelPrivate();
--
-- void init(ImageFilterModel* q);
-- void setupWorkers();
-- void infosToProcess(const QList<ImageInfo>& infos);
-- void infosToProcess(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues, bool forReAdd = true);
--
--public:
--
-- ImageFilterModel* q;
--
-- ImageModel* imageModel;
--
-- ImageFilterSettings filter;
-- ImageSortSettings sorter;
-- VersionImageFilterSettings versionFilter;
-- GroupImageFilterSettings groupFilter;
--
-- volatile unsigned int version;
-- unsigned int lastDiscardVersion;
-- unsigned int lastFilteredVersion;
-- int sentOut;
-- int sentOutForReAdd;
--
-- QTimer* updateFilterTimer;
--
-- bool needPrepare;
-- bool needPrepareComments;
-- bool needPrepareTags;
-- bool needPrepareGroups;
--
-- QMutex mutex;
-- ImageFilterSettings filterCopy;
-- VersionImageFilterSettings versionFilterCopy;
-- GroupImageFilterSettings groupFilterCopy;
-- ImageFilterModelPreparer* preparer;
-- ImageFilterModelFilterer* filterer;
--
-- QHash<qlonglong, bool> filterResults;
-- bool hasOneMatch;
-- bool hasOneMatchForText;
--
-- QList<ImageFilterModelPrepareHook*> prepareHooks;
--
--/*
-- QHash<int, QSet<qlonglong> > categoryCountHashInt;
-- QHash<QString, QSet<qlonglong> > categoryCountHashString;
--
--public:
--
-- void cacheCategoryCount(int id, qlonglong imageid) const
-- { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashInt[id].insert(imageid); }
-- void cacheCategoryCount(const QString& id, qlonglong imageid) const
-- { const_cast<ImageFilterModelPrivate*>(this)->categoryCountHashString[id].insert(imageid); }
--*/
--
--public Q_SLOTS:
--
-- void preprocessInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void processAddedInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void packageFinished(const ImageFilterModelTodoPackage& package);
-- void packageDiscarded(const ImageFilterModelTodoPackage& package);
--
--Q_SIGNALS:
--
-- void packageToPrepare(const ImageFilterModelTodoPackage& package);
-- void packageToFilter(const ImageFilterModelTodoPackage& package);
-- void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void reAddingFinished();
--};
--
--} // namespace Digikam
--
--#endif // IMAGEFILTERMODELPRIV_H
-diff --git a/libs/models/imagefiltermodelthreads.cpp b/libs/models/imagefiltermodelthreads.cpp
-deleted file mode 100644
-index aa5c462..0000000
---- a/libs/models/imagefiltermodelthreads.cpp
-+++ /dev/null
-@@ -1,40 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltermodel.h"
--#include "imagefiltermodelpriv.h"
--#include "imagefiltermodelthreads.h"
--
--namespace Digikam
--{
--
--ImageFilterModelWorker::ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d)
-- : d(d)
--{
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltermodelthreads.h b/libs/models/imagefiltermodelthreads.h
-deleted file mode 100644
-index 83fa987..0000000
---- a/libs/models/imagefiltermodelthreads.h
-+++ /dev/null
-@@ -1,100 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-11
-- * Description : Qt item model for database entries - private header
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERMODELTHREADS_H
--#define IMAGEFILTERMODELTHREADS_H
--
--// Qt includes
--
--#include <QThread>
--
--// Local includes
--
--#include "digikam_export.h"
--#include "workerobject.h"
--
--namespace Digikam
--{
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelWorker : public WorkerObject
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageFilterModelWorker(ImageFilterModel::ImageFilterModelPrivate* const d);
--
-- bool checkVersion(const ImageFilterModelTodoPackage& package)
-- {
-- return d->version == package.version;
-- }
--
--public Q_SLOTS:
--
-- virtual void process(ImageFilterModelTodoPackage package) = 0;
--
--Q_SIGNALS:
--
-- void processed(const ImageFilterModelTodoPackage& package);
-- void discarded(const ImageFilterModelTodoPackage& package);
--
--protected:
--
-- ImageFilterModel::ImageFilterModelPrivate* d;
--};
--
--// -----------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelPreparer : public ImageFilterModelWorker
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageFilterModelPreparer(ImageFilterModel::ImageFilterModelPrivate* const d)
-- : ImageFilterModelWorker(d)
-- {
-- }
--
-- void process(ImageFilterModelTodoPackage package);
--};
--
--// ----------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterModelFilterer : public ImageFilterModelWorker
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageFilterModelFilterer(ImageFilterModel::ImageFilterModelPrivate* const d)
-- : ImageFilterModelWorker(d)
-- {
-- }
--
-- void process(ImageFilterModelTodoPackage package);
--};
--
--} // namespace Digikam
--
--#endif // IMAGEFILTERMODELTHREADS_H
-diff --git a/libs/models/imagefiltersettings.cpp b/libs/models/imagefiltersettings.cpp
-deleted file mode 100644
-index b61e7f9..0000000
---- a/libs/models/imagefiltersettings.cpp
-+++ /dev/null
-@@ -1,952 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Filter values for use with ImageFilterModel
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imagefiltersettings.h"
--
--// C++ includes
--
--#include <cmath>
--
--// Qt includes
--
--#include <QDateTime>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbfields.h"
--#include "digikam_globals.h"
--#include "imageinfo.h"
--#include "tagscache.h"
--#include "versionmanagersettings.h"
--
--namespace Digikam
--{
--
--ImageFilterSettings::ImageFilterSettings()
--{
-- m_untaggedFilter = false;
-- m_isUnratedExcluded = false;
-- m_ratingFilter = 0;
-- m_mimeTypeFilter = MimeFilter::AllFiles;
-- m_ratingCond = GreaterEqualCondition;
-- m_matchingCond = OrCondition;
-- m_geolocationCondition = GeolocationNoFilter;
--}
--
--DatabaseFields::Set ImageFilterSettings::watchFlags() const
--{
-- DatabaseFields::Set set;
--
-- if (isFilteringByDay())
-- {
-- set |= DatabaseFields::CreationDate;
-- }
--
-- if (isFilteringByText())
-- {
-- set |= DatabaseFields::Name;
-- set |= DatabaseFields::Comment;
-- }
--
-- if (isFilteringByRating())
-- {
-- set |= DatabaseFields::Rating;
-- }
--
-- if (isFilteringByTypeMime())
-- {
-- set |= DatabaseFields::Category;
-- set |= DatabaseFields::Format;
-- }
--
-- if (isFilteringByGeolocation())
-- {
-- set |= DatabaseFields::ImagePositionsAll;
-- }
--
-- if (isFilteringByColorLabels())
-- {
-- set |= DatabaseFields::ColorLabel;
-- }
--
-- if (isFilteringByPickLabels())
-- {
-- set |= DatabaseFields::PickLabel;
-- }
--
-- return set;
--}
--
--bool ImageFilterSettings::isFilteringByDay() const
--{
-- if (!m_dayFilter.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByTags() const
--{
-- if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty() || m_untaggedFilter)
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByColorLabels() const
--{
-- if (!m_colorLabelTagFilter.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByPickLabels() const
--{
-- if (!m_pickLabelTagFilter.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByText() const
--{
-- if (!m_textFilterSettings.text.isEmpty())
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByTypeMime() const
--{
-- if (m_mimeTypeFilter != MimeFilter::AllFiles)
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringByGeolocation() const
--{
-- return (m_geolocationCondition != GeolocationNoFilter);
--}
--
--bool ImageFilterSettings::isFilteringByRating() const
--{
-- if (m_ratingFilter != 0 || m_ratingCond != GreaterEqualCondition || m_isUnratedExcluded)
-- {
-- return true;
-- }
--
-- return false;
--}
--
--bool ImageFilterSettings::isFilteringInternally() const
--{
-- return (isFiltering() || !m_urlWhitelists.isEmpty() || !m_idWhitelists.isEmpty());
--}
--
--bool ImageFilterSettings::isFiltering() const
--{
-- return isFilteringByDay() ||
-- isFilteringByTags() ||
-- isFilteringByText() ||
-- isFilteringByRating() ||
-- isFilteringByTypeMime() ||
-- isFilteringByColorLabels() ||
-- isFilteringByPickLabels() ||
-- isFilteringByGeolocation();
--}
--
--void ImageFilterSettings::setDayFilter(const QList<QDateTime>& days)
--{
-- m_dayFilter.clear();
--
-- for (QList<QDateTime>::const_iterator it = days.constBegin(); it != days.constEnd(); ++it)
-- {
-- m_dayFilter.insert(*it, true);
-- }
--}
--
--void ImageFilterSettings::setTagFilter(const QList<int>& includedTags,
-- const QList<int>& excludedTags,
-- MatchingCondition matchingCondition,
-- bool showUnTagged,
-- const QList<int>& clTagIds,
-- const QList<int>& plTagIds)
--{
-- m_includeTagFilter = includedTags;
-- m_excludeTagFilter = excludedTags;
-- m_matchingCond = matchingCondition;
-- m_untaggedFilter = showUnTagged;
-- m_colorLabelTagFilter = clTagIds;
-- m_pickLabelTagFilter = plTagIds;
--}
--
--void ImageFilterSettings::setRatingFilter(int rating, RatingCondition ratingCondition, bool isUnratedExcluded)
--{
-- m_ratingFilter = rating;
-- m_ratingCond = ratingCondition;
-- m_isUnratedExcluded = isUnratedExcluded;
--}
--
--void ImageFilterSettings::setMimeTypeFilter(int mime)
--{
-- m_mimeTypeFilter = (MimeFilter::TypeMimeFilter)mime;
--}
--
--void ImageFilterSettings::setGeolocationFilter(const GeolocationCondition& condition)
--{
-- m_geolocationCondition = condition;
--}
--
--void ImageFilterSettings::setTextFilter(const SearchTextFilterSettings& settings)
--{
-- m_textFilterSettings = settings;
--}
--
--void ImageFilterSettings::setTagNames(const QHash<int, QString>& hash)
--{
-- m_tagNameHash = hash;
--}
--
--void ImageFilterSettings::setAlbumNames(const QHash<int, QString>& hash)
--{
-- m_albumNameHash = hash;
--}
--
--void ImageFilterSettings::setUrlWhitelist(const QList<QUrl>& urlList, const QString& id)
--{
-- if (urlList.isEmpty())
-- {
-- m_urlWhitelists.remove(id);
-- }
-- else
-- {
-- m_urlWhitelists.insert(id, urlList);
-- }
--}
--
--void ImageFilterSettings::setIdWhitelist(const QList<qlonglong>& idList, const QString& id)
--{
-- if (idList.isEmpty())
-- {
-- m_idWhitelists.remove(id);
-- }
-- else
-- {
-- m_idWhitelists.insert(id, idList);
-- }
--}
--
--template <class ContainerA, class ContainerB>
--bool containsAnyOf(const ContainerA& listA, const ContainerB& listB)
--{
-- foreach (const typename ContainerA::value_type& a, listA)
-- {
-- if (listB.contains(a))
-- {
-- return true;
-- }
-- }
-- return false;
--}
--
--template <class ContainerA, typename Value, class ContainerB>
--bool containsNoneOfExcept(const ContainerA& list, const ContainerB& noneOfList, const Value& exception)
--{
-- foreach (const typename ContainerB::value_type& n, noneOfList)
-- {
-- if (n != exception && list.contains(n))
-- {
-- return false;
-- }
-- }
-- return true;
--}
--
--bool ImageFilterSettings::matches(const ImageInfo& info, bool* const foundText) const
--{
-- if (foundText)
-- {
-- *foundText = false;
-- }
--
-- if (!isFilteringInternally())
-- {
-- return true;
-- }
--
-- bool match = false;
--
-- if (!m_includeTagFilter.isEmpty() || !m_excludeTagFilter.isEmpty())
-- {
-- QList<int> tagIds = info.tagIds();
-- QList<int>::const_iterator it;
--
-- match = m_includeTagFilter.isEmpty();
--
-- if (m_matchingCond == OrCondition)
-- {
-- for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-- {
-- if (tagIds.contains(*it))
-- {
-- match = true;
-- break;
-- }
-- }
--
-- match |= (m_untaggedFilter && tagIds.isEmpty());
-- }
-- else // AND matching condition...
-- {
-- // m_untaggedFilter and non-empty tag filter, combined with AND, is logically no match
-- if (!m_untaggedFilter)
-- {
-- for (it = m_includeTagFilter.begin(); it != m_includeTagFilter.end(); ++it)
-- {
-- if (!tagIds.contains(*it))
-- {
-- break;
-- }
-- }
--
-- if (it == m_includeTagFilter.end())
-- {
-- match = true;
-- }
-- }
-- }
--
-- for (it = m_excludeTagFilter.begin(); it != m_excludeTagFilter.end(); ++it)
-- {
-- if (tagIds.contains(*it))
-- {
-- match = false;
-- break;
-- }
-- }
-- }
-- else if (m_untaggedFilter)
-- {
-- match = !TagsCache::instance()->containsPublicTags(info.tagIds());
-- }
-- else
-- {
-- match = true;
-- }
--
-- //-- Filter by pick labels ------------------------------------------------
--
-- if (!m_pickLabelTagFilter.isEmpty())
-- {
-- QList<int> tagIds = info.tagIds();
-- bool matchPL = false;
--
-- if (containsAnyOf(m_pickLabelTagFilter, tagIds))
-- {
-- matchPL = true;
-- }
-- else if (!matchPL)
-- {
-- int noPickLabelTagId = TagsCache::instance()->tagForPickLabel(NoPickLabel);
--
-- if (m_pickLabelTagFilter.contains(noPickLabelTagId))
-- {
-- // Searching for "has no ColorLabel" requires special handling:
-- // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-- matchPL = containsNoneOfExcept(tagIds, TagsCache::instance()->pickLabelTags(), noPickLabelTagId);
-- }
-- }
--
-- match &= matchPL;
-- }
--
-- //-- Filter by color labels ------------------------------------------------
--
-- if (!m_colorLabelTagFilter.isEmpty())
-- {
-- QList<int> tagIds = info.tagIds();
-- bool matchCL = false;
--
-- if (containsAnyOf(m_colorLabelTagFilter, tagIds))
-- {
-- matchCL = true;
-- }
-- else if (!matchCL)
-- {
-- int noColorLabelTagId = TagsCache::instance()->tagForColorLabel(NoColorLabel);
--
-- if (m_colorLabelTagFilter.contains(noColorLabelTagId))
-- {
-- // Searching for "has no ColorLabel" requires special handling:
-- // Scan that the tag ids contains none of the ColorLabel tags, except maybe the NoColorLabel tag
-- matchCL = containsNoneOfExcept(tagIds, TagsCache::instance()->colorLabelTags(), noColorLabelTagId);
-- }
-- }
--
-- match &= matchCL;
-- }
--
-- //-- Filter by date -----------------------------------------------------------
--
-- if (!m_dayFilter.isEmpty())
-- {
-- match &= m_dayFilter.contains(QDateTime(info.dateTime().date(), QTime()));
-- }
--
-- //-- Filter by rating ---------------------------------------------------------
--
-- if (m_ratingFilter >= 0)
-- {
-- // for now we treat -1 (no rating) just like a rating of 0.
-- int rating = info.rating();
--
-- if (rating == -1)
-- {
-- rating = 0;
-- }
--
-- if(m_isUnratedExcluded && rating == 0)
-- {
-- match = false;
-- }
-- else
-- {
-- if (m_ratingCond == GreaterEqualCondition)
-- {
-- // If the rating is not >=, i.e it is <, then it does not match.
-- if (rating < m_ratingFilter)
-- {
-- match = false;
-- }
-- }
-- else if (m_ratingCond == EqualCondition)
-- {
-- // If the rating is not =, i.e it is !=, then it does not match.
-- if (rating != m_ratingFilter)
-- {
-- match = false;
-- }
-- }
-- else
-- {
-- // If the rating is not <=, i.e it is >, then it does not match.
-- if (rating > m_ratingFilter)
-- {
-- match = false;
-- }
-- }
-- }
-- }
--
-- // -- Filter by mime type -----------------------------------------------------
--
-- switch (m_mimeTypeFilter)
-- {
-- // info.format is a standardized string: Only one possibility per mime type
-- case MimeFilter::ImageFiles:
-- {
-- if (info.category() != DatabaseItem::Image)
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::JPGFiles:
-- {
-- if (info.format() != QLatin1String("JPG"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::PNGFiles:
-- {
-- if (info.format() != QLatin1String("PNG"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::TIFFiles:
-- {
-- if (info.format() != QLatin1String("TIFF"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::DNGFiles:
-- {
-- if (info.format() != QLatin1String("RAW-DNG"))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::NoRAWFiles:
-- {
-- if (info.format().startsWith(QLatin1String("RAW")))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::RAWFiles:
-- {
-- if (!info.format().startsWith(QLatin1String("RAW")))
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::MoviesFiles:
-- {
-- if (info.category() != DatabaseItem::Video)
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::AudioFiles:
-- {
-- if (info.category() != DatabaseItem::Audio)
-- {
-- match = false;
-- }
--
-- break;
-- }
-- case MimeFilter::RasterFiles:
-- {
-- if (info.format() != QLatin1String("PSD") && // Adobe Photoshop Document
-- info.format() != QLatin1String("PSB") && // Adobe Photoshop Big
-- info.format() != QLatin1String("XCF") && // Gimp
-- info.format() != QLatin1String("KRA") && // Krita
-- info.format() != QLatin1String("ORA") // Open Raster
-- )
-- {
-- match = false;
-- }
--
-- break;
-- }
-- default:
-- {
-- // All Files: do nothing...
-- break;
-- }
-- }
--
-- //-- Filter by geolocation ----------------------------------------------------
--
-- if (m_geolocationCondition!=GeolocationNoFilter)
-- {
-- if (m_geolocationCondition==GeolocationNoCoordinates)
-- {
-- if (info.hasCoordinates())
-- {
-- match = false;
-- }
-- }
-- else if (m_geolocationCondition==GeolocationHasCoordinates)
-- {
-- if (!info.hasCoordinates())
-- {
-- match = false;
-- }
-- }
-- }
--
-- //-- Filter by text -----------------------------------------------------------
--
-- if (!m_textFilterSettings.text.isEmpty())
-- {
-- bool textMatch = false;
--
-- // Image name
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageName &&
-- info.name().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Image title
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageTitle &&
-- info.title().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Image comment
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageComment &&
-- info.comment().contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Tag names
-- foreach(int id, info.tagIds())
-- {
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::TagName &&
-- m_tagNameHash.value(id).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
-- }
--
-- // Album names
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::AlbumName &&
-- m_albumNameHash.value(info.albumId()).contains(m_textFilterSettings.text, m_textFilterSettings.caseSensitive))
-- {
-- textMatch = true;
-- }
--
-- // Image Aspect Ratio
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImageAspectRatio)
-- {
-- QRegExp expRatio (QLatin1String("^\\d+:\\d+$"));
-- QRegExp expFloat (QLatin1String("^\\d+(.\\d+)?$"));
--
-- if (expRatio.indexIn(m_textFilterSettings.text) > -1 && m_textFilterSettings.text.contains(QRegExp(QLatin1String(":\\d+"))))
-- {
-- QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-- QStringList numberStringList = trimmedTextFilterSettingsText.split(QLatin1String(":"), QString::SkipEmptyParts);
--
-- if (numberStringList.length() == 2)
-- {
-- QString numString = (QString)numberStringList.at(0), denomString = (QString)numberStringList.at(1);
-- bool canConverseNum = false;
-- bool canConverseDenom = false;
-- int num = numString.toInt(&canConverseNum, 10), denom = denomString.toInt(&canConverseDenom, 10);
--
-- if (canConverseNum && canConverseDenom)
-- {
-- if (fabs(info.aspectRatio() - (double)num / denom) < 0.1)
-- textMatch = true;
-- }
-- }
-- }
-- else if (expFloat.indexIn(m_textFilterSettings.text) > -1)
-- {
-- QString trimmedTextFilterSettingsText = m_textFilterSettings.text;
-- bool canConverse = false;
-- double ratio = trimmedTextFilterSettingsText.toDouble(&canConverse);
--
-- if (canConverse)
-- {
-- if (fabs(info.aspectRatio() - ratio) < 0.1)
-- textMatch = true;
-- }
-- }
-- }
--
-- // Image Pixel Size
-- // See bug #341053 for details.
--
-- if (m_textFilterSettings.textFields & SearchTextFilterSettings::ImagePixelSize)
-- {
-- QSize size = info.dimensions();
-- int pixelSize = size.height()*size.width();
-- QString text = m_textFilterSettings.text;
--
-- if(text.contains(QRegExp(QLatin1String("^>\\d{1,15}$"))) && pixelSize > (text.remove(0,1)).toInt())
-- {
-- textMatch = true;
-- }
-- else if(text.contains(QRegExp(QLatin1String("^<\\d{1,15}$"))) && pixelSize < (text.remove(0,1)).toInt())
-- {
-- textMatch = true;
-- }
-- else if(text.contains(QRegExp(QLatin1String("^\\d+$"))) && pixelSize == text.toInt())
-- {
-- textMatch = true;
-- }
-- }
--
-- match &= textMatch;
--
-- if (foundText)
-- {
-- *foundText = textMatch;
-- }
-- }
--
-- // -- filter by URL-whitelists ------------------------------------------------
-- // NOTE: whitelists are always AND for now.
--
-- if (match)
-- {
-- const QUrl url = info.fileUrl();
--
-- for (QHash<QString, QList<QUrl>>::const_iterator it = m_urlWhitelists.constBegin();
-- it!=m_urlWhitelists.constEnd(); ++it)
-- {
-- match = it->contains(url);
--
-- if (!match)
-- {
-- break;
-- }
-- }
-- }
--
-- if (match)
-- {
-- const qlonglong id = info.id();
--
-- for (QHash<QString, QList<qlonglong> >::const_iterator it = m_idWhitelists.constBegin();
-- it!=m_idWhitelists.constEnd(); ++it)
-- {
-- match = it->contains(id);
--
-- if (!match)
-- {
-- break;
-- }
-- }
-- }
--
-- return match;
--}
--
--// -------------------------------------------------------------------------------------------------
--
--VersionImageFilterSettings::VersionImageFilterSettings()
--{
-- m_includeTagFilter = 0;
-- m_exceptionTagFilter = 0;
--}
--
--VersionImageFilterSettings::VersionImageFilterSettings(const VersionManagerSettings& settings)
--{
-- setVersionManagerSettings(settings);
--}
--
--bool VersionImageFilterSettings::operator==(const VersionImageFilterSettings& other) const
--{
-- return m_excludeTagFilter == other.m_excludeTagFilter &&
-- m_exceptionLists == other.m_exceptionLists;
--}
--
--bool VersionImageFilterSettings::matches(const ImageInfo& info) const
--{
-- if (!isFiltering())
-- {
-- return true;
-- }
--
-- const qlonglong id = info.id();
--
-- for (QHash<QString, QList<qlonglong> >::const_iterator it = m_exceptionLists.constBegin();
-- it != m_exceptionLists.constEnd(); ++it)
-- {
-- if (it->contains(id))
-- {
-- return true;
-- }
-- }
--
-- bool match = true;
-- QList<int> tagIds = info.tagIds();
--
-- if (!tagIds.contains(m_includeTagFilter))
-- {
-- for (QList<int>::const_iterator it = m_excludeTagFilter.begin();
-- it != m_excludeTagFilter.end(); ++it)
-- {
-- if (tagIds.contains(*it))
-- {
-- match = false;
-- break;
-- }
-- }
-- }
--
-- if (!match)
-- {
-- if (tagIds.contains(m_exceptionTagFilter))
-- {
-- match = true;
-- }
-- }
--
-- return match;
--}
--
--bool VersionImageFilterSettings::isHiddenBySettings(const ImageInfo& info) const
--{
-- QList<int> tagIds = info.tagIds();
--
-- foreach(int tagId, m_excludeTagFilter)
-- {
-- if (tagIds.contains(tagId))
-- {
-- return true;
-- }
-- }
--
-- return false;
--}
--
--bool VersionImageFilterSettings::isExemptedBySettings(const ImageInfo& info) const
--{
-- return info.tagIds().contains(m_exceptionTagFilter);
--}
--
--void VersionImageFilterSettings::setVersionManagerSettings(const VersionManagerSettings& settings)
--{
-- m_excludeTagFilter.clear();
--
-- if (!settings.enabled)
-- {
-- return;
-- }
--
-- if (!(settings.showInViewFlags & VersionManagerSettings::ShowOriginal))
-- {
-- m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::originalVersion());
-- }
--
-- if (!(settings.showInViewFlags & VersionManagerSettings::ShowIntermediates))
-- {
-- m_excludeTagFilter << TagsCache::instance()->getOrCreateInternalTag(InternalTagName::intermediateVersion());
-- }
--
-- m_includeTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::currentVersion());
-- m_exceptionTagFilter = TagsCache::instance()->getOrCreateInternalTag(InternalTagName::versionAlwaysVisible());
--}
--
--void VersionImageFilterSettings::setExceptionList(const QList<qlonglong>& idList, const QString& id)
--{
-- if (idList.isEmpty())
-- {
-- m_exceptionLists.remove(id);
-- }
-- else
-- {
-- m_exceptionLists.insert(id, idList);
-- }
--}
--
--bool VersionImageFilterSettings::isFiltering() const
--{
-- return !m_excludeTagFilter.isEmpty();
--}
--
--bool VersionImageFilterSettings::isFilteringByTags() const
--{
-- return isFiltering();
--}
--
--// -------------------------------------------------------------------------------------------------
--
--GroupImageFilterSettings::GroupImageFilterSettings()
-- : m_allOpen(false)
--{
--}
--
--bool GroupImageFilterSettings::operator==(const GroupImageFilterSettings& other) const
--{
-- return (m_allOpen == other.m_allOpen &&
-- m_openGroups == other.m_openGroups);
--}
--
--bool GroupImageFilterSettings::matches(const ImageInfo& info) const
--{
-- if (m_allOpen)
-- {
-- return true;
-- }
--
-- if (info.isGrouped())
-- {
-- return m_openGroups.contains(info.groupImage().id());
-- }
-- return true;
--}
--
--void GroupImageFilterSettings::setOpen(qlonglong group, bool open)
--{
-- if (open)
-- {
-- m_openGroups << group;
-- }
-- else
-- {
-- m_openGroups.remove(group);
-- }
--}
--
--bool GroupImageFilterSettings::isOpen(qlonglong group) const
--{
-- return m_openGroups.contains(group);
--}
--
--void GroupImageFilterSettings::setAllOpen(bool open)
--{
-- m_allOpen = open;
--}
--
--bool GroupImageFilterSettings::isAllOpen() const
--{
-- return m_allOpen;
--}
--
--bool GroupImageFilterSettings::isFiltering() const
--{
-- return !m_allOpen;
--}
--
--DatabaseFields::Set GroupImageFilterSettings::watchFlags() const
--{
-- return DatabaseFields::ImageRelations;
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagefiltersettings.h b/libs/models/imagefiltersettings.h
-deleted file mode 100644
-index 0e7beae..0000000
---- a/libs/models/imagefiltersettings.h
-+++ /dev/null
-@@ -1,349 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Filter values for use with ImageFilterModel
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- * Copyright (C) 2010 by Andi Clemens <andi dot clemens at gmail dot com>
-- * Copyright (C) 2011 by Michael G. Hansen <mike at mghansen dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEFILTERSETTINGS_H
--#define IMAGEFILTERSETTINGS_H
--
--// Qt includes
--
--#include <QHash>
--#include <QList>
--#include <QMap>
--#include <QString>
--#include <QSet>
--#include <QUrl>
--
--// Local includes
--
--#include "searchtextbar.h"
--#include "mimefilter.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageInfo;
--class VersionManagerSettings;
--
--namespace DatabaseFields
--{
-- class Set;
--}
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT SearchTextFilterSettings : public SearchTextSettings
--{
--
--public:
--
-- enum TextFilterFields
-- {
-- None = 0x00,
-- ImageName = 0x01,
-- ImageTitle = 0x02,
-- ImageComment = 0x04,
-- TagName = 0x08,
-- AlbumName = 0x10,
-- ImageAspectRatio = 0x20,
-- ImagePixelSize = 0x40,
-- All = ImageName | ImageTitle | ImageComment | TagName | AlbumName | ImageAspectRatio | ImagePixelSize
-- };
--
--public:
--
-- SearchTextFilterSettings()
-- {
-- textFields = None;
-- }
--
-- explicit SearchTextFilterSettings(const SearchTextSettings& settings)
-- {
-- caseSensitive = settings.caseSensitive;
-- text = settings.text;
-- textFields = None;
-- }
--
-- TextFilterFields textFields;
--};
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT ImageFilterSettings
--{
--public:
--
-- ImageFilterSettings();
--
-- /**
-- * Returns true if the given ImageInfo matches the filter criteria.
-- * Optionally, foundText is set to true if it matched by text search.
-- */
-- bool matches(const ImageInfo& info, bool* const foundText = 0) const;
--
--public:
--
-- /// --- Tags filter ---
--
-- /// Possible logical matching condition used to sort tags id.
-- enum MatchingCondition
-- {
-- OrCondition,
-- AndCondition
-- };
--
-- void setTagFilter(const QList<int>& includedTags,
-- const QList<int>& excludedTags,
-- MatchingCondition matchingCond,
-- bool showUnTagged,
-- const QList<int>& clTagIds,
-- const QList<int>& plTagIds);
--
--public:
--
-- /// --- Rating filter ---
--
-- /// Possible conditions used to filter rating: >=, =, <=
-- enum RatingCondition
-- {
-- GreaterEqualCondition,
-- EqualCondition,
-- LessEqualCondition
-- };
--
-- void setRatingFilter(int rating, RatingCondition ratingCond, bool isUnratedExcluded);
--
--public:
--
-- /// --- Date filter ---
-- void setDayFilter(const QList<QDateTime>& days);
--
--public:
--
-- /// --- Text filter ---
-- void setTextFilter(const SearchTextFilterSettings& settings);
-- void setTagNames(const QHash<int, QString>& tagNameHash);
-- void setAlbumNames(const QHash<int, QString>& albumNameHash);
--
--public:
--
-- /// --- Mime filter ---
-- void setMimeTypeFilter(int mimeTypeFilter);
--
--public:
--
-- /// --- Geolocation filter
-- enum GeolocationCondition
-- {
-- GeolocationNoFilter = 0,
-- GeolocationNoCoordinates = 1 << 1,
-- GeolocationHasCoordinates = 1 << 2
-- };
--
-- void setGeolocationFilter(const GeolocationCondition& condition);
--
--public:
--
-- /// Returns if the day is a filter criteria
-- bool isFilteringByDay() const;
--
-- /// Returns if the type mime is a filter criteria
-- bool isFilteringByTypeMime() const;
--
-- /// Returns whether geolocation is a filter criteria
-- bool isFilteringByGeolocation() const;
--
-- /// Returns if the rating is a filter criteria
-- bool isFilteringByRating() const;
--
-- /// Returns if the pick labels is a filter criteria
-- bool isFilteringByPickLabels() const;
--
-- /// Returns if the color labels is a filter criteria
-- bool isFilteringByColorLabels() const;
--
-- /// Returns if the tag is a filter criteria
-- bool isFilteringByTags() const;
--
-- /// Returns if the text (including comment) is a filter criteria
-- bool isFilteringByText() const;
--
-- /// Returns if images will be filtered by these criteria at all
-- bool isFiltering() const;
--
--public:
--
-- /// --- URL whitelist filter
-- void setUrlWhitelist(const QList<QUrl>& urlList, const QString& id);
--
--public:
--
-- /// --- ID whitelist filter
-- void setIdWhitelist(const QList<qlonglong>& idList, const QString& id);
--
--public:
--
-- /// --- Change notification ---
--
-- /** Returns database fields a change in which would affect the current filtering.
-- * To find out if an image tag change affects filtering, test isFilteringByTags().
-- * The text filter will also be affected by changes in tags and album names.
-- */
-- DatabaseFields::Set watchFlags() const;
--
--private:
--
-- /**
-- * @brief Returns whether some internal filtering (whitelist by id or URL) or normal filtering is going on
-- */
-- bool isFilteringInternally() const;
--
--private:
--
-- /// --- Tags filter ---
-- bool m_untaggedFilter;
-- QList<int> m_includeTagFilter;
-- QList<int> m_excludeTagFilter;
-- MatchingCondition m_matchingCond;
-- QList<int> m_colorLabelTagFilter;
-- QList<int> m_pickLabelTagFilter;
--
-- /// --- Rating filter ---
-- int m_ratingFilter;
-- RatingCondition m_ratingCond;
-- bool m_isUnratedExcluded;
--
-- /// --- Date filter ---
-- QMap<QDateTime, bool> m_dayFilter;
--
-- /// --- Text filter ---
-- SearchTextFilterSettings m_textFilterSettings;
--
-- /// Helpers for text search: Set these if you want to search album or tag names with text search
-- QHash<int, QString> m_tagNameHash;
-- QHash<int, QString> m_albumNameHash;
--
-- /// --- Mime filter ---
-- MimeFilter::TypeMimeFilter m_mimeTypeFilter;
--
-- /// --- Geolocation filter
-- GeolocationCondition m_geolocationCondition;
--
-- /// --- URL whitelist filter
-- QHash<QString,QList<QUrl>> m_urlWhitelists;
--
-- /// --- ID whitelist filter
-- QHash<QString,QList<qlonglong> > m_idWhitelists;
--};
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT VersionImageFilterSettings
--{
--public:
--
-- VersionImageFilterSettings();
-- explicit VersionImageFilterSettings(const VersionManagerSettings& settings);
--
-- bool operator==(const VersionImageFilterSettings& other) const;
--
-- /**
-- * Returns true if the given ImageInfo matches the filter criteria.
-- */
-- bool matches(const ImageInfo& info) const;
--
-- bool isHiddenBySettings(const ImageInfo& info) const;
-- bool isExemptedBySettings(const ImageInfo& info) const;
--
-- /// --- Tags filter ---
--
-- void setVersionManagerSettings(const VersionManagerSettings& settings);
--
-- /**
-- * Add list with exceptions: These images will be exempted from filtering by this filter
-- */
-- void setExceptionList(const QList<qlonglong>& idlist, const QString& id);
--
-- /// Returns if images will be filtered by these criteria at all
-- bool isFiltering() const;
--
-- /// Returns if the tag is a filter criteria
-- bool isFilteringByTags() const;
--
-- /// DatabaseFields::Set watchFlags() const: Would return 0
--
--protected:
--
-- QList<int> m_excludeTagFilter;
-- int m_includeTagFilter;
-- int m_exceptionTagFilter;
-- QHash<QString,QList<qlonglong> > m_exceptionLists;
--};
--
--// ---------------------------------------------------------------------------------------
--
--class DIGIKAM_DATABASE_EXPORT GroupImageFilterSettings
--{
--public:
--
-- GroupImageFilterSettings();
--
-- bool operator==(const GroupImageFilterSettings& other) const;
--
-- /**
-- * Returns true if the given ImageInfo matches the filter criteria.
-- */
-- bool matches(const ImageInfo& info) const;
--
-- /**
-- * Open or close a group.
-- */
-- void setOpen(qlonglong group, bool open);
-- bool isOpen(qlonglong group) const;
--
-- /**
-- * Open all groups
-- */
-- void setAllOpen(bool open);
-- bool isAllOpen() const;
--
-- /// Returns if images will be filtered by these criteria at all
-- bool isFiltering() const;
--
-- DatabaseFields::Set watchFlags() const;
--
--protected:
--
-- bool m_allOpen;
-- QSet<qlonglong> m_openGroups;
--};
--
--} // namespace Digikam
--
--Q_DECLARE_METATYPE(Digikam::ImageFilterSettings::GeolocationCondition)
--
--#endif // IMAGEFILTERSETTINGS_H
-diff --git a/libs/models/imagelistmodel.cpp b/libs/models/imagelistmodel.cpp
-deleted file mode 100644
-index fafce34..0000000
---- a/libs/models/imagelistmodel.cpp
-+++ /dev/null
-@@ -1,70 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-12-06
-- * Description : An image model based on a static list
-- *
-- * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagelistmodel.h"
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbaccess.h"
--#include "coredbchangesets.h"
--#include "coredbwatch.h"
--#include "imageinfo.h"
--#include "imageinfolist.h"
--
--namespace Digikam
--{
--
--ImageListModel::ImageListModel(QObject* parent)
-- : ImageThumbnailModel(parent)
--{
-- connect(CoreDbAccess::databaseWatch(), SIGNAL(collectionImageChange(CollectionImageChangeset)),
-- this, SLOT(slotCollectionImageChange(CollectionImageChangeset)));
--}
--
--ImageListModel::~ImageListModel()
--{
--}
--
--void ImageListModel::slotCollectionImageChange(const CollectionImageChangeset& changeset)
--{
-- if (isEmpty())
-- {
-- return;
-- }
--
-- switch (changeset.operation())
-- {
-- case CollectionImageChangeset::Added:
-- break;
-- case CollectionImageChangeset::Removed:
-- case CollectionImageChangeset::RemovedAll:
-- removeImageInfos(ImageInfoList(changeset.ids()));
-- break;
--
-- default:
-- break;
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagelistmodel.h b/libs/models/imagelistmodel.h
-deleted file mode 100644
-index a225b1b..0000000
---- a/libs/models/imagelistmodel.h
-+++ /dev/null
-@@ -1,63 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-12-06
-- * Description : An image model based on a static list
-- *
-- * Copyright (C) 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGELISTMODEL_H
--#define IMAGELISTMODEL_H
--
--// Local includes
--
--#include "imagethumbnailmodel.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageChangeset;
--class CollectionImageChangeset;
--
--class DIGIKAM_DATABASE_EXPORT ImageListModel : public ImageThumbnailModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageListModel(QObject* parent = 0);
-- ~ImageListModel();
--
-- // NOTE: necessary methods to add and remove ImageInfos to the model are inherited from ImageModel
--
--Q_SIGNALS:
--
-- /**
-- * Emitted when images are removed from the model because they are removed in the database
-- */
-- void imageInfosRemoved(const QList<ImageInfo>& infos);
--
--protected Q_SLOTS:
--
-- void slotCollectionImageChange(const CollectionImageChangeset& changeset);
--};
--
--} // namespace Digikam
--
--#endif // IMAGELISTMODEL_H
-diff --git a/libs/models/imagemodel.cpp b/libs/models/imagemodel.cpp
-deleted file mode 100644
-index 41b43cf..0000000
---- a/libs/models/imagemodel.cpp
-+++ /dev/null
-@@ -1,1368 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#include "imagemodel.h"
--
--// Qt includes
--
--#include <QHash>
--#include <QItemSelection>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "coredbchangesets.h"
--#include "coredbfields.h"
--#include "coredbwatch.h"
--#include "imageinfo.h"
--#include "imageinfolist.h"
--#include "abstractitemdragdrophandler.h"
--
--namespace Digikam
--{
--
--class ImageModel::Private
--{
--public:
--
-- Private()
-- {
-- preprocessor = 0;
-- keepFilePathCache = false;
-- sendRemovalSignals = false;
-- incrementalUpdater = 0;
-- refreshing = false;
-- reAdding = false;
-- incrementalRefreshRequested = false;
-- }
--
-- ImageInfoList infos;
-- QList<QVariant> extraValues;
-- QHash<qlonglong, int> idHash;
--
-- bool keepFilePathCache;
-- QHash<QString, qlonglong> filePathHash;
--
-- bool sendRemovalSignals;
--
-- QObject* preprocessor;
-- bool refreshing;
-- bool reAdding;
-- bool incrementalRefreshRequested;
--
-- DatabaseFields::Set watchFlags;
--
-- class ImageModelIncrementalUpdater* incrementalUpdater;
--
-- ImageInfoList pendingInfos;
-- QList<QVariant> pendingExtraValues;
--
-- inline bool isValid(const QModelIndex& index)
-- {
-- if (!index.isValid())
-- {
-- return false;
-- }
--
-- if (index.row() < 0 || index.row() >= infos.size())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index" << index;
-- return false;
-- }
--
-- return true;
-- }
-- inline bool extraValueValid(const QModelIndex& index)
-- {
-- // we assume isValid() being called before, no duplicate checks
-- if (index.row() >= extraValues.size())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "Invalid index for extraData" << index;
-- return false;
-- }
--
-- return true;
-- }
--};
--
--typedef QPair<int, int> IntPair; // to make foreach macro happy
--typedef QList<IntPair> IntPairList;
--
--class ImageModelIncrementalUpdater
--{
--public:
--
-- explicit ImageModelIncrementalUpdater(ImageModel::Private* d);
--
-- void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void aboutToBeRemovedInModel(const IntPairList& aboutToBeRemoved);
-- QList<IntPair> oldIndexes();
--
-- static QList<IntPair> toContiguousPairs(const QList<int>& ids);
--
--public:
--
-- QHash<qlonglong, int> oldIds;
-- QList<QVariant> oldExtraValues;
-- QList<ImageInfo> newInfos;
-- QList<QVariant> newExtraValues;
-- QList<IntPairList> modelRemovals;
--};
--
--ImageModel::ImageModel(QObject* parent)
-- : QAbstractListModel(parent),
-- d(new Private)
--{
-- connect(CoreDbAccess::databaseWatch(), SIGNAL(imageChange(ImageChangeset)),
-- this, SLOT(slotImageChange(ImageChangeset)));
--
-- connect(CoreDbAccess::databaseWatch(), SIGNAL(imageTagChange(ImageTagChangeset)),
-- this, SLOT(slotImageTagChange(ImageTagChangeset)));
--}
--
--ImageModel::~ImageModel()
--{
-- delete d->incrementalUpdater;
-- delete d;
--}
--
--// ------------ Access methods -------------
--
--void ImageModel::setKeepsFilePathCache(bool keepCache)
--{
-- d->keepFilePathCache = keepCache;
--}
--
--bool ImageModel::keepsFilePathCache() const
--{
-- return d->keepFilePathCache;
--}
--
--bool ImageModel::isEmpty() const
--{
-- return d->infos.isEmpty();
--}
--
--void ImageModel::setWatchFlags(const DatabaseFields::Set& set)
--{
-- d->watchFlags = set;
--}
--
--ImageInfo ImageModel::imageInfo(const QModelIndex& index) const
--{
-- if (!d->isValid(index))
-- {
-- return ImageInfo();
-- }
--
-- return d->infos.at(index.row());
--}
--
--ImageInfo& ImageModel::imageInfoRef(const QModelIndex& index) const
--{
-- return d->infos[index.row()];
--}
--
--qlonglong ImageModel::imageId(const QModelIndex& index) const
--{
-- if (!d->isValid(index))
-- {
-- return 0;
-- }
--
-- return d->infos.at(index.row()).id();
--}
--
--QList<ImageInfo> ImageModel::imageInfos(const QList<QModelIndex>& indexes) const
--{
-- QList<ImageInfo> infos;
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- infos << imageInfo(index);
-- }
--
-- return infos;
--}
--
--QList<qlonglong> ImageModel::imageIds(const QList<QModelIndex>& indexes) const
--{
-- QList<qlonglong> ids;
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- ids << imageId(index);
-- }
--
-- return ids;
--}
--
--ImageInfo ImageModel::imageInfo(int row) const
--{
-- if (row >= d->infos.size())
-- {
-- return ImageInfo();
-- }
--
-- return d->infos.at(row);
--}
--
--ImageInfo& ImageModel::imageInfoRef(int row) const
--{
-- return d->infos[row];
--}
--
--qlonglong ImageModel::imageId(int row) const
--{
-- if (row < 0 || row >= d->infos.size())
-- {
-- return -1;
-- }
--
-- return d->infos.at(row).id();
--}
--
--QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info) const
--{
-- return indexForImageId(info.id());
--}
--
--QModelIndex ImageModel::indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const
--{
-- return indexForImageId(info.id(), extraValue);
--}
--
--QList<QModelIndex> ImageModel::indexesForImageInfo(const ImageInfo& info) const
--{
-- return indexesForImageId(info.id());
--}
--
--QModelIndex ImageModel::indexForImageId(qlonglong id) const
--{
-- int index = d->idHash.value(id, -1);
--
-- if (index != -1)
-- {
-- return createIndex(index, 0);
-- }
--
-- return QModelIndex();
--}
--
--QModelIndex ImageModel::indexForImageId(qlonglong id, const QVariant& extraValue) const
--{
-- if (d->extraValues.isEmpty())
-- return indexForImageId(id);
--
-- QHash<qlonglong, int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- if (d->extraValues.at(it.value()) == extraValue)
-- return createIndex(it.value(), 0);
-- }
--
-- return QModelIndex();
--}
--
--QList<QModelIndex> ImageModel::indexesForImageId(qlonglong id) const
--{
-- QList<QModelIndex> indexes;
-- QHash<qlonglong, int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- indexes << createIndex(it.value(), 0);
-- }
--
-- return indexes;
--}
--
--int ImageModel::numberOfIndexesForImageInfo(const ImageInfo& info) const
--{
-- return numberOfIndexesForImageId(info.id());
--}
--
--int ImageModel::numberOfIndexesForImageId(qlonglong id) const
--{
-- if (d->extraValues.isEmpty())
-- {
-- return 0;
-- }
--
-- int count = 0;
-- QHash<qlonglong,int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- ++count;
-- }
--
-- return count;
--}
--
--// static method
--ImageInfo ImageModel::retrieveImageInfo(const QModelIndex& index)
--{
-- if (!index.isValid())
-- {
-- return ImageInfo();
-- }
--
-- ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-- int row = index.data(ImageModelInternalId).toInt();
--
-- if (!model)
-- {
-- return ImageInfo();
-- }
--
-- return model->imageInfo(row);
--}
--
--// static method
--qlonglong ImageModel::retrieveImageId(const QModelIndex& index)
--{
-- if (!index.isValid())
-- {
-- return 0;
-- }
--
-- ImageModel* const model = index.data(ImageModelPointerRole).value<ImageModel*>();
-- int row = index.data(ImageModelInternalId).toInt();
--
-- if (!model)
-- {
-- return 0;
-- }
--
-- return model->imageId(row);
--}
--
--QModelIndex ImageModel::indexForPath(const QString& filePath) const
--{
-- if (d->keepFilePathCache)
-- {
-- return indexForImageId(d->filePathHash.value(filePath));
-- }
-- else
-- {
-- const int size = d->infos.size();
--
-- for (int i=0; i<size; ++i)
-- {
-- if (d->infos.at(i).filePath() == filePath)
-- {
-- return createIndex(i, 0);
-- }
-- }
-- }
--
-- return QModelIndex();
--}
--
--QList<QModelIndex> ImageModel::indexesForPath(const QString& filePath) const
--{
-- if (d->keepFilePathCache)
-- {
-- return indexesForImageId(d->filePathHash.value(filePath));
-- }
-- else
-- {
-- QList<QModelIndex> indexes;
-- const int size = d->infos.size();
--
-- for (int i=0; i<size; ++i)
-- {
-- if (d->infos.at(i).filePath() == filePath)
-- {
-- indexes << createIndex(i, 0);
-- }
-- }
--
-- return indexes;
-- }
--}
--
--ImageInfo ImageModel::imageInfo(const QString& filePath) const
--{
-- if (d->keepFilePathCache)
-- {
-- qlonglong id = d->filePathHash.value(filePath);
--
-- if (id)
-- {
-- int index = d->idHash.value(id, -1);
--
-- if (index != -1)
-- {
-- return d->infos.at(index);
-- }
-- }
-- }
-- else
-- {
-- foreach(const ImageInfo& info, d->infos)
-- {
-- if (info.filePath() == filePath)
-- {
-- return info;
-- }
-- }
-- }
--
-- return ImageInfo();
--}
--
--QList<ImageInfo> ImageModel::imageInfos(const QString& filePath) const
--{
-- QList<ImageInfo> infos;
--
-- if (d->keepFilePathCache)
-- {
-- qlonglong id = d->filePathHash.value(filePath);
--
-- if (id)
-- {
-- foreach(int index, d->idHash.values(id))
-- {
-- infos << d->infos.at(index);
-- }
-- }
-- }
-- else
-- {
-- foreach(const ImageInfo& info, d->infos)
-- {
-- if (info.filePath() == filePath)
-- {
-- infos << info;
-- }
-- }
-- }
--
-- return infos;
--}
--
--void ImageModel::addImageInfo(const ImageInfo& info)
--{
-- addImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
--}
--
--void ImageModel::addImageInfos(const QList<ImageInfo>& infos)
--{
-- addImageInfos(infos, QList<QVariant>());
--}
--
--void ImageModel::addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- if (d->incrementalUpdater)
-- {
-- d->incrementalUpdater->appendInfos(infos, extraValues);
-- }
-- else
-- {
-- appendInfos(infos, extraValues);
-- }
--}
--
--void ImageModel::addImageInfoSynchronously(const ImageInfo& info)
--{
-- addImageInfosSynchronously(QList<ImageInfo>() << info, QList<QVariant>());
--}
--
--void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos)
--{
-- addImageInfos(infos, QList<QVariant>());
--}
--
--void ImageModel::addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- publiciseInfos(infos, extraValues);
-- emit processAdded(infos, extraValues);
--}
--
--void ImageModel::ensureHasImageInfo(const ImageInfo& info)
--{
-- ensureHasImageInfos(QList<ImageInfo>() << info, QList<QVariant>());
--}
--
--void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos)
--{
-- ensureHasImageInfos(infos, QList<QVariant>());
--}
--
--void ImageModel::ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (extraValues.isEmpty())
-- {
-- if (!d->pendingExtraValues.isEmpty())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-- return;
-- }
-- }
-- else
-- {
-- if (d->pendingInfos.size() != d->pendingExtraValues.size())
-- {
-- qCDebug(DIGIKAM_GENERAL_LOG) << "ExtraValue / No Extra Value mismatch. Ignoring added infos.";
-- return;
-- }
-- }
--
-- d->pendingInfos << infos;
-- d->pendingExtraValues << extraValues;
-- cleanSituationChecks();
--}
--
--void ImageModel::clearImageInfos()
--{
-- d->infos.clear();
-- d->extraValues.clear();
-- d->idHash.clear();
-- d->filePathHash.clear();
-- delete d->incrementalUpdater;
-- d->incrementalUpdater = 0;
-- d->pendingInfos.clear();
-- d->pendingExtraValues.clear();
-- d->refreshing = false;
-- d->reAdding = false;
-- d->incrementalRefreshRequested = false;
--
-- beginResetModel();
-- endResetModel();
--
-- imageInfosCleared();
--}
--
--void ImageModel::setImageInfos(const QList<ImageInfo>& infos)
--{
-- clearImageInfos();
-- addImageInfos(infos);
--}
--
--QList<ImageInfo> ImageModel::imageInfos() const
--{
-- return d->infos;
--}
--
--QList<qlonglong> ImageModel::imageIds() const
--{
-- return d->idHash.keys();
--}
--
--bool ImageModel::hasImage(qlonglong id) const
--{
-- return d->idHash.contains(id);
--}
--
--bool ImageModel::hasImage(const ImageInfo& info) const
--{
-- return d->idHash.contains(info.id());
--}
--
--bool ImageModel::hasImage(const ImageInfo& info, const QVariant& extraValue) const
--{
-- return hasImage(info.id(), extraValue);
--}
--
--bool ImageModel::hasImage(qlonglong id, const QVariant& extraValue) const
--{
-- if (d->extraValues.isEmpty())
-- return hasImage(id);
--
-- QHash<qlonglong, int>::const_iterator it;
--
-- for (it = d->idHash.constFind(id); it != d->idHash.constEnd() && it.key() == id; ++it)
-- {
-- if (d->extraValues.at(it.value()) == extraValue)
-- return true;
-- }
--
-- return false;;
--}
--
--QList<ImageInfo> ImageModel::uniqueImageInfos() const
--{
-- if (d->extraValues.isEmpty())
-- {
-- return d->infos;
-- }
--
-- QList<ImageInfo> uniqueInfos;
-- const int size = d->infos.size();
--
-- for (int i=0; i<size; ++i)
-- {
-- const ImageInfo& info = d->infos.at(i);
--
-- if (d->idHash.value(info.id()) == i)
-- {
-- uniqueInfos << info;
-- }
-- }
--
-- return uniqueInfos;
--}
--
--void ImageModel::emitDataChangedForAll()
--{
-- if (d->infos.isEmpty())
-- {
-- return;
-- }
--
-- QModelIndex first = createIndex(0, 0);
-- QModelIndex last = createIndex(d->infos.size() - 1, 0);
-- emit dataChanged(first, last);
--}
--
--void ImageModel::emitDataChangedForSelection(const QItemSelection& selection)
--{
-- if (!selection.isEmpty())
-- {
-- foreach(const QItemSelectionRange& range, selection)
-- {
-- emit dataChanged(range.topLeft(), range.bottomRight());
-- }
-- }
--}
--
--void ImageModel::ensureHasGroupedImages(const ImageInfo& groupLeader)
--{
-- ensureHasImageInfos(groupLeader.groupedImages());
--}
--
--// ------------ Preprocessing -------------
--
--void ImageModel::setPreprocessor(QObject* preprocessor)
--{
-- unsetPreprocessor(d->preprocessor);
-- d->preprocessor = preprocessor;
--}
--
--void ImageModel::unsetPreprocessor(QObject* preprocessor)
--{
-- if (preprocessor && d->preprocessor == preprocessor)
-- {
-- disconnect(this, SIGNAL(preprocess(QList<ImageInfo>,QList<QVariant>)), 0, 0);
-- disconnect(d->preprocessor, 0, this, SLOT(reAddImageInfos(QList<ImageInfo>,QList<QVariant>)));
-- disconnect(d->preprocessor, 0, this, SLOT(reAddingFinished()));
-- }
--}
--
--void ImageModel::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- if (d->preprocessor)
-- {
-- d->reAdding = true;
-- emit preprocess(infos, extraValues);
-- }
-- else
-- {
-- publiciseInfos(infos, extraValues);
-- }
--}
--
--void ImageModel::appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- // This method does deduplication. It is private because in context of readding or refreshing it is of no use.
--
-- if (extraValues.isEmpty())
-- {
-- QList<ImageInfo> checkedInfos;
--
-- foreach (const ImageInfo& info, infos)
-- {
-- if (!hasImage(info))
-- {
-- checkedInfos << info;
-- }
-- }
--
-- appendInfos(checkedInfos, QList<QVariant>());
-- }
-- else
-- {
-- QList<ImageInfo> checkedInfos;
-- QList<QVariant> checkedExtraValues;
-- const int size = infos.size();
--
-- for (int i=0; i<size; i++)
-- {
-- if (!hasImage(infos[i], extraValues[i]))
-- {
-- checkedInfos << infos[i];
-- checkedExtraValues << extraValues[i];
-- }
-- }
--
-- appendInfos(checkedInfos, checkedExtraValues);
-- }
--}
--
--void ImageModel::reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- // addImageInfos -> appendInfos -> preprocessor -> reAddImageInfos
-- publiciseInfos(infos, extraValues);
--}
--
--void ImageModel::reAddingFinished()
--{
-- d->reAdding = false;
-- cleanSituationChecks();
--}
--
--void ImageModel::startRefresh()
--{
-- d->refreshing = true;
--}
--
--void ImageModel::finishRefresh()
--{
-- d->refreshing = false;
-- cleanSituationChecks();
--}
--
--bool ImageModel::isRefreshing() const
--{
-- return d->refreshing;
--}
--
--void ImageModel::cleanSituationChecks()
--{
-- // For starting an incremental refresh we want a clear situation:
-- // Any remaining batches from non-incremental refreshing subclasses have been received in appendInfos(),
-- // any batches sent to preprocessor for re-adding have been re-added.
-- if (d->refreshing || d->reAdding)
-- {
-- return;
-- }
--
-- if (!d->pendingInfos.isEmpty())
-- {
-- appendInfosChecked(d->pendingInfos, d->pendingExtraValues);
-- d->pendingInfos.clear();
-- d->pendingExtraValues.clear();
-- cleanSituationChecks();
-- return;
-- }
--
-- if (d->incrementalRefreshRequested)
-- {
-- d->incrementalRefreshRequested = false;
-- emit readyForIncrementalRefresh();
-- }
-- else
-- {
-- emit allRefreshingFinished();
-- }
--}
--
--void ImageModel::publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (infos.isEmpty())
-- {
-- return;
-- }
--
-- Q_ASSERT(infos.size() == extraValues.size() || (extraValues.isEmpty() && d->extraValues.isEmpty()));
--
-- emit imageInfosAboutToBeAdded(infos);
-- const int firstNewIndex = d->infos.size();
-- const int lastNewIndex = d->infos.size() + infos.size() - 1;
-- beginInsertRows(QModelIndex(), firstNewIndex, lastNewIndex);
-- d->infos << infos;
-- d->extraValues << extraValues;
--
-- for (int i=firstNewIndex; i<=lastNewIndex; ++i)
-- {
-- const ImageInfo& info = d->infos.at(i);
-- qlonglong id = info.id();
-- d->idHash.insertMulti(id, i);
--
-- if (d->keepFilePathCache)
-- {
-- d->filePathHash[info.filePath()] = id;
-- }
-- }
--
-- endInsertRows();
-- emit imageInfosAdded(infos);
--}
--
--void ImageModel::requestIncrementalRefresh()
--{
-- if (d->reAdding)
-- {
-- d->incrementalRefreshRequested = true;
-- }
-- else
-- {
-- emit readyForIncrementalRefresh();
-- }
--}
--
--bool ImageModel::hasIncrementalRefreshPending() const
--{
-- return d->incrementalRefreshRequested;
--}
--
--void ImageModel::startIncrementalRefresh()
--{
-- delete d->incrementalUpdater;
--
-- d->incrementalUpdater = new ImageModelIncrementalUpdater(d);
--}
--
--void ImageModel::finishIncrementalRefresh()
--{
-- if (!d->incrementalUpdater)
-- {
-- return;
-- }
--
-- // remove old entries
-- QList<QPair<int, int> > pairs = d->incrementalUpdater->oldIndexes();
-- removeRowPairs(pairs);
--
-- // add new indexes
-- appendInfos(d->incrementalUpdater->newInfos, d->incrementalUpdater->newExtraValues);
--
-- delete d->incrementalUpdater;
-- d->incrementalUpdater = 0;
--}
--
--void ImageModel::removeIndex(const QModelIndex& index)
--{
-- removeIndexes(QList<QModelIndex>() << index);
--}
--
--void ImageModel::removeIndexes(const QList<QModelIndex>& indexes)
--{
-- QList<int> listIndexes;
--
-- foreach(const QModelIndex& index, indexes)
-- {
-- if (d->isValid(index))
-- {
-- listIndexes << index.row();
-- }
-- }
--
-- if (listIndexes.isEmpty())
-- {
-- return;
-- }
--
-- removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
--}
--
--void ImageModel::removeImageInfo(const ImageInfo& info)
--{
-- removeImageInfos(QList<ImageInfo>() << info);
--}
--
--void ImageModel::removeImageInfos(const QList<ImageInfo>& infos)
--{
-- QList<int> listIndexes;
--
-- foreach(const ImageInfo& info, infos)
-- {
-- QModelIndex index = indexForImageId(info.id());
--
-- if (index.isValid())
-- {
-- listIndexes << index.row();
-- }
-- }
-- removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
--}
--
--void ImageModel::removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (extraValues.isEmpty())
-- {
-- removeImageInfos(infos);
-- return;
-- }
--
-- QList<int> listIndexes;
--
-- for (int i=0; i<infos.size(); ++i)
-- {
-- QModelIndex index = indexForImageId(infos.at(i).id(), extraValues.at(i));
--
-- if (index.isValid())
-- {
-- listIndexes << index.row();
-- }
-- }
--
-- removeRowPairsWithCheck(ImageModelIncrementalUpdater::toContiguousPairs(listIndexes));
--}
--
--void ImageModel::setSendRemovalSignals(bool send)
--{
-- d->sendRemovalSignals = send;
--}
--
--template <class List, typename T>
--static bool pairsContain(const List& list, T value)
--{
-- typename List::const_iterator middle;
-- typename List::const_iterator begin = list.begin();
-- typename List::const_iterator end = list.end();
-- int n = int(end - begin);
-- int half;
--
-- while (n > 0)
-- {
-- half = n >> 1;
-- middle = begin + half;
--
-- if (middle->first <= value && middle->second >= value)
-- {
-- return true;
-- }
-- else if (middle->second < value)
-- {
-- begin = middle + 1;
-- n -= half + 1;
-- }
-- else
-- {
-- n = half;
-- }
-- }
--
-- return false;
--}
--
--void ImageModel::removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove)
--{
-- if (d->incrementalUpdater)
-- {
-- d->incrementalUpdater->aboutToBeRemovedInModel(toRemove);
-- }
--
-- removeRowPairs(toRemove);
--}
--
--void ImageModel::removeRowPairs(const QList<QPair<int, int> >& toRemove)
--{
-- if (toRemove.isEmpty())
-- {
-- return;
-- }
--
-- // Remove old indexes
-- // Keep in mind that when calling beginRemoveRows all structures announced to be removed
-- // must still be valid, and this includes our hashes as well, which limits what we can optimize
--
-- int removedRows = 0, offset = 0;
-- typedef QPair<int, int> IntPair; // to make foreach macro happy
--
-- foreach(const IntPair& pair, toRemove)
-- {
-- const int begin = pair.first - offset;
-- const int end = pair.second - offset; // inclusive
-- removedRows = end - begin + 1;
--
-- // when removing from the list, all subsequent indexes are affected
-- offset += removedRows;
--
-- QList<ImageInfo> removedInfos;
--
-- if (d->sendRemovalSignals)
-- {
-- qCopy(d->infos.begin() + begin, d->infos.begin() + end, removedInfos.begin());
-- emit imageInfosAboutToBeRemoved(removedInfos);
-- }
--
-- imageInfosAboutToBeRemoved(begin, end);
-- beginRemoveRows(QModelIndex(), begin, end);
--
-- // update idHash - which points to indexes of d->infos, and these change now!
-- QHash<qlonglong, int>::iterator it;
--
-- for (it = d->idHash.begin(); it != d->idHash.end(); )
-- {
-- if (it.value() >= begin)
-- {
-- if (it.value() > end)
-- {
-- // after the removed interval: adjust index
-- it.value() -= removedRows;
-- }
-- else
-- {
-- // in the removed interval
-- it = d->idHash.erase(it);
-- continue;
-- }
-- }
--
-- ++it;
-- }
--
-- // remove from list
-- d->infos.erase(d->infos.begin() + begin, d->infos.begin() + (end + 1));
--
-- if (!d->extraValues.isEmpty())
-- {
-- d->extraValues.erase(d->extraValues.begin() + begin, d->extraValues.begin() + (end + 1));
-- }
--
-- endRemoveRows();
--
-- if (d->sendRemovalSignals)
-- {
-- emit imageInfosRemoved(removedInfos);
-- }
-- }
--
-- // tidy up: remove old indexes from file path hash now
-- if (d->keepFilePathCache)
-- {
-- QHash<QString, qlonglong>::iterator it;
--
-- for (it = d->filePathHash.begin(); it != d->filePathHash.end(); )
-- {
-- if (pairsContain(toRemove, it.value()))
-- {
-- it = d->filePathHash.erase(it);
-- }
-- else
-- {
-- ++it;
-- }
-- }
-- }
--}
--
--ImageModelIncrementalUpdater::ImageModelIncrementalUpdater(ImageModel::Private* d)
--{
-- oldIds = d->idHash;
-- oldExtraValues = d->extraValues;
--}
--
--void ImageModelIncrementalUpdater::appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues)
--{
-- if (extraValues.isEmpty())
-- {
-- foreach(const ImageInfo& info, infos)
-- {
-- QHash<qlonglong,int>::iterator it = oldIds.find(info.id());
--
-- if (it != oldIds.end())
-- {
-- oldIds.erase(it);
-- }
-- else
-- {
-- newInfos << info;
-- }
-- }
-- }
-- else
-- {
-- for (int i=0; i<infos.size(); ++i)
-- {
-- const ImageInfo& info = infos.at(i);
-- bool found = false;
-- QHash<qlonglong,int>::iterator it;
--
-- for (it = oldIds.find(info.id()); it != oldIds.end() && it.key() == info.id(); ++it)
-- {
-- // first check is for bug #262596. Not sure if needed.
-- if (it.value() < oldExtraValues.size() && extraValues.at(i) == oldExtraValues.at(it.value()))
-- {
-- found = true;
-- break;
-- }
-- }
--
-- if (found)
-- {
-- oldIds.erase(it);
-- // do not erase from oldExtraValues - oldIds is a hash id -> index.
-- }
-- else
-- {
-- newInfos << info;
-- newExtraValues << extraValues.at(i);
-- }
-- }
-- }
--}
--
--void ImageModelIncrementalUpdater::aboutToBeRemovedInModel(const IntPairList& toRemove)
--{
-- modelRemovals << toRemove;
--}
--
--QList<QPair<int, int> > ImageModelIncrementalUpdater::oldIndexes()
--{
-- // first, apply all changes to indexes by direct removal in model
-- // while the updater was active
-- foreach(const IntPairList& list, modelRemovals)
-- {
-- int removedRows = 0, offset = 0;
--
-- foreach(const IntPair& pair, list)
-- {
-- const int begin = pair.first - offset;
-- const int end = pair.second - offset; // inclusive
-- removedRows = end - begin + 1;
--
-- // when removing from the list, all subsequent indexes are affected
-- offset += removedRows;
--
-- // update idHash - which points to indexes of d->infos, and these change now!
-- QHash<qlonglong, int>::iterator it;
--
-- for (it = oldIds.begin(); it != oldIds.end(); )
-- {
-- if (it.value() >= begin)
-- {
-- if (it.value() > end)
-- {
-- // after the removed interval: adjust index
-- it.value() -= removedRows;
-- }
-- else
-- {
-- // in the removed interval
-- it = oldIds.erase(it);
-- continue;
-- }
-- }
--
-- ++it;
-- }
-- }
-- }
--
-- modelRemovals.clear();
--
-- return toContiguousPairs(oldIds.values());
--}
--
--QList<QPair<int, int> > ImageModelIncrementalUpdater::toContiguousPairs(const QList<int>& unsorted)
--{
-- // Take the given indices and return them as contiguous pairs [begin, end]
--
-- QList<QPair<int, int> > pairs;
--
-- if (unsorted.isEmpty())
-- {
-- return pairs;
-- }
--
-- QList<int> indices(unsorted);
-- qSort(indices);
--
-- QPair<int, int> pair(indices.first(), indices.first());
--
-- for (int i=1; i<indices.size(); ++i)
-- {
-- const int &index = indices.at(i);
--
-- if (index == pair.second + 1)
-- {
-- pair.second = index;
-- continue;
-- }
--
-- pairs << pair; // insert last pair
-- pair.first = index;
-- pair.second = index;
-- }
--
-- pairs << pair;
--
-- return pairs;
--}
--
--// ------------ QAbstractItemModel implementation -------------
--
--QVariant ImageModel::data(const QModelIndex& index, int role) const
--{
-- if (!d->isValid(index))
-- {
-- return QVariant();
-- }
--
-- switch (role)
-- {
-- case Qt::DisplayRole:
-- case Qt::ToolTipRole:
-- return d->infos.at(index.row()).name();
--
-- case ImageModelPointerRole:
-- return QVariant::fromValue(const_cast<ImageModel*>(this));
--
-- case ImageModelInternalId:
-- return index.row();
--
-- case CreationDateRole:
-- return d->infos.at(index.row()).dateTime();
--
-- case ExtraDataRole:
--
-- if (d->extraValueValid(index))
-- {
-- return d->extraValues.at(index.row());
-- }
-- else
-- {
-- return QVariant();
-- }
--
-- case ExtraDataDuplicateCount:
-- {
-- qlonglong id = d->infos.at(index.row()).id();
-- return numberOfIndexesForImageId(id);
-- }
-- }
--
-- return QVariant();
--}
--
--QVariant ImageModel::headerData(int section, Qt::Orientation orientation, int role) const
--{
-- Q_UNUSED(section)
-- Q_UNUSED(orientation)
-- Q_UNUSED(role)
-- return QVariant();
--}
--
--int ImageModel::rowCount(const QModelIndex& parent) const
--{
-- if (parent.isValid())
-- {
-- return 0;
-- }
--
-- return d->infos.size();
--}
--
--Qt::ItemFlags ImageModel::flags(const QModelIndex& index) const
--{
-- if (!d->isValid(index))
-- {
-- return 0;
-- }
--
-- Qt::ItemFlags f = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
--
-- f |= dragDropFlags(index);
--
-- return f;
--}
--
--QModelIndex ImageModel::index(int row, int column, const QModelIndex& parent) const
--{
-- if (column != 0 || row < 0 || parent.isValid() || row >= d->infos.size())
-- {
-- return QModelIndex();
-- }
--
-- return createIndex(row, 0);
--}
--
--// ------------ Database watch -------------
--
--void ImageModel::slotImageChange(const ImageChangeset& changeset)
--{
-- if (d->infos.isEmpty())
-- {
-- return;
-- }
--
-- if (d->watchFlags & changeset.changes())
-- {
-- QItemSelection items;
--
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- QModelIndex index = indexForImageId(id);
--
-- if (index.isValid())
-- {
-- items.select(index, index);
-- }
-- }
--
-- if (!items.isEmpty())
-- {
-- emitDataChangedForSelection(items);
-- emit imageChange(changeset, items);
-- }
-- }
--}
--
--void ImageModel::slotImageTagChange(const ImageTagChangeset& changeset)
--{
-- if (d->infos.isEmpty())
-- {
-- return;
-- }
--
-- QItemSelection items;
--
-- foreach(const qlonglong& id, changeset.ids())
-- {
-- QModelIndex index = indexForImageId(id);
--
-- if (index.isValid())
-- {
-- items.select(index, index);
-- }
-- }
--
-- if (!items.isEmpty())
-- {
-- emitDataChangedForSelection(items);
-- emit imageTagChange(changeset, items);
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagemodel.h b/libs/models/imagemodel.h
-deleted file mode 100644
-index dcf94c2..0000000
---- a/libs/models/imagemodel.h
-+++ /dev/null
-@@ -1,364 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEMODEL_H
--#define IMAGEMODEL_H
--
--// Qt includes
--
--#include <QAbstractListModel>
--
--// Local includes
--
--#include "dragdropimplementations.h"
--#include "imageinfo.h"
--#include "digikam_export.h"
--
--class QItemSelection;
--
--namespace Digikam
--{
--
--class ImageChangeset;
--class ImageTagChangeset;
--
--namespace DatabaseFields
--{
--class Set;
--}
--
--class DIGIKAM_DATABASE_EXPORT ImageModel : public QAbstractListModel, public DragDropModelImplementation
--{
-- Q_OBJECT
--
--public:
--
-- enum ImageModelRoles
-- {
-- /// An ImageModel* pointer to this model
-- ImageModelPointerRole = Qt::UserRole,
-- ImageModelInternalId = Qt::UserRole + 1,
-- /// Returns a thumbnail pixmap. May be implemented by subclasses.
-- /// Returns either a valid pixmap or a null QVariant.
-- ThumbnailRole = Qt::UserRole + 2,
-- /// Returns a QDateTime with the creation date
-- CreationDateRole = Qt::UserRole + 3,
-- /// Return (optional) extraData field
-- ExtraDataRole = Qt::UserRole + 5,
-- /// Returns the number of duplicate indexes for the same image id
-- ExtraDataDuplicateCount = Qt::UserRole + 6,
--
-- // Roles which are defined here but not implemented by ImageModel
-- /// Returns position of item in Left Light Table preview.
-- LTLeftPanelRole = Qt::UserRole + 50,
-- /// Returns position of item in Right Light Table preview.
-- LTRightPanelRole = Qt::UserRole + 51,
--
-- // For use by subclasses
-- SubclassRoles = Qt::UserRole + 100,
-- // For use by filter models
-- FilterModelRoles = Qt::UserRole + 500
-- };
--
--public:
--
-- explicit ImageModel(QObject* parent = 0);
-- ~ImageModel();
--
-- /** If a cache is kept, lookup by file path is fast,
-- * without a cache it is O(n). Default is false.
-- */
-- void setKeepsFilePathCache(bool keepCache);
-- bool keepsFilePathCache() const;
--
-- /** Set a set of database fields to watch.
-- * If either of these is changed, dataChanged() will be emitted.
-- * Default is no flag (no signal will be emitted).
-- */
-- void setWatchFlags(const DatabaseFields::Set& set);
--
-- /** Returns the ImageInfo object, reference or image id from the underlying data
-- * pointed to by the index.
-- * If the index is not valid, imageInfo will return a null ImageInfo, imageId will
-- * return 0, imageInfoRef must not be called with an invalid index.
-- */
-- ImageInfo imageInfo(const QModelIndex& index) const;
-- ImageInfo& imageInfoRef(const QModelIndex& index) const;
-- qlonglong imageId(const QModelIndex& index) const;
-- QList<ImageInfo> imageInfos(const QList<QModelIndex>& indexes) const;
-- QList<qlonglong> imageIds(const QList<QModelIndex>& indexes) const;
--
-- /** Returns the ImageInfo object, reference or image id from the underlying data
-- * of the given row (parent is the invalid QModelIndex, column is 0).
-- * Note that imageInfoRef will crash if index is invalid.
-- */
-- ImageInfo imageInfo(int row) const;
-- ImageInfo& imageInfoRef(int row) const;
-- qlonglong imageId(int row) const;
--
-- /** Return the index for the given ImageInfo or id, if contained in this model.
-- */
-- QModelIndex indexForImageInfo(const ImageInfo& info) const;
-- QModelIndex indexForImageInfo(const ImageInfo& info, const QVariant& extraValue) const;
-- QModelIndex indexForImageId(qlonglong id) const;
-- QModelIndex indexForImageId(qlonglong id, const QVariant& extraValue) const;
-- QList<QModelIndex> indexesForImageInfo(const ImageInfo& info) const;
-- QList<QModelIndex> indexesForImageId(qlonglong id) const;
--
-- int numberOfIndexesForImageInfo(const ImageInfo& info) const;
-- int numberOfIndexesForImageId(qlonglong id) const;
--
-- /** Returns the index or ImageInfo object from the underlying data
-- * for the given file path. This is fast if keepsFilePathCache is enabled.
-- * The file path is as returned by ImageInfo.filePath().
-- * In case of multiple occurrences of the same file, the simpler variants return
-- * any one found first, use the QList methods to retrieve all occurrences.
-- */
-- QModelIndex indexForPath(const QString& filePath) const;
-- ImageInfo imageInfo(const QString& filePath) const;
-- QList<QModelIndex> indexesForPath(const QString& filePath) const;
-- QList<ImageInfo> imageInfos(const QString& filePath) const;
--
-- /** Main entry point for subclasses adding image infos to the model.
-- * If you list entries not unique per image id, you must add an extraValue
-- * so that every entry is unique by imageId and extraValues.
-- * Please note that these methods do not prevent addition of duplicate entries.
-- */
-- void addImageInfo(const ImageInfo& info);
-- void addImageInfos(const QList<ImageInfo>& infos);
-- void addImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /** Clears image infos and resets model.
-- */
-- void clearImageInfos();
--
-- /** Clears and adds the infos.
-- */
-- void setImageInfos(const QList<ImageInfo>& infos);
--
-- /**
-- * Directly remove the given indexes or infos from the model.
-- */
-- void removeIndex(const QModelIndex& indexes);
-- void removeIndexes(const QList<QModelIndex>& indexes);
-- void removeImageInfo(const ImageInfo& info);
-- void removeImageInfos(const QList<ImageInfo>& infos);
-- void removeImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /**
-- * addImageInfo() is asynchronous if a prepocessor is set.
-- * This method first adds the info, synchronously.
-- * Only afterwards, the preprocessor will have the opportunity to process it.
-- * This method also bypasses any incremental updates.
-- * Please note that these methods do not prevent addition of duplicate entries.
-- */
-- void addImageInfoSynchronously(const ImageInfo& info);
-- void addImageInfosSynchronously(const QList<ImageInfo>& infos);
-- void addImageInfosSynchronously(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /**
-- * Add the given entries. Method returns immediately, the
-- * addition may happen later asynchronously.
-- * These methods prevent the addition of duplicate entries.
-- */
-- void ensureHasImageInfo(const ImageInfo& info);
-- void ensureHasImageInfos(const QList<ImageInfo>& infos);
-- void ensureHasImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
--
-- /**
-- * Ensure that all images grouped on the given leader are contained in the model.
-- */
-- void ensureHasGroupedImages(const ImageInfo& groupLeader);
--
-- QList<ImageInfo> imageInfos() const;
-- QList<qlonglong> imageIds() const;
-- QList<ImageInfo> uniqueImageInfos() const;
--
-- bool hasImage(qlonglong id) const;
-- bool hasImage(const ImageInfo& info) const;
-- bool hasImage(const ImageInfo& info, const QVariant& extraValue) const;
-- bool hasImage(qlonglong id, const QVariant& extraValue) const;
--
-- bool isEmpty() const;
--
-- // Drag and Drop
-- DECLARE_MODEL_DRAG_DROP_METHODS
--
-- /**
-- * Install an object as a preprocessor for ImageInfos added to this model.
-- * For every QList of ImageInfos added to addImageInfo, the signal preprocess()
-- * will be emitted. The preprocessor may process the items and shall then readd
-- * them by calling reAddImageInfos(). It may take some time to process.
-- * It shall discard any held infos when the modelReset() signal is sent.
-- * It shall call readdFinished() when no reset occurred and all infos on the way have been readded.
-- * This means that only after calling this method, you shall make three connections
-- * (preprocess -> your slot, your signal -> reAddImageInfos, your signal -> reAddingFinished)
-- * and make or already hold a connection modelReset() -> your slot.
-- * There is only one preprocessor at a time, a previously set object will be disconnected.
-- */
-- void setPreprocessor(QObject* processor);
-- void unsetPreprocessor(QObject* processor);
--
-- /**
-- * Returns true if this model is currently refreshing.
-- * For a preprocessor this means that, although the preprocessor may currently have
-- * processed all it got, more batches are to be expected.
-- */
-- bool isRefreshing() const;
--
-- /**
-- * Enable sending of imageInfosAboutToBeRemoved and imageInfosRemoved signals.
-- * Default: false
-- */
-- void setSendRemovalSignals(bool send);
--
-- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-- virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
-- virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
-- virtual Qt::ItemFlags flags(const QModelIndex& index) const;
-- virtual QModelIndex index(int row, int column = 0, const QModelIndex& parent = QModelIndex()) const;
--
-- /** Retrieves the imageInfo object from the data() method of the given index.
-- * The index may be from a QSortFilterProxyModel as long as an ImageModel is at the end. */
-- static ImageInfo retrieveImageInfo(const QModelIndex& index);
-- static qlonglong retrieveImageId(const QModelIndex& index);
--
--Q_SIGNALS:
--
-- /** Informs that ImageInfos will be added to the model.
-- * This signal is sent before the model data is changed and views are informed.
-- */
-- void imageInfosAboutToBeAdded(const QList<ImageInfo>& infos);
--
-- /** Informs that ImageInfos have been added to the model.
-- * This signal is sent after the model data is changed and views are informed.
-- */
-- void imageInfosAdded(const QList<ImageInfo>& infos);
--
-- /** Informs that ImageInfos will be removed from the model.
-- * This signal is sent before the model data is changed and views are informed.
-- * Note: You need to explicitly enable sending of this signal. It is not sent
-- * in clearImageInfos().
-- */
-- void imageInfosAboutToBeRemoved(const QList<ImageInfo>& infos);
--
-- /** Informs that ImageInfos have been removed from the model.
-- * This signal is sent after the model data is changed and views are informed. *
-- * Note: You need to explicitly enable sending of this signal. It is not sent
-- * in clearImageInfos().
-- */
-- void imageInfosRemoved(const QList<ImageInfo>& infos);
--
-- /** Connect to this signal only if you are the current preprocessor.
-- */
-- void preprocess(const QList<ImageInfo>& infos, const QList<QVariant>&);
-- void processAdded(const QList<ImageInfo>& infos, const QList<QVariant>&);
--
-- /** If an ImageChangeset affected indexes of this model with changes as set in watchFlags(),
-- * this signal contains the changeset and the affected indexes.
-- */
-- void imageChange(const ImageChangeset&, const QItemSelection&);
--
-- /** If an ImageTagChangeset affected indexes of this model,
-- * this signal contains the changeset and the affected indexes.
-- */
-- void imageTagChange(const ImageTagChangeset&, const QItemSelection&);
--
-- /** Signals that the model is right now ready to start an incremental refresh.
-- * This is guaranteed only for the scope of emitting this signal.
-- */
-- void readyForIncrementalRefresh();
--
-- /** Signals that the model has finished currently with all scheduled
-- * refreshing, full or incremental, and all preprocessing.
-- * The model is in polished, clean situation right now.
-- */
-- void allRefreshingFinished();
--
--public Q_SLOTS:
--
-- void reAddImageInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void reAddingFinished();
--
--protected:
--
-- /** Subclasses that add ImageInfos in batches shall call startRefresh()
-- * when they start sending batches and finishRefresh() when they have finished.
-- * No incremental refreshes will be started while listing.
-- * A clearImageInfos() always stops listing, calling finishRefresh() is then not necessary.
-- */
-- void startRefresh();
-- void finishRefresh();
--
-- /** As soon as the model is ready to start an incremental refresh, the signal
-- * readyForIncrementalRefresh() will be emitted. The signal will be emitted inline
-- * if the model is ready right now.
-- */
-- void requestIncrementalRefresh();
-- bool hasIncrementalRefreshPending() const;
--
-- /** Starts an incremental refresh operation. You shall only call this method from a slot
-- * connected to readyForIncrementalRefresh(). To initiate an incremental refresh,
-- * call requestIncrementalRefresh().
-- */
-- void startIncrementalRefresh();
-- void finishIncrementalRefresh();
--
-- void emitDataChangedForAll();
-- void emitDataChangedForSelection(const QItemSelection& selection);
--
-- // Called when the internal storage is cleared
-- virtual void imageInfosCleared() {};
--
-- // Called before rowsAboutToBeRemoved
-- virtual void imageInfosAboutToBeRemoved(int /*begin*/, int /*end*/) {};
--
--protected Q_SLOTS:
--
-- virtual void slotImageChange(const ImageChangeset& changeset);
-- virtual void slotImageTagChange(const ImageTagChangeset& changeset);
--
--private:
--
-- void appendInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void appendInfosChecked(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void publiciseInfos(const QList<ImageInfo>& infos, const QList<QVariant>& extraValues);
-- void cleanSituationChecks();
-- void removeRowPairsWithCheck(const QList<QPair<int, int> >& toRemove);
-- void removeRowPairs(const QList<QPair<int, int> >& toRemove);
--
--public:
--
-- // Declared public because it's used in ImageModelIncrementalUpdater class
-- class Private;
--
--private:
--
-- Private* const d;
--};
--
--} // namespace Digikam
--
--Q_DECLARE_METATYPE(Digikam::ImageModel*)
--
--#endif // IMAGEMODEL_H
-diff --git a/libs/models/imagesortsettings.cpp b/libs/models/imagesortsettings.cpp
-deleted file mode 100644
-index 39ee6e1..0000000
---- a/libs/models/imagesortsettings.cpp
-+++ /dev/null
-@@ -1,400 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Filter values for use with ImageFilterModel
-- *
-- * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2014 by Mohamed Anwer <m dot anwer at gmx dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imagesortsettings.h"
--
--// Qt includes
--
--#include <QDateTime>
--#include <QRectF>
--
--// Local includes
--
--#include "coredbfields.h"
--#include "imageinfo.h"
--
--namespace Digikam
--{
--
--ImageSortSettings::ImageSortSettings()
--{
-- categorizationMode = NoCategories;
-- categorizationSortOrder = DefaultOrder;
-- categorizationCaseSensitivity = Qt::CaseSensitive;
-- sortRole = SortByFileName;
-- sortOrder = DefaultOrder;
-- strTypeNatural = true;
-- sortCaseSensitivity = Qt::CaseSensitive;
-- currentCategorizationSortOrder = Qt::AscendingOrder;
-- currentSortOrder = Qt::AscendingOrder;
--}
--
--bool ImageSortSettings::operator==(const ImageSortSettings& other) const
--{
-- return
-- categorizationMode == other.categorizationMode &&
-- categorizationSortOrder == other.categorizationSortOrder &&
-- categorizationCaseSensitivity == other.categorizationCaseSensitivity &&
-- sortRole == other.sortRole &&
-- sortOrder == other.sortOrder &&
-- sortCaseSensitivity == other.sortCaseSensitivity;
--}
--
--void ImageSortSettings::setCategorizationMode(CategorizationMode mode)
--{
-- categorizationMode = mode;
--
-- if (categorizationSortOrder == DefaultOrder)
-- {
-- currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-- }
--}
--
--void ImageSortSettings::setCategorizationSortOrder(SortOrder order)
--{
-- categorizationSortOrder = order;
--
-- if (categorizationSortOrder == DefaultOrder)
-- {
-- currentCategorizationSortOrder = defaultSortOrderForCategorizationMode(categorizationMode);
-- }
-- else
-- {
-- currentCategorizationSortOrder = (Qt::SortOrder)categorizationSortOrder;
-- }
--}
--
--void ImageSortSettings::setSortRole(SortRole role)
--{
-- sortRole = role;
--
-- if (sortOrder == DefaultOrder)
-- {
-- currentSortOrder = defaultSortOrderForSortRole(sortRole);
-- }
--}
--
--void ImageSortSettings::setSortOrder(SortOrder order)
--{
-- sortOrder = order;
--
-- if (sortOrder == DefaultOrder)
-- {
-- currentSortOrder = defaultSortOrderForSortRole(sortRole);
-- }
-- else
-- {
-- currentSortOrder = (Qt::SortOrder)order;
-- }
--}
--
--void ImageSortSettings::setStringTypeNatural(bool natural)
--{
-- strTypeNatural = natural;
--}
--
--Qt::SortOrder ImageSortSettings::defaultSortOrderForCategorizationMode(CategorizationMode mode)
--{
-- switch (mode)
-- {
-- case NoCategories:
-- case OneCategory:
-- case CategoryByAlbum:
-- case CategoryByFormat:
-- default:
-- return Qt::AscendingOrder;
-- }
--}
--
--Qt::SortOrder ImageSortSettings::defaultSortOrderForSortRole(SortRole role)
--{
-- switch (role)
-- {
-- case SortByFileName:
-- case SortByFilePath:
-- return Qt::AscendingOrder;
-- case SortByFileSize:
-- return Qt::DescendingOrder;
-- case SortByModificationDate:
-- case SortByCreationDate:
-- return Qt::AscendingOrder;
-- case SortByRating:
-- case SortByImageSize:
-- return Qt::DescendingOrder;
-- case SortByAspectRatio:
-- return Qt::DescendingOrder;
-- case SortBySimilarity:
-- return Qt::DescendingOrder;
-- default:
-- return Qt::AscendingOrder;
-- }
--}
--
--int ImageSortSettings::compareCategories(const ImageInfo& left, const ImageInfo& right) const
--{
-- switch (categorizationMode)
-- {
-- case NoCategories:
-- case OneCategory:
-- return 0;
-- case CategoryByAlbum:
-- {
-- int leftAlbum = left.albumId();
-- int rightAlbum = right.albumId();
--
-- // return comparation result
-- if (leftAlbum == rightAlbum)
-- {
-- return 0;
-- }
-- else if (lessThanByOrder(leftAlbum, rightAlbum, currentCategorizationSortOrder))
-- {
-- return -1;
-- }
-- else
-- {
-- return 1;
-- }
-- }
-- case CategoryByFormat:
-- {
-- return naturalCompare(left.format(), right.format(),
-- currentCategorizationSortOrder, categorizationCaseSensitivity, strTypeNatural);
-- }
-- default:
-- return 0;
-- }
--}
--
--bool ImageSortSettings::lessThan(const ImageInfo& left, const ImageInfo& right) const
--{
-- int result = compare(left, right, sortRole);
--
-- if (result != 0)
-- {
-- return result < 0;
-- }
--
-- // are they identical?
-- if (left == right)
-- {
-- return false;
-- }
--
-- // If left and right equal for first sort order, use a hierarchy of all sort orders
-- if ( (result = compare(left, right, SortByFileName)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByCreationDate)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByModificationDate)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByFilePath)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortByFileSize)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ( (result = compare(left, right, SortBySimilarity)) != 0)
-- {
-- return result < 0;
-- }
--
-- return false;
--}
--
--int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right) const
--{
-- return compare(left, right, sortRole);
--}
--
--int ImageSortSettings::compare(const ImageInfo& left, const ImageInfo& right, SortRole role) const
--{
-- switch (role)
-- {
-- case SortByFileName:
-- {
-- bool versioning = (left.name().contains(QLatin1String("_v"), Qt::CaseInsensitive) ||
-- right.name().contains(QLatin1String("_v"), Qt::CaseInsensitive));
-- return naturalCompare(left.name(), right.name(), currentSortOrder, sortCaseSensitivity, strTypeNatural, versioning);
-- }
-- case SortByFilePath:
-- return naturalCompare(left.filePath(), right.filePath(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-- case SortByFileSize:
-- return compareByOrder(left.fileSize(), right.fileSize(), currentSortOrder);
-- case SortByModificationDate:
-- return compareByOrder(left.modDateTime(), right.modDateTime(), currentSortOrder);
-- case SortByCreationDate:
-- return compareByOrder(left.dateTime(), right.dateTime(), currentSortOrder);
-- case SortByRating:
-- // I have the feeling that inverting the sort order for rating is the natural order
-- return - compareByOrder(left.rating(), right.rating(), currentSortOrder);
-- case SortByImageSize:
-- {
-- QSize leftSize = left.dimensions();
-- QSize rightSize = right.dimensions();
-- int leftPixels = leftSize.width() * leftSize.height();
-- int rightPixels = rightSize.width() * rightSize.height();
-- return compareByOrder(leftPixels, rightPixels, currentSortOrder);
-- }
-- case SortByAspectRatio:
-- {
-- QSize leftSize = left.dimensions();
-- QSize rightSize = right.dimensions();
-- int leftAR = (double(leftSize.width()) / double(leftSize.height())) * 1000000;
-- int rightAR = (double(rightSize.width()) / double(rightSize.height())) * 1000000;
-- return compareByOrder(leftAR, rightAR, currentSortOrder);
-- }
-- case SortBySimilarity:
-- {
-- qlonglong leftReferenceImageId = left.currentReferenceImage();
-- qlonglong rightReferenceImageId = right.currentReferenceImage();
-- // make sure that the original image has always the highest similarity.
-- double leftSimilarity = left.id() == leftReferenceImageId ? 1.1 : left.currentSimilarity();
-- double rightSimilarity = right.id() == rightReferenceImageId ? 1.1 : right.currentSimilarity();
-- return compareByOrder(leftSimilarity, rightSimilarity, currentSortOrder);
-- }
-- default:
-- return 1;
-- }
--}
--
--bool ImageSortSettings::lessThan(const QVariant& left, const QVariant& right) const
--{
-- if (left.type() != right.type())
-- {
-- return false;
-- }
--
-- switch (left.type())
-- {
-- case QVariant::Int:
-- return compareByOrder(left.toInt(), right.toInt(), currentSortOrder);
-- case QVariant::UInt:
-- return compareByOrder(left.toUInt(), right.toUInt(), currentSortOrder);
-- case QVariant::LongLong:
-- return compareByOrder(left.toLongLong(), right.toLongLong(), currentSortOrder);
-- case QVariant::ULongLong:
-- return compareByOrder(left.toULongLong(), right.toULongLong(), currentSortOrder);
-- case QVariant::Double:
-- return compareByOrder(left.toDouble(), right.toDouble(), currentSortOrder);
-- case QVariant::Date:
-- return compareByOrder(left.toDate(), right.toDate(), currentSortOrder);
-- case QVariant::DateTime:
-- return compareByOrder(left.toDateTime(), right.toDateTime(), currentSortOrder);
-- case QVariant::Time:
-- return compareByOrder(left.toTime(), right.toTime(), currentSortOrder);
-- case QVariant::Rect:
-- case QVariant::RectF:
-- {
-- QRectF rectLeft = left.toRectF();
-- QRectF rectRight = right.toRectF();
-- int result;
--
-- if ((result = compareByOrder(rectLeft.top(), rectRight.top(), currentSortOrder)) != 0)
-- {
-- return result < 0;
-- }
--
-- if ((result = compareByOrder(rectLeft.left(), rectRight.left(), currentSortOrder)) != 0)
-- {
-- return result < 0;
-- }
--
-- QSizeF sizeLeft = rectLeft.size(), sizeRight = rectRight.size();
--
-- if ((result = compareByOrder(sizeLeft.width()*sizeLeft.height(), sizeRight.width()*sizeRight.height(), currentSortOrder)) != 0)
-- {
-- return result < 0;
-- }
-- // FIXME: fall through?? If not, add "break" here
-- }
-- default:
-- return naturalCompare(left.toString(), right.toString(), currentSortOrder, sortCaseSensitivity, strTypeNatural);
-- }
--}
--
--DatabaseFields::Set ImageSortSettings::watchFlags() const
--{
-- DatabaseFields::Set set;
--
-- switch (sortRole)
-- {
-- case SortByFileName:
-- set |= DatabaseFields::Name;
-- break;
-- case SortByFilePath:
-- set |= DatabaseFields::Name;
-- break;
-- case SortByFileSize:
-- set |= DatabaseFields::FileSize;
-- break;
-- case SortByModificationDate:
-- set |= DatabaseFields::ModificationDate;
-- break;
-- case SortByCreationDate:
-- set |= DatabaseFields::CreationDate;
-- break;
-- case SortByRating:
-- set |= DatabaseFields::Rating;
-- break;
-- case SortByImageSize:
-- set |= DatabaseFields::Width | DatabaseFields::Height;
-- break;
-- case SortByAspectRatio:
-- set |= DatabaseFields::Width | DatabaseFields::Height;
-- break;
-- case SortBySimilarity:
-- // TODO: Not sure what to do here....
-- set |= DatabaseFields::Name;
-- break;
-- }
--
-- switch (categorizationMode)
-- {
-- case NoCategories:
-- case OneCategory:
-- case CategoryByAlbum:
-- break;
-- case CategoryByFormat:
-- set |= DatabaseFields::Format;
-- break;
-- }
--
-- return set;
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagesortsettings.h b/libs/models/imagesortsettings.h
-deleted file mode 100644
-index 2a5fd8c..0000000
---- a/libs/models/imagesortsettings.h
-+++ /dev/null
-@@ -1,225 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-05-31
-- * Description : Sort settings for use with ImageFilterModel
-- *
-- * Copyright (C) 2009 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- *
-- * 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, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGESORTSETTINGS_H
--#define IMAGESORTSETTINGS_H
--
--// Qt includes
--
--#include <QHash>
--#include <QList>
--#include <QMap>
--#include <QString>
--#include <QCollator>
--
--// Local includes
--
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class ImageInfo;
--
--namespace DatabaseFields
--{
-- class Set;
--}
--
--class DIGIKAM_DATABASE_EXPORT ImageSortSettings
--{
--public:
--
-- ImageSortSettings();
--
-- bool operator==(const ImageSortSettings& other) const;
--
-- /** Compares the categories of left and right.
-- * Return -1 if left is less than right, 0 if both fall in the same category,
-- * and 1 if left is greater than right.
-- * Adheres to set categorization mode and current category sort order.
-- */
-- int compareCategories(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Returns true if left is less than right.
-- * Adheres to current sort role and sort order.
-- */
-- bool lessThan(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Compares the ImageInfos left and right.
-- * Return -1 if left is less than right, 1 if left is greater than right,
-- * and 0 if left equals right comparing the current sort role's value.
-- * Adheres to set sort role and sort order.
-- */
-- int compare(const ImageInfo& left, const ImageInfo& right) const;
--
-- /** Returns true if left QVariant is less than right.
-- * Adheres to current sort role and sort order.
-- * Use for extraValue, if necessary.
-- */
-- bool lessThan(const QVariant& left, const QVariant& right) const;
--
-- enum SortOrder
-- {
-- AscendingOrder = Qt::AscendingOrder,
-- DescendingOrder = Qt::DescendingOrder,
-- DefaultOrder /// sort order depends on the chosen sort role
-- };
--
-- /// --- Categories ---
--
-- enum CategorizationMode
-- {
-- NoCategories, /// categorization switched off
-- OneCategory, /// all items in one global category
-- CategoryByAlbum,
-- CategoryByFormat
-- };
--
-- CategorizationMode categorizationMode;
-- SortOrder categorizationSortOrder;
--
-- void setCategorizationMode(CategorizationMode mode);
-- void setCategorizationSortOrder(SortOrder order);
--
-- /// Only Ascending or Descending, never DefaultOrder
-- Qt::SortOrder currentCategorizationSortOrder;
-- Qt::CaseSensitivity categorizationCaseSensitivity;
--
-- bool isCategorized() const { return categorizationMode >= CategoryByAlbum; }
--
-- /// --- Image Sorting ---
--
-- enum SortRole
-- {
-- // Note: For legacy reasons, the order of the first five entries must remain unchanged
-- SortByFileName,
-- SortByFilePath,
-- SortByCreationDate,
-- SortByFileSize,
-- SortByRating,
-- SortByModificationDate,
-- SortByImageSize, // pixel number
-- SortByAspectRatio, // width / height * 100000
-- SortBySimilarity
-- };
--
-- SortRole sortRole;
-- SortOrder sortOrder;
-- bool strTypeNatural;
--
-- void setSortRole(SortRole role);
-- void setSortOrder(SortOrder order);
-- void setStringTypeNatural(bool natural);
--
-- Qt::SortOrder currentSortOrder;
-- Qt::CaseSensitivity sortCaseSensitivity;
--
-- int compare(const ImageInfo& left, const ImageInfo& right, SortRole sortRole) const;
--
-- // --- ---
--
-- static Qt::SortOrder defaultSortOrderForCategorizationMode(CategorizationMode mode);
-- static Qt::SortOrder defaultSortOrderForSortRole(SortRole role);
--
-- /// --- Change notification ---
--
-- /** Returns database fields a change in which would affect the current sorting.
-- */
-- DatabaseFields::Set watchFlags() const;
--
-- /// --- Utilities ---
--
-- /** Returns a < b if sortOrder is Ascending, or b < a if order is descending.
-- */
-- template <typename T>
-- static inline bool lessThanByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-- {
-- if (sortOrder == Qt::AscendingOrder)
-- {
-- return a < b;
-- }
-- else
-- {
-- return b < a;
-- }
-- }
--
-- /** Returns the usual compare result of -1, 0, or 1 for lessThan, equals and greaterThan.
-- */
-- template <typename T>
-- static inline int compareValue(const T& a, const T& b)
-- {
-- if (a == b)
-- {
-- return 0;
-- }
--
-- if (a < b)
-- {
-- return -1;
-- }
-- else
-- {
-- return 1;
-- }
-- }
--
-- /** Takes a typical result from a compare method (0 is equal, -1 is less than, 1 is greater than)
-- * and applies the given sort order to it.
-- */
-- static inline int compareByOrder(int compareResult, Qt::SortOrder sortOrder)
-- {
-- if (sortOrder == Qt::AscendingOrder)
-- {
-- return compareResult;
-- }
-- else
-- {
-- return - compareResult;
-- }
-- }
--
-- template <typename T>
-- static inline int compareByOrder(const T& a, const T& b, Qt::SortOrder sortOrder)
-- {
-- return compareByOrder(compareValue(a, b), sortOrder);
-- }
--
-- /** Compares the two string by natural comparison and adheres to given sort order
-- */
-- static inline int naturalCompare(const QString& a, const QString& b, Qt::SortOrder sortOrder,
-- Qt::CaseSensitivity caseSensitive = Qt::CaseSensitive,
-- bool natural = true, bool versioning = false)
-- {
-- QCollator collator;
-- collator.setNumericMode(natural);
-- collator.setIgnorePunctuation(versioning);
-- collator.setCaseSensitivity(caseSensitive);
-- return (compareByOrder(collator.compare(a, b), sortOrder));
-- }
--};
--
--} // namespace Digikam
--
--#endif // IMAGESORTSETTINGS_H
-diff --git a/libs/models/imagethumbnailmodel.cpp b/libs/models/imagethumbnailmodel.cpp
-deleted file mode 100644
-index b7f5661..0000000
---- a/libs/models/imagethumbnailmodel.cpp
-+++ /dev/null
-@@ -1,323 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries with support for thumbnail loading
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011-2017 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imagethumbnailmodel.h"
--
--// Qt includes
--
--#include <QHash>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "thumbnailloadthread.h"
--#include "digikam_export.h"
--#include "digikam_globals.h"
--
--namespace Digikam
--{
--
--class ImageThumbnailModel::ImageThumbnailModelPriv
--{
--public:
--
-- ImageThumbnailModelPriv() :
-- thread(0),
-- preloadThread(0),
-- thumbSize(0),
-- lastGlobalThumbSize(0),
-- preloadThumbSize(0),
-- emitDataChanged(true)
-- {
-- staticListContainingThumbnailRole << ImageModel::ThumbnailRole;
-- }
--
-- ThumbnailLoadThread* thread;
-- ThumbnailLoadThread* preloadThread;
-- ThumbnailSize thumbSize;
-- ThumbnailSize lastGlobalThumbSize;
-- ThumbnailSize preloadThumbSize;
-- QRect detailRect;
-- QVector<int> staticListContainingThumbnailRole;
--
-- bool emitDataChanged;
--
-- int preloadThumbnailSize() const
-- {
-- if (preloadThumbSize.size())
-- {
-- return preloadThumbSize.size();
-- }
--
-- return thumbSize.size();
-- }
--};
--
--ImageThumbnailModel::ImageThumbnailModel(QObject* parent)
-- : ImageModel(parent), d(new ImageThumbnailModelPriv)
--{
-- setKeepsFilePathCache(true);
--}
--
--ImageThumbnailModel::~ImageThumbnailModel()
--{
-- delete d->preloadThread;
-- delete d;
--}
--
--void ImageThumbnailModel::setThumbnailLoadThread(ThumbnailLoadThread* thread)
--{
-- d->thread = thread;
--
-- connect(d->thread, SIGNAL(signalThumbnailLoaded(LoadingDescription,QPixmap)),
-- this, SLOT(slotThumbnailLoaded(LoadingDescription,QPixmap)));
--}
--
--ThumbnailLoadThread* ImageThumbnailModel::thumbnailLoadThread() const
--{
-- return d->thread;
--}
--
--ThumbnailSize ImageThumbnailModel::thumbnailSize() const
--{
-- return d->thumbSize;
--}
--
--void ImageThumbnailModel::setThumbnailSize(const ThumbnailSize& size)
--{
-- d->lastGlobalThumbSize = size;
-- d->thumbSize = size;
--}
--
--void ImageThumbnailModel::setPreloadThumbnailSize(const ThumbnailSize& size)
--{
-- d->preloadThumbSize = size;
--}
--
--void ImageThumbnailModel::setEmitDataChanged(bool emitSignal)
--{
-- d->emitDataChanged = emitSignal;
--}
--
--void ImageThumbnailModel::setPreloadThumbnails(bool preload)
--{
-- if (preload)
-- {
-- if (!d->preloadThread)
-- {
-- d->preloadThread = new ThumbnailLoadThread;
-- d->preloadThread->setPixmapRequested(false);
-- d->preloadThread->setPriority(QThread::LowestPriority);
-- }
--
-- connect(this, SIGNAL(allRefreshingFinished()),
-- this, SLOT(preloadAllThumbnails()));
-- }
-- else
-- {
-- delete d->preloadThread;
-- d->preloadThread = 0;
-- disconnect(this, SIGNAL(allRefreshingFinished()),
-- this, SLOT(preloadAllThumbnails()));
-- }
--}
--
--void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare)
--{
-- prepareThumbnails(indexesToPrepare, d->thumbSize);
--}
--
--void ImageThumbnailModel::prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize)
--{
-- if (!d->thread)
-- {
-- return;
-- }
--
-- QList<ThumbnailIdentifier> ids;
-- foreach(const QModelIndex& index, indexesToPrepare)
-- {
-- ids << imageInfoRef(index).thumbnailIdentifier();
-- }
-- d->thread->findGroup(ids, thumbSize.size());
--}
--
--void ImageThumbnailModel::preloadThumbnails(const QList<ImageInfo>& infos)
--{
-- if (!d->preloadThread)
-- {
-- return;
-- }
--
-- QList<ThumbnailIdentifier> ids;
-- foreach(const ImageInfo& info, infos)
-- {
-- ids << info.thumbnailIdentifier();
-- }
-- d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
--}
--
--void ImageThumbnailModel::preloadThumbnails(const QList<QModelIndex>& indexesToPreload)
--{
-- if (!d->preloadThread)
-- {
-- return;
-- }
--
-- QList<ThumbnailIdentifier> ids;
-- foreach(const QModelIndex& index, indexesToPreload)
-- {
-- ids << imageInfoRef(index).thumbnailIdentifier();
-- }
-- d->preloadThread->stopAllTasks();
-- d->preloadThread->pregenerateGroup(ids, d->preloadThumbnailSize());
--}
--
--void ImageThumbnailModel::preloadAllThumbnails()
--{
-- preloadThumbnails(imageInfos());
--}
--
--void ImageThumbnailModel::imageInfosCleared()
--{
-- if (d->preloadThread)
-- {
-- d->preloadThread->stopAllTasks();
-- }
--}
--
--QVariant ImageThumbnailModel::data(const QModelIndex& index, int role) const
--{
-- if (role == ThumbnailRole && d->thread && index.isValid())
-- {
-- QPixmap thumbnail;
-- ImageInfo info = imageInfo(index);
-- QString path = info.filePath();
--
-- if (info.isNull())
-- {
-- return QVariant(QVariant::Pixmap);
-- }
--
-- if (!d->detailRect.isNull())
-- {
-- if (d->thread->find(info.thumbnailIdentifier(), d->detailRect, thumbnail, d->thumbSize.size()))
-- {
-- return thumbnail;
-- }
-- }
-- else
-- {
-- if (d->thread->find(info.thumbnailIdentifier(), thumbnail, d->thumbSize.size()))
-- {
-- return thumbnail;
-- }
-- }
--
-- return QVariant(QVariant::Pixmap);
-- }
--
-- return ImageModel::data(index, role);
--}
--
--bool ImageThumbnailModel::setData(const QModelIndex& index, const QVariant& value, int role)
--{
-- if (role == ThumbnailRole)
-- {
-- switch (value.type())
-- {
-- case QVariant::Invalid:
-- d->thumbSize = d->lastGlobalThumbSize;
-- d->detailRect = QRect();
-- break;
--
-- case QVariant::Int:
--
-- if (value.isNull())
-- {
-- d->thumbSize = d->lastGlobalThumbSize;
-- }
-- else
-- {
-- d->thumbSize = value.toInt();
-- }
-- break;
--
-- case QVariant::Rect:
--
-- if (value.isNull())
-- {
-- d->detailRect = QRect();
-- }
-- else
-- {
-- d->detailRect = value.toRect();
-- }
-- break;
--
-- default:
-- break;
-- }
-- }
--
-- return ImageModel::setData(index, value, role);
--}
--
--void ImageThumbnailModel::slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb)
--{
-- if (thumb.isNull())
-- {
-- return;
-- }
--
-- // In case of multiple occurrence, we currently do not know which thumbnail is this. Signal change on all.
-- QModelIndexList indexes;
-- ThumbnailIdentifier thumbId = loadingDescription.thumbnailIdentifier();
-- if (thumbId.filePath.isEmpty())
-- {
-- indexes = indexesForImageId(thumbId.id);
-- }
-- else
-- {
-- indexes = indexesForPath(thumbId.filePath);
-- }
-- foreach(const QModelIndex& index, indexes)
-- {
-- if (thumb.isNull())
-- {
-- emit thumbnailFailed(index, loadingDescription.previewParameters.size);
-- }
-- else
-- {
-- emit thumbnailAvailable(index, loadingDescription.previewParameters.size);
--
-- if (d->emitDataChanged)
-- {
-- emit dataChanged(index, index, d->staticListContainingThumbnailRole);
-- }
-- }
-- }
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imagethumbnailmodel.h b/libs/models/imagethumbnailmodel.h
-deleted file mode 100644
-index 366ca65..0000000
---- a/libs/models/imagethumbnailmodel.h
-+++ /dev/null
-@@ -1,140 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2009-03-05
-- * Description : Qt item model for database entries with support for thumbnail loading
-- *
-- * Copyright (C) 2009-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
-- * Copyright (C) 2011 by Gilles Caulier <caulier dot gilles at gmail dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGETHUMBNAILMODEL_H
--#define IMAGETHUMBNAILMODEL_H
--
--// Local includes
--
--#include "imagemodel.h"
--#include "thumbnailsize.h"
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class LoadingDescription;
--class ThumbnailLoadThread;
--
--class DIGIKAM_DATABASE_EXPORT ImageThumbnailModel : public ImageModel
--{
-- Q_OBJECT
--
--public:
--
-- /**
-- * An ImageModel that supports thumbnail loading.
-- * You need to set a ThumbnailLoadThread to enable thumbnail loading.
-- * Adjust the thumbnail size to your needs.
-- * Note that setKeepsFilePathCache is enabled per default.
-- */
-- explicit ImageThumbnailModel(QObject* parent);
-- ~ImageThumbnailModel();
--
-- /** Enable thumbnail loading and set the thread that shall be used.
-- * The thumbnail size of this thread will be adjusted.
-- */
-- void setThumbnailLoadThread(ThumbnailLoadThread* thread);
-- ThumbnailLoadThread* thumbnailLoadThread() const;
--
-- /// Set the thumbnail size to use
-- void setThumbnailSize(const ThumbnailSize& thumbSize);
--
-- /// If you want to fix a size for preloading, do it here.
-- void setPreloadThumbnailSize(const ThumbnailSize& thumbSize);
--
-- void setExifRotate(bool rotate);
--
-- /**
-- * Enable emitting dataChanged() when a thumbnail becomes available.
-- * The thumbnailAvailable() signal will be emitted in any case.
-- * Default is true.
-- */
-- void setEmitDataChanged(bool emitSignal);
--
-- /**
-- * Enable preloading of thumbnails:
-- * If preloading is enabled, for every entry in the model a thumbnail generation is started.
-- * Default: false.
-- */
-- void setPreloadThumbnails(bool preload);
--
-- ThumbnailSize thumbnailSize() const;
--
-- /**
-- * Handles the ThumbnailRole.
-- * If the pixmap is available, returns it in the QVariant.
-- * If it still needs to be loaded, returns a null QVariant and emits
-- * thumbnailAvailable() as soon as it is available.
-- */
-- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
--
-- /**
-- * You can override the current thumbnail size by giving an integer value for ThumbnailRole.
-- * Set a null QVariant to use the thumbnail size set by setThumbnailSize() again.
-- * The index given here is ignored for this purpose.
-- */
-- virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::DisplayRole);
--
--public Q_SLOTS:
--
-- /** Prepare the thumbnail loading for the given indexes
-- */
-- void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare);
-- void prepareThumbnails(const QList<QModelIndex>& indexesToPrepare, const ThumbnailSize& thumbSize);
--
-- /**
-- * Preload thumbnail for the given infos resp. indexes.
-- * Note: Use setPreloadThumbnails to automatically preload all entries in the model.
-- * Note: This only ensures thumbnail generation. It is not guaranteed that pixmaps
-- * are stored in the cache. For thumbnails that are expect to be drawn immediately,
-- * include them in prepareThumbnails().
-- * Note: Stops preloading of previously added thumbnails.
-- */
-- void preloadThumbnails(const QList<ImageInfo>&);
-- void preloadThumbnails(const QList<QModelIndex>&);
-- void preloadAllThumbnails();
--
--Q_SIGNALS:
--
-- void thumbnailAvailable(const QModelIndex& index, int requestedSize);
-- void thumbnailFailed(const QModelIndex& index, int requestedSize);
--
--protected:
--
-- virtual void imageInfosCleared();
--
--protected Q_SLOTS:
--
-- void slotThumbnailLoaded(const LoadingDescription& loadingDescription, const QPixmap& thumb);
--
--private:
--
-- class ImageThumbnailModelPriv;
-- ImageThumbnailModelPriv* const d;
--};
--
--} // namespace Digikam
--
--#endif /* IMAGETHUMBNAILMODEL_H */
-diff --git a/libs/models/imageversionsmodel.cpp b/libs/models/imageversionsmodel.cpp
-deleted file mode 100644
-index e6ba582..0000000
---- a/libs/models/imageversionsmodel.cpp
-+++ /dev/null
-@@ -1,183 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-07-13
-- * Description : Model for image versions
-- *
-- * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#include "imageversionsmodel.h"
--
--// KDE includes
--
--#include <klocalizedstring.h>
--
--// Local includes
--
--#include "digikam_debug.h"
--#include "workingwidget.h"
--
--namespace Digikam
--{
--
--class ImageVersionsModel::Private
--{
--public:
--
-- Private()
-- {
-- data = 0;
-- paintTree = false;
-- }
--
-- ///Complete paths with filenames and tree level
-- QList<QPair<QString, int> >* data;
-- ///This is for delegate to paint it as selected
-- QString currentSelectedImage;
-- ///If true, the delegate will paint items as a tree
-- ///if false, it will be painted as a list
-- bool paintTree;
--};
--
--ImageVersionsModel::ImageVersionsModel(QObject* parent)
-- : QAbstractListModel(parent),
-- d(new Private)
--{
-- d->data = new QList<QPair<QString, int> >;
--}
--
--ImageVersionsModel::~ImageVersionsModel()
--{
-- //qDeleteAll(d->data);
-- delete d;
--}
--
--Qt::ItemFlags ImageVersionsModel::flags(const QModelIndex& index) const
--{
-- if (!index.isValid())
-- {
-- return 0;
-- }
--
-- return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
--}
--
--QVariant ImageVersionsModel::data(const QModelIndex& index, int role) const
--{
-- if (!index.isValid())
-- {
-- return QVariant();
-- }
--
-- if (role == Qt::DisplayRole && !d->data->isEmpty())
-- {
-- return d->data->at(index.row()).first;
-- }
-- else if (role == Qt::UserRole && !d->data->isEmpty())
-- {
-- return d->data->at(index.row()).second;
-- }
-- else if (role == Qt::DisplayRole && d->data->isEmpty())
-- {
-- //TODO: make this text Italic
-- return QVariant(QString(i18n("No image selected")));
-- }
--
-- return QVariant();
--}
--
--int ImageVersionsModel::rowCount(const QModelIndex& parent) const
--{
-- Q_UNUSED(parent)
-- return d->data->count();
--}
--
--void ImageVersionsModel::setupModelData(QList<QPair<QString, int> >& data)
--{
-- beginResetModel();
--
-- d->data->clear();
--
-- if (!data.isEmpty())
-- {
-- d->data->append(data);
-- }
-- else
-- {
-- d->data->append(qMakePair(QString(i18n("This is the original image")), 0));
-- }
--
-- endResetModel();
--}
--
--void ImageVersionsModel::clearModelData()
--{
-- beginResetModel();
--
-- if (!d->data->isEmpty())
-- {
-- d->data->clear();
-- }
--
-- endResetModel();
--}
--
--void ImageVersionsModel::slotAnimationStep()
--{
-- emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, 1));
--}
--
--QString ImageVersionsModel::currentSelectedImage() const
--{
-- return d->currentSelectedImage;
--}
--
--void ImageVersionsModel::setCurrentSelectedImage(const QString& path)
--{
-- d->currentSelectedImage = path;
--}
--
--QModelIndex ImageVersionsModel::currentSelectedImageIndex() const
--{
-- return index(listIndexOf(d->currentSelectedImage), 0);
--}
--
--bool ImageVersionsModel::paintTree() const
--{
-- return d->paintTree;
--}
--
--void ImageVersionsModel::setPaintTree(bool paint)
--{
-- d->paintTree = paint;
--}
--
--int ImageVersionsModel::listIndexOf(const QString& item) const
--{
-- for (int i = 0; i < d->data->size(); ++i)
-- {
-- if (d->data->at(i).first == item)
-- {
-- return i;
-- }
-- }
--
-- return -1;
--}
--
--} // namespace Digikam
-diff --git a/libs/models/imageversionsmodel.h b/libs/models/imageversionsmodel.h
-deleted file mode 100644
-index ed08529..0000000
---- a/libs/models/imageversionsmodel.h
-+++ /dev/null
-@@ -1,75 +0,0 @@
--/* ============================================================
-- *
-- * This file is a part of digiKam project
-- * http://www.digikam.org
-- *
-- * Date : 2010-07-13
-- * Description : Model for image versions
-- *
-- * Copyright (C) 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
-- *
-- * This program is free software; you can redistribute it
-- * and/or modify it under the terms of the GNU General
-- * Public License as published by the Free Software Foundation;
-- * either version 2, 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.
-- *
-- * ============================================================ */
--
--#ifndef IMAGEVERSIONSMODEL_H
--#define IMAGEVERSIONSMODEL_H
--
--// Qt includes
--
--#include <QModelIndex>
--#include <QPixmap>
--
--// Local includes
--
--#include "digikam_export.h"
--
--namespace Digikam
--{
--
--class DIGIKAM_DATABASE_EXPORT ImageVersionsModel : public QAbstractListModel
--{
-- Q_OBJECT
--
--public:
--
-- explicit ImageVersionsModel(QObject* parent = 0);
-- ~ImageVersionsModel();
--
-- Qt::ItemFlags flags(const QModelIndex& index) const;
-- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
-- int rowCount(const QModelIndex& parent = QModelIndex()) const;
--
-- void setupModelData(QList<QPair<QString, int> >& data);
-- void clearModelData();
--
-- QString currentSelectedImage() const;
-- void setCurrentSelectedImage(const QString& path);
-- QModelIndex currentSelectedImageIndex() const;
--
-- bool paintTree() const;
-- int listIndexOf(const QString& item) const;
--
--public Q_SLOTS:
--
-- void slotAnimationStep();
-- void setPaintTree(bool paint);
--
--private:
--
-- class Private;
-- Private* const d;
--};
--
--} // namespace Digikam
--
--#endif // IMAGEVERSIONSMODEL_H
---
-cgit v0.11.2
-
diff --git a/kde/patch/digikam/digikam_imagemagick7.patch b/kde/patch/digikam/digikam_imagemagick7.patch
deleted file mode 100644
index 04a7752..0000000
--- a/kde/patch/digikam/digikam_imagemagick7.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From: Antonio Rojas <arojas@archlinux.org>
-Date: Thu, 7 Nov 2019 09:25:02 +0100
-Subject: Properly initialize ExceptionInfo in libMagick
-
-Otherwise it will crash if some plugins can't be loaded.
-
-diff --git a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp
-index 1858b4d..20ef01b 100644
---- a/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp
-+++ b/core/dplugins/dimg/imagemagick/dimgimagemagickplugin.cpp
-@@ -125,7 +125,7 @@ QMap<QString, QString> DImgImageMagickPlugin::extraAboutData() const
- QString mimes = typeMimes();
-
- QMap<QString, QString> map;
-- ExceptionInfo ex;
-+ ExceptionInfo ex = *AcquireExceptionInfo();
- size_t n = 0;
- const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex);
-
-@@ -219,7 +219,7 @@ int DImgImageMagickPlugin::canRead(const QFileInfo& fileInfo, bool magic) const
- int DImgImageMagickPlugin::canWrite(const QString& format) const
- {
- QStringList formats;
-- ExceptionInfo ex;
-+ ExceptionInfo ex = *AcquireExceptionInfo();
- size_t n = 0;
- const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex);
-
-@@ -266,7 +266,7 @@ DImgLoader* DImgImageMagickPlugin::loader(DImg* const image, const DRawDecoding&
- QStringList DImgImageMagickPlugin::decoderFormats() const
- {
- QStringList formats;
-- ExceptionInfo ex;
-+ ExceptionInfo ex = *AcquireExceptionInfo();
- size_t n = 0;
- const MagickInfo** inflst = GetMagickInfoList("*", &n, &ex);
-
---
-cgit v1.1
-
diff --git a/kde/patch/dolphin.patch b/kde/patch/dolphin.patch
index dfe3a2f..02a7950 100644
--- a/kde/patch/dolphin.patch
+++ b/kde/patch/dolphin.patch
@@ -1,3 +1,2 @@
# Let the user decide whether she wants to run Dolphin as root:
cat $CWD/patch/dolphin/dolphin_revert_noroot.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/falkon.patch b/kde/patch/falkon.patch
new file mode 100644
index 0000000..27a4668
--- /dev/null
+++ b/kde/patch/falkon.patch
@@ -0,0 +1,2 @@
+# Fix build against Qt 5.15:
+cat $CWD/patch/falkon/falkon.qt-5.15.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/falkon/falkon.qt-5.15.diff b/kde/patch/falkon/falkon.qt-5.15.diff
new file mode 100644
index 0000000..60f1699
--- /dev/null
+++ b/kde/patch/falkon/falkon.qt-5.15.diff
@@ -0,0 +1,20 @@
+--- ./src/lib/tools/qztools.cpp.orig 2019-03-19 13:06:45.000000000 -0500
++++ ./src/lib/tools/qztools.cpp 2020-07-18 15:00:08.881313780 -0500
+@@ -25,6 +25,7 @@
+ #include <QByteArray>
+ #include <QPixmap>
+ #include <QPainter>
++#include <QPainterPath>
+ #include <QBuffer>
+ #include <QFile>
+ #include <QDir>
+--- ./src/plugins/VerticalTabs/verticaltabsplugin.cpp.orig 2019-03-19 13:06:45.000000000 -0500
++++ ./src/plugins/VerticalTabs/verticaltabsplugin.cpp 2020-07-18 15:03:16.468303404 -0500
+@@ -31,6 +31,7 @@
+ #include "desktopfile.h"
+
+ #include <QSettings>
++#include <QFile>
+
+ VerticalTabsPlugin::VerticalTabsPlugin()
+ : QObject()
diff --git a/kde/patch/gwenview.patch b/kde/patch/gwenview.patch
deleted file mode 100644
index 04dfe50..0000000
--- a/kde/patch/gwenview.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Prevent dataloss when importing pictures;
-# Will be fixed in 17.04.2:
-#cat $CWD/patch/gwenview/gwenview-17.04.1_dataloss.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/gwenview/gwenview-17.04.1_dataloss.patch b/kde/patch/gwenview/gwenview-17.04.1_dataloss.patch
deleted file mode 100644
index fa93428..0000000
--- a/kde/patch/gwenview/gwenview-17.04.1_dataloss.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-From 6ce5d2f8d82f83c5a3d726ee5807ebaf7a6e3c6c Mon Sep 17 00:00:00 2001
-From: Henrik Fehlauer <rkflx@lab12.net>
-Date: Thu, 11 May 2017 22:40:15 +0200
-Subject: Avoid data loss when importing pictures
-
-Summary:
-Fix porting regressions, which left users of Gwenview Importer with:
-- failed import (import destination still empty)
-- additionally (when choosing "Delete" instead of "Keep" after import):
- pictures also removed from import source, with no way to recover
-
-Correct additional problems remaining after fixing the import failure:
-- hang on duplicate filenames
-- identically named files with different content are never imported
-- error dialog when deleting pictures from import source
-
-BUG: 379615
-
-In detail:
-
-1st problem (introduced in 017b4fe5dc7f4b6e876cfd7b108dcebbf609ae94):
-
- Initially, pictures are copied to a temporary folder
- (e.g. "foo/.gwenview_importer-IcQqvo/"), before being moved/renamed
- to the final destination (e.g. "foo/"), which is determined by
- calling "cd .." on the temporary folder.
-
- However, mistakenly this path contains a superfluous '/'
- (e.g. "foo/.gwenview_importer-IcQqvo//"), resulting in the final
- destination reading "foo/.gwenview_importer-IcQqvo/" instead of
- "foo/". On cleanup, the temporary folder is removed, simultaneously
- deleting all new pictures.
-
- Fix: Omit '/' where appropriate.
-
-2nd problem (broken by a3262e9b197ee97323ef8bf3a9dca1e13f61a74c):
-
- When trying to find a unique filename, the while loop "stat"ing the
- file repeats forever.
-
- Fix: Call "KIO::stat" and "KJobWidgets::setWindow"
- also inside the loop.
-
-3rd problem (introduced in 017b4fe5dc7f4b6e876cfd7b108dcebbf609ae94):
-
- If the destination directory already contains an identically named
- file, we try to find a different name by appending a number. For
- this, we need to strip the old filename from the full path.
- Unfortunately, only calling "path()" is incorrect, giving
- "foo/pict0001.jpg/pict0001_1.jpg", rather than "foo/pict0001_1.jpg".
-
- Fix: Use "adjusted(QUrl::RemoveFilename)".
-
-4th problem (broken by a3262e9b197ee97323ef8bf3a9dca1e13f61a74c):
-
- Although deletion works, we show a warning dialog stating failure.
-
- Fix: Invert the logic of "job->exec()", as the error handling should
- be skipped by "break"ing out of the while loop.
-
-Test Plan:
-Steps to reproduce (see https://bugs.kde.org/show_bug.cgi?id=379615) no longer result in data loss.
-
-Autotests for importer (separate review request in D5750) pass. Hopefully, this helps catching any future porting regressions.
-
-Reviewers: ltoscano, sandsmark, gateau
-
-Reviewed By: ltoscano
-
-Differential Revision: https://phabricator.kde.org/D5749
----
- importer/fileutils.cpp | 5 ++++-
- importer/importdialog.cpp | 2 +-
- importer/importer.cpp | 4 ++--
- 3 files changed, 7 insertions(+), 4 deletions(-)
-
-diff --git a/importer/fileutils.cpp b/importer/fileutils.cpp
-index 5293d56..a51a18c 100644
---- a/importer/fileutils.cpp
-+++ b/importer/fileutils.cpp
-@@ -128,7 +128,10 @@ RenameResult rename(const QUrl& src, const QUrl& dst_, QWidget* authWindow)
- }
- result = RenamedUnderNewName;
-
-- dst.setPath(dst.path() + '/' + prefix + QString::number(count) + suffix);
-+ dst.setPath(dst.adjusted(QUrl::RemoveFilename).path() + prefix + QString::number(count) + suffix);
-+ statJob = KIO::stat(dst);
-+ KJobWidgets::setWindow(statJob, authWindow);
-+
- ++count;
- }
-
-diff --git a/importer/importdialog.cpp b/importer/importdialog.cpp
-index ee6f7cd..5e9e847 100644
---- a/importer/importdialog.cpp
-+++ b/importer/importdialog.cpp
-@@ -121,7 +121,7 @@ public:
- QList<QUrl> urls = importedUrls + skippedUrls;
- while (true) {
- KIO::Job* job = KIO::del(urls);
-- if (!job->exec()) {
-+ if (job->exec()) {
- break;
- }
- // Deleting failed
-diff --git a/importer/importer.cpp b/importer/importer.cpp
-index 51c4b96..a7e1d4e 100644
---- a/importer/importer.cpp
-+++ b/importer/importer.cpp
-@@ -98,7 +98,7 @@ struct ImporterPrivate
- }
- mCurrentUrl = mUrlList.takeFirst();
- QUrl dst = mTempImportDirUrl;
-- dst.setPath(dst.path() + '/' + mCurrentUrl.fileName());
-+ dst.setPath(dst.path() + mCurrentUrl.fileName());
- KIO::Job* job = KIO::copy(mCurrentUrl, dst, KIO::HideProgressInfo);
- KJobWidgets::setWindow(job, mAuthWindow);
- QObject::connect(job, SIGNAL(result(KJob*)),
-@@ -122,7 +122,7 @@ struct ImporterPrivate
- } else {
- fileName = src.fileName();
- }
-- dst.setPath(dst.path() + '/' + fileName);
-+ dst.setPath(dst.path() + fileName);
-
- FileUtils::RenameResult result = FileUtils::rename(src, dst, mAuthWindow);
- switch (result) {
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/kaccounts-integration.patch b/kde/patch/kaccounts-integration.patch
deleted file mode 100644
index 26b87d4..0000000
--- a/kde/patch/kaccounts-integration.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# A bug with 15.08.2/.3 breaks KDE Telepathy accounts connection .
-# Will be fixed in 15.12.0:
-#cat $CWD/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch b/kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch
deleted file mode 100644
index e41d58b..0000000
--- a/kde/patch/kaccounts-integration/kaccounts-integration-15.08.3_service.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/src/jobs/createaccount.cpp
-+++ b/src/jobs/createaccount.cpp
-@@ -141,8 +141,8 @@
-
- m_done = true;
-
-+ connect(m_identity, &SignOn::Identity::credentialsStored, m_identity, &SignOn::Identity::queryInfo);
- m_identity->storeCredentials();
-- connect(m_identity, &SignOn::Identity::credentialsStored, m_identity, &SignOn::Identity::queryInfo);
- }
-
- void CreateAccount::pluginError(const QString &error)
-@@ -177,12 +177,12 @@
- return;
- }
-
-+ m_account->selectService();
-+
- if (m_account->displayName().isEmpty()) {
- m_account->setDisplayName(info.userName());
- }
- m_account->setValue("username", info.userName());
--
-- m_account->selectService();
- m_account->setCredentialsId(info.id());
-
- Accounts::AuthData authData = m_accInfo->authData();
-
diff --git a/kde/patch/kalgebra.patch b/kde/patch/kalgebra.patch
index 8365ff3..d17f482 100644
--- a/kde/patch/kalgebra.patch
+++ b/kde/patch/kalgebra.patch
@@ -2,4 +2,3 @@
# on other, it's not, requiring you to link both Curses and Readline libraries
# manually.
cat $CWD/patch/kalgebra/kalgebra_ncurses_linking.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kalzium.patch b/kde/patch/kalzium.patch
deleted file mode 100644
index 6593e9d..0000000
--- a/kde/patch/kalzium.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix build against KF 5.31.0 (repaired in 16.12.3):
-#cat $CWD/patch/kalzium/kalzium_kf_5.31.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kalzium/kalzium_kf_5.31.patch b/kde/patch/kalzium/kalzium_kf_5.31.patch
deleted file mode 100644
index a3d4e00..0000000
--- a/kde/patch/kalzium/kalzium_kf_5.31.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-Patch taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/plain/kde-apps/kalzium/files/kalzium-16.12.2-kf-5.31.patch
-
-From f233d458959548ab371e3faeca7313f746625afc Mon Sep 17 00:00:00 2001
-From: Heiko Becker <heirecka@exherbo.org>
-Date: Sun, 22 Jan 2017 14:46:24 +0100
-Subject: Fix build with extra-cmake-modules > 5.30
-
-Since a5f3a76e14799c68b5e8f74e375baa5f6f6ab4dc in
-extra-cmake-modules.git -fno-operator-names is passed to the build
-(when supported), causing a build error for kalzium.
-
-REVIEW: 129873
----
- src/calculator/titrationCalculator.cpp | 39 +++++++++++++++-------------------
- 1 file changed, 17 insertions(+), 22 deletions(-)
-
-diff --git a/src/calculator/titrationCalculator.cpp b/src/calculator/titrationCalculator.cpp
-index 44ea152..6ea9ac9 100644
---- a/src/calculator/titrationCalculator.cpp
-+++ b/src/calculator/titrationCalculator.cpp
-@@ -41,11 +41,6 @@
-
- using namespace std;
-
--#ifdef _MSC_VER
--#define and &&
--#define or ||
--#endif
--
- titrationCalculator::titrationCalculator(QWidget * parent) : QWidget(parent)
- {
- xmin = 0;
-@@ -112,7 +107,7 @@ void titrationCalculator::plot()
- }
- QString mreporto;
- int iter = 0;
-- if (uid.xaxis->text() == "" or uid.xaxis->text() == " ") {
-+ if (uid.xaxis->text() == "" || uid.xaxis->text() == " ") {
- uid.xaxis->setText(i18n("nothing"));
- }
- if (tmpy == 0) {
-@@ -121,11 +116,11 @@ void titrationCalculator::plot()
- //now we have to solve the system of equations NOTE:yvalue contains the equation of Y-axis variable
- //we iterates the process until you have an equation in one only unknown variable or a numeric expression
- mreporto = solve(yvalue);
-- while (end == 0 or lettere == 1) {
-+ while (end == 0 || lettere == 1) {
- QByteArray ba = mreporto.toLatin1();
- char *tmreport = ba.data();
- ++iter;
-- if (end == 1 or lettere == 0) {
-+ if (end == 1 || lettere == 0) {
- break;
- }
- if (iter > 100) {
-@@ -273,13 +268,13 @@ QString titrationCalculator::solve(char *yvalue)
- QString tempyval;
- QString ptem;
- for (int i = 0; strlen(yvalue) + 1; ++i) {
-- if (!(yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',')) {
-+ if (!(yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',')) {
- break; //if current value is not a permitted value, this means that something is wrong
- }
-- if (yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='.' || yvalue[i]==',') {
- lettere = 1; //if lettere == 0 then the equation contains only mnumbers
- }
-- if (yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',') {
- tempyval = tempyval + QString(yvalue[i]);
- } else {
- tempy = tempy + QString(yvalue[i]);
-@@ -302,7 +297,7 @@ QString titrationCalculator::solve(char *yvalue)
- end = 1;
- }
- if (tempy!=uid.xaxis->text()) {
-- if (yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',') {
- //actually nothing
- } else {
- end = 0;
-@@ -335,13 +330,13 @@ QString titrationCalculator::solvex(char *yvalue, QString dnum) {
- QString tempyval;
- tempy = "";
- for (int i = 0; strlen(yvalue) + 1; ++i) {
-- if (!(yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',')) {
-+ if (!(yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',')) {
- break; //if current value is not a permitted value, this means that something is wrong
- }
-- if (yvalue[i]=='q' or yvalue[i]=='w' or yvalue[i]=='e' or yvalue[i]=='r' or yvalue[i]=='t' or yvalue[i]=='y' or yvalue[i]=='u' or yvalue[i]=='i' or yvalue[i]=='o' or yvalue[i]=='p' or yvalue[i]=='a' or yvalue[i]=='s' or yvalue[i]=='d' or yvalue[i]=='f' or yvalue[i]=='g' or yvalue[i]=='h' or yvalue[i]=='j' or yvalue[i]=='k' or yvalue[i]=='l' or yvalue[i]=='z' or yvalue[i]=='x' or yvalue[i]=='c' or yvalue[i]=='v' or yvalue[i]=='b' or yvalue[i]=='n' or yvalue[i]=='m' or yvalue[i]=='Q' or yvalue[i]=='W' or yvalue[i]=='E' or yvalue[i]=='R' or yvalue[i]=='T' or yvalue[i]=='Y' or yvalue[i]=='U' or yvalue[i]=='I' or yvalue[i]=='O' or yvalue[i]=='P' or yvalue[i]=='A' or yvalue[i]=='S' or yvalue[i]=='D' or yvalue[i]=='F' or yvalue[i]=='G' or yvalue[i]=='H' or yvalue[i]=='J' or yvalue[i]=='K' or yvalue[i]=='L' or yvalue[i]=='Z' or yvalue[i]=='X' or yvalue[i]=='C' or yvalue[i]=='V' or yvalue[i]=='B' or yvalue[i]=='N' or yvalue[i]=='M' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='q' || yvalue[i]=='w' || yvalue[i]=='e' || yvalue[i]=='r' || yvalue[i]=='t' || yvalue[i]=='y' || yvalue[i]=='u' || yvalue[i]=='i' || yvalue[i]=='o' || yvalue[i]=='p' || yvalue[i]=='a' || yvalue[i]=='s' || yvalue[i]=='d' || yvalue[i]=='f' || yvalue[i]=='g' || yvalue[i]=='h' || yvalue[i]=='j' || yvalue[i]=='k' || yvalue[i]=='l' || yvalue[i]=='z' || yvalue[i]=='x' || yvalue[i]=='c' || yvalue[i]=='v' || yvalue[i]=='b' || yvalue[i]=='n' || yvalue[i]=='m' || yvalue[i]=='Q' || yvalue[i]=='W' || yvalue[i]=='E' || yvalue[i]=='R' || yvalue[i]=='T' || yvalue[i]=='Y' || yvalue[i]=='U' || yvalue[i]=='I' || yvalue[i]=='O' || yvalue[i]=='P' || yvalue[i]=='A' || yvalue[i]=='S' || yvalue[i]=='D' || yvalue[i]=='F' || yvalue[i]=='G' || yvalue[i]=='H' || yvalue[i]=='J' || yvalue[i]=='K' || yvalue[i]=='L' || yvalue[i]=='Z' || yvalue[i]=='X' || yvalue[i]=='C' || yvalue[i]=='V' || yvalue[i]=='B' || yvalue[i]=='N' || yvalue[i]=='M' || yvalue[i]=='.' || yvalue[i]==',') {
- tempy = tempy + yvalue[i]; //if lettere == 0 then the equation contains only mnumbers
- }
-- if (yvalue[i]=='+' or yvalue[i]=='-' or yvalue[i]=='^' or yvalue[i]=='*' or yvalue[i]=='/' or yvalue[i]=='(' or yvalue[i]==')' or yvalue[i]=='1' or yvalue[i]=='2' or yvalue[i]=='3' or yvalue[i]=='4' or yvalue[i]=='5' or yvalue[i]=='6' or yvalue[i]=='7' or yvalue[i]=='8' or yvalue[i]=='9' or yvalue[i]=='0' or yvalue[i]=='.' or yvalue[i]==',') {
-+ if (yvalue[i]=='+' || yvalue[i]=='-' || yvalue[i]=='^' || yvalue[i]=='*' || yvalue[i]=='/' || yvalue[i]=='(' || yvalue[i]==')' || yvalue[i]=='1' || yvalue[i]=='2' || yvalue[i]=='3' || yvalue[i]=='4' || yvalue[i]=='5' || yvalue[i]=='6' || yvalue[i]=='7' || yvalue[i]=='8' || yvalue[i]=='9' || yvalue[i]=='0' || yvalue[i]=='.' || yvalue[i]==',') {
- if (!tempyolda.isEmpty()) {
- tempy = tempy + yvalue[i];
- if (tempyolda == uid.xaxis->text()) {
-@@ -359,7 +354,7 @@ QString titrationCalculator::solvex(char *yvalue, QString dnum) {
- tempyolda = tempyold;
- } else {
- tempyold = "";
-- if (((olda != 1) and (yvalue[i + 1] != '^')) or (yvalue[i] == '+' or yvalue[i] == '-' or yvalue[i] == '^' or yvalue[i] == '*' or yvalue[i] == '/' or yvalue[i] == '(' or yvalue[i] == ')')) {
-+ if (((olda != 1) && (yvalue[i + 1] != '^')) || (yvalue[i] == '+' || yvalue[i] == '-' || yvalue[i] == '^' || yvalue[i] == '*' || yvalue[i] == '/' || yvalue[i] == '(' || yvalue[i] == ')')) {
- tempyval = tempyval + QString(yvalue[i]);
- }
- }
-@@ -374,7 +369,7 @@ QString titrationCalculator::solvex(char *yvalue, QString dnum) {
- tempyold = "";
- olda = 1;
- }
-- if ((tempy==uid.xaxis->text()) and (!tempyolda.isEmpty())) {
-+ if ((tempy==uid.xaxis->text()) && (!tempyolda.isEmpty())) {
- if (yvalue[i + 1] != '^') {
- tempyval = tempyval + dnum;
- }
-@@ -611,7 +606,7 @@ void titrationCalculator::on_actionOpen_triggered()
- if (tmpchr != '|') {
- tempyval = tempyval + tmpchr;
- } else {
-- if ((tablea == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((tablea == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- if ((i % 2) != 0) {
- QTableWidgetItem *titemo = uid.tableWidget->item((i - 1) / 2, 1);
- if (titemo) {
-@@ -626,7 +621,7 @@ void titrationCalculator::on_actionOpen_triggered()
- ++i;
- }
-
-- if ((tableb == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((tableb == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- if ((i % 2) != 0) {
- QTableWidgetItem *titemo = uid.tableWidget_2->item((i - 1) / 2, 1);
- if (titemo) {
-@@ -641,13 +636,13 @@ void titrationCalculator::on_actionOpen_triggered()
- }
- ++i;
- }
-- if ((xax == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((xax == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- uid.xaxis->setText(tempyval);
- }
-- if ((yax == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((yax == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- uid.yaxis->setText(tempyval);
- }
-- if ((notea == 1) and (tempyval != QString("table1")) and (tempyval != QString("table2")) and (tempyval != QString("xaxis")) and (tempyval != QString("yaxis")) and (tempyval != QString("note"))) {
-+ if ((notea == 1) && (tempyval != QString("table1")) && (tempyval != QString("table2")) && (tempyval != QString("xaxis")) && (tempyval != QString("yaxis")) && (tempyval != QString("note"))) {
- uid.note->setText(tempyval);
- }
-
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/kate.patch b/kde/patch/kate.patch
index 45c2f53..59df062 100644
--- a/kde/patch/kate.patch
+++ b/kde/patch/kate.patch
@@ -1,8 +1,3 @@
-# Last-minute fixes for opening and closing files:
-# Should be fixed after 15.12.0.
-#cat $CWD/patch/kate/kate-15.12.0.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Allow Kate to be started by the root user; disallowing this is not
# a decision that a developer should make for the user, it is patronizing:
cat $CWD/patch/kate/kate_runasroot.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kate/kate-15.12.0.patch b/kde/patch/kate/kate-15.12.0.patch
deleted file mode 100644
index 25067f4..0000000
--- a/kde/patch/kate/kate-15.12.0.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Michal Humpula <michal.humpula@hudrydum.cz>
-Date: Sun, 29 Nov 2015 10:24:42 +0000
-Subject: fix opening new files trough dbus
-X-Git-Url: http://quickgit.kde.org/?p=kate.git&a=commitdiff&h=d61b121264d7b43d41c1c6417a18bbfb9078eb9d
----
-fix opening new files trough dbus
-
-REVIEW: 126197
----
-
-
---- a/urlinfo.h
-+++ b/urlinfo.h
-@@ -33,7 +33,7 @@
- : cursor(KTextEditor::Cursor::invalid())
- {
- // convert to an url
-- const QRegularExpression withProtocol(QStringLiteral("^[a-zA-Z]+:")); // TODO: remove after Qt supports this on its own
-+ const QRegularExpression withProtocol(QStringLiteral("^[a-zA-Z]+://")); // TODO: remove after Qt supports this on its own
- if (withProtocol.match(path).hasMatch()) {
- url = QUrl::fromUserInput(path);
- } else {
-@@ -50,7 +50,7 @@
- int line = match.captured(1).toInt() - 1;
- // don't use an invalid column when the line is valid
- int column = qMax(0, match.captured(2).toInt() - 1);
-- url = QUrl::fromLocalFile(path);
-+ url = QUrl::fromLocalFile(QDir::current().absoluteFilePath(path));
- cursor = {line, column};
- }
- }
diff --git a/kde/patch/kcalc.patch b/kde/patch/kcalc.patch
deleted file mode 100644
index 8cc3873..0000000
--- a/kde/patch/kcalc.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Fix issue where kcalc has a zero-sized window and appears not to start,
-# in combination with Qt 5.6.
-# Should be fixed after 16.04.0.
-#cat $CWD/patch/kcalc/kcalc-kdebug_360105.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kcalc/kcalc-kdebug_360105.patch b/kde/patch/kcalc/kcalc-kdebug_360105.patch
deleted file mode 100644
index a2ff272..0000000
--- a/kde/patch/kcalc/kcalc-kdebug_360105.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Fix issue where kcalc has a zero-sized window and appears not to start.
-
-Patch-by: Rex Dieter <rdieter@math.unl.edu>
-Gentoo-bug: 577782
-KDE-bug: 360105
-
---- a/kcalc.cpp
-+++ b/kcalc.cpp
-@@ -124,5 +124,5 @@ KCalculator::KCalculator(QWidget *parent
- updateGeometry();
-
-- setFixedSize(minimumSize());
-+ if ( ! minimumSize().isEmpty() ) setFixedSize(minimumSize());
-
- updateDisplay(UPDATE_FROM_CORE);
diff --git a/kde/patch/kcalcore.patch b/kde/patch/kcalcore.patch
deleted file mode 100644
index 051150d..0000000
--- a/kde/patch/kcalcore.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix compile error against new libical 3:
-# Fixed in Applications 17.12.0:
-#cat $CWD/patch/kcalcore/kcalcore_libical3.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kcalcore/kcalcore_libical3.patch b/kde/patch/kcalcore/kcalcore_libical3.patch
deleted file mode 100644
index 0a5155f..0000000
--- a/kde/patch/kcalcore/kcalcore_libical3.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-From 27eaa211b23a6bb0bcba5a91cf7cadfc1e888e21 Mon Sep 17 00:00:00 2001
-From: Allen Winter <winter@kde.org>
-Date: Fri, 6 Oct 2017 10:39:20 -0400
-Subject: icalformat_p.cpp, icaltimezones.cpp - follow API changes in libical3
-
----
- src/icalformat_p.cpp | 11 ++++++-----
- src/icaltimezones.cpp | 10 ++++------
- 2 files changed, 10 insertions(+), 11 deletions(-)
-
-diff --git a/src/icalformat_p.cpp b/src/icalformat_p.cpp
-index bd1d8a3..c2e4548 100644
---- a/src/icalformat_p.cpp
-+++ b/src/icalformat_p.cpp
-@@ -2355,7 +2355,6 @@ icaltimetype ICalFormatImpl::writeICalDate(const QDate &date)
- t.second = 0;
-
- t.is_date = 1;
-- t.is_utc = 0;
- t.zone = nullptr;
-
- return t;
-@@ -2377,7 +2376,9 @@ icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &datetime, bool d
- t.second = datetime.time().second();
- }
- t.zone = nullptr; // zone is NOT set
-- t.is_utc = datetime.isUtc() ? 1 : 0;
-+ if ( datetime.isUtc() ) {
-+ t = icaltime_convert_to_zone(t, icaltimezone_get_utc_timezone());
-+ }
-
- // _dumpIcaltime( t );
-
-@@ -2450,7 +2452,7 @@ icalproperty *ICalFormatImpl::writeICalDateTimeProperty(const icalproperty_kind
- }
-
- KTimeZone ktz;
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc(t)) {
- ktz = dt.timeZone();
- }
-
-@@ -2483,7 +2484,7 @@ QDateTime ICalFormatImpl::readICalDateTime(icalproperty *p, const icaltimetype &
- // _dumpIcaltime( t );
-
- KDateTime::Spec timeSpec;
-- if (t.is_utc || t.zone == icaltimezone_get_utc_timezone()) {
-+ if (icaltime_is_utc(t) || t.zone == icaltimezone_get_utc_timezone()) {
- timeSpec = KDateTime::UTC; // the time zone is UTC
- utc = false; // no need to convert to UTC
- } else {
-diff --git a/src/icaltimezones.cpp b/src/icaltimezones.cpp
-index 2f6d42f..f8f8d5d 100644
---- a/src/icaltimezones.cpp
-+++ b/src/icaltimezones.cpp
-@@ -54,7 +54,7 @@ static QDateTime toQDateTime(const icaltimetype &t)
- {
- return QDateTime(QDate(t.year, t.month, t.day),
- QTime(t.hour, t.minute, t.second),
-- (t.is_utc ? Qt::UTC : Qt::LocalTime));
-+ (icaltime_is_utc(t) ? Qt::UTC : Qt::LocalTime));
- }
-
- // Maximum date for time zone data.
-@@ -81,7 +81,6 @@ static icaltimetype writeLocalICalDateTime(const QDateTime &utc, int offset)
- t.second = local.time().second();
- t.is_date = 0;
- t.zone = nullptr;
-- t.is_utc = 0;
- return t;
- }
-
-@@ -888,7 +887,7 @@
- }
- case ICAL_LASTMODIFIED_PROPERTY: {
- const icaltimetype t = icalproperty_get_lastmodified(p);
-- if (t.is_utc) {
-+ if (icaltime_is_utc(t)) {
- data->d->lastModified = toQDateTime(t);
- } else {
- qCDebug(KCALCORE_LOG) << "LAST-MODIFIED not UTC";
-@@ -1261,7 +1260,7 @@ bool ICalTimeZoneParser::parsePhase(icalcomponent *c, ICalTimeZonePhase &phase)
- // Convert DTSTART to QDateTime, and from local time to UTC
- const QDateTime localStart = toQDateTime(dtstart); // local time
- dtstart.second -= prevOffset;
-- dtstart.is_utc = 1;
-+ dtstart = icaltime_convert_to_zone(dtstart, icaltimezone_get_utc_timezone());
- const QDateTime utcStart = toQDateTime(icaltime_normalize(dtstart)); // UTC
-
- transitions += utcStart;
-@@ -1286,13 +1285,12 @@ bool ICalTimeZoneParser::parsePhase(icalcomponent *c, ICalTimeZonePhase &phase)
- t.minute = dtstart.minute;
- t.second = dtstart.second;
- t.is_date = 0;
-- t.is_utc = 0; // dtstart is in local time
- }
- // RFC2445 states that RDATE must be in local time,
- // but we support UTC as well to be safe.
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc(t)) {
- t.second -= prevOffset; // convert to UTC
-- t.is_utc = 1;
-+ t = icaltime_convert_to_zone(t, icaltimezone_get_utc_timezone());
- t = icaltime_normalize(t);
- }
- transitions += toQDateTime(t);
---
-cgit v0.11.2
-
diff --git a/kde/patch/kcoreaddons.patch b/kde/patch/kcoreaddons.patch
deleted file mode 100644
index 5cd190c..0000000
--- a/kde/patch/kcoreaddons.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# KDEBUG #362161 (fixed in Frameworks 5.22.0):
-# Fixes regression introduced in 9ae6d765b37135bbfe3a8b936e5a88b8a435e424
-# Since the rand() was not seeded, the numbers generated were predictable.
-#cat $CWD/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch b/kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch
deleted file mode 100644
index 31bbcf7..0000000
--- a/kde/patch/kcoreaddons/kcoreaddons.kdebug_362161.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Albert Astals Cid <aacid@kde.org>
-Date: Tue, 26 Apr 2016 21:41:27 +0000
-Subject: Missing rand() -> qrand
-X-Git-Url: http://quickgit.kde.org/?p=kcoreaddons.git&a=commitdiff&h=78212436643af95779facd9593c82fb149c2213d
----
-Missing rand() -> qrand
-
-Fixes regression introduced in 9ae6d765b37135bbfe3a8b936e5a88b8a435e424
-
-Reviewed by Aleix
-
-BUGS: 362161
----
-
-
---- a/src/lib/randomness/krandom.cpp
-+++ b/src/lib/randomness/krandom.cpp
-@@ -51,7 +51,7 @@
- }
- qsrand(seed);
- }
-- return rand();
-+ return qrand();
- }
-
- QString KRandom::randomString(int length)
-
diff --git a/kde/patch/kde-baseapps.patch b/kde/patch/kde-baseapps.patch
deleted file mode 100644
index 988504d..0000000
--- a/kde/patch/kde-baseapps.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Fix for bug https://bugs.kde.org/show_bug.cgi?id=327224
-# "Regression: Dolphin doesn't accept URLs containing a kio-slave as parameter"
-# Fixed in KDE 4.11.4.
-#cat $CWD/patch/kde-baseapps/dolphin_kdebug_327224.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-baseapps/dolphin_kdebug_327224.patch b/kde/patch/kde-baseapps/dolphin_kdebug_327224.patch
deleted file mode 100644
index 8210d87..0000000
--- a/kde/patch/kde-baseapps/dolphin_kdebug_327224.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-Revert "Files passed as arguments: Ignore unsupported files"
-
-This reverts commit cd9e50ae4f3ded5a78d0cfb09a67684a9c15d726.
-
-See bug#327224 for details.
-
---- a/dolphin/src/dolphinmainwindow.cpp
-+++ b/dolphin/src/dolphinmainwindow.cpp
-@@ -31,7 +31,6 @@
- #include "panels/information/informationpanel.h"
- #include "settings/dolphinsettingsdialog.h"
- #include "statusbar/dolphinstatusbar.h"
--#include "views/dolphinview.h"
- #include "views/dolphinviewactionhandler.h"
- #include "views/dolphinremoteencoding.h"
- #include "views/draganddrophelper.h"
-@@ -244,20 +243,8 @@
- return;
- }
-
-- // dirs could contain URLs that actually point to archives or other files.
-- // Replace them by URLs we can open where possible and filter the rest out.
-- QList<KUrl> urlsToOpen;
-- foreach (const KUrl& rawUrl, dirs) {
-- const KFileItem& item = KFileItem(KFileItem::Unknown, KFileItem::Unknown, rawUrl);
-- item.determineMimeType();
-- const KUrl& url = DolphinView::openItemAsFolderUrl(item);
-- if (!url.isEmpty()) {
-- urlsToOpen.append(url);
-- }
-- }
--
-- if (urlsToOpen.count() == 1) {
-- m_activeViewContainer->setUrl(urlsToOpen.first());
-+ if (dirs.count() == 1) {
-+ m_activeViewContainer->setUrl(dirs.first());
- return;
- }
-
-@@ -267,12 +254,12 @@
-
- // Open each directory inside a new tab. If the "split view" option has been enabled,
- // always show two directories within one tab.
-- QList<KUrl>::const_iterator it = urlsToOpen.begin();
-- while (it != urlsToOpen.end()) {
-+ QList<KUrl>::const_iterator it = dirs.begin();
-+ while (it != dirs.end()) {
- openNewTab(*it);
- ++it;
-
-- if (hasSplitView && (it != urlsToOpen.end())) {
-+ if (hasSplitView && (it != dirs.end())) {
- const int tabIndex = m_viewTab.count() - 1;
- m_viewTab[tabIndex].secondaryView->setUrl(*it);
- ++it;
-
-
diff --git a/kde/patch/kde-cli-tools.patch b/kde/patch/kde-cli-tools.patch
deleted file mode 100644
index a76227d..0000000
--- a/kde/patch/kde-cli-tools.patch
+++ /dev/null
@@ -1,6 +0,0 @@
-# Remove CONFIG argument from find_package(KF5);
-# This is no longer wanted, since ECM has a FindKF5 module.
-#cat $CWD/patch/kde-cli-tools/kde-cli-tools_ecm.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Adjust for the change in KAboutData:
-#cat $CWD/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch b/kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch
deleted file mode 100644
index 1ff1f84..0000000
--- a/kde/patch/kde-cli-tools/kde-cli-tools_ecm.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- kde-cli-tools-20140602git/CMakeLists.txt.orig 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/CMakeLists.txt 2014-06-02 23:45:22.337682384 +0200
-@@ -21,7 +21,7 @@
- Test
- )
-
--find_package(KF5 CONFIG REQUIRED COMPONENTS
-+find_package(KF5 REQUIRED COMPONENTS
- Config
- Init
- KCMUtils
diff --git a/kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff b/kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff
deleted file mode 100644
index e88a512..0000000
--- a/kde/patch/kde-cli-tools/kde-cli-tools_kaboutdata.diff
+++ /dev/null
@@ -1,59 +0,0 @@
-diff -uar kde-cli-tools-20140602git.orig/kdesu/kdesu.cpp kde-cli-tools-20140602git/kdesu/kdesu.cpp
---- kde-cli-tools-20140602git.orig/kdesu/kdesu.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kdesu/kdesu.cpp 2014-06-03 00:41:16.998697492 +0200
-@@ -81,9 +81,9 @@
- if (duser.isEmpty())
- duser = "root";
-
-- KAboutData aboutData("kdesu", 0, i18n("KDE su"),
-+ KAboutData aboutData("kdesu", i18n("KDE su"),
- Version, i18n("Runs a program with elevated privileges."),
-- KAboutData::License_Artistic,
-+ KAboutLicense::Artistic,
- i18n("Copyright (c) 1998-2000 Geert Jansen, Pietro Iglio"));
- aboutData.addAuthor(i18n("Geert Jansen"), i18n("Maintainer"),
- "jansen@kde.org", "http://www.stack.nl/~geertj/");
-diff -uar kde-cli-tools-20140602git.orig/kioclient/kioclient.cpp kde-cli-tools-20140602git/kioclient/kioclient.cpp
---- kde-cli-tools-20140602git.orig/kioclient/kioclient.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kioclient/kioclient.cpp 2014-06-03 00:41:50.446696159 +0200
-@@ -133,7 +133,7 @@
- QString programName = i18n("KIO Client");
- QString description = i18n("Command-line tool for network-transparent operations");
- QString version = "2.0";
-- KAboutData data(appName, appName, programName, version, description, KAboutData::License_LGPL_V2);
-+ KAboutData data(appName, programName, version, description, KAboutLicense::LGPL_V2);
-
- QCommandLineParser parser;
- parser.addOption(QCommandLineOption("noninteractive", i18n("Non-interactive use: no message boxes. If you don't want a"
-diff -uar kde-cli-tools-20140602git.orig/kreadconfig/kreadconfig.cpp kde-cli-tools-20140602git/kreadconfig/kreadconfig.cpp
---- kde-cli-tools-20140602git.orig/kreadconfig/kreadconfig.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kreadconfig/kreadconfig.cpp 2014-06-03 00:40:33.820702023 +0200
-@@ -53,10 +53,10 @@
- int main(int argc, char **argv)
- {
- QCoreApplication app(argc, argv);
-- KAboutData aboutData("kreadconfig", 0, i18n("KReadConfig"),
-+ KAboutData aboutData("kreadconfig", i18n("KReadConfig"),
- "1.0.1",
- i18n("Read KConfig entries - for use in shell scripts"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2001 Red Hat, Inc."));
- aboutData.addAuthor(i18n("Bernhard Rosenkraenzer"), QString(), "bero@redhat.com");
-
-diff -uar kde-cli-tools-20140602git.orig/kreadconfig/kwriteconfig.cpp kde-cli-tools-20140602git/kreadconfig/kwriteconfig.cpp
---- kde-cli-tools-20140602git.orig/kreadconfig/kwriteconfig.cpp 2014-06-02 13:45:49.000000000 +0200
-+++ kde-cli-tools-20140602git/kreadconfig/kwriteconfig.cpp 2014-06-03 00:39:54.811701204 +0200
-@@ -31,10 +31,10 @@
- int main(int argc, char **argv)
- {
- QCoreApplication app(argc, argv);
-- KAboutData aboutData("kwriteconfig", 0, i18n("KWriteConfig"),
-+ KAboutData aboutData("kwriteconfig", i18n("KWriteConfig"),
- "1.0.0",
- i18n("Write KConfig entries - for use in shell scripts"),
-- KAboutData::License_GPL,
-+ KAboutLicense::GPL,
- i18n("(c) 2001 Red Hat, Inc. & Luís Pedro Coelho"));
- aboutData.addAuthor("Luís Pedro Coelho", QString(), "luis_pedro@netcabo.pt");
- aboutData.addAuthor("Bernhard Rosenkraenzer", i18n("Wrote kreadconfig on which this is based"), "bero@redhat.com");
diff --git a/kde/patch/kde-dev-utils.patch b/kde/patch/kde-dev-utils.patch
deleted file mode 100644
index c5cbc92..0000000
--- a/kde/patch/kde-dev-utils.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix build against KF 5.48.0 (only relevant for 18.04.3):
-#cat $CWD/patch/kde-dev-utils/build_with_kf548.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-dev-utils/build_with_kf548.patch b/kde/patch/kde-dev-utils/build_with_kf548.patch
deleted file mode 100644
index e75838d..0000000
--- a/kde/patch/kde-dev-utils/build_with_kf548.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 369699a..00e1413 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,15 +1,18 @@
- cmake_minimum_required(VERSION 2.8.12)
-
- find_package(ECM 5.14 REQUIRED NO_MODULE)
- set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
-
- include(FeatureSummary)
- include(ECMInstallIcons)
- include(KDEInstallDirs)
- include(KDECMakeSettings)
- include(KDECompilerSettings NO_POLICY_SCOPE)
- include(ECMQtDeclareLoggingCategory)
-
-+# Required for ki18n_install(po) added on tarball generation
-+find_package(KF5 REQUIRED COMPONENTS I18n)
-+
- add_subdirectory(kpartloader)
- add_subdirectory(kuiviewer)
- ki18n_install(po)
-diff --git a/kpartloader/CMakeLists.txt b/kpartloader/CMakeLists.txt
-index 4e54d94..1fe4136 100644
---- a/kpartloader/CMakeLists.txt
-+++ b/kpartloader/CMakeLists.txt
-@@ -1,27 +1,26 @@
- project(kpartloader)
- ########### kpartloader ###############
-
- set(QT_MIN_VERSION "5.5.0")
-
- find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE
- COMPONENTS
- Core
- )
-
- find_package(KF5 REQUIRED
- COMPONENTS
- CoreAddons
-- I18n
- Parts
- WidgetsAddons
- )
-
- set(kpartloader_SRCS
- kpartloader.cpp
- )
-
- add_executable(kpartloader ${kpartloader_SRCS})
- target_link_libraries(kpartloader KF5::Parts)
- install(TARGETS kpartloader ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
- install(FILES kpartloaderui.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kpartloader)
-
-diff --git a/kuiviewer/CMakeLists.txt b/kuiviewer/CMakeLists.txt
-index fa72c59..3fe987e 100644
---- a/kuiviewer/CMakeLists.txt
-+++ b/kuiviewer/CMakeLists.txt
-@@ -1,96 +1,95 @@
- project(kuiviewer)
-
- set(QT_MIN_VERSION "5.5.0")
-
- include(ECMAddAppIcon)
-
- find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE
- COMPONENTS
- Core
- Designer
- UiTools
- )
-
- find_package(KF5 REQUIRED
- COMPONENTS
- CoreAddons
- KIO
-- I18n
- Parts
- )
-
- add_definitions(
- -DQT_DEPRECATED_WARNINGS
- -DQT_DISABLE_DEPRECATED_BEFORE=0x050500
- -DQT_NO_SIGNALS_SLOTS_KEYWORDS
- -DQT_STRICT_ITERATORS
- -DQT_USE_QSTRINGBUILDER
- -DQT_NO_CAST_TO_ASCII
- -DQT_NO_CAST_FROM_ASCII
- -DQT_NO_CAST_FROM_BYTEARRAY
- -DQT_NO_URL_CAST_FROM_STRING
- )
-
- ########### next target ###############
-
- set(kuiviewer_SRCS main.cpp kuiviewer.cpp )
-
- file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/*-apps-kuiviewer.png")
- ecm_add_app_icon(kuiviewer_SRCS ICONS ${ICONS_SRCS})
-
- add_executable(kuiviewer ${kuiviewer_SRCS})
-
- target_link_libraries(kuiviewer KF5::Parts )
-
- install(TARGETS kuiviewer ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} )
-
-
- ########### next target ###############
-
- set(kuiviewerpart_PART_SRCS kuiviewer_part.cpp )
-
- ecm_qt_declare_logging_category(kuiviewerpart_PART_SRCS
- HEADER kuiviewer_part_debug.h
- IDENTIFIER KUIVIEWERPART
- CATEGORY_NAME "kuiviewerpart"
- )
-
- add_library(kuiviewerpart MODULE ${kuiviewerpart_PART_SRCS})
-
- target_link_libraries(kuiviewerpart KF5::Parts Qt5::Designer Qt5::UiTools)
-
- install(TARGETS kuiviewerpart DESTINATION ${KDE_INSTALL_PLUGINDIR} )
-
-
- ########### next target ###############
-
- set(quithumbnail_PART_SRCS quicreator.cpp )
-
- add_library(quithumbnail MODULE ${quithumbnail_PART_SRCS})
-
- target_link_libraries(quithumbnail
- KF5::KIOWidgets
- Qt5::Designer
- Qt5::UiTools
- )
-
- install(TARGETS quithumbnail DESTINATION ${KDE_INSTALL_PLUGINDIR} )
-
-
- ########### install files ###############
-
- install( PROGRAMS org.kde.kuiviewer.desktop DESTINATION ${KDE_INSTALL_APPDIR} )
- install( FILES designerthumbnail.desktop kuiviewer_part.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} )
- install( FILES kuiviewer_part.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kuiviewerpart )
- install( FILES kuiviewerui.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/kuiviewer )
-
- ecm_install_icons(ICONS
- 16-apps-kuiviewer.png
- 32-apps-kuiviewer.png
- 48-apps-kuiviewer.png
- 64-apps-kuiviewer.png
- 128-apps-kuiviewer.png
- sc-apps-kuiviewer.svg
- DESTINATION ${KDE_INSTALL_ICONDIR}
- THEME hicolor
- )
diff --git a/kde/patch/kde-gtk-config.patch b/kde/patch/kde-gtk-config.patch
deleted file mode 100644
index a62e649..0000000
--- a/kde/patch/kde-gtk-config.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Make the kde-gtk-config load the current config first:
-# Fixed in 5.11.2
-#cat $CWD/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch b/kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch
deleted file mode 100644
index b5b074d..0000000
--- a/kde/patch/kde-gtk-config/kde-gtk-config_loadcurrentsettings.patch
+++ /dev/null
@@ -1,622 +0,0 @@
-From 0d0f812a1704c62c014bc87162b1280224b64f93 Mon Sep 17 00:00:00 2001
-From: Fabian Vogt <fabian@ritter-vogt.de>
-Date: Tue, 24 Oct 2017 13:25:32 +0200
-Subject: Revert "Make the kde-gtk-config kcm better at checking global gtk
- settings"
-
-Summary:
-This reverts commit 34357f74ee2d98128ff423b0ec6ddcbf4232c475.
-
-Reverting this fixes loading of the actually used GTK settings.
-
-BUG: 382291
-
-Test Plan:
-Opened kcmshell5 kde-gtk-config with and without this revert.
-Without, it shows Adwaita as theme, with it shows breeze.
-GTK uses breeze, so the behaviour with the revert is correct.
-
-Reviewers: #plasma, apol
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D8443
----
- CMakeLists.txt | 2 +-
- src/abstractappearance.h | 5 +-
- src/appearancegtk2.cpp | 103 +++++++++++++---------------------
- src/appearancegtk2.h | 11 +---
- src/appearancegtk3.cpp | 143 +++++++++++++++++++++--------------------------
- src/appearancegtk3.h | 10 +---
- src/appearencegtk.cpp | 4 +-
- tests/CMakeLists.txt | 2 +-
- tests/configsavetest.cpp | 75 ++++++++++---------------
- tests/configsavetest.h | 8 +--
- 10 files changed, 144 insertions(+), 219 deletions(-)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 181cfc9..bf1ba29 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -51,7 +51,7 @@ ki18n_wrap_ui(kcm_SRCS
- )
- add_library(kcm_kdegtkconfig MODULE ${kcm_SRCS})
- target_compile_definitions(kcm_kdegtkconfig PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}")
--target_link_libraries(kcm_kdegtkconfig ${X11_Xcursor_LIB} KF5::ConfigCore KF5::I18n KF5::KIOWidgets KF5::NewStuff KF5::Archive KF5::NewStuff KF5::ConfigWidgets KF5::IconThemes)
-+target_link_libraries(kcm_kdegtkconfig ${X11_Xcursor_LIB} KF5::I18n KF5::KIOWidgets KF5::NewStuff KF5::Archive KF5::NewStuff KF5::ConfigWidgets KF5::IconThemes)
-
- kcoreaddons_desktop_to_json(kcm_kdegtkconfig kde-gtk-config.desktop)
-
-diff --git a/src/abstractappearance.h b/src/abstractappearance.h
-index 208342e..2961a09 100644
---- a/src/abstractappearance.h
-+++ b/src/abstractappearance.h
-@@ -30,11 +30,10 @@ class AbstractAppearance
- {
- public:
- virtual ~AbstractAppearance() {}
-- virtual bool loadSettings() = 0;
-- virtual bool saveSettings() const = 0;
-+ virtual QString defaultConfigFile() const = 0;
- virtual bool loadSettings(const QString& path) = 0;
- virtual bool saveSettings(const QString& path) const = 0;
--
-+
- /** @returns the installed themes' paths*/
- virtual QStringList installedThemes() const = 0;
-
-diff --git a/src/appearancegtk2.cpp b/src/appearancegtk2.cpp
-index 92cbee3..44a2239 100644
---- a/src/appearancegtk2.cpp
-+++ b/src/appearancegtk2.cpp
-@@ -30,38 +30,48 @@
- #include <QStandardPaths>
- #include <config.h>
-
--bool AppearanceGTK2::loadSettingsPrivate(const QString& path)
-+bool AppearanceGTK2::loadSettings(const QString& path)
- {
- QFile configFile(path);
-
-- if (!configFile.open(QIODevice::ReadOnly | QIODevice::Text))
-- return false;
-+ bool canRead = configFile.open(QIODevice::ReadOnly | QIODevice::Text);
-
-- const QMap<QString, QString> foundSettings = readSettingsTuples(&configFile);
--
-- for(auto it = foundSettings.constBegin(), itEnd = foundSettings.constEnd(); it!=itEnd; ++it) {
-- if (it.key() == "gtk-theme-name")
-- m_settings["theme"] = *it;
-- else if (it.key() == "gtk-icon-theme-name")
-- m_settings["icon"] = *it;
-- else if (it.key() == "gtk-fallback-icon-theme")
-- m_settings["icon_fallback"] = *it;
-- else if (it.key() == "gtk-cursor-theme-name")
-- m_settings["cursor"] = *it;
-- else if (it.key() == "gtk-font-name")
-- m_settings["font"] = *it;
-- else if (it.key() == "gtk-toolbar-style")
-- m_settings["toolbar_style"] = *it;
-- else if (it.key() == "gtk-button-images")
-- m_settings["show_icons_buttons"] = *it;
-- else if(it.key() == "gtk-menu-images")
-- m_settings["show_icons_menus"] = *it;
-- else if (it.key() == "gtk-primary-button-warps-slider")
-- m_settings["primary_button_warps_slider"] = *it;
-- else
-- qWarning() << "unknown field" << it.key();
-+ if(canRead) {
-+// qDebug() << "The gtk2 config file exists...";
-+ const QMap<QString, QString> foundSettings = readSettingsTuples(&configFile);
-+ m_settings = QMap<QString, QString> {
-+ {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-+ {"show_icons_buttons", "0"},
-+ {"show_icons_menus", "0"},
-+ {"primary_button_warps_slider", "false"}
-+ };
-+
-+ for(auto it = foundSettings.constBegin(), itEnd = foundSettings.constEnd(); it!=itEnd; ++it) {
-+ if (it.key() == "gtk-theme-name")
-+ m_settings["theme"] = *it;
-+ else if (it.key() == "gtk-icon-theme-name")
-+ m_settings["icon"] = *it;
-+ else if (it.key() == "gtk-fallback-icon-theme")
-+ m_settings["icon_fallback"] = *it;
-+ else if (it.key() == "gtk-cursor-theme-name")
-+ m_settings["cursor"] = *it;
-+ else if (it.key() == "gtk-font-name")
-+ m_settings["font"] = *it;
-+ else if (it.key() == "gtk-toolbar-style")
-+ m_settings["toolbar_style"] = *it;
-+ else if (it.key() == "gtk-button-images")
-+ m_settings["show_icons_buttons"] = *it;
-+ else if(it.key() == "gtk-menu-images")
-+ m_settings["show_icons_menus"] = *it;
-+ else if (it.key() == "gtk-primary-button-warps-slider")
-+ m_settings["primary_button_warps_slider"] = *it;
-+ else
-+ qWarning() << "unknown field" << it.key();
-+ }
-+
- }
-- return true;
-+
-+ return canRead;
- }
-
- QString AppearanceGTK2::themesGtkrcFile(const QString& themeName) const
-@@ -82,7 +92,7 @@ QString AppearanceGTK2::themesGtkrcFile(const QString& themeName) const
- return QString();
- }
-
--bool AppearanceGTK2::saveSettingsPrivate(const QString& gtkrcFile) const
-+bool AppearanceGTK2::saveSettings(const QString& gtkrcFile) const
- {
- QFile gtkrc(gtkrcFile);
- gtkrc.remove();
-@@ -107,14 +117,14 @@ bool AppearanceGTK2::saveSettingsPrivate(const QString& gtkrcFile) const
- flow << "include \"/etc/gtk-2.0/gtkrc\"\n"; //We include the /etc's config file
-
- int nameEnd = m_settings["font"].lastIndexOf(QRegExp(" ([0-9]+|bold|italic)"));
-- const auto fontFamily = m_settings["font"].leftRef(nameEnd);
-+ QString fontFamily = m_settings["font"].left(nameEnd);
-
- //TODO: is this really needed?
- flow << "style \"user-font\" \n"
- << "{\n"
- << "\tfont_name=\""<< fontFamily << "\"\n"
- << "}\n";
--
-+
- flow << "widget_class \"*\" style \"user-font\"\n";
- flow << "gtk-font-name=\"" << m_settings["font"] << "\"\n";
- flow << "gtk-theme-name=\"" << m_settings["theme"] << "\"\n";
-@@ -144,16 +154,6 @@ bool AppearanceGTK2::saveSettingsPrivate(const QString& gtkrcFile) const
- return true;
- }
-
--void AppearanceGTK2::reset()
--{
-- m_settings = QMap<QString, QString> {
-- {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-- {"show_icons_buttons", "0"},
-- {"show_icons_menus", "0"},
-- {"primary_button_warps_slider", "false"}
-- };
--}
--
- QString AppearanceGTK2::defaultConfigFile() const
- {
- return QDir::homePath()+"/.gtkrc-2.0";
-@@ -183,26 +183,3 @@ QStringList AppearanceGTK2::installedThemes() const
-
- return paths;
- }
--
--bool AppearanceGTK2::loadSettings()
--{
-- reset();
--
-- return loadSettingsPrivate("/etc/gtk-2.0/gtkrc") && loadSettingsPrivate(defaultConfigFile());
--}
--
--bool AppearanceGTK2::saveSettings() const
--{
-- return saveSettings(defaultConfigFile());
--}
--
--bool AppearanceGTK2::loadSettings(const QString& gtkrcFile)
--{
-- reset();
-- return loadSettingsPrivate(gtkrcFile);
--}
--
--bool AppearanceGTK2::saveSettings(const QString& gtkrcFile) const
--{
-- return saveSettingsPrivate(gtkrcFile);
--}
-diff --git a/src/appearancegtk2.h b/src/appearancegtk2.h
-index 7df49bf..8bc28ee 100644
---- a/src/appearancegtk2.h
-+++ b/src/appearancegtk2.h
-@@ -29,17 +29,10 @@ class AppearanceGTK2 : public AbstractAppearance
- {
- bool loadSettings(const QString& path) override;
- bool saveSettings(const QString& path) const override;
-- bool loadSettings() override;
-- bool saveSettings() const override;
-+ QString defaultConfigFile() const override;
- QStringList installedThemes() const override;
--
-+
- QString themesGtkrcFile(const QString& themeName) const;
--
--private:
-- void reset();
-- QString defaultConfigFile() const;
-- bool loadSettingsPrivate(const QString& path);
-- bool saveSettingsPrivate(const QString& path) const;
- };
-
- #endif // APPEARANCEGTK2_H
-diff --git a/src/appearancegtk3.cpp b/src/appearancegtk3.cpp
-index 7df48c3..fa1bde5 100644
---- a/src/appearancegtk3.cpp
-+++ b/src/appearancegtk3.cpp
-@@ -25,8 +25,6 @@
- #include <QDir>
- #include <QDebug>
- #include <QStandardPaths>
--#include <KSharedConfig>
--#include <KConfigGroup>
-
- QStringList AppearanceGTK3::installedThemes() const
- {
-@@ -53,65 +51,76 @@ QStringList AppearanceGTK3::installedThemes() const
- return themes;
- }
-
--bool AppearanceGTK3::saveSettings(const KSharedConfig::Ptr& file) const
--{
-- KConfigGroup group(file, "Settings");
--
-- group.writeEntry("gtk-font-name", m_settings["font"]);
-- group.writeEntry("gtk-theme-name", m_settings["theme"]);
-- group.writeEntry("gtk-icon-theme-name", m_settings["icon"]);
-- group.writeEntry("gtk-fallback-icon-theme", m_settings["icon_fallback"]);
-- group.writeEntry("gtk-cursor-theme-name", m_settings["cursor"]);
-- group.writeEntry("gtk-toolbar-style", m_settings["toolbar_style"]);
-- group.writeEntry("gtk-menu-images", m_settings["show_icons_menus"]);
-- group.writeEntry("gtk-button-images", m_settings["show_icons_buttons"]);
-- group.writeEntry("gtk-primary-button-warps-slider", m_settings["primary_button_warps_slider"]);
-- group.writeEntry("gtk-application-prefer-dark-theme", m_settings["application_prefer_dark_theme"]);
--
-- const bool sync = group.sync();
-- Q_ASSERT(sync);
-- return true;
--}
--
--bool AppearanceGTK3::loadSettings(const KSharedConfig::Ptr& file)
-+bool AppearanceGTK3::saveSettings(const QString& file) const
- {
-- KConfigGroup group(file, "Settings");
--
-- if (!file || !group.isValid()) {
-- qWarning() << "Cannot open the GTK3 config file" << file;
-+ //Opening GTK3 config file $ENV{XDG_CONFIG_HOME}/gtk-3.0/m_settings.ini
-+ QDir::home().mkpath(file.left(file.lastIndexOf('/'))); //we make sure the path exists
-+ QFile file_gtk3(file);
-+
-+ if(!file_gtk3.open(QIODevice::WriteOnly | QIODevice::Text)) {
-+ qWarning() << "Couldn't open GTK3 config file for writing at:" << file_gtk3.fileName();
- return false;
- }
-+ QTextStream flow3(&file_gtk3);
-+ flow3 << "[Settings]\n";
-+ flow3 << "gtk-font-name=" << m_settings["font"] << "\n";
-+ flow3 << "gtk-theme-name=" << m_settings["theme"] << "\n";
-+ flow3 << "gtk-icon-theme-name="<< m_settings["icon"] << "\n";
-+ flow3 << "gtk-fallback-icon-theme=" << m_settings["icon_fallback"] << "\n";
-+ flow3 << "gtk-cursor-theme-name=" << m_settings["cursor"] << "\n";
-+ flow3 << "gtk-toolbar-style=" << m_settings["toolbar_style"] << "\n";
-+ flow3 << "gtk-menu-images=" << m_settings["show_icons_menus"] << "\n";
-+ flow3 << "gtk-button-images=" << m_settings["show_icons_buttons"] << "\n";
-+ flow3 << "gtk-primary-button-warps-slider=" << m_settings["primary_button_warps_slider"] << "\n";
-+ flow3 << "gtk-application-prefer-dark-theme=" << m_settings["application_prefer_dark_theme"] << "\n";
-
-- m_settings = QMap<QString, QString> {
-- {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-- {"show_icons_buttons", "0"},
-- {"show_icons_menus", "0"},
-- {"primary_button_warps_slider", "false"},
-- {"application_prefer_dark_theme", "false"}
-- };
--
-- m_settings["theme"] = group.readEntry("gtk-theme-name");
-- m_settings["icon"] = group.readEntry("gtk-icon-theme-name");
-- m_settings["icon_fallback"] = group.readEntry("gtk-fallback-icon-theme");
-- m_settings["cursor"] = group.readEntry("gtk-cursor-theme-name");
-- m_settings["font"] = group.readEntry("gtk-font-name");
-- m_settings["toolbar_style"] = group.readEntry("gtk-toolbar-style");
-- m_settings["show_icons_buttons"] = group.readEntry("gtk-button-images");
-- m_settings["show_icons_menus"] = group.readEntry("gtk-menu-images");
-- m_settings["primary_button_warps_slider"] = group.readEntry("gtk-primary-button-warps-slider");
-- m_settings["application_prefer_dark_theme"] = group.readEntry("gtk-application-prefer-dark-theme");
-- for(auto it = m_settings.begin(); it != m_settings.end(); ) {
-- if (it.value().isEmpty())
-- it = m_settings.erase(it);
-- else
-- ++it;
-- }
- return true;
- }
-
--QString AppearanceGTK3::configFileName() const
-+bool AppearanceGTK3::loadSettings(const QString& path)
- {
-- return QStringLiteral("gtk-3.0/settings.ini");
-+ QFile fileGtk3(path);
-+ bool canRead=fileGtk3.open(QIODevice::ReadOnly | QIODevice::Text);
-+
-+ if(canRead) {
-+ const QMap<QString, QString> foundSettings = readSettingsTuples(&fileGtk3);
-+
-+ m_settings = QMap<QString, QString> {
-+ {"toolbar_style", "GTK_TOOLBAR_ICONS"},
-+ {"show_icons_buttons", "0"},
-+ {"show_icons_menus", "0"},
-+ {"primary_button_warps_slider", "false"},
-+ {"application_prefer_dark_theme", "false"}
-+ };
-+
-+ for(auto it = foundSettings.constBegin(), itEnd = foundSettings.constEnd(); it!=itEnd; ++it) {
-+ if (it.key() == "gtk-theme-name")
-+ m_settings["theme"] = *it;
-+ else if (it.key() == "gtk-icon-theme-name")
-+ m_settings["icon"] = *it;
-+ else if (it.key() == "gtk-fallback-icon-theme")
-+ m_settings["icon_fallback"] = *it;
-+ else if (it.key() == "gtk-cursor-theme-name")
-+ m_settings["cursor"] = *it;
-+ else if (it.key() == "gtk-font-name")
-+ m_settings["font"] = *it;
-+ else if (it.key() == "gtk-toolbar-style")
-+ m_settings["toolbar_style"] = *it;
-+ else if (it.key() == "gtk-button-images")
-+ m_settings["show_icons_buttons"] = *it;
-+ else if (it.key() == "gtk-menu-images")
-+ m_settings["show_icons_menus"] = *it;
-+ else if (it.key() == "gtk-primary-button-warps-slider")
-+ m_settings["primary_button_warps_slider"] = *it;
-+ else if (it.key() == "gtk-application-prefer-dark-theme")
-+ m_settings["application_prefer_dark_theme"] = *it;
-+ else
-+ qWarning() << "unknown field" << it.key();
-+ }
-+ } else
-+ qWarning() << "Cannot open the GTK3 config file" << path;
-+
-+ return canRead;
- }
-
- QString AppearanceGTK3::defaultConfigFile() const
-@@ -120,7 +129,7 @@ QString AppearanceGTK3::defaultConfigFile() const
- if(root.isEmpty())
- root = QFileInfo(QDir::home(), ".config").absoluteFilePath();
-
-- return root + '/' + configFileName();
-+ return root+"/gtk-3.0/settings.ini";
- }
-
- bool AppearanceGTK3::getApplicationPreferDarkTheme() const
-@@ -132,29 +141,3 @@ void AppearanceGTK3::setApplicationPreferDarkTheme(const bool& enable)
- {
- m_settings["application_prefer_dark_theme"] = enable ? "true" : "false";
- }
--
--bool AppearanceGTK3::saveSettings(const QString& file) const
--{
-- auto cfg = KSharedConfig::openConfig(file);
-- return saveSettings(cfg);
--}
--
--bool AppearanceGTK3::loadSettings(const QString& path)
--{
-- auto cfg = KSharedConfig::openConfig(path);
-- return loadSettings(cfg);
--}
--
--bool AppearanceGTK3::loadSettings()
--{
-- auto cfg = KSharedConfig::openConfig(configFileName());
-- cfg->setReadDefaults(true);
-- return loadSettings(cfg);
--}
--
--bool AppearanceGTK3::saveSettings() const
--{
-- auto cfg = KSharedConfig::openConfig(configFileName());
-- cfg->setReadDefaults(true);
-- return saveSettings(cfg);
--}
-diff --git a/src/appearancegtk3.h b/src/appearancegtk3.h
-index 3ce5a05..d4562b1 100644
---- a/src/appearancegtk3.h
-+++ b/src/appearancegtk3.h
-@@ -23,7 +23,6 @@
- #ifndef APPEARANCEGTK3_H
- #define APPEARANCEGTK3_H
-
--#include <KSharedConfig>
- #include "abstractappearance.h"
-
- class AppearanceGTK3 : public AbstractAppearance
-@@ -31,18 +30,11 @@ class AppearanceGTK3 : public AbstractAppearance
-
- public:
- QStringList installedThemes() const override;
-- bool saveSettings() const override;
-- bool loadSettings() override;
- bool saveSettings(const QString& file) const override;
- bool loadSettings(const QString& path) override;
-+ QString defaultConfigFile() const override;
- bool getApplicationPreferDarkTheme() const;
- void setApplicationPreferDarkTheme(const bool& enable);
--
--private:
-- QString defaultConfigFile() const;
-- QString configFileName() const;
-- bool saveSettings(const KSharedConfig::Ptr& file) const;
-- bool loadSettings(const KSharedConfig::Ptr& file);
- };
-
- #endif // APPEARANCEGTK3_H
-diff --git a/src/appearencegtk.cpp b/src/appearencegtk.cpp
-index 95a6604..2e26a5a 100644
---- a/src/appearencegtk.cpp
-+++ b/src/appearencegtk.cpp
-@@ -64,7 +64,7 @@ bool AppearenceGTK::loadFileConfig()
- {
- bool correct = false;
- foreach(AbstractAppearance* app, m_app) {
-- bool c = app->loadSettings();
-+ bool c = app->loadSettings(app->defaultConfigFile());
- correct = correct || c;
- }
- // qDebug() << "loading..." << correct;
-@@ -75,7 +75,7 @@ bool AppearenceGTK::saveFileConfig()
- {
- bool correct = true;
- foreach(AbstractAppearance* app, m_app) {
-- bool c = app->saveSettings();
-+ bool c = app->saveSettings(app->defaultConfigFile());
- correct = correct && c;
- }
- // qDebug() << "saving..." << correct;
-diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
-index 151725d..05bf8f1 100644
---- a/tests/CMakeLists.txt
-+++ b/tests/CMakeLists.txt
-@@ -2,7 +2,7 @@ macro(add_kgc_test name)
- add_executable(${name} ${name}.cpp ${ARGV})
- add_test(${name} ${name})
- ecm_mark_as_test(${name})
-- target_link_libraries(${name} Qt5::Core Qt5::Gui Qt5::Test KF5::ConfigCore)
-+ target_link_libraries(${name} Qt5::Core Qt5::Gui Qt5::Test)
- target_include_directories(${name} PRIVATE ${CMAKE_BINARY_DIR})
- endmacro(add_kgc_test)
-
-diff --git a/tests/configsavetest.cpp b/tests/configsavetest.cpp
-index 1fe8f4f..d5d8460 100644
---- a/tests/configsavetest.cpp
-+++ b/tests/configsavetest.cpp
-@@ -9,40 +9,33 @@
-
- QTEST_GUILESS_MAIN(ConfigSaveTest);
-
--ConfigSaveTest::ConfigSaveTest()
--{
-- QStandardPaths::setTestModeEnabled(true);
--}
--
--static void fillValues(QScopedPointer<AbstractAppearance>& a)
-+void ConfigSaveTest::fillValues(AbstractAppearance* a)
- {
- a->setFont("a");
- a->setIcon("a");
- a->setTheme("a");
- a->setToolbarStyle("a");
- a->setIconFallback("a");
-- a->setCursor("a");
- a->setShowIconsInButtons(true);
- a->setShowIconsInMenus(true);
- a->setPrimaryButtonWarpsSlider(true);
-
-- auto a3 = dynamic_cast<AppearanceGTK3*>(a.data());
-+ auto a3 = dynamic_cast<AppearanceGTK3*>(a);
- if (a3) {
- a3->setApplicationPreferDarkTheme(false);
- }
- }
-
--void compareAppearances(QScopedPointer<AbstractAppearance>& reloaded, QScopedPointer<AbstractAppearance>& instance)
-+bool compareAppearances(AbstractAppearance* a, AbstractAppearance* b)
- {
-- QCOMPARE(reloaded->getFont(), instance->getFont());
-- QCOMPARE(reloaded->getIcon(), instance->getIcon());
-- QCOMPARE(reloaded->getTheme(), instance->getTheme());
-- QCOMPARE(reloaded->getCursor(), instance->getCursor());
-- QCOMPARE(reloaded->getToolbarStyle(), instance->getToolbarStyle());
-- QCOMPARE(reloaded->getIconFallback(), instance->getIconFallback());
-- QCOMPARE(reloaded->getShowIconsInButtons(), instance->getShowIconsInButtons());
-- QCOMPARE(reloaded->getShowIconsInMenus(), instance->getShowIconsInMenus());
-- QCOMPARE(reloaded->getPrimaryButtonWarpsSlider(), instance->getPrimaryButtonWarpsSlider());
-+ return a->getFont() == b->getFont()
-+ && a->getIcon() == b->getIcon()
-+ && a->getTheme() == b->getTheme()
-+ && a->getToolbarStyle() == b->getToolbarStyle()
-+ && a->getIconFallback() == b->getIconFallback()
-+ && a->getShowIconsInButtons() == b->getShowIconsInButtons()
-+ && a->getShowIconsInMenus() == b->getShowIconsInMenus()
-+ && a->getPrimaryButtonWarpsSlider() == b->getPrimaryButtonWarpsSlider();
- }
-
- QByteArray readFile(const QString& path)
-@@ -53,35 +46,23 @@ QByteArray readFile(const QString& path)
- return f.readAll();
- }
-
--void ConfigSaveTest::testGtk2()
-+void ConfigSaveTest::testOpen()
- {
-- const QString pathA = QDir::current().absoluteFilePath("test-gtk2")
-- , pathB = QDir::current().absoluteFilePath("testB-gtk2");
--
-- QScopedPointer<AbstractAppearance> instance(new AppearanceGTK2);
-- fillValues(instance);
-- QVERIFY(instance->saveSettings(pathA));
--
-- QScopedPointer<AbstractAppearance> reloaded(new AppearanceGTK2);
-- QVERIFY(reloaded->loadSettings(pathA));
-- compareAppearances(reloaded, instance);
-- QVERIFY(reloaded->saveSettings(pathB));
-- QCOMPARE(readFile(pathA), readFile(pathB));
--}
--
--void ConfigSaveTest::testGtk3()
--{
-- QScopedPointer<AbstractAppearance> instance(new AppearanceGTK3);
-- fillValues(instance);
-- const QString pathA = QDir::current().absoluteFilePath("test-gtk3")
-- , pathB = QDir::current().absoluteFilePath("testB-gtk3");
-- QVERIFY(instance->saveSettings(pathA));
--
-- QScopedPointer<AbstractAppearance> reloaded(new AppearanceGTK3);
-- QVERIFY(QFile::exists(pathA));
-- QVERIFY(reloaded->loadSettings(pathA));
-- compareAppearances(reloaded, instance);
-- QVERIFY(reloaded->saveSettings(pathB));
-+ QVector<AbstractAppearance*> instances;
-+ instances << new AppearanceGTK2 << new AppearanceGTK3;
-+ fillValues(instances[0]);
-+ fillValues(instances[1]);
-+ QVERIFY(instances[0]->saveSettings("test-gtk2"));
-+ QVERIFY(instances[1]->saveSettings("test-gtk3"));
-
-- QCOMPARE(readFile(pathA), readFile(pathB));
-+ QVector<AbstractAppearance*> reloaded;
-+ reloaded << new AppearanceGTK2 << new AppearanceGTK3;
-+ QVERIFY(reloaded[0]->loadSettings("test-gtk2"));
-+ QVERIFY(reloaded[1]->loadSettings("test-gtk3"));
-+ QVERIFY(compareAppearances(reloaded[0], instances[0]));
-+ QVERIFY(compareAppearances(reloaded[1], instances[1]));
-+ QVERIFY(reloaded[0]->saveSettings("testB-gtk2"));
-+ QVERIFY(reloaded[1]->saveSettings("testB-gtk3"));
-+ QCOMPARE(readFile("test-gtk2"), readFile("testB-gtk2"));
-+ QCOMPARE(readFile("test-gtk3"), readFile("testB-gtk3"));
- }
-diff --git a/tests/configsavetest.h b/tests/configsavetest.h
-index 342b408..39fb4c2 100644
---- a/tests/configsavetest.h
-+++ b/tests/configsavetest.h
-@@ -11,11 +11,11 @@ class AbstractAppearance;
- class ConfigSaveTest : public QObject
- {
- Q_OBJECT
--public:
-- ConfigSaveTest();
- private slots:
-- void testGtk2();
-- void testGtk3();
-+ void testOpen();
-+
-+private:
-+ void fillValues(AbstractAppearance* a);
- };
-
- #endif // CONFIGSAVETEST_H
---
-cgit v0.11.2
-
diff --git a/kde/patch/kde-runtime.patch b/kde/patch/kde-runtime.patch
index c3b6101..3201d76 100644
--- a/kde/patch/kde-runtime.patch
+++ b/kde/patch/kde-runtime.patch
@@ -1,10 +1,2 @@
-# Fix KDE bug 324470 - solved in KDE 4.11.2.
-# - Minimize/maximize by clicking taskbar entries requires double click.
-#cat $CWD/patch/kde-runtime/kde-runtime.kdebug324470.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Fix compilation against NetworkManager 1.0.6:
cat $CWD/patch/kde-runtime/kde-runtime_networkmanager.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-## Fix compilation against gpgme 1.7+:
-#cat $CWD/patch/kde-runtime/kde-runtime_gpgme.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-runtime/kde-runtime.kdebug324470.diff b/kde/patch/kde-runtime/kde-runtime.kdebug324470.diff
deleted file mode 100644
index 4269df8..0000000
--- a/kde/patch/kde-runtime/kde-runtime.kdebug324470.diff
+++ /dev/null
@@ -1,49 +0,0 @@
-commit be1a5d484c70f4f6a383150810afbfbb367db2ac
-Author: Eike Hein <hein@kde.org>
-Date: Tue Sep 3 20:29:23 2013 +0200
-
- Discard the recorded events in the item-local handlers.
-
- Solves problems with identical events being ignored due to
- QGraphicsView's reuse of QGraphicsSceneMouseEvent instances.
-
- CCMAIL:rdieter@fedoraproject.org
- BUG:324470
- BUG:324471
-
-diff --git a/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp b/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp
-index b534845..36530e0 100644
---- a/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp
-+++ b/plasma/declarativeimports/qtextracomponents/mouseeventlistener.cpp
-@@ -90,6 +90,7 @@ bool MouseEventListener::containsMouse() const
- void MouseEventListener::mousePressEvent(QGraphicsSceneMouseEvent *me)
- {
- if (m_lastEvent == me) {
-+ m_lastEvent = 0;
- return;
- }
-
-@@ -112,6 +113,7 @@ void MouseEventListener::mousePressEvent(QGraphicsSceneMouseEvent *me)
- void MouseEventListener::mouseMoveEvent(QGraphicsSceneMouseEvent *me)
- {
- if (m_lastEvent == me) {
-+ m_lastEvent = 0;
- return;
- }
-
-@@ -122,6 +124,7 @@ void MouseEventListener::mouseMoveEvent(QGraphicsSceneMouseEvent *me)
- void MouseEventListener::mouseReleaseEvent(QGraphicsSceneMouseEvent *me)
- {
- if (m_lastEvent == me) {
-+ m_lastEvent = 0;
- return;
- }
-
-@@ -138,6 +141,7 @@ void MouseEventListener::mouseReleaseEvent(QGraphicsSceneMouseEvent *me)
- void MouseEventListener::wheelEvent(QGraphicsSceneWheelEvent *we)
- {
- if (m_lastEvent == we) {
-+ m_lastEvent = 0;
- return;
- }
-
diff --git a/kde/patch/kde-runtime/kde-runtime_gpgme.patch b/kde/patch/kde-runtime/kde-runtime_gpgme.patch
deleted file mode 100644
index b1703ed..0000000
--- a/kde/patch/kde-runtime/kde-runtime_gpgme.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-commit 1b80d1d0b961f8e28186928ede2b87af292c3de4
-Author: Antonio Rojas <arojas@archlinux.org>
-Date: Thu Nov 10 16:58:10 2016 +0100
-
- Allow building kwalletd against gpgme++ from gpgme 1.7
-
- REVIEW: 129339
-
-diff --git a/kwalletd/CMakeLists.txt b/kwalletd/CMakeLists.txt
-index 73aec82..ae8c745 100644
---- a/kwalletd/CMakeLists.txt
-+++ b/kwalletd/CMakeLists.txt
-@@ -5,11 +5,18 @@ find_package(Gpgme) # Called by FindQGpgme, but since we call some gpgme
- # functions ourselves we need to link against it directly.
- find_package(QGpgme) # provided by kdepimlibs
-
--if (GPGME_FOUND AND QGPGME_FOUND)
-+if (NOT QGPGME_FOUND)
-+find_package(Gpgmepp) # provided by gpgme 1.7
-+endif (NOT QGPGME_FOUND)
-+
-+if ((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
- add_definitions(-DHAVE_QGPGME)
-- include_directories(${GPGME_INCLUDES} ${QGPGME_INCLUDE_DIR})
-+ include_directories(${GPGME_INCLUDES})
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${KDE4_ENABLE_EXCEPTIONS}")
--endif(GPGME_FOUND AND QGPGME_FOUND)
-+endif((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
-+if (GPGME_FOUND AND QGPGME_FOUND)
-+ include_directories(${QGPGME_INCLUDE_DIR})
-+endif (GPGME_FOUND AND QGPGME_FOUND)
-
- ########### build backends #########
- add_subdirectory(backend)
-@@ -37,7 +44,7 @@ kde4_add_ui_files(kwalletd_KDEINIT_SRCS
- kwalletwizardpagepassword.ui
- )
-
--if (GPGME_FOUND AND QGPGME_FOUND)
-+if ((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
- set(kwalletd_KDEINIT_SRCS
- ${kwalletd_KDEINIT_SRCS}
- knewwalletdialog.cpp
-@@ -48,7 +55,7 @@ if (GPGME_FOUND AND QGPGME_FOUND)
- knewwalletdialogintro.ui
- knewwalletdialoggpg.ui
- )
--endif(GPGME_FOUND AND QGPGME_FOUND)
-+endif((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
-
- find_file(kwallet_xml org.kde.KWallet.xml HINTS ${KDE4_DBUS_INTERFACES_DIR} )
-
-@@ -57,8 +64,12 @@ qt4_add_dbus_adaptor( kwalletd_KDEINIT_SRCS ${kwallet_xml} kwalletd.h KWalletD )
- kde4_add_kdeinit_executable( kwalletd NOGUI ${kwalletd_KDEINIT_SRCS} )
-
- target_link_libraries(kdeinit_kwalletd ${KDE4_KDEUI_LIBS} kwalletbackend )
--if (GPGME_FOUND AND QGPGME_FOUND)
-- target_link_libraries(kdeinit_kwalletd ${QGPGME_LIBRARIES} )
-+if(GPGME_FOUND AND QGPGME_FOUND)
-+target_link_libraries(kdeinit_kwalletd ${QGPGME_LIBRARIES} )
-+else(GPGME_FOUND AND QGPGME_FOUND)
-+if(Gpgmepp_FOUND)
-+target_link_libraries(kdeinit_kwalletd Gpgmepp)
-+endif(Gpgmepp_FOUND)
- endif(GPGME_FOUND AND QGPGME_FOUND)
-
- install(TARGETS kdeinit_kwalletd ${INSTALL_TARGETS_DEFAULT_ARGS})
-@@ -73,4 +84,4 @@ install( FILES kwalletd.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kwalletd )
- install( FILES kwallet-4.13.upd DESTINATION ${DATA_INSTALL_DIR}/kconf_update)
-
- add_subdirectory(tests)
--add_subdirectory(autotests)
-\ No newline at end of file
-+add_subdirectory(autotests)
-diff --git a/kwalletd/backend/CMakeLists.txt b/kwalletd/backend/CMakeLists.txt
-index 4db348f..7347b12 100644
---- a/kwalletd/backend/CMakeLists.txt
-+++ b/kwalletd/backend/CMakeLists.txt
-@@ -22,6 +22,10 @@ kde4_add_library(kwalletbackend SHARED ${kwalletbackend_LIB_SRCS})
- target_link_libraries(kwalletbackend ${KDE4_KDEUI_LIBS} ${LIBGCRYPT_LIBRARIES})
- if(QGPGME_FOUND)
- target_link_libraries(kwalletbackend ${QGPGME_LIBRARIES} )
-+else(QGPGME_FOUND)
-+if(Gpgmepp_FOUND)
-+target_link_libraries(kwalletbackend Gpgmepp)
-+endif(Gpgmepp_FOUND)
- endif(QGPGME_FOUND)
-
- # link with advapi32 on windows
-diff --git a/kwalletd/backend/backendpersisthandler.cpp b/kwalletd/backend/backendpersisthandler.cpp
-index b7f63f8..9608af0 100644
---- a/kwalletd/backend/backendpersisthandler.cpp
-+++ b/kwalletd/backend/backendpersisthandler.cpp
-@@ -33,6 +33,7 @@
- #include <gpgme++/data.h>
- #include <gpgme++/encryptionresult.h>
- #include <gpgme++/decryptionresult.h>
-+#include <boost/shared_ptr.hpp>
- #endif
- #include "backendpersisthandler.h"
- #include "kwalletbackend.h"
-diff --git a/kwalletd/kwalletwizard.cpp b/kwalletd/kwalletwizard.cpp
-index 78de78d..821b666 100644
---- a/kwalletd/kwalletwizard.cpp
-+++ b/kwalletd/kwalletwizard.cpp
-@@ -40,6 +40,7 @@
- #include <kdebug.h>
- #include <kmessagebox.h>
- #include <gpgme.h>
-+#include <boost/shared_ptr.hpp>
- #endif
-
- class PageIntro : public QWizardPage
-commit cf28801cd34730da07a2c01704ca3114630f4fe7
-Author: Antonio Rojas <arojas@archlinux.org>
-Date: Thu Nov 10 18:54:41 2016 +0100
-
- Compiling against gmgpe 1.7 requires c++11
-
-diff --git a/kwalletd/CMakeLists.txt b/kwalletd/CMakeLists.txt
-index ae8c745..88d944e 100644
---- a/kwalletd/CMakeLists.txt
-+++ b/kwalletd/CMakeLists.txt
-@@ -17,6 +17,9 @@ endif((GPGME_FOUND AND QGPGME_FOUND) OR Gpgmepp_FOUND)
- if (GPGME_FOUND AND QGPGME_FOUND)
- include_directories(${QGPGME_INCLUDE_DIR})
- endif (GPGME_FOUND AND QGPGME_FOUND)
-+if (Gpgmepp_FOUND)
-+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
-+endif (Gpgmepp_FOUND)
-
- ########### build backends #########
- add_subdirectory(backend)
diff --git a/kde/patch/kde-workspace.patch b/kde/patch/kde-workspace.patch
index 4a355d1..bebecfe 100644
--- a/kde/patch/kde-workspace.patch
+++ b/kde/patch/kde-workspace.patch
@@ -4,9 +4,5 @@ cat $CWD/patch/kde-workspace/kde-workspace.kdm.server.timeout.diff | patch -p1 -
# Always show 'remaining time' in the popup of the battery plasmoid:
cat $CWD/patch/kde-workspace/kde-workspace.batteryapplet.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-# Fix crash when DesktopNames isn't set (fixed in 4.11.10):
-#cat $CWD/patch/kde-workspace/kde-workspace.desktopnames.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# In Plasma 5 we do not need the Plasma 4 core apps, they conflict.
cat $CWD/patch/kde-workspace/kde-workspace.no.plasma4.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kde-workspace/kde-workspace.desktopnames.diff b/kde/patch/kde-workspace/kde-workspace.desktopnames.diff
deleted file mode 100644
index 59aef1c..0000000
--- a/kde/patch/kde-workspace/kde-workspace.desktopnames.diff
+++ /dev/null
@@ -1,34 +0,0 @@
-commit e1724800ecf3c6a7035dfa7bcaa50b2a8f48688f
-Author: David Faure <faure@kde.org>
-Date: Fri May 2 10:26:38 2014 +0200
-
- Fix crash when DesktopNames isn't set
-
- BUG: 334159
- FIXED-IN: 4.11.10
-
-diff --git a/kdm/backend/client.c b/kdm/backend/client.c
-index 335cc3e..a2d06c2 100644
---- a/kdm/backend/client.c
-+++ b/kdm/backend/client.c
-@@ -1810,12 +1810,14 @@ startClient(volatile int *pid)
- !(sessargs = iniEntry(str, "Desktop Entry", "Exec", 0)))
- sessargs = "";
- buf = iniEntry(str, "Desktop Entry", "DesktopNames", 0);
-- for (buf2 = buf; *buf2; ++buf2) {
-- if (*buf2 == ';')
-- *buf2 = ':';
-+ if (buf) {
-+ for (buf2 = buf; *buf2; ++buf2) {
-+ if (*buf2 == ';')
-+ *buf2 = ':';
-+ }
-+ userEnviron = setEnv(userEnviron, "XDG_CURRENT_DESKTOP", buf);
-+ free(buf);
- }
-- userEnviron = setEnv(userEnviron, "XDG_CURRENT_DESKTOP", buf);
-- free(buf);
- free(str);
- free(fname);
- goto gotit;
-
diff --git a/kde/patch/kdeconnect-kde.patch b/kde/patch/kdeconnect-kde.patch
index 47f98f5..122440d 100644
--- a/kde/patch/kdeconnect-kde.patch
+++ b/kde/patch/kdeconnect-kde.patch
@@ -1,3 +1,2 @@
# Fix remote device browsing with openssh 8.2:
cat $CWD/patch/kdeconnect-kde/kdeconnect-kde_openssh-8.2.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdelibs.patch b/kde/patch/kdelibs.patch
index 44e201e..4f1fc45 100644
--- a/kde/patch/kdelibs.patch
+++ b/kde/patch/kdelibs.patch
@@ -25,3 +25,6 @@ cat $CWD/patch/kdelibs/kdelibs.2c3762feddf7e66cf6b64d9058f625a715694a00.patch |
# Support TLS v1.1 and TLS v1.2:
cat $CWD/patch/kdelibs/kde4libs-4.14.26.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+
+# Fix for the relocated grantlee-qt4 includes:
+cat $CWD/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/kdelibs/fixbic-4.14.6.patch b/kde/patch/kdelibs/fixbic-4.14.6.patch
deleted file mode 100644
index 585ce51..0000000
--- a/kde/patch/kdelibs/fixbic-4.14.6.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-diff --git a/khtml/dom/dom_string.h b/khtml/dom/dom_string.h
-index 087f697..b269213 100644
---- a/khtml/dom/dom_string.h
-+++ b/khtml/dom/dom_string.h
-@@ -124,10 +124,23 @@ public:
- bool endsWith(const DOMString& str) const;
- bool startsWith(const DOMString& str) const;
-
-- // http://www.w3.org/TR/html/infrastructure.html#urls
-+ /**
-+ * Return a parsed url.
-+ * Used to parse SRC url attribute,
-+ * see http://www.w3.org/TR/html/infrastructure.html#urls
-+ *
-+ * @since 4.14.6
-+ */
- DOMString parsedUrl() const;
-
- /**
-+ * @deprecated, use parsedUrl()
-+ */
-+#ifndef KDE_NO_DEPRECATED
-+ KDE_DEPRECATED DOMString trimSpaces() const;
-+#endif
-+
-+ /**
- * @internal get a handle to the imlementation of the DOMString
- * Use at own risk!!!
- */
-diff --git a/khtml/dom/dom_string.cpp b/khtml/dom/dom_string.cpp
-index a3c4abd..4da676b 100644
---- a/khtml/dom/dom_string.cpp
-+++ b/khtml/dom/dom_string.cpp
-@@ -336,6 +336,13 @@ DOMString DOMString::parsedUrl() const
- return out;
- }
-
-+#ifndef KDE_NO_DEPRECATED
-+DOMString DOMString::trimSpaces() const
-+{
-+ return parsedUrl();
-+}
-+#endif
-+
- // ------------------------------------------------------------------------
-
- bool DOM::strcasecmp( const DOMString &as, const DOMString &bs )
diff --git a/kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch b/kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch
new file mode 100644
index 0000000..fd7375f
--- /dev/null
+++ b/kde/patch/kdelibs/kdelibs.grantlee-qt4.include.path.patch
@@ -0,0 +1,11 @@
+--- ./kdeui/tests/proxymodeltestsuite/modeleventlogger.cpp.orig 2017-11-04 20:51:22.000000000 -0500
++++ ./kdeui/tests/proxymodeltestsuite/modeleventlogger.cpp 2020-07-12 14:19:32.175099684 -0500
+@@ -30,7 +30,7 @@
+ #include <QDebug>
+
+ #ifdef Grantlee_FOUND
+-#include <grantlee_core.h>
++#include <grantlee-qt4/grantlee_core.h>
+ #include "grantlee_paths.h"
+
+ /**
diff --git a/kde/patch/kdelibs4support.patch b/kde/patch/kdelibs4support.patch
index 8e9fe7b..7d6626e 100644
--- a/kde/patch/kdelibs4support.patch
+++ b/kde/patch/kdelibs4support.patch
@@ -1,6 +1,2 @@
-# Make FindGettext compatible with the one provided by CMake:
-# Fixed in 5.1.0.
-#cat $CWD/patch/kdelibs4support/update-FindGettext.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Allow cmake to find our doctools:
cat $CWD/patch/kdelibs4support/FindDocBookXML4.cmake.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/kdelibs4support/update-FindGettext.patch b/kde/patch/kdelibs4support/update-FindGettext.patch
deleted file mode 100644
index 1b75cd8..0000000
--- a/kde/patch/kdelibs4support/update-FindGettext.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From: Alex Merry <alex.merry@kde.org>
-Date: Fri, 04 Jul 2014 10:10:27 +0000
-Subject: Make FindGettext compatible with the one provided by CMake
-X-Git-Url: http://quickgit.kde.org/?p=kdelibs4support.git&a=commitdiff&h=581ee6b370d8b5627196c8d6d8760d3655f6daea
----
-Make FindGettext compatible with the one provided by CMake
-
-This version will accept the old GETTEXT_PROCESS_PO_FILES() syntax (no
-PO_FILES argument), but will also accept the new syntax required by
-CMake's version of this file. It will also warn when PO_FILES is not
-given.
-
-REVIEW: 119111
----
-
-
---- a/cmake/modules/FindGettext.cmake
-+++ b/cmake/modules/FindGettext.cmake
-@@ -212,7 +212,16 @@
- LIST(REMOVE_AT _args 0 1)
- ENDIF("${_tmp}" STREQUAL "INSTALL_DESTINATION")
-
--# message(STATUS "2 all ${_addToAll} dest ${_installDest} args: ${_args}")
-+ LIST(GET _args 0 _tmp)
-+ IF("${_tmp}" STREQUAL "PO_FILES")
-+ LIST(REMOVE_AT _args 0)
-+ ELSE()
-+ SET(_deprecation_arg DEPRECATION)
-+ IF(CMAKE_VERSION VERSION_LESS 3.0.0)
-+ SET(_deprecation_arg AUTHOR_WARNING)
-+ ENDIF()
-+ MESSAGE(${_deprecation_arg} "GETTEXT_PROCESS_PO_FILES without a PO_FILES argument is deprecated")
-+ ENDIF()
-
- FOREACH(_current_PO_FILE ${_args})
- GET_FILENAME_COMPONENT(_name ${_current_PO_FILE} NAME)
diff --git a/kde/patch/kdenlive.patch b/kde/patch/kdenlive.patch
deleted file mode 100644
index 9065c4d..0000000
--- a/kde/patch/kdenlive.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix compilation with gcc7.
-# Should have been fixed in 17.04.2...
-#cat $CWD/patch/kdenlive/kdenlive_gcc7.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdenlive/kdenlive_gcc7.patch b/kde/patch/kdenlive/kdenlive_gcc7.patch
deleted file mode 100644
index a7ddb90..0000000
--- a/kde/patch/kdenlive/kdenlive_gcc7.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-# Make kdenlive compile with gcc7
-
---- kdenlive-17.04.1/src/profiles/tree/profiletreemodel.cpp.orig 2017-05-08 19:52:35.000000000 +0200
-+++ kdenlive-17.04.1/src/profiles/tree/profiletreemodel.cpp 2017-05-19 08:09:04.986909338 +0200
-@@ -27,6 +27,7 @@
- #include <QVector>
- #include <array>
- #include <KLocalizedString>
-+#include <functional>
-
-
- class ProfileItem
---- kdenlive-17.04.1/src/scopes/audioscopes/spectrogram.cpp.orig 2017-05-08 19:52:35.000000000 +0200
-+++ kdenlive-17.04.1/src/scopes/audioscopes/spectrogram.cpp 2017-05-19 08:09:04.993910503 +0200
-@@ -241,7 +241,7 @@
- x = leftDist + (m_innerScopeRect.width() - 1) * ((float)hz) / m_freqMax;
-
- // Hide text if it would overlap with the text drawn at the mouse position
-- hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - (leftDist + mouseX + 20)) < (int) minDistX + 16
-+ hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - ((int)leftDist + mouseX + 20)) < (int) minDistX + 16
- && mouseX < m_innerScopeRect.width() && mouseX >= 0;
-
- if (x <= rightBorder) {
-@@ -268,7 +268,7 @@
- }
- // Draw the line at the very right (maximum frequency)
- x = leftDist + m_innerScopeRect.width() - 1;
-- hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - (leftDist + mouseX + 30)) < (int) minDistX
-+ hideText = m_aTrackMouse->isChecked() && m_mouseWithinWidget && abs(x - ((int)leftDist + mouseX + 30)) < (int) minDistX
- && mouseX < m_innerScopeRect.width() && mouseX >= 0;
- davinci.drawLine(x, topDist, x, topDist + m_innerScopeRect.height() + 6);
- if (!hideText) {
diff --git a/kde/patch/kdepim.patch b/kde/patch/kdepim.patch
deleted file mode 100644
index c5aeb9c..0000000
--- a/kde/patch/kdepim.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Install Kleopatra headers, needed by kopete-cryptography:
-# This used to be fixed?
-#cat $CWD/patch/kdepim/kdepim-install_kleopatra_headers.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdepim/kdepim-install_kleopatra_headers.patch b/kde/patch/kdepim/kdepim-install_kleopatra_headers.patch
deleted file mode 100644
index 18662fd..0000000
--- a/kde/patch/kdepim/kdepim-install_kleopatra_headers.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-diff -uarN kdepim-15.08.0.orig/kleopatra/libkleopatraclient/CMakeLists.txt kdepim-15.08.0/kleopatra/libkleopatraclient/CMakeLists.txt
---- kdepim-15.08.0.orig/kleopatra/libkleopatraclient/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/kleopatra/libkleopatraclient/CMakeLists.txt 2015-08-24 23:05:07.650076668 +0200
-@@ -4,6 +4,11 @@
- add_subdirectory(core)
- add_subdirectory(gui)
-
-+install(
-+ FILES kleopatraclient_export.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/libkleopatraclient
-+ )
-+
- if(BUILD_TESTING)
- add_subdirectory(tests)
- endif()
-diff -uarN kdepim-15.08.0.orig/kleopatra/libkleopatraclient/core/CMakeLists.txt kdepim-15.08.0/kleopatra/libkleopatraclient/core/CMakeLists.txt
---- kdepim-15.08.0.orig/kleopatra/libkleopatraclient/core/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/kleopatra/libkleopatraclient/core/CMakeLists.txt 2015-08-24 22:52:15.613045160 +0200
-@@ -67,3 +67,13 @@
- target_link_libraries(kleopatraclientcore Qt5::Widgets KF5::I18n)
-
- install(TARGETS kleopatraclientcore ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-+
-+install(
-+ FILES
-+ initialization.h
-+ command.h
-+ selectcertificatecommand.h
-+ signencryptfilescommand.h
-+ decryptverifyfilescommand.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/libkleopatraclient/core
-+ )
-diff -uarN kdepim-15.08.0.orig/kleopatra/libkleopatraclient/gui/CMakeLists.txt kdepim-15.08.0/kleopatra/libkleopatraclient/gui/CMakeLists.txt
---- kdepim-15.08.0.orig/kleopatra/libkleopatraclient/gui/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/kleopatra/libkleopatraclient/gui/CMakeLists.txt 2015-08-24 22:52:15.613045160 +0200
-@@ -16,3 +16,9 @@
- )
-
- install(TARGETS kleopatraclientgui ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-+
-+install(
-+ FILES
-+ certificaterequester.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/libkleopatraclient/gui
-+ )
-diff -uarN kdepim-15.08.0.orig/libkleo/CMakeLists.txt kdepim-15.08.0/libkleo/CMakeLists.txt
---- kdepim-15.08.0.orig/libkleo/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/libkleo/CMakeLists.txt 2015-08-24 22:52:15.613045160 +0200
-@@ -126,3 +126,61 @@
- else ()
- install ( FILES libkleopatrarc.desktop DESTINATION ${KDE_INSTALL_CONFDIR} RENAME libkleopatrarc )
- endif ()
-+
-+install( FILES
-+ kleo/kleo_export.h
-+ kleo/enum.h
-+ kleo/oidmap.h
-+ kleo/cryptobackend.h
-+ kleo/cryptobackendfactory.h
-+ kleo/cryptoconfig.h
-+ kleo/dn.h
-+ kleo/job.h
-+ kleo/keylistjob.h
-+ kleo/keygenerationjob.h
-+ kleo/abstractimportjob.h
-+ kleo/importjob.h
-+ kleo/importfromkeyserverjob.h
-+ kleo/exportjob.h
-+ kleo/changeexpiryjob.h
-+ kleo/changeownertrustjob.h
-+ kleo/downloadjob.h
-+ kleo/deletejob.h
-+ kleo/encryptjob.h
-+ kleo/decryptjob.h
-+ kleo/signjob.h
-+ kleo/specialjob.h
-+ kleo/verifydetachedjob.h
-+ kleo/verifyopaquejob.h
-+ kleo/decryptverifyjob.h
-+ kleo/signencryptjob.h
-+ kleo/signkeyjob.h
-+ kleo/adduseridjob.h
-+ kleo/refreshkeysjob.h
-+ kleo/multideletejob.h
-+ kleo/hierarchicalkeylistjob.h
-+ kleo/keyfilter.h
-+ kleo/keyfiltermanager.h
-+ kleo/changepasswdjob.h
-+ kleo/checksumdefinition.h
-+ kleo/exception.h
-+ kleo/kconfigbasedkeyfilter.h
-+ kleo/listallkeysjob.h
-+ kleo/stl_util.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/kleo COMPONENT Devel)
-+
-+install ( FILES
-+ ui/kdhorizontalline.h
-+ ui/messagebox.h
-+ ui/progressbar.h
-+ ui/progressdialog.h
-+ ui/keylistview.h
-+ ui/keyselectiondialog.h
-+ ui/keyrequester.h
-+ ui/keyapprovaldialog.h
-+ ui/dnattributeorderconfigwidget.h
-+ ui/cryptoconfigmodule.h
-+ ui/cryptoconfigdialog.h
-+ ui/directoryserviceswidget.h
-+ ui/filenamerequester.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/kleo/ui COMPONENT Devel)
-diff -uarN kdepim-15.08.0.orig/libkpgp/CMakeLists.txt kdepim-15.08.0/libkpgp/CMakeLists.txt
---- kdepim-15.08.0.orig/libkpgp/CMakeLists.txt 2015-08-10 21:56:00.000000000 +0200
-+++ kdepim-15.08.0/libkpgp/CMakeLists.txt 2015-08-24 23:04:02.505074051 +0200
-@@ -44,6 +44,15 @@
- set_target_properties(kpgp PROPERTIES VERSION ${KDEPIM_LIB_VERSION} SOVERSION ${KDEPIM_LIB_SOVERSION})
- install(TARGETS kpgp ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-
-+install(FILES
-+ kpgp.h
-+ kpgpbase.h
-+ kpgpblock.h
-+ kpgpkey.h
-+ kpgpui.h
-+ libkpgp_export.h
-+ DESTINATION ${INCLUDE_INSTALL_DIR}/kpgp COMPONENT Devel )
-+
- if(BUILD_TESTING)
- add_subdirectory( tests )
- endif()
diff --git a/kde/patch/kdepimlibs.patch b/kde/patch/kdepimlibs.patch
deleted file mode 100644
index 05e5dfe..0000000
--- a/kde/patch/kdepimlibs.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix a crash in kmail (fixed in 15.12.1):
-#cat $CWD/patch/kdepimlibs/kdepimlibs_kmail_crash.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch b/kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch
deleted file mode 100644
index 1614e07..0000000
--- a/kde/patch/kdepimlibs/kdepimlibs_kmail_crash.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From: Weng Xuetian <wengxt@gmail.com>
-Date: Thu, 17 Dec 2015 16:19:36 +0000
-Subject: Fix possible crash upon application exits (e.g. kmail)
-X-Git-Url: http://quickgit.kde.org/?p=kdepimlibs.git&a=commitdiff&h=c6bf33a9018587e96a350bfd0b2bffde1859db27
----
-Fix possible crash upon application exits (e.g. kmail)
-
-Qt lambda connection will not automatically disconnect if no context
-qobject is provided. Since SessionPrivate is not a qobject, disconnect
-the connection in the destructor to prevent accessing deleted object.
-
-REVIEW: 126395
----
-
-
---- a/akonadi/src/core/session.cpp
-+++ b/akonadi/src/core/session.cpp
-@@ -301,15 +301,16 @@
- // Shutdown the thread before QApplication event loop quits - the
- // thread()->wait() mechanism in ConnectionThread dtor crashes sometimes
- // when called from QApplication destructor
-- QObject::connect(qApp, &QCoreApplication::aboutToQuit,
-- [this]() {
-- delete connThread;
-- connThread = Q_NULLPTR;
-- });
-+ connThreadCleanUp = QObject::connect(qApp, &QCoreApplication::aboutToQuit,
-+ [this]() {
-+ delete connThread;
-+ connThread = Q_NULLPTR;
-+ });
- }
-
- SessionPrivate::~SessionPrivate()
- {
-+ QObject::disconnect(connThreadCleanUp);
- delete connThread;
- }
-
-
---- a/akonadi/src/core/session_p.h
-+++ b/akonadi/src/core/session_p.h
-@@ -29,6 +29,7 @@
-
- #include <QtCore/QQueue>
- #include <QtCore/QThreadStorage>
-+#include <QtCore/QMetaObject>
- #include <QFile>
-
- class QIODevice;
-@@ -125,6 +126,7 @@
- Session *mParent;
- QThread *thread;
- ConnectionThread *connThread;
-+ QMetaObject::Connection connThreadCleanUp;
- QByteArray sessionId;
- bool connected;
- qint64 theNextTag;
-
diff --git a/kde/patch/kdepimlibs4.patch b/kde/patch/kdepimlibs4.patch
deleted file mode 100644
index 91a7d15..0000000
--- a/kde/patch/kdepimlibs4.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix a compilation issue with new libical:
-cat $CWD/patch/kdepimlibs4/kdepimlibs.libical3.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdepimlibs4/kdepimlibs.libical3.diff b/kde/patch/kdepimlibs4/kdepimlibs.libical3.diff
deleted file mode 100644
index c3b8caf..0000000
--- a/kde/patch/kdepimlibs4/kdepimlibs.libical3.diff
+++ /dev/null
@@ -1,184 +0,0 @@
---- ./kcalcore/icalformat_p.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcalcore/icalformat_p.cpp 2017-12-05 23:03:44.742261940 -0600
-@@ -2301,7 +2301,6 @@
- t.second = 0;
-
- t.is_date = 1;
-- t.is_utc = 0;
- t.zone = 0;
-
- return t;
-@@ -2322,8 +2321,7 @@
- t.minute = datetime.time().minute();
- t.second = datetime.time().second();
- }
-- t.zone = 0; // zone is NOT set
-- t.is_utc = datetime.isUtc() ? 1 : 0;
-+ t.zone = datetime.isUtc() ? icaltimezone_get_utc_timezone() : 0; // zone is NOT set
-
- // _dumpIcaltime( t );
-
-@@ -2398,7 +2396,7 @@
- }
-
- KTimeZone ktz;
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc( t )) {
- ktz = dt.timeZone();
- }
-
-@@ -2431,7 +2429,7 @@
- // _dumpIcaltime( t );
-
- KDateTime::Spec timeSpec;
-- if (t.is_utc || t.zone == icaltimezone_get_utc_timezone()) {
-+ if (icaltime_is_utc( t ) || t.zone == icaltimezone_get_utc_timezone()) {
- timeSpec = KDateTime::UTC; // the time zone is UTC
- utc = false; // no need to convert to UTC
- } else {
---- ./kcalcore/icaltimezones.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcalcore/icaltimezones.cpp 2017-12-05 23:03:55.482262829 -0600
-@@ -54,7 +54,7 @@
- {
- return QDateTime(QDate(t.year, t.month, t.day),
- QTime(t.hour, t.minute, t.second),
-- (t.is_utc ? Qt::UTC : Qt::LocalTime));
-+ (icaltime_is_utc( t ) ? Qt::UTC : Qt::LocalTime));
- }
-
- // Maximum date for time zone data.
-@@ -81,7 +81,6 @@
- t.second = local.time().second();
- t.is_date = 0;
- t.zone = 0;
-- t.is_utc = 0;
- return t;
- }
-
-@@ -886,7 +885,7 @@
- case ICAL_LASTMODIFIED_PROPERTY:
- {
- const icaltimetype t = icalproperty_get_lastmodified(p);
-- if (t.is_utc) {
-+ if (icaltime_is_utc( t )) {
- data->d->lastModified = toQDateTime(t);
- } else {
- kDebug() << "LAST-MODIFIED not UTC";
-@@ -1259,7 +1258,7 @@
- // Convert DTSTART to QDateTime, and from local time to UTC
- const QDateTime localStart = toQDateTime(dtstart); // local time
- dtstart.second -= prevOffset;
-- dtstart.is_utc = 1;
-+ dtstart.zone = icaltimezone_get_utc_timezone();
- const QDateTime utcStart = toQDateTime(icaltime_normalize(dtstart)); // UTC
-
- transitions += utcStart;
-@@ -1286,13 +1285,13 @@
- t.minute = dtstart.minute;
- t.second = dtstart.second;
- t.is_date = 0;
-- t.is_utc = 0; // dtstart is in local time
-+ t.zone = 0; // dtstart is in local time
- }
- // RFC2445 states that RDATE must be in local time,
- // but we support UTC as well to be safe.
-- if (!t.is_utc) {
-+ if (!icaltime_is_utc( t )) {
- t.second -= prevOffset; // convert to UTC
-- t.is_utc = 1;
-+ t.zone = icaltimezone_get_utc_timezone();
- t = icaltime_normalize(t);
- }
- transitions += toQDateTime(t);
---- ./kcal/icalformat_p.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcal/icalformat_p.cpp 2017-12-05 23:04:01.670263342 -0600
-@@ -2087,7 +2087,6 @@
- t.second = 0;
-
- t.is_date = 1;
-- t.is_utc = 0;
- t.zone = 0;
-
- return t;
-@@ -2106,8 +2105,7 @@
- t.second = datetime.time().second();
-
- t.is_date = 0;
-- t.zone = 0; // zone is NOT set
-- t.is_utc = datetime.isUtc() ? 1 : 0;
-+ t.zone = datetime.isUtc() ? icaltimezone_get_utc_timezone() : 0;
-
- // _dumpIcaltime( t );
-
-@@ -2174,7 +2172,7 @@
- }
-
- KTimeZone ktz;
-- if ( !t.is_utc ) {
-+ if ( !icaltime_is_utc( t ) ) {
- ktz = dt.timeZone();
- }
-
-@@ -2207,7 +2205,7 @@
- // _dumpIcaltime( t );
-
- KDateTime::Spec timeSpec;
-- if ( t.is_utc || t.zone == icaltimezone_get_utc_timezone() ) {
-+ if ( icaltime_is_utc( t ) || t.zone == icaltimezone_get_utc_timezone() ) {
- timeSpec = KDateTime::UTC; // the time zone is UTC
- utc = false; // no need to convert to UTC
- } else {
---- ./kcal/icaltimezones.cpp.orig 2015-06-24 07:43:14.000000000 -0500
-+++ ./kcal/icaltimezones.cpp 2017-12-05 23:04:07.385263815 -0600
-@@ -50,7 +50,7 @@
- {
- return QDateTime( QDate( t.year, t.month, t.day ),
- QTime( t.hour, t.minute, t.second ),
-- ( t.is_utc ? Qt::UTC : Qt::LocalTime ) );
-+ ( icaltime_is_utc( t ) ? Qt::UTC : Qt::LocalTime ) );
- }
-
- // Maximum date for time zone data.
-@@ -77,7 +77,6 @@
- t.second = local.time().second();
- t.is_date = 0;
- t.zone = 0;
-- t.is_utc = 0;
- return t;
- }
-
-@@ -787,7 +786,7 @@
- case ICAL_LASTMODIFIED_PROPERTY:
- {
- icaltimetype t = icalproperty_get_lastmodified(p);
-- if ( t.is_utc ) {
-+ if ( icaltime_is_utc( t ) ) {
- data->d->lastModified = toQDateTime( t );
- } else {
- kDebug() << "LAST-MODIFIED not UTC";
-@@ -972,7 +971,7 @@
- // Convert DTSTART to QDateTime, and from local time to UTC
- QDateTime localStart = toQDateTime( dtstart ); // local time
- dtstart.second -= prevOffset;
-- dtstart.is_utc = 1;
-+ dtstart.zone = icaltimezone_get_utc_timezone();
- QDateTime utcStart = toQDateTime( icaltime_normalize( dtstart ) ); // UTC
-
- transitions += utcStart;
-@@ -999,13 +998,13 @@
- t.minute = dtstart.minute;
- t.second = dtstart.second;
- t.is_date = 0;
-- t.is_utc = 0; // dtstart is in local time
-+ t.zone = 0; // dtstart is in local time
- }
- // RFC2445 states that RDATE must be in local time,
- // but we support UTC as well to be safe.
-- if ( !t.is_utc ) {
-+ if ( !icaltime_is_utc( t ) ) {
- t.second -= prevOffset; // convert to UTC
-- t.is_utc = 1;
-+ t.zone = icaltimezone_get_utc_timezone();
- t = icaltime_normalize( t );
- }
- transitions += toQDateTime( t );
diff --git a/kde/patch/kdeplasma-addons.patch b/kde/patch/kdeplasma-addons.patch
deleted file mode 100644
index 8c997b2..0000000
--- a/kde/patch/kdeplasma-addons.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# CVE 2013-2120: paste widget "password" generator uses insecure randomness:
-# Fixed in KDE 4.11.
-#cat $CWD/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch b/kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch
deleted file mode 100644
index 7a394a5..0000000
--- a/kde/patch/kdeplasma-addons/random_generator_cve-2013-2120.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Aaron Seigo <aseigo@kde.org>
-Date: Mon, 03 Jun 2013 17:16:32 +0000
-Subject: use KRandom, avoid modulo bias
-X-Git-Url: http://quickgit.kde.org/?p=kdeplasma-addons.git&a=commitdiff&h=36a1fe49cb70f717c4a6e9eeee2c9186503a8dce
----
-use KRandom, avoid modulo bias
----
-
-
---- a/applets/paste/pastemacroexpander.cpp
-+++ b/applets/paste/pastemacroexpander.cpp
-@@ -27,6 +27,7 @@
- #include <KDebug>
- #include <KLocale>
- #include <KMessageBox>
-+#include <KRandom>
-
- class PasteMacroExpanderSingleton
- {
-@@ -142,35 +143,49 @@
- << "01234567890"
- << "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
-
-- int charCount;
-+ int charCount = 8;
- QString chars;
- QString result;
-
- if (a.count() > 0) {
-- charCount = qMax(a[0].trimmed().toInt(), 1);
-- } else {
-- charCount = 8;
-+ charCount = qMax(a[0].trimmed().toInt(), 8);
- }
-+
- if (a.count() < 2) {
- chars = characterSets.join("");
- }
-+
- if (a.count() > 1) {
- chars += (a[1].trimmed() == "true") ? characterSets[0] : "";
- }
-+
- if (a.count() > 2) {
- chars += (a[2].trimmed() == "true") ? characterSets[1] : "";
- }
-+
- if (a.count() > 3) {
- chars += (a[3].trimmed() == "true") ? characterSets[2] : "";
- }
-+
- if (a.count() > 4) {
- chars += (a[4].trimmed() == "true") ? characterSets[3] : "";
- }
-
-- QDateTime now = QDateTime::currentDateTime();
-- qsrand(now.toTime_t() / now.time().msec());
-+ const int setSize = chars.count();
-+ const int top = (RAND_MAX / setSize) * setSize;
-+ kDebug() << "topping out at " << setSize << RAND_MAX << top;
- for (int i = 0; i < charCount; ++i) {
-- result += chars[qrand() % chars.count()];
-+ // to prevent modulo bias, discard random numbers at the
-+ // 'top end' of INT_MAX
-+ int rand = -1;
-+ do {
-+ if (rand > 0) {
-+ kDebug() << "Ha!" << rand;
-+ }
-+ rand = KRandom::random();
-+ } while (rand >= top);
-+
-+ result += chars[rand % setSize];
- }
- //kDebug() << result;
- return result;
diff --git a/kde/patch/kdesdk-kioslaves.patch b/kde/patch/kdesdk-kioslaves.patch
deleted file mode 100644
index da2f885..0000000
--- a/kde/patch/kdesdk-kioslaves.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix compilation against svn > 1.8.
-#cat $CWD/patch/kdesdk-kioslaves/svn19.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdesdk-kioslaves/svn19.patch b/kde/patch/kdesdk-kioslaves/svn19.patch
deleted file mode 100644
index dbd057d..0000000
--- a/kde/patch/kdesdk-kioslaves/svn19.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-Subversion 1.9 and more recent versions have removed some interfaces, which
-the Subversion developers consider to serve only svn-internal purposes, from
-the header files installed by the package.
-
-The following patch (orignally from pkgsrc) provides an own sort mechanism
-to replace the no longer available svn_sort__hash functionality.
-
---- kdesdk-kioslaves-15.08.3/svn/svn.cpp.orig 2015-09-20 17:51:35.000000000 +0000
-+++ kdesdk-kioslaves-15.08.3/svn/svn.cpp
-@@ -54,6 +54,8 @@
- #include "svn.h"
- #include <apr_portable.h>
-
-+#include <algorithm>
-+
- using namespace KIO;
-
- typedef struct
-@@ -107,11 +109,6 @@ static svn_error_t *write_to_string(void
- return SVN_NO_ERROR;
- }
-
--static int
--compare_items_as_paths (const svn_sort__item_t*a, const svn_sort__item_t*b) {
-- return svn_path_compare_paths ((const char *)a->key, (const char *)b->key);
--}
--
- kio_svnProtocol::kio_svnProtocol(const QByteArray &pool_socket, const QByteArray &app_socket)
- : SlaveBase("kio_svn", pool_socket, app_socket) {
- kDebug(7128) << "kio_svnProtocol::kio_svnProtocol()";
-@@ -515,6 +512,11 @@ void kio_svnProtocol::stat(const KUrl &
- svn_pool_destroy( subpool );
- }
-
-+static bool
-+sort_by_path(const std::pair<const char *, svn_dirent_t *> &a, const std::pair<const char *, svn_dirent_t *> &b) {
-+ return svn_path_compare_paths(a.first, b.first) < 0;
-+}
-+
- void kio_svnProtocol::listDir(const KUrl& url) {
- kDebug(7128) << "kio_svn::listDir(const KUrl& url) : " << url.url();
-
-@@ -547,23 +549,23 @@ void kio_svnProtocol::listDir(const KUrl
- return;
- }
-
-- apr_array_header_t *array;
-- int i;
--
-- array = svn_sort__hash (dirents, compare_items_as_paths, subpool);
-+ std::vector<std::pair<const char *, svn_dirent_t *> > array;
-+ for (apr_hash_index_t *hi = apr_hash_first(subpool, dirents); hi; hi = apr_hash_next(hi)) {
-+ const void *key;
-+ void *data;
-+ apr_hash_this(hi, &key, NULL, &data);
-+ array.push_back(std::make_pair(reinterpret_cast<const char *>(key), reinterpret_cast<svn_dirent_t *>(data)));
-+ }
-+ std::sort(array.begin(), array.end(), sort_by_path);
-
-- UDSEntry entry;
-- for (i = 0; i < array->nelts; ++i) {
-+ UDSEntry entry;
-+ for (size_t i = 0; i < array.size(); ++i) {
- entry.clear();
- const char *utf8_entryname, *native_entryname;
- svn_dirent_t *dirent;
-- svn_sort__item_t *item;
-
-- item = &APR_ARRAY_IDX (array, i, svn_sort__item_t);
--
-- utf8_entryname = (const char*)item->key;
--
-- dirent = (svn_dirent_t*)apr_hash_get (dirents, utf8_entryname, item->klen);
-+ utf8_entryname = array[i].first;
-+ dirent = array[i].second;
-
- svn_utf_cstring_from_utf8 (&native_entryname, utf8_entryname, subpool);
- const char *native_author = NULL;
-@@ -577,7 +579,7 @@ void kio_svnProtocol::listDir(const KUrl
- if ( createUDSEntry(QString( native_entryname ), QString( native_author ), dirent->size,
- dirent->kind==svn_node_dir ? true : false, mtime, entry) )
- listEntry( entry, false );
-- }
-+ }
- listEntry( entry, true );
-
- finished();
diff --git a/kde/patch/kdev-python.patch b/kde/patch/kdev-python.patch
deleted file mode 100644
index a86d07a..0000000
--- a/kde/patch/kdev-python.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix compilation against Python 3.8.
-# Fixed in 5.5.0.
-#cat $CWD/patch/kdev-python/kdev-python-5.4.4_python38.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdev-python/kdev-python-5.4.4_python38.patch b/kde/patch/kdev-python/kdev-python-5.4.4_python38.patch
deleted file mode 100644
index 572c9da..0000000
--- a/kde/patch/kdev-python/kdev-python-5.4.4_python38.patch
+++ /dev/null
@@ -1,560 +0,0 @@
-From e23fa8f15af89a8bd4bd84dd96b5fd7017457516 Mon Sep 17 00:00:00 2001
-From: Francis Herne <mail@flherne.uk>
-Date: Fri, 20 Sep 2019 00:41:29 +0100
-Subject: [PATCH] Initial Python 3.8 support.
-
-This allows kdev-python to be built and run against CPython 3.8,
- and if so to parse files containing 3.8 syntax.
-
-BUG: 411956
-FIXED-IN: 5.5.0
----
- CMakeLists.txt | 4 +-
- duchain/declarationbuilder.cpp | 10 ++++-
- duchain/declarationbuilder.h | 1 +
- duchain/expressionvisitor.cpp | 4 ++
- duchain/expressionvisitor.h | 1 +
- duchain/tests/pyduchaintest.cpp | 19 +++++++++
- parser/ast.cpp | 7 +++-
- parser/ast.h | 9 ++++
- parser/astbuilder.cpp | 6 +++
- parser/astdefaultvisitor.cpp | 6 +++
- parser/astdefaultvisitor.h | 2 +
- parser/astvisitor.cpp | 1 +
- parser/astvisitor.h | 1 +
- parser/conversionGenerator.py | 11 +++--
- parser/generated.h | 36 ++++++++++++++++
- parser/{python36.sdef => python38.sdef} | 55 ++++++++++++++++++++++---
- parser/tests/pyasttest.cpp | 5 +++
- 17 files changed, 164 insertions(+), 14 deletions(-)
- rename parser/{python36.sdef => python38.sdef} (82%)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 6f9e465b..09b089dd 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -31,7 +31,7 @@ add_definitions( -DTRANSLATION_DOMAIN=\"kdevpython\" )
-
- # CMake looks for exactly the specified version first and ignores newer versions.
- # To avoid that, start looking for the newest supported version and work down.
--set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4)
-+set(Python_ADDITIONAL_VERSIONS 3.8 3.7 3.6 3.5 3.4)
- foreach(_PYTHON_V ${Python_ADDITIONAL_VERSIONS})
- find_package(PythonInterp ${_PYTHON_V})
- if ( PYTHONINTERP_FOUND )
-@@ -49,7 +49,7 @@ if ( PYTHONINTERP_FOUND AND PYTHON_VERSION_STRING VERSION_GREATER "3.4" )
- endif()
-
- if ( NOT PYTHONLIBS_FOUND OR PYTHONLIBS_VERSION_STRING VERSION_LESS "3.4.3" )
-- message(FATAL_ERROR "Python >= 3.4.3 but < 3.8 with --enable-shared is required to build kdev-python")
-+ message(FATAL_ERROR "Python >= 3.4.3 but < 3.9 with --enable-shared is required to build kdev-python")
- endif()
-
- configure_file(kdevpythonversion.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/kdevpythonversion.h" @ONLY)
-diff --git a/duchain/declarationbuilder.cpp b/duchain/declarationbuilder.cpp
-index e3cb2b9c..61e144c5 100644
---- a/duchain/declarationbuilder.cpp
-+++ b/duchain/declarationbuilder.cpp
-@@ -1354,6 +1354,14 @@ void DeclarationBuilder::visitAnnotationAssignment(AnnotationAssignmentAst* node
- assignToUnknown(node->target, assignType);
- }
-
-+void DeclarationBuilder::visitAssignmentExpression(AssignmentExpressionAst* node) {
-+ AstDefaultVisitor::visitAssignmentExpression(node);
-+
-+ ExpressionVisitor v(currentContext());
-+ v.visitNode(node->value);
-+ assignToUnknown(node->target, v.lastType());
-+}
-+
- void DeclarationBuilder::visitClassDefinition( ClassDefinitionAst* node )
- {
- visitNodeList(node->decorators);
-@@ -1745,7 +1753,7 @@ void DeclarationBuilder::visitArguments( ArgumentsAst* node )
- int parametersCount = node->arguments.length();
- int firstDefaultParameterOffset = parametersCount - defaultParametersCount;
- int currentIndex = 0;
-- foreach ( ArgAst* arg, node->arguments + node->kwonlyargs ) {
-+ foreach ( ArgAst* arg, node->posonlyargs + node->arguments + node->kwonlyargs ) {
- // Iterate over all the function's arguments, create declarations, and add the arguments
- // to the functions FunctionType.
- currentIndex += 1;
-diff --git a/duchain/declarationbuilder.h b/duchain/declarationbuilder.h
-index adee6d6d..1992b781 100644
---- a/duchain/declarationbuilder.h
-+++ b/duchain/declarationbuilder.h
-@@ -90,6 +90,7 @@ class KDEVPYTHONDUCHAIN_EXPORT DeclarationBuilder: public DeclarationBuilderBase
- void visitFunctionDefinition(FunctionDefinitionAst* node) override;
- void visitAssignment(AssignmentAst* node) override;
- void visitAnnotationAssignment(AnnotationAssignmentAst* node) override;
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override;
- void visitFor(ForAst* node) override;
- void visitImport(ImportAst* node) override;
- void visitImportFrom(ImportFromAst* node) override;
-diff --git a/duchain/expressionvisitor.cpp b/duchain/expressionvisitor.cpp
-index 5c5286ae..055c5b49 100644
---- a/duchain/expressionvisitor.cpp
-+++ b/duchain/expressionvisitor.cpp
-@@ -757,5 +757,9 @@ void ExpressionVisitor::visitBooleanOperation(Python::BooleanOperationAst* node)
- encounter(result);
- }
-
-+void ExpressionVisitor::visitAssignmentExpression(Python::AssignmentExpressionAst* node) {
-+ visitNode(node->value);
-+}
-+
- }
-
-diff --git a/duchain/expressionvisitor.h b/duchain/expressionvisitor.h
-index 25ca2319..a56481ad 100644
---- a/duchain/expressionvisitor.h
-+++ b/duchain/expressionvisitor.h
-@@ -81,6 +81,7 @@ class KDEVPYTHONDUCHAIN_EXPORT ExpressionVisitor : public AstDefaultVisitor, pub
- void visitSetComprehension(SetComprehensionAst* node) override;
- void visitIfExpression(IfExpressionAst* node) override;
- void visitNameConstant(NameConstantAst* node) override;
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override;
-
- /**
- * @brief Checks for magic docstrings that override a call's return type.
-diff --git a/duchain/tests/pyduchaintest.cpp b/duchain/tests/pyduchaintest.cpp
-index 7142ed2b..17ba34e5 100644
---- a/duchain/tests/pyduchaintest.cpp
-+++ b/duchain/tests/pyduchaintest.cpp
-@@ -838,6 +838,7 @@ void PyDUChainTest::testTypes()
- QEXPECT_FAIL("init_class_no_decl", "aliasing info lost", Continue);
- QEXPECT_FAIL("property_wrong", "visitCall uses declaration if no type", Continue);
- QEXPECT_FAIL("property_setter", "very basic property support", Continue);
-+ QEXPECT_FAIL("assignment_expr_context", "not implemented", Continue);
- QCOMPARE(visitor->found, true);
- }
-
-@@ -1302,6 +1303,21 @@ void PyDUChainTest::testTypes_data()
- " def foo(self, ccc=aaa, ddd=bbb):\n" // self.bbb is visible here, Foo().aaa isn't.
- " return ccc, ddd\n"
- "checkme = Foo().Bar().foo()\n" << "tuple of (str, int)";
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ QTest::newRow("assignment_expr_while") <<
-+ "file = open('foo.txt')\n"
-+ "while q := file.readline():\n"
-+ " checkme = q\n" << "str";
-+ QTest::newRow("assignment_expr_comprehension") <<
-+ "checkme = [z for q in (1, 2, 3) if (z := q % 2)]" << "list of int";
-+ QTest::newRow("assignment_expr_context") <<
-+ "a = [z for q in (1, 2, 3) if (z := q % 2)]\n"
-+ "checkme = z" << "int";
-+ QTest::newRow("positional_params") <<
-+ "def foo(a, b, /, c, d):\n"
-+ " return a, b, c, d\n"
-+ "checkme = foo(10, 'x', 2.3, d='y')\n" << "tuple of (int, str, float, str)";
-+#endif
- }
-
- typedef QPair<Declaration*, int> pair;
-@@ -1780,6 +1796,9 @@ void PyDUChainTest::testVariableCreation_data()
- << QStringList{"int", "int", "float"};
- QTest::newRow("for_loop_tuple") << "for a in 1, 2: pass" << QStringList{"a"} << QStringList{"int"};
- QTest::newRow("for_loop_dict") << "for a in {'foo': 1}: pass" << QStringList{"a"} << QStringList{"str"};
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ QTest::newRow("assignment_expr") << "a = (b := 10)" << QStringList{"a", "b"} << QStringList{"int", "int"};
-+#endif
- }
-
- void PyDUChainTest::testCleanupMultiplePasses()
-diff --git a/parser/ast.cpp b/parser/ast.cpp
-index 9892b184..cd570d36 100644
---- a/parser/ast.cpp
-+++ b/parser/ast.cpp
-@@ -163,6 +163,11 @@ ExpressionAst::ExpressionAst(Ast* parent, AstType type): Ast(parent, type), valu
-
- }
-
-+AssignmentExpressionAst::AssignmentExpressionAst(Ast* parent): ExpressionAst(parent, Ast::AssignmentExpressionAstType), value(nullptr)
-+{
-+
-+}
-+
- YieldFromAst::YieldFromAst(Ast* parent) : ExpressionAst(parent, Ast::YieldFromAstType)
- {
-
-@@ -248,7 +253,7 @@ NameConstantAst::NameConstantAst(Ast* parent): ExpressionAst(parent, Ast::NameCo
-
- }
-
--NumberAst::NumberAst(Ast* parent): ExpressionAst(parent, Ast::NumberAstType), value(0)
-+NumberAst::NumberAst(Ast* parent): ExpressionAst(parent, Ast::NumberAstType), value(0), isInt(false)
- {
-
- }
-diff --git a/parser/ast.h b/parser/ast.h
-index 378af0bd..65fef1cd 100644
---- a/parser/ast.h
-+++ b/parser/ast.h
-@@ -131,6 +131,7 @@ class KDEVPYTHONPARSER_EXPORT Ast
- SliceAstType,
- EllipsisAstType,
- IndexAstType,
-+ AssignmentExpressionAstType,
- LastExpressionType, // keep this at the end of the expr ast list
-
- CodeAstType,
-@@ -457,6 +458,13 @@ class KDEVPYTHONPARSER_EXPORT ExpressionAst : public Ast {
- ExpressionAst* value; // WARNING this is not set in most cases!
- };
-
-+class KDEVPYTHONPARSER_EXPORT AssignmentExpressionAst : public ExpressionAst {
-+public:
-+ AssignmentExpressionAst(Ast* parent);
-+ ExpressionAst* target;
-+ ExpressionAst* value;
-+};
-+
- class KDEVPYTHONPARSER_EXPORT AwaitAst : public ExpressionAst {
- public:
- AwaitAst(Ast* parent);
-@@ -743,6 +751,7 @@ class KDEVPYTHONPARSER_EXPORT ArgumentsAst : public Ast {
- ArgumentsAst(Ast* parent);
- QList<ArgAst*> arguments;
- QList<ArgAst*> kwonlyargs;
-+ QList<ArgAst*> posonlyargs;
- QList<ExpressionAst*> defaultValues;
- ArgAst* vararg;
- ArgAst* kwarg;
-diff --git a/parser/astbuilder.cpp b/parser/astbuilder.cpp
-index a1ccd68d..ad2e0dce 100644
---- a/parser/astbuilder.cpp
-+++ b/parser/astbuilder.cpp
-@@ -101,7 +101,13 @@ CodeAst::Ptr AstBuilder::parse(const QUrl& filename, QString &contents)
- PythonInitializer pyIniter(pyInitLock);
- PyArena* arena = pyIniter.arena;
-
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ PyCompilerFlags flags;
-+ flags.cf_flags = PyCF_SOURCE_IS_UTF8 | PyCF_IGNORE_COOKIE | PyCF_ONLY_AST;
-+ flags.cf_feature_version = 7;
-+#else
- PyCompilerFlags flags = {PyCF_SOURCE_IS_UTF8 | PyCF_IGNORE_COOKIE};
-+#endif
-
- CythonSyntaxRemover cythonSyntaxRemover;
-
-diff --git a/parser/astdefaultvisitor.cpp b/parser/astdefaultvisitor.cpp
-index 5db1f6f1..cdd31bbf 100644
---- a/parser/astdefaultvisitor.cpp
-+++ b/parser/astdefaultvisitor.cpp
-@@ -292,6 +292,12 @@ void AstDefaultVisitor::visitAnnotationAssignment(AnnotationAssignmentAst* node)
- visitNode(node->value);
- }
-
-+void AstDefaultVisitor::visitAssignmentExpression(AssignmentExpressionAst* node)
-+{
-+ visitNode(node->target);
-+ visitNode(node->value);
-+}
-+
- void AstDefaultVisitor::visitBinaryOperation(BinaryOperationAst* node)
- {
- visitNode(node->lhs);
-diff --git a/parser/astdefaultvisitor.h b/parser/astdefaultvisitor.h
-index e8e0d3de..aa1f540c 100644
---- a/parser/astdefaultvisitor.h
-+++ b/parser/astdefaultvisitor.h
-@@ -49,6 +49,7 @@ class KDEVPYTHONPARSER_EXPORT AstDefaultVisitor : public AstVisitor
- void visitAssignment(AssignmentAst* node) override;
- void visitAugmentedAssignment(AugmentedAssignmentAst* node) override;
- void visitAnnotationAssignment(AnnotationAssignmentAst* node) override;
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override;
- void visitFor(ForAst* node) override;
- void visitWhile(WhileAst* node) override;
- void visitIf(IfAst* node) override;
-@@ -122,6 +123,7 @@ class KDEVPYTHONPARSER_EXPORT AstFreeVisitor : public AstDefaultVisitor {
- void visitAssignment(AssignmentAst* node) override { AstDefaultVisitor::visitAssignment(node); delete node; }
- void visitAugmentedAssignment(AugmentedAssignmentAst* node) override { AstDefaultVisitor::visitAugmentedAssignment(node); delete node; }
- void visitAnnotationAssignment(AnnotationAssignmentAst* node) override { AstDefaultVisitor::visitAnnotationAssignment(node); delete node; }
-+ void visitAssignmentExpression(AssignmentExpressionAst* node) override { AstDefaultVisitor::visitAssignmentExpression(node); delete node; }
- void visitFor(ForAst* node) override { AstDefaultVisitor::visitFor(node); delete node; }
- void visitWhile(WhileAst* node) override { AstDefaultVisitor::visitWhile(node); delete node; }
- void visitIf(IfAst* node) override { AstDefaultVisitor::visitIf(node); delete node; }
-diff --git a/parser/astvisitor.cpp b/parser/astvisitor.cpp
-index ace7d619..51c5a1c5 100644
---- a/parser/astvisitor.cpp
-+++ b/parser/astvisitor.cpp
-@@ -47,6 +47,7 @@ void AstVisitor::visitNode(Ast* node)
- case Ast::AssignmentAstType: this->visitAssignment(static_cast<AssignmentAst*>(node)); break;
- case Ast::AugmentedAssignmentAstType: this->visitAugmentedAssignment(static_cast<AugmentedAssignmentAst*>(node)); break;
- case Ast::AnnotationAssignmentAstType: this->visitAnnotationAssignment(static_cast<AnnotationAssignmentAst*>(node)); break;
-+ case Ast::AssignmentExpressionAstType: this->visitAssignmentExpression(static_cast<AssignmentExpressionAst*>(node)); break;
- case Ast::ForAstType: this->visitFor(static_cast<ForAst*>(node)); break;
- case Ast::WhileAstType: this->visitWhile(static_cast<WhileAst*>(node)); break;
- case Ast::IfAstType: this->visitIf(static_cast<IfAst*>(node)); break;
-diff --git a/parser/astvisitor.h b/parser/astvisitor.h
-index 1908e9dd..51aa47b4 100644
---- a/parser/astvisitor.h
-+++ b/parser/astvisitor.h
-@@ -61,6 +61,7 @@ class KDEVPYTHONPARSER_EXPORT AstVisitor
- virtual void visitAssignment(AssignmentAst* node) { Q_UNUSED(node); };
- virtual void visitAugmentedAssignment(AugmentedAssignmentAst* node) { Q_UNUSED(node); };
- virtual void visitAnnotationAssignment(AnnotationAssignmentAst* node) { Q_UNUSED(node); };
-+ virtual void visitAssignmentExpression(AssignmentExpressionAst* node) { Q_UNUSED(node); };
- virtual void visitFor(ForAst* node) { Q_UNUSED(node); };
- virtual void visitWhile(WhileAst* node) { Q_UNUSED(node); };
- virtual void visitIf(IfAst* node) { Q_UNUSED(node); };
-diff --git a/parser/conversionGenerator.py b/parser/conversionGenerator.py
-index 9d65cc0d..66055953 100644
---- a/parser/conversionGenerator.py
-+++ b/parser/conversionGenerator.py
-@@ -9,7 +9,7 @@
-
- import sys
-
--contents = open('python36.sdef').read().replace("\n", "").split(';;')
-+contents = open('python38.sdef').read().replace("\n", "").split(';;')
-
- func_structure = '''
- Ast* visitNode(%{RULE_FOR}* node) {
-@@ -45,7 +45,6 @@
-
- switch_line = ''' case %{KIND}: {
- %{ACTIONS}
-- result = v;
- break;
- }'''
-
-@@ -139,6 +138,7 @@ def pluginAstToPythonAstType(plugintypestr):
- results[rule_for] = list()
-
- current_actions = list()
-+ created_v = False
- for action in actions:
- command = action.split('|')[0]
- try:
-@@ -204,14 +204,17 @@ def pluginAstToPythonAstType(plugintypestr):
- elif command == 'create':
- astType = arguments
- current_actions.append(create_ast_line.replace('%{AST_TYPE}', astType))
--
-+ created_v = True
-+
- if code:
- current_actions.append(code);
--
-+
- current_actions = "\n".join(current_actions)
- if kind == 'any':
- current_stmt = current_actions
- else:
-+ if created_v:
-+ current_actions += "\n result = v;"
- current_stmt = switch_line.replace('%{KIND}', kind).replace('%{ACTIONS}', current_actions)
- if before_version:
- version_cpp_if = ("#if PYTHON_VERSION < QT_VERSION_CHECK(%d, %d, 0)\n"
-diff --git a/parser/generated.h b/parser/generated.h
-index 9061deb0..e1136f84 100644
---- a/parser/generated.h
-+++ b/parser/generated.h
-@@ -76,12 +76,23 @@ class PythonAstTransformer {
- Ast* visitNode(_arguments* node) {
- bool ranges_copied = false; Q_UNUSED(ranges_copied);
- if ( ! node ) return nullptr;
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- ArgumentsAst* v = new ArgumentsAst(parent());
- nodeStack.push(v); v->vararg = static_cast<ArgAst*>(visitNode(node->vararg)); nodeStack.pop();
- nodeStack.push(v); v->kwarg = static_cast<ArgAst*>(visitNode(node->kwarg)); nodeStack.pop();
- nodeStack.push(v); v->arguments = visitNodeList<_arg, ArgAst>(node->args); nodeStack.pop();
- nodeStack.push(v); v->defaultValues = visitNodeList<_expr, ExpressionAst>(node->defaults); nodeStack.pop();
- nodeStack.push(v); v->kwonlyargs = visitNodeList<_arg, ArgAst>(node->kwonlyargs); nodeStack.pop();
-+#endif
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ ArgumentsAst* v = new ArgumentsAst(parent());
-+ nodeStack.push(v); v->vararg = static_cast<ArgAst*>(visitNode(node->vararg)); nodeStack.pop();
-+ nodeStack.push(v); v->kwarg = static_cast<ArgAst*>(visitNode(node->kwarg)); nodeStack.pop();
-+ nodeStack.push(v); v->arguments = visitNodeList<_arg, ArgAst>(node->args); nodeStack.pop();
-+ nodeStack.push(v); v->defaultValues = visitNodeList<_expr, ExpressionAst>(node->defaults); nodeStack.pop();
-+ nodeStack.push(v); v->kwonlyargs = visitNodeList<_arg, ArgAst>(node->kwonlyargs); nodeStack.pop();
-+ nodeStack.push(v); v->posonlyargs = visitNodeList<_arg, ArgAst>(node->posonlyargs); nodeStack.pop();
-+#endif
- return v;
- }
-
-@@ -280,18 +291,22 @@ class PythonAstTransformer {
- break;
- }
- #endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Num_kind: {
- NumberAst* v = new NumberAst(parent());
- v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);
- result = v;
- break;
- }
-+#endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Str_kind: {
- StringAst* v = new StringAst(parent());
- v->value = PyUnicodeObjectToQString(node->v.Str.s);
- result = v;
- break;
- }
-+#endif
- #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 6, 0)
- case JoinedStr_kind: {
- JoinedStringAst* v = new JoinedStringAst(parent());
-@@ -310,12 +325,14 @@ class PythonAstTransformer {
- break;
- }
- #endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Bytes_kind: {
- BytesAst* v = new BytesAst(parent());
- v->value = PyUnicodeObjectToQString(node->v.Bytes.s);
- result = v;
- break;
- }
-+#endif
- case Attribute_kind: {
- AttributeAst* v = new AttributeAst(parent());
- v->attribute = node->v.Attribute.attr ? new Python::Identifier(PyUnicodeObjectToQString(node->v.Attribute.attr)) : nullptr;
-@@ -374,23 +391,42 @@ class PythonAstTransformer {
- result = v;
- break;
- }
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case Ellipsis_kind: {
- EllipsisAst* v = new EllipsisAst(parent());
- result = v;
- break;
- }
-+#endif
-+#if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0)
- case NameConstant_kind: {
- NameConstantAst* v = new NameConstantAst(parent());
- v->value = node->v.NameConstant.value == Py_None ? NameConstantAst::None : node->v.NameConstant.value == Py_False ? NameConstantAst::False : NameConstantAst::True;
- result = v;
- break;
- }
-+#endif
- case YieldFrom_kind: {
- YieldFromAst* v = new YieldFromAst(parent());
- nodeStack.push(v); v->value = static_cast<ExpressionAst*>(visitNode(node->v.YieldFrom.value)); nodeStack.pop();
- result = v;
- break;
- }
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ case Constant_kind: {
-+PyObject *value = node->v.Constant.value;if (value == Py_None) { NameConstantAst* v = new NameConstantAst(parent()); v->value = NameConstantAst::None; result = v;}else if (value == Py_True) { NameConstantAst* v = new NameConstantAst(parent()); v->value = NameConstantAst::True; result = v;}else if (value == Py_False) { NameConstantAst* v = new NameConstantAst(parent()); v->value = NameConstantAst::False; result = v;}else if (value->ob_type == &PyLong_Type) { NumberAst* v = new NumberAst(parent()); v->isInt = true; v->value = PyLong_AsLong(value); result = v;}else if (value->ob_type == &PyFloat_Type || value->ob_type == &PyComplex_Type) { result = new NumberAst(parent());}else if (value->ob_type == &PyUnicode_Type) { StringAst* v = new StringAst(parent()); v->value = PyUnicodeObjectToQString(value); result = v;}else if (value->ob_type == &PyBytes_Type) { result = new BytesAst(parent());}else if (value->ob_type == &PyEllipsis_Type) { result = new EllipsisAst(parent());}else { qWarning() << "Unhandled constant type: " << value->ob_type->tp_name; Q_ASSERT(false);};
-+ break;
-+ }
-+#endif
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ case NamedExpr_kind: {
-+ AssignmentExpressionAst* v = new AssignmentExpressionAst(parent());
-+ nodeStack.push(v); v->target = static_cast<ExpressionAst*>(visitNode(node->v.NamedExpr.target)); nodeStack.pop();
-+ nodeStack.push(v); v->value = static_cast<ExpressionAst*>(visitNode(node->v.NamedExpr.value)); nodeStack.pop();
-+ result = v;
-+ break;
-+ }
-+#endif
- default:
- qWarning() << "Unsupported _expr AST type: " << node->kind;
- Q_ASSERT(false);
-diff --git a/parser/python36.sdef b/parser/python38.sdef
-similarity index 82%
-rename from parser/python36.sdef
-rename to parser/python38.sdef
-index f53ff1c7..30d9f95a 100644
---- a/parser/python36.sdef
-+++ b/parser/python38.sdef
-@@ -73,20 +73,62 @@ if (node->v.Call.kwargs) {
- v->keywords.append(kwargs);
- nodeStack.pop();
- };;
--RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
--RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;;
-+RULE_FOR _expr;KIND Num_kind;ACTIONS create|NumberAst;BEFORE 3.8;CODE v->isInt = PyLong_Check(node->v.Num.n); v->value = PyLong_AsLong(node->v.Num.n);;
-+RULE_FOR _expr;KIND Str_kind;ACTIONS create|StringAst set|value$>s;BEFORE 3.8;;
- RULE_FOR _expr;KIND JoinedStr_kind;ACTIONS create|JoinedStringAst set|values=>ExpressionAst,values;SINCE 3.6;;
- RULE_FOR _expr;KIND FormattedValue_kind;ACTIONS create|FormattedValueAst set|value->ExpressionAst,value set|conversion:>conversion set|formatSpec->ExpressionAst,format_spec;SINCE 3.6;;
--RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;;
-+RULE_FOR _expr;KIND Bytes_kind;ACTIONS create|BytesAst set|value$>s;BEFORE 3.8;;
- RULE_FOR _expr;KIND Attribute_kind;ACTIONS create|AttributeAst set|attribute~>attr set|value->ExpressionAst,value set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Subscript_kind;ACTIONS create|SubscriptAst set|value->ExpressionAst,value set|slice->SliceAst,slice set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Starred_kind;ACTIONS create|StarredAst set|value->ExpressionAst,value set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Name_kind;ACTIONS create|NameAst set|identifier~>id set|context*>Context,ctx;;
- RULE_FOR _expr;KIND List_kind;ACTIONS create|ListAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
- RULE_FOR _expr;KIND Tuple_kind;ACTIONS create|TupleAst set|elements=>ExpressionAst,elts set|context*>Context,ctx;;
--RULE_FOR _expr;KIND Ellipsis_kind;ACTIONS create|EllipsisAst;;
--RULE_FOR _expr;KIND NameConstant_kind;ACTIONS create|NameConstantAst set|value_>value;;
-+RULE_FOR _expr;KIND Ellipsis_kind;ACTIONS create|EllipsisAst;BEFORE 3.8;;
-+RULE_FOR _expr;KIND NameConstant_kind;ACTIONS create|NameConstantAst set|value_>value;BEFORE 3.8;;
- RULE_FOR _expr;KIND YieldFrom_kind;ACTIONS create|YieldFromAst set|value->ExpressionAst,value;;
-+RULE_FOR _expr;KIND Constant_kind;ACTIONS;SINCE 3.8;CODE
-+PyObject *value = node->v.Constant.value;
-+if (value == Py_None) {
-+ NameConstantAst* v = new NameConstantAst(parent());
-+ v->value = NameConstantAst::None;
-+ result = v;
-+}
-+else if (value == Py_True) {
-+ NameConstantAst* v = new NameConstantAst(parent());
-+ v->value = NameConstantAst::True;
-+ result = v;
-+}
-+else if (value == Py_False) {
-+ NameConstantAst* v = new NameConstantAst(parent());
-+ v->value = NameConstantAst::False;
-+ result = v;
-+}
-+else if (value->ob_type == &PyLong_Type) {
-+ NumberAst* v = new NumberAst(parent());
-+ v->isInt = true;
-+ v->value = PyLong_AsLong(value);
-+ result = v;
-+}
-+else if (value->ob_type == &PyFloat_Type || value->ob_type == &PyComplex_Type) {
-+ result = new NumberAst(parent());
-+}
-+else if (value->ob_type == &PyUnicode_Type) {
-+ StringAst* v = new StringAst(parent());
-+ v->value = PyUnicodeObjectToQString(value);
-+ result = v;
-+}
-+else if (value->ob_type == &PyBytes_Type) {
-+ result = new BytesAst(parent());
-+}
-+else if (value->ob_type == &PyEllipsis_Type) {
-+ result = new EllipsisAst(parent());
-+}
-+else {
-+ qWarning() << "Unhandled constant type: " << value->ob_type->tp_name;
-+ Q_ASSERT(false);
-+};;
-+RULE_FOR _expr;KIND NamedExpr_kind;ACTIONS create|AssignmentExpressionAst set|target->ExpressionAst,target set|value->ExpressionAst,value;SINCE 3.8;;
-
- RULE_FOR _slice;KIND Slice_kind;ACTIONS create|SliceAst set|lower->ExpressionAst,lower set|upper->ExpressionAst,upper set|step->ExpressionAst,step;;
- RULE_FOR _slice;KIND ExtSlice_kind;ACTIONS create|ExtendedSliceAst set|dims=>SliceAst,dims;;
-@@ -95,7 +137,8 @@ RULE_FOR _slice;KIND Index_kind;ACTIONS create|IndexAst set|value->ExpressionAst
-
- RULE_FOR _comprehension;KIND any;ACTIONS create|ComprehensionAst set|target->ExpressionAst,target set|iterator->ExpressionAst,iter set|conditions=>ExpressionAst,ifs;;
- RULE_FOR _excepthandler;KIND ExceptHandler_kind;ACTIONS create|ExceptionHandlerAst set|type->ExpressionAst,type set|name~>name set|body=>Ast,body;;
--RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;;
-+RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs;BEFORE 3.8;;
-+RULE_FOR _arguments;KIND any;ACTIONS create|ArgumentsAst set|vararg->ArgAst,vararg set|kwarg->ArgAst,kwarg set|arguments=>ArgAst,args set|defaultValues=>ExpressionAst,defaults set|kwonlyargs=>ArgAst,kwonlyargs set|posonlyargs=>ArgAst,posonlyargs;SINCE 3.8;;
- RULE_FOR _arg;KIND any;ACTIONS create|ArgAst set|argumentName~>arg set|annotation->ExpressionAst,annotation;;
- RULE_FOR _keyword;KIND any;ACTIONS create|KeywordAst set|argumentName~>arg set|value->ExpressionAst,value;;
- RULE_FOR _alias;KIND any;ACTIONS create|AliasAst set|name~>name set|asName~>asname;;
-diff --git a/parser/tests/pyasttest.cpp b/parser/tests/pyasttest.cpp
-index 4fd5f4eb..c28f6fce 100644
---- a/parser/tests/pyasttest.cpp
-+++ b/parser/tests/pyasttest.cpp
-@@ -238,6 +238,11 @@ void PyAstTest::testExpressions_data()
- " **{ext: self.res_extension for ext in self._rc_extensions + self._mc_extensions},\n"
- "}";
- #endif
-+#if PYTHON_VERSION >= QT_VERSION_CHECK(3, 8, 0)
-+ QTest::newRow("assignment_expr_1") << "a = (b := 10)";
-+ QTest::newRow("assignment_expr_2") << "a = [q for z in (1, 2, 3) if (q := 2*z)]";
-+ QTest::newRow("positional_params") << "def foo(a, b, /, c, d, *, e): pass";
-+#endif
- }
-
- void PyAstTest::testCorrectedFuncRanges()
diff --git a/kde/patch/kdewebdev.patch b/kde/patch/kdewebdev.patch
deleted file mode 100644
index 4bbe65b..0000000
--- a/kde/patch/kdewebdev.patch
+++ /dev/null
@@ -1,6 +0,0 @@
-# Make it find tidy:
-cat $CWD/patch/kdewebdev/include-tidy.patch \
- | sed -e "s#/tmp/package-kdewebdev#${SLACK_KDE_BUILD_DIR}/$(echo ${module} |cut -f1 -d:)/package-kdewebdev#" \
- | patch -p0 --verbose \
- || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kdewebdev/include-tidy.patch b/kde/patch/kdewebdev/include-tidy.patch
deleted file mode 100644
index fd4de94..0000000
--- a/kde/patch/kdewebdev/include-tidy.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- klinkstatus/src/tidy/tidyx.h.orig 2009-09-03 09:55:38.886267704 -0500
-+++ klinkstatus/src/tidy/tidyx.h 2009-09-03 09:57:29.032269520 -0500
-@@ -48,8 +48,8 @@
- Created 2002-07-11 by Charles Reitzel
- */
-
--#include <tidy.h>
--#include <buffio.h>
-+#include "/tmp/package-kdewebdev/usr/include/tidy/tidy.h"
-+#include "/tmp/package-kdewebdev/usr/include/tidy/buffio.h"
-
- #include <config-tidy.h>
-
diff --git a/kde/patch/kholidays.patch b/kde/patch/kholidays.patch
deleted file mode 100644
index ec8ad80..0000000
--- a/kde/patch/kholidays.patch
+++ /dev/null
@@ -1,8 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-# Fixed post Plasma 5.5.5.
-#cat $CWD/patch/kholidays/kholidays_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Revert depfreeze breaking merges (KF5_VERSION, cmake, PIM_VERSION).
-# Should be fixed in Applications > 16.12.3.
-#cat $CWD/patch/kholidays/kholidays_depfreeze_revert.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kholidays/kholidays_depfreeze_revert.patch b/kde/patch/kholidays/kholidays_depfreeze_revert.patch
deleted file mode 100644
index 316403a..0000000
--- a/kde/patch/kholidays/kholidays_depfreeze_revert.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-From 506bd08a6faf61c776beecb05f1acbe04223827a Mon Sep 17 00:00:00 2001
-From: Andreas Sturmlechner <andreas.sturmlechner@gmail.com>
-Date: Fri, 10 Mar 2017 13:33:10 +0100
-Subject: Revert depfreeze breaking merges (KF5_VERSION, cmake, PIM_VERSION)
-
----
- CMakeLists.txt | 16 ++++++++--------
- 1 file changed, 8 insertions(+), 8 deletions(-)
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 05164db..e0b67b8 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -1,28 +1,28 @@
--cmake_minimum_required(VERSION 3.0)
--set(PIM_VERSION "5.4.40")
-+cmake_minimum_required(VERSION 2.8.12)
-
--project(KHolidays VERSION ${PIM_VERSION})
-+project(KHolidays)
-
- # ECM setup
--set(KF5_VERSION "5.31.0")
-+set(KF5_VERSION "5.28.0")
- find_package(ECM ${KF5_VERSION} CONFIG REQUIRED)
- set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
-
- include(GenerateExportHeader)
- include(ECMGenerateHeaders)
- include(ECMGeneratePriFile)
--include(CMakePackageConfigHelpers)
-+include(ECMPackageConfigHelpers)
- include(ECMSetupVersion)
- include(ECMPoQmTools)
- include(FeatureSummary)
- include(KDEInstallDirs)
- include(KDECMakeSettings)
- include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE)
--include(ECMCoverageOption)
-+
-+set(PIM_VERSION "5.4.3")
-
- set(KHOLIDAYS_LIB_VERSION ${PIM_VERSION})
-
--ecm_setup_version(PROJECT VARIABLE_PREFIX KHOLIDAYS
-+ecm_setup_version(${KHOLIDAYS_LIB_VERSION} VARIABLE_PREFIX KHOLIDAYS
- VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kholidays_version.h"
- PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5HolidaysConfigVersion.cmake"
- SOVERSION 5
-@@ -50,7 +50,7 @@ endif()
- ########### CMake Config Files ###########
- set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Holidays")
-
--configure_package_config_file(
-+ecm_configure_package_config_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/KF5HolidaysConfig.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/KF5HolidaysConfig.cmake"
- INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
---
-cgit v0.11.2
-
diff --git a/kde/patch/kholidays/kholidays_isnan.patch b/kde/patch/kholidays/kholidays_isnan.patch
deleted file mode 100644
index 55e79aa..0000000
--- a/kde/patch/kholidays/kholidays_isnan.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Milian Wolff <milian.wolff@kdab.com>
-Date: Mon, 07 Mar 2016 09:58:37 +0000
-Subject: Fix compile with clang: isnan is in the std namespace when including cmath.
-X-Git-Url: http://quickgit.kde.org/?p=kholidays.git&a=commitdiff&h=488aa158f7a0a99604a13a897a11388c02f8d39e
----
-Fix compile with clang: isnan is in the std namespace when including cmath.
----
-
-
---- a/src/sunriseset.cpp
-+++ b/src/sunriseset.cpp
-@@ -180,7 +180,7 @@
- double hourAngle = calcHourAngleSunrise(latitude, solarDec);
- double delta = longitude + radToDeg(hourAngle);
- QTime timeUTC(0, 0);
-- if (isnan(delta))
-+ if (std::isnan(delta))
- return timeUTC;
- timeUTC = timeUTC.addSecs((720 - (4.0 * delta) - eqTime) * 60);
- return QTime(timeUTC.hour(),
-@@ -199,7 +199,7 @@
- double hourAngle = -calcHourAngleSunrise(latitude, solarDec);
- double delta = longitude + radToDeg(hourAngle);
- QTime timeUTC(0, 0);
-- if (isnan(delta))
-+ if (std::isnan(delta))
- return timeUTC;
- timeUTC = timeUTC.addSecs((720 - (4.0 * delta) - eqTime) * 60);
- return QTime(timeUTC.hour(),
-
diff --git a/kde/patch/kinfocenter.patch b/kde/patch/kinfocenter.patch
index 5a65977..b57d434 100644
--- a/kde/patch/kinfocenter.patch
+++ b/kde/patch/kinfocenter.patch
@@ -1,3 +1,2 @@
# Fix linking error :
cat $CWD/patch/kinfocenter/kinfocenter_libpci.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kio.patch b/kde/patch/kio.patch
deleted file mode 100644
index e943096..0000000
--- a/kde/patch/kio.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-# Add search paths for kdelibs4 documentation to khelpcenter.
-# Patch taken from kubuntu:
-#cat $CWD/patch/kio/kio_kdelibs4_docpatch.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# KDEBUG #350769 (fixed in Frameworks 5.16.0):
-# Move konqpopupmenuplugin.desktop from kde-baseapps (kdelibs4 based)
-# to kio (kf5 based) to make service menus visible in dolphin (kf5 based):
-#cat $CWD/patch/kio/kio_dolphin_servicemenus.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Qt >= 5.9.3 breaks creation of folders in kio, which affects e.g.
-# Dolphin and Plasma Folder View.
-# Fixed in KIO 5.41:
-#cat $CWD/patch/kio/kio_fix_url_setpath.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix crash when accessing help://
-# Fixed in KIO 5.52:
-#cat $CWD/patch/kio/kio_KDEBUG_399709.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kio/kio_KDEBUG_399709.patch b/kde/patch/kio/kio_KDEBUG_399709.patch
deleted file mode 100644
index 0a8cfdc..0000000
--- a/kde/patch/kio/kio_KDEBUG_399709.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From cf3b0d102855a4a90db3fb65a99e0009fcdd3755 Mon Sep 17 00:00:00 2001
-From: Michael Pyne <mpyne@kde.org>
-Date: Sat, 13 Oct 2018 19:09:50 -0400
-Subject: kio_help: Fix crash in QCoreApplication when accessing help://.
-
-A recent commit d428fc8e6447ede81f1e1911d0b66b39265672f3 removed old
-custom crash handling code in favor of KCrash. But this actually adds a
-dependency on there being a valid QCoreApplication object.
-
-I took from the example of the similar kio_file to simply create the
-QCoreApplication here.
-
-BUG:399709
-
-Differential Revision: https://phabricator.kde.org/D16189
----
- src/ioslaves/help/main.cpp | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/ioslaves/help/main.cpp b/src/ioslaves/help/main.cpp
-index f09987a..f800a9d 100644
---- a/src/ioslaves/help/main.cpp
-+++ b/src/ioslaves/help/main.cpp
-@@ -10,6 +10,7 @@ extern "C" int xmlLoadExtDtdDefaultValue;
-
- #include <QDebug>
-
-+#include <QCoreApplication>
- #include <QString>
-
- #include <stdlib.h>
-@@ -40,6 +41,9 @@ extern "C"
- {
- Q_DECL_EXPORT int kdemain(int argc, char **argv)
- {
-+ QCoreApplication app(argc, argv); // needed for KCrash
-+ app.setApplicationName(QStringLiteral("kio_help"));
-+
- KDocTools::setupStandardDirs();
-
- //qDebug() << "Starting " << getpid();
---
-cgit v0.11.2
-
diff --git a/kde/patch/kio/kio_dolphin_servicemenus.patch b/kde/patch/kio/kio_dolphin_servicemenus.patch
deleted file mode 100644
index 811bfea..0000000
--- a/kde/patch/kio/kio_dolphin_servicemenus.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From: Frank Reininghaus <frank78ac@googlemail.com>
-Date: Sat, 03 Oct 2015 07:26:33 +0000
-Subject: Move konqpopupmenuplugin.desktop from kde-baseapps to kio
-X-Git-Url: http://quickgit.kde.org/?p=kio.git&a=commitdiff&h=4b24b70c93523c5bc56c90c04a5a666331e96a1b
----
-Move konqpopupmenuplugin.desktop from kde-baseapps to kio
-
-This ensures that service menu entries are shown if the unreleased
-KF5-based version of lib/konq from kde-baseapps is not installed
-
-It would be great if the translations from lib/konq in kde-baseapps
-could be merged. Thanks!
-
-BUG: 350769
-Change-Id: Id2c9a73ce95a6c8b704f3a1000c0292d1864a352
-REVIEW: 125425
-CCMAIL: luigi.toscano@tiscali.it
----
-Slightly modified by Eric Hameleers <alien@slackware.com>
----
-diff -uarN kio-5.15.0.orig/src/widgets/CMakeLists.txt kio-5.15.0/src/widgets/CMakeLists.txt
---- kio-5.15.0.orig/src/widgets/CMakeLists.txt 2015-10-05 10:11:41.000000000 +0200
-+++ kio-5.15.0/src/widgets/CMakeLists.txt 2015-10-18 14:14:15.461196097 +0200
-@@ -184,6 +184,7 @@
- kfileitemactionplugin.desktop
- kpropertiesdialogplugin.desktop
- kurifilterplugin.desktop
-+ konqpopupmenuplugin.desktop
- kiodndpopupmenuplugin.desktop
- DESTINATION ${KDE_INSTALL_KSERVICETYPES5DIR} )
-
-diff -uarN kio-5.15.0.orig/src/widgets/konqpopupmenuplugin.desktop kio-5.15.0/src/widgets/konqpopupmenuplugin.desktop
---- kio-5.15.0.orig/src/widgets/konqpopupmenuplugin.desktop 1970-01-01 01:00:00.000000000 +0100
-+++ kio-5.15.0/src/widgets/konqpopupmenuplugin.desktop 2015-10-18 14:17:09.078193339 +0200
-@@ -0,0 +1,89 @@
-+[Desktop Entry]
-+Type=ServiceType
-+X-KDE-ServiceType=KonqPopupMenu/Plugin
-+Comment=Plugin for the Konqueror Popup Menu
-+Comment[af]=Inplak vir die Konqueror Opspring Kieslys
-+Comment[ar]=ملحق لقائمة كونكيورر المنبثقة
-+Comment[as]=Konqueror প'প-আপ তালিকাৰ কাৰণে প্লাগ-ইন
-+Comment[ast]=Complementu pal menú emerxente de Konqueror
-+Comment[be]=Утулка для выплыўнага меню Konqueror
-+Comment[be@latin]=Plugin dla vypłyŭnoha menu prahramy „Konqueror”
-+Comment[bg]=Приставка за контекстното меню на браузъра
-+Comment[bn]=কনকরার পপ-আপ মেনুর জন্য প্লাগ-ইন
-+Comment[bn_IN]=Konqueror পপ-আপ মেনুর প্লাগ-ইন
-+Comment[bs]=Priključak za K‑osvajačev iskačući meni
-+Comment[ca]=Connector per al menú emergent del Konqueror
-+Comment[ca@valencia]=Connector per al menú emergent del Konqueror
-+Comment[cs]=Modul pro kontextovou nabídku Konqueroru
-+Comment[csb]=Wtëkôcz do menu (òtmëkô knąpą mëszë) Konquerora
-+Comment[cy]=Ategyn i Naidlen Konqueror
-+Comment[da]=Plugin for Konquerors popop-menu
-+Comment[de]=Erweiterung für das Aufklapp-Menü von Konqueror
-+Comment[el]=Πρόσθετο για το αναδυόμενο μενού του Konqueror
-+Comment[en_GB]=Plugin for the Konqueror Popup Menu
-+Comment[eo]=Kromprogrameto por la spruĉmenuo de Konkeranto
-+Comment[es]=Complemento para el menú emergente de Konqueror
-+Comment[et]=Konquerori hüpikmenüü plugin
-+Comment[eu]=Konquerorren laster-menuetarako plugina
-+Comment[fa]=وصله برای گزینگان بالاپر Konqueror
-+Comment[fi]=Konquerorin ponnahdusvalikkoliitännäinen
-+Comment[fr]=Module externe pour le menu contextuel de Konqueror
-+Comment[fy]=Plugin foar Konqueror's fluesmenu
-+Comment[ga]=Breiseán le haghaidh Roghchláir Aníos Konqueror
-+Comment[gl]=Complemento para o menú contextual de Konqueror
-+Comment[gu]=કોન્કરર પોપઅપ મેનુ માટે પ્લગઇન
-+Comment[he]=תוסף לתפריט המוקפץ של Konqueror
-+Comment[hi]=कॉन्करर पॉपअप मेन्यू के लिए प्लगइन
-+Comment[hne]=कान्करर पापअप मेन्यू बर प्लगइन
-+Comment[hr]=Dodatak za Konqueror pop-up izbornik
-+Comment[hsb]=zašćěpka za popup-meni w konqueroru
-+Comment[hu]=Bővítőmodul a Konqueror felbukkanó menühöz
-+Comment[ia]=Plugin pro le Menu de Popup de Konqueror
-+Comment[id]=Plugin untuk Menu Popup Konqueror
-+Comment[is]=Íforrit fyrir sprettvalmynd Konqueror Popup Menu
-+Comment[it]=Estensione per il menu a comparsa di Konqueror
-+Comment[ja]=Konqueror ポップアップメニューのプラグイン
-+Comment[ka]=Konqueror-ის ჩამოშლადი მენიუს პლაგინი
-+Comment[kk]=Konqueror баптау қалқымалы мәзір плагині
-+Comment[km]=កម្មវិធី​ជំនួយ​សម្រាប់​ម៉ឺនុយ​លេច​ឡើង​របស់​ Konqueror
-+Comment[kn]=ಕಾಂಕರ್ ಪುಟಿಕೆ (ಪಾಪಪ್) ಪರಿವಿಡಿಗೆ ಮಿಳಿತಾನ್ವಯ (ಪ್ಲಗಿನ್)
-+Comment[ko]=Konqueror 팝업 메뉴 플러그인
-+Comment[ku]=Pêveka ji bo Pêşeka Hilpekîn a Konquerorê
-+Comment[lt]=Priedas pasirodančiam Konqueror meniu
-+Comment[lv]=Konqueror izlecošās izvēlnes spraudnis
-+Comment[mai]=कान्करर पापअप मेनू क' लेल प्लगइन
-+Comment[mk]=Приклучок за контекстното мени на Konqueror
-+Comment[ml]=കോണ്‍ക്വററിന്റെ പൊങ്ങിവരുന്ന മെനുവിനുള്ള സംയോജകം
-+Comment[mr]=कॉन्करर पॉपअप मेन्यू करिता प्लगइन
-+Comment[ms]=Plugin untuk Menu Popuo Konqueror
-+Comment[nds]=Plugin för dat Konqueror-Opdukmenü
-+Comment[ne]=कन्क्वेरर पपअप मेनुका लागि प्लगइन
-+Comment[nl]=Plugin voor Konqueror's contextmenu
-+Comment[or]=Konqueror ପପଅପ ତାଲିକା ପାଇଁ ପ୍ଲଗଇନ
-+Comment[pa]=ਕੋਨਕਿਉਰੋਰ ਪਾਪਅੱਪ ਮੇਨੂ ਲਈ ਪਲੱਗਇਨ
-+Comment[pl]=Wtyczka do menu (otwieranego przyciskiem myszy) Konquerora
-+Comment[pt]='Plugin' para o Menu do Konqueror
-+Comment[pt_BR]=Plugin do Konqueror para menus de contexto
-+Comment[ro]=Extensie pentru meniul popup Konqueror
-+Comment[ru]=Расширение контекстного меню Konqueror
-+Comment[si]=Konqueror පොප් අප් මෙනුව සඳහා ප්ලගිනය
-+Comment[sk]=Modul pre kontextové menu Konquerora
-+Comment[sl]=Vstavek za Konquerorjev pojavni meni
-+Comment[sr]=Прикључак за К‑освајачев искачући мени
-+Comment[sr@ijekavian]=Прикључак за К‑освајачев искачући мени
-+Comment[sr@ijekavianlatin]=Priključak za K‑osvajačev iskačući meni
-+Comment[sr@latin]=Priključak za K‑osvajačev iskačući meni
-+Comment[sv]=Insticksprogram för Konquerors popupmeny
-+Comment[ta]=கான்கொரர் தோன்றும் பட்டிக்கான செருகல்கள்
-+Comment[te]=Konqueror పాప్అప్ మెనూకొరకు ప్లగ్ఇన్
-+Comment[tg]=Плагин барои менюи пайдошавии Konqueror
-+Comment[th]=ส่วนเสริมการทำงานสำหรับเมนูผุดของคอนเควอร์เรอร์
-+Comment[tr]=Konqueror Açılabilir Menüsü İçin Eklenti
-+Comment[ug]=Konqueror قاڭقىش تىزىملىكىنىڭ قىستۇرمىسى
-+Comment[uk]=Додаток контекстного меню Konqueror
-+Comment[vi]=Trình bổ sung cho Trình đơn Bật lên của Konqueror
-+Comment[wa]=Tchôke-divins po l' aspitant menu di Konqueror
-+Comment[xh]=Iplagi efakiweyo ye Konqueror ye Popup Menu
-+Comment[x-test]=xxPlugin for the Konqueror Popup Menuxx
-+Comment[zh_CN]=Konqueror 弹出菜单插件
-+Comment[zh_TW]=Konqueror 彈出式選單的外掛程式
-
-
diff --git a/kde/patch/kio/kio_fix_url_setpath.patch b/kde/patch/kio/kio_fix_url_setpath.patch
deleted file mode 100644
index d9cf740..0000000
--- a/kde/patch/kio/kio_fix_url_setpath.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 2353119aae8f03565bc7779ed1d597d266f5afda Mon Sep 17 00:00:00 2001
-From: Elvis Angelaccio <elvis.angelaccio@kde.org>
-Date: Thu, 16 Nov 2017 10:41:19 +0100
-Subject: Fix KIO::mkpath with qtbase 5.10 beta 4
-
-Summary:
-The latest Qt 5.10 beta includes [1] which breaks a bunch of unit tests,
-since `url.setPath("//foo")` will now result in an invalid (empty) QUrl.
-
-This patch fixes the KIO::mkpath() case.
-
-[1]: http://code.qt.io/cgit/qt/qtbase.git/commit/?id=f62768d046528636789f901ac79e2cfa1843a7b7
-
-Test Plan:
-
-* I can now create folders from dolphin and plasma.
-* fileundomanagertest and mkpathjobtest no longer fail
-
-Reviewers: #frameworks, dfaure
-
-Tags: #frameworks
-
-Differential Revision: https://phabricator.kde.org/D8836
----
- src/core/mkpathjob.cpp | 17 ++++++++++++++---
- 1 file changed, 14 insertions(+), 3 deletions(-)
-
-diff --git a/src/core/mkpathjob.cpp b/src/core/mkpathjob.cpp
-index bff46ca..a177805 100644
---- a/src/core/mkpathjob.cpp
-+++ b/src/core/mkpathjob.cpp
-@@ -43,8 +43,13 @@ public:
- m_url.setPath(QStringLiteral("/"));
- int i = 0;
- for (; i < basePathComponents.count() && i < m_pathComponents.count(); ++i) {
-- if (m_pathComponents.at(i) == basePathComponents.at(i)) {
-- m_url.setPath(m_url.path() + '/' + m_pathComponents.at(i));
-+ const QString pathComponent = m_pathComponents.at(i);
-+ if (pathComponent == basePathComponents.at(i)) {
-+ if (m_url.path() == QLatin1Char('/')) {
-+ m_url.setPath(m_url.path() + pathComponent);
-+ } else {
-+ m_url.setPath(m_url.path() + '/' + pathComponent);
-+ }
- } else {
- break;
- }
-@@ -57,7 +62,13 @@ public:
- if (m_url.isLocalFile()) {
- i = 0;
- for (; i < m_pathComponents.count(); ++i) {
-- QString testDir = m_url.toLocalFile() + '/' + m_pathComponents.at(i);
-+ const QString localFile = m_url.toLocalFile();
-+ QString testDir;
-+ if (localFile == QLatin1Char('/')) {
-+ testDir = localFile + m_pathComponents.at(i);
-+ } else {
-+ testDir = localFile + '/' + m_pathComponents.at(i);
-+ }
- if (QFileInfo(testDir).isDir()) {
- m_url.setPath(testDir);
- } else {
---
-cgit v0.11.2
-
diff --git a/kde/patch/kio/kio_kdelibs4_docpatch.patch b/kde/patch/kio/kio_kdelibs4_docpatch.patch
deleted file mode 100644
index 9549d31..0000000
--- a/kde/patch/kio/kio_kdelibs4_docpatch.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-Description: add search paths for kdelibs4 docs
-Author: Jonathan Riddell
-Origin: me
-Forwarded: no, kdelibs4 path was set in debian/kubuntu packages
-Applied-Upstream: nope
-Reviewed-by: Jonathan Riddell
-Last-Update: 2015-03-01
----
-This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
---- kio/src/ioslaves/help/kio_help.cpp 2015-03-07 15:45:21.000000000 +0100
-+++ kio/src/ioslaves/help/kio_help.cpp 2015-04-02 17:15:39.687828131 +0200
-@@ -49,7 +49,8 @@
- QStringList search;
-
- // assemble the local search paths
-- const QStringList localDoc = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "doc/HTML", QStandardPaths::LocateDirectory);
-+ QStringList localDoc = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "doc/HTML", QStandardPaths::LocateDirectory);
-+ localDoc << QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "doc/kde/HTML", QStandardPaths::LocateDirectory);
-
- QStringList langs = QLocale().uiLanguages();
- langs.append("en");
-
diff --git a/kde/patch/kirigami2.patch b/kde/patch/kirigami2.patch
deleted file mode 100644
index 9a997b3..0000000
--- a/kde/patch/kirigami2.patch
+++ /dev/null
@@ -1,8 +0,0 @@
-# Fix crashes in systemsettings5 when visiting the second icon.
-# Should be fixed post kirigami2 5.64.0):
-#cat $CWD/patch/kirigami2/kirigami_iconview_crash.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Make headerParent correctly aligned when there is a scrollbar:
-# Should be fixed post kirigami2 5.67.0):
-#cat $CWD/patch/kirigami2/kirigami_scrollbar.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kirigami2/kirigami_iconview_crash.patch b/kde/patch/kirigami2/kirigami_iconview_crash.patch
deleted file mode 100644
index 79a35ed..0000000
--- a/kde/patch/kirigami2/kirigami_iconview_crash.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-diff --git a/src/columnview.cpp b/src/columnview.cpp
---- a/src/columnview.cpp
-+++ b/src/columnview.cpp
-@@ -37,23 +37,37 @@
- public:
- QmlComponentsPoolSingleton()
- {}
--
-- QmlComponentsPool self;
-+ static QmlComponentsPool *instance(QQmlEngine *engine);
-+private:
-+ QHash<QQmlEngine*, QmlComponentsPool*> m_instances;
- };
-
- Q_GLOBAL_STATIC(QmlComponentsPoolSingleton, privateQmlComponentsPoolSelf)
-
-
--QmlComponentsPool::QmlComponentsPool(QObject *parent)
-- : QObject(parent)
--{}
--
--void QmlComponentsPool::initialize(QQmlEngine *engine)
-+QmlComponentsPool *QmlComponentsPoolSingleton::instance(QQmlEngine *engine)
- {
-- if (!engine || m_instance) {
-- return;
-+ Q_ASSERT(engine);
-+ auto componentPool = privateQmlComponentsPoolSelf->m_instances.value(engine);
-+
-+ if (componentPool) {
-+ return componentPool;
- }
-
-+ componentPool = new QmlComponentsPool(engine);
-+
-+ QObject::connect(componentPool, &QObject::destroyed, [engine]() {
-+ if (privateQmlComponentsPoolSelf) {
-+ privateQmlComponentsPoolSelf->m_instances.remove(engine);
-+ }
-+ });
-+ privateQmlComponentsPoolSelf->m_instances[engine] = componentPool;
-+ return componentPool;
-+}
-+
-+QmlComponentsPool::QmlComponentsPool(QQmlEngine *engine)
-+ : QObject(engine)
-+{
- QQmlComponent *component = new QQmlComponent(engine, this);
-
- component->setData(QByteArrayLiteral("import QtQuick 2.7\n"
-@@ -572,12 +586,12 @@
- QQuickItem *separatorItem = m_separators.value(item);
-
- if (!separatorItem) {
-- separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->self.m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
-+ separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->instance(qmlEngine(item))->m_separatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
- if (separatorItem) {
- separatorItem->setParentItem(item);
- separatorItem->setZ(9999);
- separatorItem->setProperty("column", QVariant::fromValue(item));
-- privateQmlComponentsPoolSelf->self.m_separatorComponent->completeCreate();
-+ QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_separatorComponent->completeCreate();
- m_separators[item] = separatorItem;
- }
- }
-@@ -590,12 +604,12 @@
- QQuickItem *separatorItem = m_rightSeparators.value(item);
-
- if (!separatorItem) {
-- separatorItem = qobject_cast<QQuickItem *>(privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
-+ separatorItem = qobject_cast<QQuickItem *>(QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_rightSeparatorComponent->beginCreate(QQmlEngine::contextForObject(item)));
- if (separatorItem) {
- separatorItem->setParentItem(item);
- separatorItem->setZ(9999);
- separatorItem->setProperty("column", QVariant::fromValue(item));
-- privateQmlComponentsPoolSelf->self.m_rightSeparatorComponent->completeCreate();
-+ QmlComponentsPoolSingleton::instance(qmlEngine(item))->m_rightSeparatorComponent->completeCreate();
- m_rightSeparators[item] = separatorItem;
- }
- }
-@@ -759,7 +773,7 @@
- void ColumnView::setColumnWidth(qreal width)
- {
- // Always forget the internal binding when the user sets anything, even the same value
-- disconnect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::gridUnitChanged, this, nullptr);
-+ disconnect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::gridUnitChanged, this, nullptr);
-
- if (m_contentItem->m_columnWidth == width) {
- return;
-@@ -902,7 +916,7 @@
-
- void ColumnView::setScrollDuration(int duration)
- {
-- disconnect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::longDurationChanged, this, nullptr);
-+ disconnect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::longDurationChanged, this, nullptr);
-
- if (m_contentItem->m_slideAnim->duration() == duration) {
- return;
-@@ -1392,22 +1406,20 @@
-
- void ColumnView::classBegin()
- {
-- privateQmlComponentsPoolSelf->self.initialize(qmlEngine(this));
--
- auto syncColumnWidth = [this]() {
-- m_contentItem->m_columnWidth = privateQmlComponentsPoolSelf->self.m_units->property("gridUnit").toInt() * 20;
-+ m_contentItem->m_columnWidth = privateQmlComponentsPoolSelf->instance(qmlEngine(this))->m_units->property("gridUnit").toInt() * 20;
- emit columnWidthChanged();
- };
-
-- connect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::gridUnitChanged, this, syncColumnWidth);
-+ connect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::gridUnitChanged, this, syncColumnWidth);
- syncColumnWidth();
-
- auto syncDuration = [this]() {
-- m_contentItem->m_slideAnim->setDuration(privateQmlComponentsPoolSelf->self.m_units->property("longDuration").toInt());
-+ m_contentItem->m_slideAnim->setDuration(QmlComponentsPoolSingleton::instance(qmlEngine(this))->m_units->property("longDuration").toInt());
- emit scrollDurationChanged();
- };
-
-- connect(&privateQmlComponentsPoolSelf->self, &QmlComponentsPool::longDurationChanged, this, syncDuration);
-+ connect(QmlComponentsPoolSingleton::instance(qmlEngine(this)), &QmlComponentsPool::longDurationChanged, this, syncDuration);
- syncDuration();
-
- QQuickItem::classBegin();
-diff --git a/src/columnview_p.h b/src/columnview_p.h
---- a/src/columnview_p.h
-+++ b/src/columnview_p.h
-@@ -32,11 +32,9 @@
- Q_OBJECT
-
- public:
-- QmlComponentsPool(QObject *parent = nullptr);
-+ QmlComponentsPool(QQmlEngine *engine);
- ~QmlComponentsPool();
-
-- void initialize(QQmlEngine *engine);
--
- QQmlComponent *m_separatorComponent = nullptr;
- QQmlComponent *m_rightSeparatorComponent = nullptr;
- QObject *m_units = nullptr;
-
-
diff --git a/kde/patch/kirigami2/kirigami_scrollbar.patch b/kde/patch/kirigami2/kirigami_scrollbar.patch
deleted file mode 100644
index e81bf0e..0000000
--- a/kde/patch/kirigami2/kirigami_scrollbar.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From f695cde36a6829b8b92b2fd82deff16d9385fcb9 Mon Sep 17 00:00:00 2001
-From: Marco Martin <notmart@gmail.com>
-Date: Mon, 10 Feb 2020 11:48:50 +0100
-Subject: make headerParent correctly alignedwhen there is a scrollbar
-
----
- src/controls/GlobalDrawer.qml | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/controls/GlobalDrawer.qml b/src/controls/GlobalDrawer.qml
-index 0e8e512..9166ad7 100644
---- a/src/controls/GlobalDrawer.qml
-+++ b/src/controls/GlobalDrawer.qml
-@@ -301,6 +301,7 @@ OverlayDrawer {
- anchors {
- left: parent.left
- right: parent.right
-+ rightMargin: Math.min(0, -scrollView.width + mainFlickable.width)
- }
- spacing: 0
- y: bannerImage.visible ? Math.max(headerContainer.height, -mainFlickable.contentY) - height : 0
---
-cgit v1.1
-
-
diff --git a/kde/patch/kmail.patch b/kde/patch/kmail.patch
deleted file mode 100644
index 0cbf394..0000000
--- a/kde/patch/kmail.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix kontact crash on logout (KDEBUG 404881).
-# Fixed post 19.04.2.
-#cat $CWD/patch/kmail/kmail_kontact_kdebug_404881.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kmail/kmail_kontact_kdebug_404881.patch b/kde/patch/kmail/kmail_kontact_kdebug_404881.patch
deleted file mode 100644
index f2704aa..0000000
--- a/kde/patch/kmail/kmail_kontact_kdebug_404881.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 97e165dcf5a851ee10526631d24f9af7736da2e6 Mon Sep 17 00:00:00 2001
-From: David Faure <faure@kde.org>
-Date: Thu, 6 Jun 2019 18:10:42 +0200
-Subject: Fix kontact crash on logout.
-
-Summary:
-KMail was creating new Akonadi jobs during mainwindow destruction,
-due to not testing the bool in GuiActivateEvent.
-
-Same bt in bug 404881, apparently quitting from the akregator tray icon
-[which quits all of kontact... separate issue...] gave the same crash.
-
-BUG: 404881
-FIXED-IN: 19.04.2
-
-Test Plan: Run kontact, logout. Hello Drkonqi.
-
-Reviewers: mlaurent, winterz
-
-Reviewed By: mlaurent, winterz
-
-Subscribers: kde-pim
-
-Tags: #kde_pim
-
-Differential Revision: https://phabricator.kde.org/D21626
----
- src/kmail_part.cpp | 23 ++++++++++++-----------
- 1 file changed, 12 insertions(+), 11 deletions(-)
-
-diff --git a/src/kmail_part.cpp b/src/kmail_part.cpp
-index 703a1ee..96c4c07 100644
---- a/src/kmail_part.cpp
-+++ b/src/kmail_part.cpp
-@@ -33,6 +33,7 @@
-
- #include <QVBoxLayout>
-
-+#include <KParts/GUIActivateEvent>
- #include <kparts/statusbarextension.h>
- #include <kparts/mainwindow.h>
- #include <kpluginfactory.h>
-@@ -129,18 +130,18 @@ bool KMailPart::openFile()
- void KMailPart::guiActivateEvent(KParts::GUIActivateEvent *e)
- {
- KParts::ReadOnlyPart::guiActivateEvent(e);
-- mainWidget->initializeFilterActions();
-- mainWidget->tagActionManager()->createActions();
-- mainWidget->folderShortcutActionManager()->createActions();
-- mainWidget->populateMessageListStatusFilterCombo();
-- mainWidget->initializePluginActions();
-- /*
-- FIXME it doesn't work when we switch component.
-- const QString title = mainWidget->fullCollectionPath();
-- if (!title.isEmpty()) {
-- Q_EMIT setWindowCaption(title);
-+ if (e->activated()) {
-+ mainWidget->initializeFilterActions();
-+ mainWidget->tagActionManager()->createActions();
-+ mainWidget->folderShortcutActionManager()->createActions();
-+ mainWidget->populateMessageListStatusFilterCombo();
-+ mainWidget->initializePluginActions();
-+
-+ const QString title = mainWidget->fullCollectionPath();
-+ if (!title.isEmpty()) {
-+ Q_EMIT setWindowCaption(title);
-+ }
- }
-- */
- }
-
- void KMailPart::exit()
---
-cgit v1.1
-
diff --git a/kde/patch/kmplot.patch b/kde/patch/kmplot.patch
deleted file mode 100644
index aee60a5..0000000
--- a/kde/patch/kmplot.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-#cat $CWD/patch/kmplot/kmplot_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kmplot/kmplot_isnan.patch b/kde/patch/kmplot/kmplot_isnan.patch
deleted file mode 100644
index 691ff89..0000000
--- a/kde/patch/kmplot/kmplot_isnan.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- kmplot-15.12.3/kmplot/view.cpp.0 2016-03-11 21:19:48.011194225 +0000
-+++ kmplot-15.12.3/kmplot/view.cpp 2016-03-11 21:20:37.341056493 +0000
-@@ -476,7 +476,7 @@
- double x = pixel.x();
- double y = pixel.y();
-
-- if ( isnan(x) )
-+ if ( std::isnan(x) )
- {
- xclipflg = true;
- x = pixelIfNaN.x();
-@@ -496,14 +496,14 @@
- }
- else
- {
-- if ( isinf(x) == -1 )
-+ if ( std::isinf(x) == -1 )
- x = 0;
-
-- else if ( isinf(x) == 1 )
-+ else if ( std::isinf(x) == 1 )
- x = m_clipRect.right();
- }
-
-- if ( isnan(y) )
-+ if ( std::isnan(y) )
- {
- yclipflg = true;
- y = pixelIfNaN.y();
-@@ -523,10 +523,10 @@
- }
- else
- {
-- if ( isinf(y) == -1 )
-+ if ( std::isinf(y) == -1 )
- y = 0;
-
-- else if ( isinf(y) == 1 )
-+ else if ( std::isinf(y) == 1 )
- y = m_clipRect.bottom();
- }
-
diff --git a/kde/patch/konsole.patch b/kde/patch/konsole.patch
deleted file mode 100644
index b296ad1..0000000
--- a/kde/patch/konsole.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-# Set TERM to 'konsole' instead of the default 'xterm-256color'
-# to prevent garbled text under certain conditions:
-# Reverted to default behaviour in 18.04.0 after Slackware did the same:
-#cat $CWD/patch/konsole/konsole.term.is.konsole.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix rendering of cursor if non-default theme is selected
-# (fixed post 18.12.3):
-#cat $CWD/patch/konsole/konsole.cursor.antialias.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix crash when closing session in KonsolePart via menu:
-# (fixed in 20.04.2)
-#cat $CWD/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix konsolepart segfault when closing after showing context menu:
-# (fixed in 20.04.2)
-#cat $CWD/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/konsole/konsole.cursor.antialias.patch b/kde/patch/konsole/konsole.cursor.antialias.patch
deleted file mode 100644
index 596ccaa..0000000
--- a/kde/patch/konsole/konsole.cursor.antialias.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From eccfb1f62bbf67ebffee11e241bd05757b826ff1 Mon Sep 17 00:00:00 2001
-From: Wolfgang Bauer <wbauer@tmo.at>
-Date: Mon, 4 Mar 2019 09:59:45 -0500
-Subject: [PATCH] Fix ibeam and underline cursor rendering
-
-Summary:
-Since anti-aliasing was enabled in the painter, coordinates need to
-be shifted half a pixel so that they align with the pixel grid,
-otherwise the result gets "blurred" due to the anti-aliasing.
-And as parts of the blurred shape leak outside the cursor rectangle,
-this also leaves artifacts when the cursor moves or blinks as these
-parts are not cleared.
-
-This is basically the same as commit
-e7085310d6d594823d0ed491fa8bdbd99dec4932 for the
-standard block cursor.
-
-BUG: 402589
-
-Test Plan:
-- Switch cursor shape to "I-Beam" or "Underline" in the "Advanced"
-profile settings
-
-The cursors are a single line again now, before they were blurred by
-anti-aliasing.
-
-Screenshots:
-Before:
-{F6656366}
-{F6656370}
-
-After:
-{F6656371}
-{F6656373}
-
-Also, there are no more artifacts when the cursor is moved or
-cursor blinking is enabled.
-
-Reviewers: #konsole, hindenburg
-
-Reviewed By: #konsole, hindenburg
-
-Subscribers: hindenburg, konsole-devel
-
-Tags: #konsole
-
-Differential Revision: https://phabricator.kde.org/D19513
----
- src/TerminalDisplay.cpp | 18 ++++++++++--------
- 1 file changed, 10 insertions(+), 8 deletions(-)
-
-diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp
-index 543b8970..397422c4 100644
---- a/src/TerminalDisplay.cpp
-+++ b/src/TerminalDisplay.cpp
-@@ -716,16 +716,18 @@ void TerminalDisplay::drawCursor(QPainter& painter,
- }
- }
- } else if (_cursorShape == Enum::UnderlineCursor) {
-- painter.drawLine(cursorRect.left(),
-- cursorRect.bottom(),
-- cursorRect.right(),
-- cursorRect.bottom());
-+ QLineF line(cursorRect.left() + 0.5,
-+ cursorRect.bottom() - 0.5,
-+ cursorRect.right() - 0.5,
-+ cursorRect.bottom() - 0.5);
-+ painter.drawLine(line);
-
- } else if (_cursorShape == Enum::IBeamCursor) {
-- painter.drawLine(cursorRect.left(),
-- cursorRect.top(),
-- cursorRect.left(),
-- cursorRect.bottom());
-+ QLineF line(cursorRect.left() + 0.5,
-+ cursorRect.top() + 0.5,
-+ cursorRect.left() + 0.5,
-+ cursorRect.bottom() - 0.5);
-+ painter.drawLine(line);
- }
- }
-
-
diff --git a/kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch b/kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch
deleted file mode 100644
index fcdbb84..0000000
--- a/kde/patch/konsole/konsole.konsolepart.segfault.closing.after.contextmenu.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 1d7142ed24ef370ae984c0441d5b325b42656bd7 Mon Sep 17 00:00:00 2001
-From: Maximilian Schiller <manimax3@outlook.de>
-Date: Fri, 29 May 2020 07:36:02 -0400
-Subject: Fix konsolepart segfault when closing after showing context menu
-
-Assign the _view as the parent to the KXMLGuiFactory because the
-factory is referencing the view widget as its associated widget. Since
-the TerminalDisplay gets destructed first this is now a dangling
-pointer. If the view is set as the parent the factory gets cleaned up
-correctly. Also cleanup the created clientBuilder after destruction
-because it can't have a parent and would probably leak memory.
-
-BUG: 415762
-FIXED-IN: 20.08.0
-See also !87
----
- src/SessionController.cpp | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/src/SessionController.cpp b/src/SessionController.cpp
-index e72f342..542955d 100644
---- a/src/SessionController.cpp
-+++ b/src/SessionController.cpp
-@@ -1732,11 +1732,13 @@ void SessionController::showDisplayContextMenu(const QPoint& position)
- if (factory() == nullptr) {
- if (clientBuilder() == nullptr) {
- setClientBuilder(new KXMLGUIBuilder(_view));
-+
-+ // Client builder does not get deleted automatically
-+ connect(this, &QObject::destroyed, this, [this]{ delete clientBuilder(); });
- }
-
-- auto factory = new KXMLGUIFactory(clientBuilder(), this);
-+ auto factory = new KXMLGUIFactory(clientBuilder(), _view);
- factory->addClient(this);
-- ////qDebug() << "Created xmlgui factory" << factory;
- }
-
- QPointer<QMenu> popup = qobject_cast<QMenu*>(factory()->container(QStringLiteral("session-popup-menu"), this));
---
-cgit v1.1
-
-
diff --git a/kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch b/kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch
deleted file mode 100644
index 914031b..0000000
--- a/kde/patch/konsole/konsole.konsolepart.segfault.closing.session.via.menu.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-From fdfae25665731882687da8721e58c3c56a3babf8 Mon Sep 17 00:00:00 2001
-From: Nicolas Fella <nicolas.fella@gmx.de>
-Date: Thu, 28 May 2020 09:28:06 -0400
-Subject: Fix crash when closing session in KonsolePart via menu
-
-This close method is also used when closing a Konsole session
-via the X on the tabbar and tabheader.
-
-FIXED-IN: 20.08.0
-BUG: 420817
-BUG: 420695
-BUG: 415762
-
-See merge request !87
----
- src/SessionController.cpp | 23 +++++++++++++++--------
- 1 file changed, 15 insertions(+), 8 deletions(-)
-
-diff --git a/src/SessionController.cpp b/src/SessionController.cpp
-index 006ba8b..e72f342 100644
---- a/src/SessionController.cpp
-+++ b/src/SessionController.cpp
-@@ -999,16 +999,23 @@ void SessionController::closeSession()
- return;
- }
-
-- if (confirmClose()) {
-- if (_session->closeInNormalWay()) {
-+ if (!confirmClose()) {
-+ return;
-+ }
-+
-+ if (!_session->closeInNormalWay()) {
-+ if (!confirmForceClose()) {
- return;
-- } else if (confirmForceClose()) {
-- if (_session->closeInForceWay()) {
-- return;
-- } else {
-- qCDebug(KonsoleDebug) << "Konsole failed to close a session in any way.";
-- }
- }
-+
-+ if (!_session->closeInForceWay()) {
-+ qCDebug(KonsoleDebug) << "Konsole failed to close a session in any way.";
-+ return;
-+ }
-+ }
-+
-+ if (factory()) {
-+ factory()->removeClient(this);
- }
- }
-
---
-cgit v1.1
-
-
diff --git a/kde/patch/konsole/konsole.term.is.konsole.patch b/kde/patch/konsole/konsole.term.is.konsole.patch
deleted file mode 100644
index 443b9f1..0000000
--- a/kde/patch/konsole/konsole.term.is.konsole.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff -uar konsole-17.12.3.orig/src/Profile.cpp konsole-17.12.3/src/Profile.cpp
---- konsole-17.12.3.orig/src/Profile.cpp 2018-03-01 23:54:01.000000000 +0100
-+++ konsole-17.12.3/src/Profile.cpp 2018-04-03 21:17:11.897873304 +0200
-@@ -157,7 +157,7 @@
- // See Pty.cpp on why Arguments is populated
- setProperty(Arguments, QStringList() << QString::fromUtf8(qgetenv("SHELL")));
- setProperty(Icon, QStringLiteral("utilities-terminal"));
-- setProperty(Environment, QStringList() << QStringLiteral("TERM=xterm-256color") << QStringLiteral("COLORTERM=truecolor"));
-+ setProperty(Environment, QStringList() << QStringLiteral("TERM=konsole") << QStringLiteral("COLORTERM=truecolor"));
- setProperty(LocalTabTitleFormat, QStringLiteral("%d : %n"));
- setProperty(RemoteTabTitleFormat, QStringLiteral("(%u) %H"));
- setProperty(ShowTerminalSizeHint, true);
-diff -uar konsole-17.12.3.orig/src/Pty.cpp konsole-17.12.3/src/Pty.cpp
---- konsole-17.12.3.orig/src/Pty.cpp 2018-03-01 23:54:01.000000000 +0100
-+++ konsole-17.12.3/src/Pty.cpp 2018-04-03 21:18:18.898007801 +0200
-@@ -229,7 +229,7 @@
-
- // extra safeguard to make sure $TERM is always set
- if (!isTermEnvAdded) {
-- setEnv(QStringLiteral("TERM"), QStringLiteral("xterm-256color"));
-+ setEnv(QStringLiteral("TERM"), QStringLiteral("konsole"));
- }
- }
-
diff --git a/kde/patch/kopete.patch b/kde/patch/kopete.patch
deleted file mode 100644
index 64e8238..0000000
--- a/kde/patch/kopete.patch
+++ /dev/null
@@ -1,9 +0,0 @@
-# Fix for jabber protocol vulnerability in Kopete: CVE-2017-5593
-# (User Impersonation Vulnerability)
-# Fixed in 16.12.3.
-# cat $CWD/patch/kopete/kopete_kdebug376348.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Make 18.04.0 compile.
-# Fixed in 18.04.1.
-#cat $CWD/patch/kopete/kopete_kdebug393372.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kopete/kopete_kdebug376348.patch b/kde/patch/kopete/kopete_kdebug376348.patch
deleted file mode 100644
index d9bb057..0000000
--- a/kde/patch/kopete/kopete_kdebug376348.patch
+++ /dev/null
@@ -1,127 +0,0 @@
-From 6243764c4fd0985320d4a10b48051cc418d584ad Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali.rohar@gmail.com>
-Date: Sat, 11 Feb 2017 13:24:59 +0100
-Subject: Fix CVE 2017-5593 (User Impersonation Vulnerability) in jabber
- protocol
-
-BUG: 376348
-FIXED-IN: 16.12.3
----
- .../jabber/libiris/patches/01_cve_2017-5593.patch | 52 ++++++++++++++++++++++
- .../jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp | 14 +++---
- 2 files changed, 61 insertions(+), 5 deletions(-)
- create mode 100644 protocols/jabber/libiris/patches/01_cve_2017-5593.patch
-
-diff --git a/protocols/jabber/libiris/patches/01_cve_2017-5593.patch b/protocols/jabber/libiris/patches/01_cve_2017-5593.patch
-new file mode 100644
-index 0000000..573ca66
---- /dev/null
-+++ b/protocols/jabber/libiris/patches/01_cve_2017-5593.patch
-@@ -0,0 +1,52 @@
-+diff --git a/src/xmpp/xmpp-im/xmpp_tasks.cpp b/src/xmpp/xmpp-im/xmpp_tasks.cpp
-+index 0e74b71..0837548 100644
-+--- a/src/xmpp/xmpp-im/xmpp_tasks.cpp
-++++ b/src/xmpp/xmpp-im/xmpp_tasks.cpp
-+@@ -888,14 +888,18 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ QDomElement forward;
-+ Message::CarbonDir cd = Message::NoCarbon;
-+
-++ Jid fromJid = Jid(e1.attribute(QLatin1String("from")));
-+ // Check for Carbon
-+ QDomNodeList list = e1.childNodes();
-+ for (int i = 0; i < list.size(); ++i) {
-+ QDomElement el = list.at(i).toElement();
-+
-+- if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2") && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))) {
-++ if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2")
-++ && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))
-++ && fromJid.compare(Jid(e1.attribute(QLatin1String("to"))), false)) {
-+ QDomElement el1 = el.firstChildElement();
-+- if (el1.tagName() == QLatin1String("forwarded") && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-++ if (el1.tagName() == QLatin1String("forwarded")
-++ && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ QDomElement el2 = el1.firstChildElement(QLatin1String("message"));
-+ if (!el2.isNull()) {
-+ forward = el2;
-+@@ -904,7 +908,8 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ }
-+ }
-+ }
-+- else if (el.tagName() == QLatin1String("forwarded") && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-++ else if (el.tagName() == QLatin1String("forwarded")
-++ && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ forward = el.firstChildElement(QLatin1String("message")); // currently only messages are supportted
-+ // TODO <delay> element support
-+ if (!forward.isNull()) {
-+@@ -913,7 +918,6 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ }
-+ }
-+
-+- QString from = e1.attribute(QLatin1String("from"));
-+ Stanza s = client()->stream().createStanza(addCorrectNS(forward.isNull()? e1 : forward));
-+ if(s.isNull()) {
-+ //printf("take: bad stanza??\n");
-+@@ -926,7 +930,7 @@ bool JT_PushMessage::take(const QDomElement &e)
-+ return false;
-+ }
-+ if (!forward.isNull()) {
-+- m.setForwardedFrom(Jid(from));
-++ m.setForwardedFrom(fromJid);
-+ m.setCarbonDirection(cd);
-+ }
-+
-diff --git a/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp b/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp
-index 0e74b71..0837548 100644
---- a/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp
-+++ b/protocols/jabber/libiris/src/xmpp/xmpp-im/xmpp_tasks.cpp
-@@ -888,14 +888,18 @@ bool JT_PushMessage::take(const QDomElement &e)
- QDomElement forward;
- Message::CarbonDir cd = Message::NoCarbon;
-
-+ Jid fromJid = Jid(e1.attribute(QLatin1String("from")));
- // Check for Carbon
- QDomNodeList list = e1.childNodes();
- for (int i = 0; i < list.size(); ++i) {
- QDomElement el = list.at(i).toElement();
-
-- if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2") && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))) {
-+ if (el.attribute("xmlns") == QLatin1String("urn:xmpp:carbons:2")
-+ && (el.tagName() == QLatin1String("received") || el.tagName() == QLatin1String("sent"))
-+ && fromJid.compare(Jid(e1.attribute(QLatin1String("to"))), false)) {
- QDomElement el1 = el.firstChildElement();
-- if (el1.tagName() == QLatin1String("forwarded") && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ if (el1.tagName() == QLatin1String("forwarded")
-+ && el1.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
- QDomElement el2 = el1.firstChildElement(QLatin1String("message"));
- if (!el2.isNull()) {
- forward = el2;
-@@ -904,7 +908,8 @@ bool JT_PushMessage::take(const QDomElement &e)
- }
- }
- }
-- else if (el.tagName() == QLatin1String("forwarded") && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
-+ else if (el.tagName() == QLatin1String("forwarded")
-+ && el.attribute(QLatin1String("xmlns")) == QLatin1String("urn:xmpp:forward:0")) {
- forward = el.firstChildElement(QLatin1String("message")); // currently only messages are supportted
- // TODO <delay> element support
- if (!forward.isNull()) {
-@@ -913,7 +918,6 @@ bool JT_PushMessage::take(const QDomElement &e)
- }
- }
-
-- QString from = e1.attribute(QLatin1String("from"));
- Stanza s = client()->stream().createStanza(addCorrectNS(forward.isNull()? e1 : forward));
- if(s.isNull()) {
- //printf("take: bad stanza??\n");
-@@ -926,7 +930,7 @@ bool JT_PushMessage::take(const QDomElement &e)
- return false;
- }
- if (!forward.isNull()) {
-- m.setForwardedFrom(Jid(from));
-+ m.setForwardedFrom(fromJid);
- m.setCarbonDirection(cd);
- }
-
---
-cgit v0.11.2
-
diff --git a/kde/patch/kopete/kopete_kdebug393372.patch b/kde/patch/kopete/kopete_kdebug393372.patch
deleted file mode 100644
index 2d1b1f0..0000000
--- a/kde/patch/kopete/kopete_kdebug393372.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From b1f4fa1401cba2e359e5a4b3ea2bafd119fca62b Mon Sep 17 00:00:00 2001
-From: Pino Toscano <pino@kde.org>
-Date: Tue, 24 Apr 2018 06:30:19 +0200
-Subject: oscar: include buffer.h
-
-This header uses Buffer as by-value parameter, so make sure it knows
-about it.
-
-BUG: 393372
-FIXED-IN: 18.04.1
----
- protocols/oscar/liboscar/tasks/messagereceivertask.h | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/protocols/oscar/liboscar/tasks/messagereceivertask.h b/protocols/oscar/liboscar/tasks/messagereceivertask.h
-index 8f52cd7..908e903 100644
---- a/protocols/oscar/liboscar/tasks/messagereceivertask.h
-+++ b/protocols/oscar/liboscar/tasks/messagereceivertask.h
-@@ -21,6 +21,7 @@
- #include <QByteArray>
- #include "oscarmessage.h"
- #include "oscartypeclasses.h"
-+#include "buffer.h"
-
- class QTextCodec;
-
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/korundum.patch b/kde/patch/korundum.patch
deleted file mode 100644
index 10deb29..0000000
--- a/kde/patch/korundum.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Build against Ruby 1.9.3.
-# See also https://bugs.kde.org/show_bug.cgi?id=287057
-# No longer needed in KDE 4.11.
-#cat $CWD/patch/korundum/korundum_ruby19.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/korundum/korundum_ruby19.patch b/kde/patch/korundum/korundum_ruby19.patch
deleted file mode 100644
index 561d8de..0000000
--- a/kde/patch/korundum/korundum_ruby19.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff -up korundum-4.8.0/src/krubypluginfactory.cpp.ruby19 korundum-4.8.0/src/krubypluginfactory.cpp
---- korundum-4.8.0/src/krubypluginfactory.cpp.ruby19 2011-07-27 13:37:29.000000000 -0500
-+++ korundum-4.8.0/src/krubypluginfactory.cpp 2012-02-17 08:30:38.785635819 -0600
-@@ -39,7 +39,7 @@
- extern "C" {
- extern VALUE rb_load_path;
- extern VALUE qt_internal_module;
--void Init_prelude(void);
-+// void Init_prelude(void);
- }
-
- //
-@@ -165,7 +165,7 @@ QObject *KRubyPluginFactory::create(cons
- #if RUBY_VERSION >= 0x10900
- VALUE gem = rb_define_module("Gem");
- rb_const_set(gem, rb_intern("Enable"), Qtrue);
-- Init_prelude();
-+// Init_prelude();
- #endif
-
- ruby_incpush(QFile::encodeName(program.path()));
-@@ -342,7 +342,7 @@ int kdemain(int argc, char **argv)
- #if RUBY_VERSION >= 0x10900
- VALUE gem = rb_define_module("Gem");
- rb_const_set(gem, rb_intern("Enable"), Qtrue);
-- Init_prelude();
-+// Init_prelude();
- #endif
-
- ruby_incpush(QFile::encodeName(program.path()));
-
diff --git a/kde/patch/kpat.patch b/kde/patch/kpat.patch
deleted file mode 100644
index 5bda77a..0000000
--- a/kde/patch/kpat.patch
+++ /dev/null
@@ -1,6 +0,0 @@
-# Commit https://cgit.kde.org/kpat.git/patch/?id=fc1d54ced6a727382599d767e55879b6843c3456
-# Introduces a hard dependency on fc-solver which in turn has new dependencies
-# So, we revert this commit to avoid dropping kpat altogether in 18.08.0.
-# For 18.12.0 we will have to add freecell-solver anyway.
-#cat $CWD/patch/kpat/kpat_no_freecell_solver_dep.patch | patch -p1 --reverse --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kpat/kpat_no_freecell_solver_dep.patch b/kde/patch/kpat/kpat_no_freecell_solver_dep.patch
deleted file mode 100644
index 06aedca..0000000
--- a/kde/patch/kpat/kpat_no_freecell_solver_dep.patch
+++ /dev/null
@@ -1,1475 +0,0 @@
-Commit https://cgit.kde.org/kpat.git/patch/?id=fc1d54ced6a727382599d767e55879b6843c3456
-Introduces a hard dependency on fc-solver which in turn has new dependencies
-So, we revert this commit to avoid dropping kpat altogether
-
-From ed0e53e0888da7123f4a0d2097f8da7fb105ca18 Mon Sep 17 00:00:00 2001
-From: Fabian Kosmale <0inkane@googlemail.com>
-Date: Sun, 13 May 2018 15:14:53 +0200
-Subject: Use Freecell Solver for FreeCell and Simple Simon
-
-Summary: This uses http://fc-solve.shlomifish.org/ and prevents the looping in the existing solvers.
-
-Test Plan: Test that the solvers are working.
-
-Reviewers: #kde_games, fabiank
-
-Subscribers: kde-games-devel, aacid, #kde_games
-
-Tags: #kde_games
-
-Differential Revision: https://phabricator.kde.org/D12415
----
- CMakeLists.txt | 6 +-
- dealer.cpp | 4 +
- freecell.cpp | 35 ++++
- freecell.h | 1 +
- patsolve/abstract_fc_solve_solver.cpp | 239 ++++++++++++++++++++++++++
- patsolve/abstract_fc_solve_solver.h | 52 ++++++
- patsolve/freecellsolver.cpp | 310 +++++++++++++++++-----------------
- patsolve/freecellsolver.h | 23 ++-
- patsolve/patsolve.h | 12 +-
- patsolve/simonsolver.cpp | 129 +++++++++++++-
- patsolve/simonsolver.h | 20 ++-
- patsolve/solverinterface.h | 2 +
- pileutils.cpp | 61 +++++++
- pileutils.h | 4 +
- simon.cpp | 56 +++++-
- simon.h | 1 +
- 16 files changed, 779 insertions(+), 176 deletions(-)
- create mode 100644 patsolve/abstract_fc_solve_solver.cpp
- create mode 100644 patsolve/abstract_fc_solve_solver.h
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 8f738bf..c043c45 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -4,6 +4,8 @@ cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR)
- set (QT_MIN_VERSION "5.7.0")
- set (KF5_MIN_VERSION "5.30.0")
-
-+include(FindPkgConfig)
-+pkg_check_modules(FC_SOLVE REQUIRED libfreecell-solver)
- find_package(ECM ${KF5_MIN_VERSION} REQUIRED CONFIG)
- set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
-
-@@ -45,7 +47,7 @@ add_subdirectory(sounds)
- add_subdirectory(themes)
- add_subdirectory(doc)
-
--set(kpat_SRCS
-+set(kpat_SRCS ${libfcs_SRCS}
- main.cpp
- dealer.cpp
- dealerinfo.cpp
-@@ -59,6 +61,7 @@ set(kpat_SRCS
- soundengine.cpp
- statisticsdialog.cpp
- view.cpp
-+ patsolve/abstract_fc_solve_solver.cpp
- patsolve/memory.cpp
- patsolve/patsolve.cpp
-
-@@ -101,6 +104,7 @@ target_link_libraries(kpat
- KF5::KIOCore
- KF5KDEGames
- kcardgame
-+ ${FC_SOLVE_LDFLAGS}
- )
-
- install(TARGETS kpat ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-diff --git a/dealer.cpp b/dealer.cpp
-index 7c03ebf..a2558fc 100644
---- a/dealer.cpp
-+++ b/dealer.cpp
-@@ -1724,6 +1724,10 @@ void DealerScene::startSolver()
-
- bool DealerScene::isGameLost() const
- {
-+ if (! m_winningMoves.isEmpty())
-+ {
-+ return false;
-+ }
- if ( solver() )
- {
- if ( m_solverThread && m_solverThread->isRunning() )
-diff --git a/freecell.cpp b/freecell.cpp
-index f870cdb..9a7c278 100644
---- a/freecell.cpp
-+++ b/freecell.cpp
-@@ -111,6 +111,41 @@ void Freecell::restart( const QList<KCard*> & cards )
- }
-
-
-+QString Freecell::solverFormat() const
-+{
-+ QString output;
-+ QString tmp;
-+ for (int i = 0; i < 4 ; i++) {
-+ if (target[i]->isEmpty())
-+ continue;
-+ tmp += suitToString(target[i]->topCard()->suit()) + '-' + rankToString(target[i]->topCard()->rank()) + ' ';
-+ }
-+ if (!tmp.isEmpty())
-+ output += QString::fromLatin1("Foundations: %1\n").arg(tmp);
-+
-+ tmp.truncate(0);
-+ for (int i = 0; i < 4 ; i++) {
-+ if (freecell[i]->isEmpty())
-+ tmp += "- ";
-+ else
-+ tmp += rankToString(freecell[i]->topCard()->rank()) + suitToString(freecell[i]->topCard()->suit()) + ' ';
-+ }
-+ if (!tmp.isEmpty())
-+ {
-+ QString a = QString::fromLatin1("Freecells: %1\n");
-+ output += a.arg(tmp);
-+ }
-+
-+ for (int i = 0; i < 8 ; i++)
-+ {
-+ QList<KCard*> cards = store[i]->cards();
-+ for (QList<KCard*>::ConstIterator it = cards.begin(); it != cards.end(); ++it)
-+ output += rankToString((*it)->rank()) + suitToString((*it)->suit()) + ' ';
-+ output += '\n';
-+ }
-+ return output;
-+}
-+
- void Freecell::cardsDroppedOnPile( const QList<KCard*> & cards, KCardPile * pile )
- {
- if ( cards.size() <= 1 )
-diff --git a/freecell.h b/freecell.h
-index 7b0b2cb..9f7d84b 100644
---- a/freecell.h
-+++ b/freecell.h
-@@ -62,6 +62,7 @@ protected slots:
- private:
- bool canPutStore( const KCardPile * pile, const QList<KCard*> & cards ) const;
-
-+ virtual QString solverFormat() const;
- PatPile* store[8];
- PatPile* freecell[4];
- PatPile* target[4];
-diff --git a/patsolve/abstract_fc_solve_solver.cpp b/patsolve/abstract_fc_solve_solver.cpp
-new file mode 100644
-index 0000000..11e5baa
---- /dev/null
-+++ b/patsolve/abstract_fc_solve_solver.cpp
-@@ -0,0 +1,239 @@
-+/*
-+ * Copyright (C) 2006-2009 Stephan Kulow <coolo@kde.org>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "freecell-solver/fcs_user.h"
-+#include "freecell-solver/fcs_cl.h"
-+
-+#include "abstract_fc_solve_solver.h"
-+
-+const int CHUNKSIZE = 100;
-+const long int MAX_ITERS_LIMIT = 200000;
-+
-+#define PRINT 0
-+
-+/* These two routines make and unmake moves. */
-+
-+void FcSolveSolver::make_move(MOVE *)
-+{
-+ return;
-+}
-+
-+void FcSolveSolver::undo_move(MOVE *)
-+{
-+ return;
-+}
-+
-+/* Get the possible moves from a position, and store them in Possible[]. */
-+SolverInterface::ExitStatus FcSolveSolver::patsolve( int _max_positions )
-+{
-+ int current_iters_count;
-+ max_positions = (_max_positions < 0) ? MAX_ITERS_LIMIT : _max_positions;
-+
-+ init();
-+
-+ if (!solver_instance)
-+ {
-+ {
-+ solver_instance = freecell_solver_user_alloc();
-+
-+ solver_ret = FCS_STATE_NOT_BEGAN_YET;
-+
-+ char * error_string;
-+ int error_arg;
-+ const char * known_parameters[1] = {NULL};
-+ /* A "char *" copy instead of "const char *". */
-+
-+ int parse_args_ret_code = freecell_solver_user_cmd_line_parse_args(
-+ solver_instance,
-+ get_cmd_line_arg_count() ,
-+ get_cmd_line_args(),
-+ 0,
-+ known_parameters,
-+ NULL,
-+ NULL,
-+ &error_string,
-+ &error_arg
-+ );
-+
-+ Q_ASSERT(!parse_args_ret_code);
-+ }
-+
-+ /* Not needed for Simple Simon because it's already specified in
-+ * freecell_solver_cmd_line_args. TODO : abstract .
-+ *
-+ * Shlomi Fish
-+ * */
-+ setFcSolverGameParams();
-+
-+ current_iters_count = CHUNKSIZE;
-+ freecell_solver_user_limit_iterations(solver_instance, current_iters_count);
-+ }
-+
-+ if (solver_instance)
-+ {
-+ bool continue_loop = true;
-+ while (continue_loop &&
-+ ( (solver_ret == FCS_STATE_NOT_BEGAN_YET)
-+ || (solver_ret == FCS_STATE_SUSPEND_PROCESS))
-+ &&
-+ (current_iters_count < MAX_ITERS_LIMIT)
-+ )
-+ {
-+ current_iters_count += CHUNKSIZE;
-+ freecell_solver_user_limit_iterations(solver_instance, current_iters_count);
-+
-+ if (solver_ret == FCS_STATE_NOT_BEGAN_YET)
-+ {
-+ solver_ret =
-+ freecell_solver_user_solve_board(
-+ solver_instance,
-+ board_as_string
-+ );
-+ }
-+ else
-+ {
-+ solver_ret = freecell_solver_user_resume_solution(solver_instance);
-+ }
-+ {
-+ // QMutexLocker lock( &endMutex );
-+ if ( m_shouldEnd )
-+ {
-+ continue_loop = false;
-+ }
-+ }
-+ }
-+ }
-+
-+ switch (solver_ret)
-+ {
-+ case FCS_STATE_IS_NOT_SOLVEABLE:
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+ return Solver::NoSolutionExists;
-+
-+ case FCS_STATE_WAS_SOLVED:
-+ {
-+ if (solver_instance)
-+ {
-+ m_winMoves.clear();
-+ while (freecell_solver_user_get_moves_left(solver_instance))
-+ {
-+ fcs_move_t move;
-+ MOVE new_move;
-+ const int verdict = !freecell_solver_user_get_next_move(
-+ solver_instance, &move)
-+ ;
-+
-+ Q_ASSERT (verdict);
-+
-+ new_move.fcs = move;
-+
-+ m_winMoves.append( new_move );
-+ }
-+
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+ return Solver::SolutionExists;
-+ }
-+
-+ case FCS_STATE_SUSPEND_PROCESS:
-+ return Solver::UnableToDetermineSolvability;
-+
-+ default:
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+ return Solver::NoSolutionExists;
-+ }
-+}
-+
-+/* Get the possible moves from a position, and store them in Possible[]. */
-+
-+int FcSolveSolver::get_possible_moves(int *, int *)
-+{
-+ return 0;
-+}
-+
-+bool FcSolveSolver::isWon()
-+{
-+ return true;
-+}
-+
-+int FcSolveSolver::getOuts()
-+{
-+ return 0;
-+}
-+
-+FcSolveSolver::FcSolveSolver()
-+ : Solver()
-+ , solver_instance(NULL)
-+ , solver_ret(FCS_STATE_NOT_BEGAN_YET)
-+ , board_as_string("")
-+{
-+}
-+
-+unsigned int FcSolveSolver::getClusterNumber()
-+{
-+ return 0;
-+}
-+
-+void FcSolveSolver::print_layout()
-+{
-+#if 0
-+ int i, w, o;
-+
-+ fprintf(stderr, "print-layout-begin\n");
-+ for (w = 0; w < 10; ++w) {
-+ Q_ASSERT( Wp[w] == &W[w][Wlen[w]-1] );
-+ fprintf( stderr, "Play%d: ", w );
-+ for (i = 0; i < Wlen[w]; ++i) {
-+ printcard(W[w][i], stderr);
-+ }
-+ fputc('\n', stderr);
-+ }
-+ fprintf( stderr, "Off: " );
-+ for (o = 0; o < 4; ++o) {
-+ if ( O[o] != -1 )
-+ printcard( O[o] + PS_KING, stderr);
-+ }
-+ fprintf(stderr, "\nprint-layout-end\n");
-+#endif
-+}
-+
-+void FcSolveSolver::unpack_cluster( unsigned int)
-+{
-+ return;
-+}
-+
-+FcSolveSolver::~FcSolveSolver()
-+{
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_free(solver_instance);
-+ solver_instance = NULL;
-+ }
-+}
-+
-diff --git a/patsolve/abstract_fc_solve_solver.h b/patsolve/abstract_fc_solve_solver.h
-new file mode 100644
-index 0000000..d2d072d
---- /dev/null
-+++ b/patsolve/abstract_fc_solve_solver.h
-@@ -0,0 +1,52 @@
-+/*
-+ * Copyright (C) 2006-2009 Stephan Kulow <coolo@kde.org>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
-+ */
-+
-+#ifndef ABSTRACT_FC_SOLVE_SOLVER_H
-+#define ABSTRACT_FC_SOLVE_SOLVER_H
-+
-+#include "patsolve.h"
-+
-+struct FcSolveSolver : public Solver<10>
-+{
-+public:
-+ FcSolveSolver();
-+ virtual ~FcSolveSolver();
-+ virtual int get_possible_moves(int *a, int *numout);
-+ virtual bool isWon();
-+ virtual void make_move(MOVE *m);
-+ virtual void undo_move(MOVE *m);
-+ virtual int getOuts();
-+ virtual unsigned int getClusterNumber();
-+ virtual void translate_layout() = 0;
-+ virtual void unpack_cluster( unsigned int k );
-+ virtual MoveHint translateMove(const MOVE &m) = 0;
-+ virtual SolverInterface::ExitStatus patsolve( int _max_positions = -1);
-+ virtual void setFcSolverGameParams() = 0;
-+
-+ virtual void print_layout();
-+
-+ virtual int get_cmd_line_arg_count() = 0;
-+ virtual const char * * get_cmd_line_args() = 0;
-+/* Names of the cards. The ordering is defined in pat.h. */
-+
-+ void * solver_instance;
-+ int solver_ret;
-+ // More than enough space for two decks.
-+ char board_as_string[4 * 13 * 2 * 4 * 3];
-+};
-+
-+#endif // ABSTRACT_FC_SOLVE_SOLVER_H
-diff --git a/patsolve/freecellsolver.cpp b/patsolve/freecellsolver.cpp
-index 39eff50..e92000f 100644
---- a/patsolve/freecellsolver.cpp
-+++ b/patsolve/freecellsolver.cpp
-@@ -16,12 +16,18 @@
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "freecell-solver/fcs_user.h"
-+#include "freecell-solver/fcs_cl.h"
-+
- #include "freecellsolver.h"
-
- #include "../freecell.h"
-
--
--/* Some macros used in get_possible_moves(). */
-+const int CHUNKSIZE = 100;
-+const long int MAX_ITERS_LIMIT = 200000;
-
- /* The following function implements
- (Same_suit ? (suit(a) == suit(b)) : (color(a) != color(b)))
-@@ -32,10 +38,13 @@ namespace {
-
- /* Statistics. */
-
-+#if 0
- int FreecellSolver::Xparam[] = { 4, 1, 8, -1, 7, 11, 4, 2, 2, 1, 2 };
-+#endif
-
- /* These two routines make and unmake moves. */
-
-+#if 0
- void FreecellSolver::make_move(MOVE *m)
- {
- int from, to;
-@@ -85,7 +94,9 @@ void FreecellSolver::undo_move(MOVE *m)
- Wlen[from]++;
- hashpile(from);
- }
-+#endif
-
-+#if 0
- /* Move prioritization. Given legal, pruned moves, there are still some
- that are a waste of time, especially in the endgame where there are lots of
- possible moves, but few productive ones. Note that we also prioritize
-@@ -178,9 +189,11 @@ void FreecellSolver::prioritize(MOVE *mp0, int n)
- }
- }
- }
-+#endif
-
- /* Automove logic. Freecell games must avoid certain types of automoves. */
-
-+#if 0
- int FreecellSolver::good_automove(int o, int r)
- {
- int i;
-@@ -220,148 +233,43 @@ int FreecellSolver::good_automove(int o, int r)
-
- return true;
- }
-+#endif
-
--/* Get the possible moves from a position, and store them in Possible[]. */
-+#define CMD_LINE_ARGS_NUM 2
-
--int FreecellSolver::get_possible_moves(int *a, int *numout)
-+static const char * freecell_solver_cmd_line_args[CMD_LINE_ARGS_NUM] =
- {
-- int i, n, t, w, o, empty, emptyw;
-- card_t card;
-- MOVE *mp;
--
-- /* Check for moves from W to O. */
--
-- n = 0;
-- mp = Possible;
-- for (w = 0; w < Nwpiles + Ntpiles; ++w) {
-- if (Wlen[w] > 0) {
-- card = *Wp[w];
-- o = SUIT(card);
-- empty = (O[o] == NONE);
-- if ((empty && (RANK(card) == PS_ACE)) ||
-- (!empty && (RANK(card) == O[o] + 1))) {
-- mp->card_index = 0;
-- mp->from = w;
-- mp->to = o;
-- mp->totype = O_Type;
-- mp->turn_index = -1;
-- mp->pri = 0; /* unused */
-- n++;
-- mp++;
--
-- /* If it's an automove, just do it. */
--
-- if (good_automove(o, RANK(card))) {
-- *a = true;
-- mp[-1].pri = 127;
-- if (n != 1) {
-- Possible[0] = mp[-1];
-- return 1;
-- }
-- return n;
-- }
-- }
-- }
-- }
--
-- /* No more automoves, but remember if there were any moves out. */
--
-- *a = false;
-- *numout = n;
--
-- /* Check for moves from non-singleton W cells to one of any
-- empty W cells. */
-+ "--load-config", "video-editing"
-+};
-
-- emptyw = -1;
-- for (w = 0; w < Nwpiles; ++w) {
-- if (Wlen[w] == 0) {
-- emptyw = w;
-- break;
-- }
-- }
-- if (emptyw >= 0) {
-- for (i = 0; i < Nwpiles + Ntpiles; ++i) {
-- if (i == emptyw || Wlen[i] == 0) {
-- continue;
-- }
-- bool allowed = false;
-- if ( i < Nwpiles)
-- allowed = true;
-- if ( i >= Nwpiles )
-- allowed = true;
-- if ( allowed ) {
-- card = *Wp[i];
-- mp->card_index = 0;
-- mp->from = i;
-- mp->to = emptyw;
-- mp->totype = W_Type;
-- mp->turn_index = -1;
-- if ( i >= Nwpiles )
-- mp->pri = Xparam[6];
-- else
-- mp->pri = Xparam[3];
-- n++;
-- mp++;
-- }
-- }
-- }
--
-- /* Check for moves from W to non-empty W cells. */
--
-- for (i = 0; i < Nwpiles + Ntpiles; ++i) {
-- if (Wlen[i] > 0) {
-- card = *Wp[i];
-- for (w = 0; w < Nwpiles; ++w) {
-- if (i == w) {
-- continue;
-- }
-- if (Wlen[w] > 0 &&
-- (RANK(card) == RANK(*Wp[w]) - 1 &&
-- suitable(card, *Wp[w]))) {
-- mp->card_index = 0;
-- mp->from = i;
-- mp->to = w;
-- mp->totype = W_Type;
-- mp->turn_index = -1;
-- if ( i >= Nwpiles )
-- mp->pri = Xparam[5];
-- else
-- mp->pri = Xparam[4];
-- n++;
-- mp++;
-- }
-- }
-- }
-- }
--
-- /* Check for moves from W to one of any empty T cells. */
--
-- for (t = 0; t < Ntpiles; ++t) {
-- if (!Wlen[t+Nwpiles]) {
-- break;
-- }
-- }
-+int FreecellSolver::get_cmd_line_arg_count()
-+{
-+ return CMD_LINE_ARGS_NUM;
-+}
-
-- if (t < Ntpiles) {
-- for (w = 0; w < Nwpiles; ++w) {
-- if (Wlen[w] > 0) {
-- card = *Wp[w];
-- mp->card_index = 0;
-- mp->from = w;
-- mp->turn_index = -1;
-- mp->to = t+Nwpiles;
-- mp->totype = W_Type;
-- mp->pri = Xparam[7];
-- n++;
-- mp++;
-- }
-- }
-- }
-+const char * * FreecellSolver::get_cmd_line_args()
-+{
-+ return freecell_solver_cmd_line_args;
-+}
-
-
-- return n;
-+void FreecellSolver::setFcSolverGameParams()
-+{
-+ /*
-+ * I'm using the more standard interface instead of the depracated
-+ * user_set_game one. I'd like that each function will have its
-+ * own dedicated purpose.
-+ *
-+ * Shlomi Fish
-+ * */
-+ freecell_solver_user_set_num_freecells(solver_instance,4);
-+ freecell_solver_user_set_num_stacks(solver_instance,8);
-+ freecell_solver_user_set_num_decks(solver_instance,1);
-+ freecell_solver_user_set_sequences_are_built_by_type(solver_instance, FCS_SEQ_BUILT_BY_ALTERNATE_COLOR);
-+ freecell_solver_user_set_sequence_move(solver_instance, 0);
-+ freecell_solver_user_set_empty_stacks_filled_by(solver_instance, FCS_ES_FILLED_BY_ANY_CARD);
- }
--
-+#if 0
- void FreecellSolver::unpack_cluster( unsigned int k )
- {
- /* Get the Out cells from the cluster number. */
-@@ -373,27 +281,13 @@ void FreecellSolver::unpack_cluster( unsigned int k )
- k >>= 4;
- O[3] = k & 0xF;
- }
-+#endif
-
--bool FreecellSolver::isWon()
--{
-- // maybe won?
-- for (int o = 0; o < 4; ++o) {
-- if (O[o] != PS_KING) {
-- return false;
-- }
-- }
--
-- return true;
--}
--
--int FreecellSolver::getOuts()
--{
-- return O[0] + O[1] + O[2] + O[3];
--}
-
- FreecellSolver::FreecellSolver(const Freecell *dealer)
-- : Solver()
-+ : FcSolveSolver()
- {
-+#if 0
- Osuit[0] = PS_DIAMOND;
- Osuit[1] = PS_CLUB;
- Osuit[2] = PS_HEART;
-@@ -402,12 +296,15 @@ FreecellSolver::FreecellSolver(const Freecell *dealer)
- Nwpiles = 8;
- Ntpiles = 4;
-
-+#endif
-+
- deal = dealer;
- }
-
- /* Read a layout file. Format is one pile per line, bottom to top (visible
- card). Temp cells and Out on the last two lines, if any. */
-
-+#if 0
- void FreecellSolver::translate_layout()
- {
- /* Read the workspace. */
-@@ -447,9 +344,78 @@ void FreecellSolver::translate_layout()
- }
- }
- }
-+#endif
-
- MoveHint FreecellSolver::translateMove( const MOVE &m )
- {
-+ fcs_move_t move = m.fcs;
-+ int cards = fcs_move_get_num_cards_in_seq(move);
-+ PatPile *from = 0;
-+ PatPile *to = 0;
-+
-+ switch(fcs_move_get_type(move))
-+ {
-+ case FCS_MOVE_TYPE_STACK_TO_STACK:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ to = deal->store[fcs_move_get_dest_stack(move)];
-+ break;
-+
-+ case FCS_MOVE_TYPE_FREECELL_TO_STACK:
-+ from = deal->freecell[fcs_move_get_src_freecell(move)];
-+ to = deal->store[fcs_move_get_dest_stack(move)];
-+ cards = 1;
-+ break;
-+
-+ case FCS_MOVE_TYPE_FREECELL_TO_FREECELL:
-+ from = deal->freecell[fcs_move_get_src_freecell(move)];
-+ to = deal->freecell[fcs_move_get_dest_freecell(move)];
-+ cards = 1;
-+ break;
-+
-+ case FCS_MOVE_TYPE_STACK_TO_FREECELL:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ to = deal->freecell[fcs_move_get_dest_freecell(move)];
-+ cards = 1;
-+ break;
-+
-+ case FCS_MOVE_TYPE_STACK_TO_FOUNDATION:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ cards = 1;
-+ to = 0;
-+ break;
-+
-+ case FCS_MOVE_TYPE_FREECELL_TO_FOUNDATION:
-+ from = deal->freecell[fcs_move_get_src_freecell(move)];
-+ cards = 1;
-+ to = 0;
-+ }
-+ Q_ASSERT(from);
-+ Q_ASSERT(cards <= from->cards().count());
-+ Q_ASSERT(to || cards == 1);
-+ KCard *card = from->cards()[from->cards().count() - cards];
-+
-+ if (!to)
-+ {
-+ PatPile *target = 0;
-+ PatPile *empty = 0;
-+ for (int i = 0; i < 4; ++i) {
-+ KCard *c = deal->target[i]->topCard();
-+ if (c) {
-+ if ( c->suit() == card->suit() )
-+ {
-+ target = deal->target[i];
-+ break;
-+ }
-+ } else if ( !empty )
-+ empty = deal->target[i];
-+ }
-+ to = target ? target : empty;
-+ }
-+ Q_ASSERT(to);
-+
-+ return MoveHint(card, to, 0);
-+
-+#if 0
- // this is tricky as we need to want to build the "meta moves"
-
- PatPile *frompile = nullptr;
-@@ -486,8 +452,43 @@ MoveHint FreecellSolver::translateMove( const MOVE &m )
-
- return MoveHint( card, target, m.pri );
- }
-+#endif
- }
-
-+void FreecellSolver::translate_layout()
-+{
-+ strcpy(board_as_string, deal->solverFormat().toLatin1());
-+
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_recycle(solver_instance);
-+ solver_ret = FCS_STATE_NOT_BEGAN_YET;
-+ }
-+#if 0
-+ /* Read the workspace. */
-+ int total = 0;
-+
-+ for ( int w = 0; w < 10; ++w ) {
-+ int i = translate_pile(deal->store[w], W[w], 52);
-+ Wp[w] = &W[w][i - 1];
-+ Wlen[w] = i;
-+ total += i;
-+ }
-+
-+ for (int i = 0; i < 4; ++i) {
-+ O[i] = -1;
-+ KCard *c = deal->target[i]->top();
-+ if (c) {
-+ total += 13;
-+ O[i] = translateSuit( c->suit() );
-+ }
-+ }
-+#endif
-+}
-+
-+
-+
-+#if 0
- unsigned int FreecellSolver::getClusterNumber()
- {
- int i = O[0] + (O[1] << 4);
-@@ -496,7 +497,9 @@ unsigned int FreecellSolver::getClusterNumber()
- k |= i << 8;
- return k;
- }
-+#endif
-
-+#if 0
- void FreecellSolver::print_layout()
- {
- int i, t, w, o;
-@@ -519,3 +522,4 @@ void FreecellSolver::print_layout()
- }
- fprintf(stderr, "\nprint-layout-end\n");
- }
-+#endif
-diff --git a/patsolve/freecellsolver.h b/patsolve/freecellsolver.h
-index 45ca063..99d1dbb 100644
---- a/patsolve/freecellsolver.h
-+++ b/patsolve/freecellsolver.h
-@@ -19,16 +19,17 @@
- #ifndef FREECELLSOLVER_H
- #define FREECELLSOLVER_H
-
--class Freecell;
--#include "patsolve.h"
-+#include "abstract_fc_solve_solver.h"
-
- constexpr auto Nwpiles = 8;
- constexpr auto Ntpiles = 4;
-+class Freecell;
-
--class FreecellSolver : public Solver<Nwpiles + Ntpiles>
-+class FreecellSolver : public FcSolveSolver
- {
- public:
- explicit FreecellSolver(const Freecell *dealer);
-+#if 0
- int good_automove(int o, int r);
- int get_possible_moves(int *a, int *numout) Q_DECL_OVERRIDE;
- bool isWon() Q_DECL_OVERRIDE;
-@@ -40,8 +41,17 @@ public:
- void translate_layout() Q_DECL_OVERRIDE;
- void unpack_cluster( unsigned int k ) Q_DECL_OVERRIDE;
- MoveHint translateMove(const MOVE &m) Q_DECL_OVERRIDE;
--
-- void print_layout() Q_DECL_OVERRIDE;
-+#endif
-+ virtual void translate_layout();
-+#if 0
-+ virtual void unpack_cluster( unsigned int k );
-+#endif
-+ virtual MoveHint translateMove(const MOVE &m);
-+ virtual void setFcSolverGameParams();
-+ virtual int get_cmd_line_arg_count();
-+ virtual const char * * get_cmd_line_args();
-+#if 0
-+ virtual void print_layout();
-
- int Nwpiles; /* the numbers we're actually using */
- int Ntpiles;
-@@ -51,10 +61,11 @@ public:
- card_t O[4]; /* output piles store only the rank or NONE */
- card_t Osuit[4];
-
-- const Freecell *deal;
-
- static int Xparam[];
-+#endif
-
-+ const Freecell *deal;
- };
-
- #endif // FREECELLSOLVER_H
-diff --git a/patsolve/patsolve.h b/patsolve/patsolve.h
-index 03285d4..1c3a7c6 100644
---- a/patsolve/patsolve.h
-+++ b/patsolve/patsolve.h
-@@ -33,6 +33,10 @@
-
- #include <cstdio>
-
-+/* A card is represented as ( down << 6 ) + (suit << 4) + rank. */
-+
-+typedef quint8 card_t;
-+
- struct POSITION {
- POSITION *queue; /* next position in the queue */
- POSITION *parent; /* point back up the move stack */
-@@ -48,14 +52,15 @@ class MemoryManager;
- template<size_t NumberPiles>
- class Solver : public SolverInterface
- {
-+
- public:
-
- Solver();
- virtual ~Solver();
-- ExitStatus patsolve( int max_positions = -1) final;
-+ virtual ExitStatus patsolve( int max_positions = -1);
-+ bool recursive(POSITION *pos = nullptr);
- virtual void translate_layout() = 0;
- virtual MoveHint translateMove(const MOVE &m ) = 0;
--
- void stopExecution() final;
- QList<MOVE> firstMoves() const final;
- QList<MOVE> winMoves() const final;
-@@ -126,8 +131,7 @@ protected:
- POSITION *Stack = nullptr;
- QMap<qint32,bool> recu_pos;
- int max_positions;
--
--private:
-+protected:
- QList<MOVE> m_firstMoves;
- QList<MOVE> m_winMoves;
- std::atomic_bool m_shouldEnd;
-diff --git a/patsolve/simonsolver.cpp b/patsolve/simonsolver.cpp
-index a9d640c..e75dcaa 100644
---- a/patsolve/simonsolver.cpp
-+++ b/patsolve/simonsolver.cpp
-@@ -15,17 +15,26 @@
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-+#include <stdlib.h>
-+#include <string.h>
-+
-+#include "freecell-solver/fcs_user.h"
-+#include "freecell-solver/fcs_cl.h"
-+
- #include "simonsolver.h"
-
- #include "../simon.h"
-
- #include <QDebug>
-
-+const int CHUNKSIZE = 100;
-+const long int MAX_ITERS_LIMIT = 200000;
-
- #define PRINT 0
-
- /* These two routines make and unmake moves. */
-
-+#if 0
- void SimonSolver::make_move(MOVE *m)
- {
- #if PRINT
-@@ -136,13 +145,62 @@ void SimonSolver::undo_move(MOVE *m)
- print_layout();
- #endif
- }
-+#endif
-+
-+#define CMD_LINE_ARGS_NUM 4
-+static const char * freecell_solver_cmd_line_args[CMD_LINE_ARGS_NUM] =
-+{
-+ "-g", "simple_simon", "--load-config", "the-last-mohican"
-+};
-+
-+int SimonSolver::get_cmd_line_arg_count()
-+{
-+ return CMD_LINE_ARGS_NUM;
-+}
-+
-+const char * * SimonSolver::get_cmd_line_args()
-+{
-+ return freecell_solver_cmd_line_args;
-+}
-+
-+void SimonSolver::setFcSolverGameParams()
-+{
-+ freecell_solver_user_apply_preset(solver_instance, "simple_simon");
-+}
-
-+#if 0
- /* Get the possible moves from a position, and store them in Possible[]. */
-
- int SimonSolver::get_possible_moves(int *a, int *numout)
- {
- MOVE *mp;
-+ int n;
-+
-+ mp = Possible;
-+ n = 0;
-+ *a = 1;
-+
-+ while (freecell_solver_user_get_moves_left(solver_instance))
-+ {
-+ fcs_move_t move;
-+ fcs_move_t * move_ptr;
-+ if (!freecell_solver_user_get_next_move(solver_instance, &move)) {
-+ move_ptr = new fcs_move_t;
-+ *move_ptr = move;
-+ mp->ptr = (void *)move_ptr;
-+ mp++;
-+ n++;
-+ }
-+ else
-+ {
-+ Q_ASSERT(0);
-+ }
-+ }
-+
-+ *numout = n;
-+ return n;
-
-+#if 0
- /* Check for moves from W to O. */
-
- int n = 0;
-@@ -301,8 +359,11 @@ int SimonSolver::get_possible_moves(int *a, int *numout)
- }
-
- return n;
-+#endif
- }
-+#endif
-
-+#if 0
- void SimonSolver::unpack_cluster( unsigned int k )
- {
- // TODO: this only works for easy
-@@ -314,7 +375,9 @@ void SimonSolver::unpack_cluster( unsigned int k )
- O[i] = -1;
- }
- }
-+#endif
-
-+#if 0
- bool SimonSolver::isWon()
- {
- // maybe won?
-@@ -324,7 +387,9 @@ bool SimonSolver::isWon()
-
- return true;
- }
-+#endif
-
-+#if 0
- int SimonSolver::getOuts()
- {
- int k = 0;
-@@ -334,9 +399,10 @@ int SimonSolver::getOuts()
-
- return k;
- }
-+#endif
-
- SimonSolver::SimonSolver(const Simon *dealer)
-- : Solver()
-+ : FcSolveSolver()
- {
- deal = dealer;
- }
-@@ -346,6 +412,14 @@ card). Temp cells and Out on the last two lines, if any. */
-
- void SimonSolver::translate_layout()
- {
-+ strcpy(board_as_string, deal->solverFormat().toLatin1());
-+
-+ if (solver_instance)
-+ {
-+ freecell_solver_user_recycle(solver_instance);
-+ solver_ret = FCS_STATE_NOT_BEGAN_YET;
-+ }
-+#if 0
- /* Read the workspace. */
- int total = 0;
-
-@@ -364,8 +438,10 @@ void SimonSolver::translate_layout()
- O[i] = translateSuit( c->suit() );
- }
- }
-+#endif
- }
-
-+#if 0
- unsigned int SimonSolver::getClusterNumber()
- {
- unsigned int k = 0;
-@@ -376,7 +452,9 @@ unsigned int SimonSolver::getClusterNumber()
- }
- return k;
- }
-+#endif
-
-+#if 0
- void SimonSolver::print_layout()
- {
- int i, w, o;
-@@ -397,9 +475,57 @@ void SimonSolver::print_layout()
- }
- fprintf(stderr, "\nprint-layout-end\n");
- }
-+#endif
-
- MoveHint SimonSolver::translateMove( const MOVE &m )
- {
-+ fcs_move_t move = m.fcs;
-+ int cards = fcs_move_get_num_cards_in_seq(move);
-+ PatPile *from = 0;
-+ PatPile *to = 0;
-+
-+ switch(fcs_move_get_type(move))
-+ {
-+ case FCS_MOVE_TYPE_STACK_TO_STACK:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ to = deal->store[fcs_move_get_dest_stack(move)];
-+ break;
-+
-+ case FCS_MOVE_TYPE_SEQ_TO_FOUNDATION:
-+ from = deal->store[fcs_move_get_src_stack(move)];
-+ cards = 13;
-+ to = deal->target[fcs_move_get_foundation(move)];
-+ break;
-+
-+ }
-+ Q_ASSERT(from);
-+ Q_ASSERT(cards <= from->cards().count());
-+ Q_ASSERT(to || cards == 1);
-+ KCard *card = from->cards()[from->cards().count() - cards];
-+
-+ if (!to)
-+ {
-+ PatPile *target = 0;
-+ PatPile *empty = 0;
-+ for (int i = 0; i < 4; ++i) {
-+ KCard *c = deal->target[i]->topCard();
-+ if (c) {
-+ if ( c->suit() == card->suit() )
-+ {
-+ target = deal->target[i];
-+ break;
-+ }
-+ } else if ( !empty )
-+ empty = deal->target[i];
-+ }
-+ to = target ? target : empty;
-+ }
-+
-+ Q_ASSERT(to);
-+
-+ return MoveHint(card, to, 0);
-+
-+#if 0
- Q_ASSERT( m.from < 10 && m.to < 10 );
-
- PatPile *frompile = deal->store[m.from];
-@@ -414,4 +540,5 @@ MoveHint SimonSolver::translateMove( const MOVE &m )
-
- Q_ASSERT( m.to < 10 );
- return MoveHint( card, deal->store[m.to], m.pri );
-+#endif
- }
-diff --git a/patsolve/simonsolver.h b/patsolve/simonsolver.h
-index 2d57dda..4a417b1 100644
---- a/patsolve/simonsolver.h
-+++ b/patsolve/simonsolver.h
-@@ -18,29 +18,37 @@
- #ifndef SIMONSOLVER_H
- #define SIMONSOLVER_H
-
--#include "patsolve.h"
-+#include "abstract_fc_solve_solver.h"
-+#include "simon.h"
- class Simon;
-
-
--class SimonSolver : public Solver<10>
-+class SimonSolver : public FcSolveSolver
- {
- public:
- explicit SimonSolver(const Simon *dealer);
-+#if 0
- int get_possible_moves(int *a, int *numout) Q_DECL_OVERRIDE;
- bool isWon() Q_DECL_OVERRIDE;
- void make_move(MOVE *m) Q_DECL_OVERRIDE;
- void undo_move(MOVE *m) Q_DECL_OVERRIDE;
- int getOuts() Q_DECL_OVERRIDE;
- unsigned int getClusterNumber() Q_DECL_OVERRIDE;
-- void translate_layout() Q_DECL_OVERRIDE;
-+#endif
-+ virtual void translate_layout() Q_DECL_OVERRIDE;
-+ virtual MoveHint translateMove(const MOVE &m) Q_DECL_OVERRIDE;
-+#if 0
- void unpack_cluster( unsigned int k ) Q_DECL_OVERRIDE;
-- MoveHint translateMove(const MOVE &m) Q_DECL_OVERRIDE;
--
- void print_layout() Q_DECL_OVERRIDE;
-+#endif
-+ virtual void setFcSolverGameParams();
-
-+ virtual int get_cmd_line_arg_count();
-+ virtual const char * * get_cmd_line_args();
-+#if 0
- /* Names of the cards. The ordering is defined in pat.h. */
--
- int O[4];
-+#endif
- const Simon *deal;
- };
-
-diff --git a/patsolve/solverinterface.h b/patsolve/solverinterface.h
-index d99d3b8..77fd410 100644
---- a/patsolve/solverinterface.h
-+++ b/patsolve/solverinterface.h
-@@ -4,6 +4,7 @@
- #include <QList>
-
- #include "../hint.h"
-+#include "freecell-solver/fcs_user.h"
-
-
- /* A card is represented as ( down << 6 ) + (suit << 4) + rank. */
-@@ -22,6 +23,7 @@ public:
- PileType totype;
- signed char pri; /* move priority (low priority == low value) */
- int turn_index; /* turn the card index */
-+ fcs_move_t fcs; /* A Freecell Solver move. */
-
- bool operator<( const MOVE &m) const
- {
-diff --git a/pileutils.cpp b/pileutils.cpp
-index 1e3da3e..609c716 100644
---- a/pileutils.cpp
-+++ b/pileutils.cpp
-@@ -48,6 +48,33 @@ bool isSameSuitAscending( const QList<KCard*> & cards )
- return true;
- }
-
-+int countSameSuitDescendingSequences( const QList<KCard*> & cards )
-+{
-+ if ( cards.size() <= 1 )
-+ return 0;
-+
-+ int suit = cards.first()->suit();
-+ int lastRank = cards.first()->rank();
-+
-+ int count = 1;
-+
-+ for( int i = 1; i < cards.size(); ++i )
-+ {
-+ --lastRank;
-+
-+ if ( cards[i]->rank() != lastRank )
-+ return -1;
-+
-+ if ( cards[i]->suit() != suit )
-+ {
-+ count++;
-+ suit = cards[i]->suit();
-+ }
-+ }
-+ return count;
-+}
-+
-+
-
- bool isSameSuitDescending( const QList<KCard*> & cards )
- {
-@@ -121,3 +148,37 @@ bool checkAddAlternateColorDescendingFromKing( const QList<KCard*> & oldCards, c
- && newCards.first()->rank() == oldCards.last()->rank() - 1;
- }
-
-+QString suitToString(int s) {
-+ switch (s) {
-+ case KCardDeck::Clubs:
-+ return "C";
-+ case KCardDeck::Hearts:
-+ return "H";
-+ case KCardDeck::Diamonds:
-+ return "D";
-+ case KCardDeck::Spades:
-+ return "S";
-+ default:
-+ exit(-1);
-+ }
-+ return QString();
-+}
-+
-+QString rankToString(int r)
-+{
-+ switch (r) {
-+ case KCardDeck::King:
-+ return "K";
-+ case KCardDeck::Ace:
-+ return "A";
-+ case KCardDeck::Jack:
-+ return "J";
-+ case KCardDeck::Queen:
-+ return "Q";
-+ case KCardDeck::Ten:
-+ return "T";
-+ default:
-+ return QString::number(r);
-+ }
-+}
-+
-diff --git a/pileutils.h b/pileutils.h
-index 2fa1657..faa8c40 100644
---- a/pileutils.h
-+++ b/pileutils.h
-@@ -26,9 +26,13 @@ class KCard;
- bool isSameSuitAscending( const QList<KCard*> & cards );
- bool isSameSuitDescending( const QList<KCard*> & cards );
- bool isAlternateColorDescending( const QList<KCard*> & cards );
-+int countSameSuitDescendingSequences( const QList<KCard*> & cards );
-
- bool checkAddSameSuitAscendingFromAce( const QList<KCard*> & oldCards, const QList<KCard*> & newCards );
- bool checkAddAlternateColorDescending( const QList<KCard*> & oldCards, const QList<KCard*> & newCards );
- bool checkAddAlternateColorDescendingFromKing( const QList<KCard*> & oldCards, const QList<KCard*> & newCards );
-
-+extern QString suitToString(int s);
-+extern QString rankToString(int r);
-+
- #endif
-diff --git a/simon.cpp b/simon.cpp
-index 8e3ef10..834dd55 100644
---- a/simon.cpp
-+++ b/simon.cpp
-@@ -111,24 +111,70 @@ bool Simon::checkAdd(const PatPile * pile, const QList<KCard*> & oldCards, const
- {
- if (pile->pileRole() == PatPile::Tableau)
- {
-- return oldCards.isEmpty()
-- || oldCards.last()->rank() == newCards.first()->rank() + 1;
-+ if (! (oldCards.isEmpty()
-+ || oldCards.last()->rank() == newCards.first()->rank() + 1 ))
-+ {
-+ return false;
-+ }
-+
-+ int seqs_count = countSameSuitDescendingSequences(newCards);
-+
-+ if (seqs_count < 0)
-+ return false;
-+
-+ // This is similar to the supermoves of Freecell - we can use empty
-+ // columns to temporarily hold intermediate sub-sequences which are
-+ // not the same suit - only a "false" parent.
-+ // Shlomi Fish
-+
-+ int empty_piles_count = 0;
-+
-+ for (int i = 0; i < 10; ++i )
-+ if (store[i]->isEmpty() && ( store[i]->index() != pile->index() ))
-+ empty_piles_count++;
-+
-+ return (seqs_count <= (1 << empty_piles_count));
- }
- else
- {
- return oldCards.isEmpty()
- && newCards.first()->rank() == KCardDeck::King
-- && newCards.last()->rank() == KCardDeck::Ace;
-+ && newCards.last()->rank() == KCardDeck::Ace
-+ && isSameSuitDescending(newCards);
- }
- }
-
- bool Simon::checkRemove(const PatPile * pile, const QList<KCard*> & cards) const
- {
-- return pile->pileRole() == PatPile::Tableau
-- && isSameSuitDescending(cards);
-+ if (pile->pileRole() != PatPile::Tableau)
-+ return false;
-+
-+ int seqs_count = countSameSuitDescendingSequences(cards);
-+
-+ return (seqs_count >= 0);
- }
-
-+QString Simon::solverFormat() const
-+{
-+ QString output;
-+ QString tmp;
-+ for (int i = 0; i < 4 ; i++) {
-+ if (target[i]->isEmpty())
-+ continue;
-+ tmp += suitToString(target[i]->topCard()->suit()) + "-K ";
-+ }
-+ if (!tmp.isEmpty())
-+ output += QString::fromLatin1("Foundations: %1\n").arg(tmp);
-
-+ for (int i = 0; i < 10 ; i++)
-+ {
-+ QList<KCard*> cards = store[i]->cards();
-+ for (QList<KCard*>::ConstIterator it = cards.begin(); it != cards.end(); ++it)
-+ output += rankToString((*it)->rank()) + suitToString((*it)->suit()) + ' ';
-+ output += '\n';
-+ }
-+ return output;
-+}
-
- static class SimonDealerInfo : public DealerInfo
- {
-diff --git a/simon.h b/simon.h
-index 83d10ab..d816f27 100644
---- a/simon.h
-+++ b/simon.h
-@@ -57,6 +57,7 @@ private:
- PatPile* store[10];
- PatPile* target[4];
-
-+ virtual QString solverFormat() const;
- friend class SimonSolver;
- };
-
---
-cgit v0.11.2
-
diff --git a/kde/patch/krita.patch b/kde/patch/krita.patch
deleted file mode 100644
index 247bbd7..0000000
--- a/kde/patch/krita.patch
+++ /dev/null
@@ -1,7 +0,0 @@
-# Fix compilation of Krita against Qt 5.9:
-#cat $CWD/patch/krita/krita_qt59.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Hack around tablet issues with un-patched Qt 5.12:
-#cat $CWD/patch/krita/krita_qtabletevents.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-
diff --git a/kde/patch/krita/krita_qt512.patch b/kde/patch/krita/krita_qt512.patch
deleted file mode 100644
index 765d232..0000000
--- a/kde/patch/krita/krita_qt512.patch
+++ /dev/null
@@ -1,117 +0,0 @@
-From 98aab8f2942cdc78dda8cfeba3580bd9d57e00a2 Mon Sep 17 00:00:00 2001
-From: Boudewijn Rempt <boud@valdyas.org>
-Date: Fri, 5 Oct 2018 11:16:26 +0200
-Subject: [PATCH] Add a cmake option to disable our own tablet support
-
-Off by default, this makes it easier to check whether bugs are
-caused by our fork of Qt's classes or to check whether Qt's tablet
-support has improved.
-
-CCBUG:399379
----
- CMakeLists.txt | 4 ++++
- config_use_qt_xcb.h.cmake | 6 ++++++
- krita/main.cc | 8 +++++++-
- libs/ui/CMakeLists.txt | 12 ++++++++----
- libs/ui/input/wintab/qxcbconnection.cpp | 1 -
- 5 files changed, 25 insertions(+), 6 deletions(-)
- create mode 100644 config_use_qt_xcb.h.cmake
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 17c9cd2d7..3199ae4da 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -168,6 +168,10 @@ if (WIN32)
- endif (MINGW)
- endif ()
-
-+option(USE_QT_XCB "Do not use Krita's forked XCB connection and tablet support on X11, but leave everything to Qt." OFF)
-+configure_file(config_use_qt_xcb.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config_use_qt_xcb.h)
-+add_feature_info("Use Qt's XCB and Tablet support on X11" USE_QT_XCB "Do not use Krita's forked XCB connection and tablet support on X11, but leave everything to Qt.")
-+
- option(HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal." ON)
- configure_file(config-hide-safe-asserts.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-hide-safe-asserts.h)
- add_feature_info("Hide Safe Asserts" HIDE_SAFE_ASSERTS "Don't show message box for \"safe\" asserts, just ignore them automatically and dump a message to the terminal.")
-diff --git a/config_use_qt_xcb.h.cmake b/config_use_qt_xcb.h.cmake
-new file mode 100644
-index 000000000..9fe3360cc
---- /dev/null
-+++ b/config_use_qt_xcb.h.cmake
-@@ -0,0 +1,6 @@
-+/* config_use_qt_xcb.h. Generated from config_use_qt_xcb.h.cmake */
-+
-+#cmakedefine USE_QT_XCB 1
-+
-+
-+
-diff --git a/krita/main.cc b/krita/main.cc
-index dca2ee170..398fa3384 100644
---- a/krita/main.cc
-+++ b/krita/main.cc
-@@ -63,8 +63,11 @@
- #include <QLibrary>
-
- #elif defined HAVE_X11
-+#include "config_use_qt_xcb.h"
-+#ifndef USE_QT_XCB
- #include <kis_xi2_event_filter.h>
- #endif
-+#endif
-
- #if defined HAVE_KCRASH
- #include <kcrash.h>
-@@ -336,8 +339,11 @@ extern "C" int main(int argc, char **argv)
- }
-
- #if defined HAVE_X11
-- app.installNativeEventFilter(KisXi2EventFilter::instance());
-+ #ifndef USE_QT_XCB
-+ app.installNativeEventFilter(KisXi2EventFilter::instance());
-+ #endif
- #endif
-+
- app.installEventFilter(KisQtWidgetsTweaker::instance());
-
-
-diff --git a/libs/ui/CMakeLists.txt b/libs/ui/CMakeLists.txt
-index 2909398ab..b4673ca92 100644
---- a/libs/ui/CMakeLists.txt
-+++ b/libs/ui/CMakeLists.txt
-@@ -425,14 +425,18 @@ endif()
- input/wintab/drawpile_tablettester/tablettest.cpp
- )
-
--if(UNIX)
-+if (UNIX)
- set(kritaui_LIB_SRCS
- ${kritaui_LIB_SRCS}
-- input/kis_tablet_event.cpp
-- input/wintab/kis_tablet_support.cpp
- qtlockedfile/qtlockedfile_unix.cpp
- )
-- if(NOT APPLE)
-+ if(NOT USE_QT_XCB)
-+ set(kritaui_LIB_SRCS
-+ ${kritaui_LIB_SRCS}
-+ input/wintab/kis_tablet_support.cpp
-+ )
-+ endif()
-+ if(NOT APPLE AND NOT USE_QT_XCB)
- set(kritaui_LIB_SRCS
- ${kritaui_LIB_SRCS}
- input/wintab/qxcbconnection_xi2.cpp
-diff --git a/libs/ui/input/wintab/qxcbconnection.cpp b/libs/ui/input/wintab/qxcbconnection.cpp
-index 5991bc187..c062d05e0 100644
---- a/libs/ui/input/wintab/qxcbconnection.cpp
-+++ b/libs/ui/input/wintab/qxcbconnection.cpp
-@@ -41,7 +41,6 @@
- #include <QGuiApplication>
- #include <QApplication>
-
--
- #include <X11/extensions/XI2proto.h>
- #include <xcb/xproto.h>
-
---
-2.17.1
-
diff --git a/kde/patch/krita/krita_qt59.patch b/kde/patch/krita/krita_qt59.patch
deleted file mode 100644
index f517995..0000000
--- a/kde/patch/krita/krita_qt59.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-Source: https://github.com/KDE/krita/commit/2f59d0d1.patch
-
-From 2f59d0d1d91e3f79342c20d0df68aa9a51817e8d Mon Sep 17 00:00:00 2001
-From: Luca Beltrame <lbeltrame@kde.org>
-Date: Sat, 6 May 2017 16:00:21 +0200
-Subject: [PATCH] Drop QForeachContainer include and fix Qt 5.9 build
-
-It's not used anywhere.
-
-Acked by boud.
----
- libs/ui/KisResourceBundleManifest.cpp | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/libs/ui/KisResourceBundleManifest.cpp b/libs/ui/KisResourceBundleManifest.cpp
-index e4f94ca788..83761657d8 100644
---- a/libs/ui/KisResourceBundleManifest.cpp
-+++ b/libs/ui/KisResourceBundleManifest.cpp
-@@ -22,7 +22,6 @@
- #include <QDomElement>
- #include <QDomNode>
- #include <QDomNodeList>
--#include <QForeachContainer>
-
- #include <KoXmlNS.h>
- #include <KoXmlReader.h>
diff --git a/kde/patch/krita/krita_qtabletevents.patch b/kde/patch/krita/krita_qtabletevents.patch
deleted file mode 100644
index a1d3869..0000000
--- a/kde/patch/krita/krita_qtabletevents.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-# NOTE: original patch: https://cgit.kde.org/krita.git/commit/?id=a3193fe2
-# But first part (patch to ext_qt)) has been removed due to failure to apply.
-# -- Eric Hameleers
-
-From a3193fe273c3f2c3b5493f77724a4bc099ae5e36 Mon Sep 17 00:00:00 2001
-From: Dmitry Kazakov <dimula73@gmail.com>
-Date: Mon, 11 Mar 2019 16:49:31 +0300
-Subject: Add a hacky patch that ensures QTabletEvents to be ignored in
- distribution builds
-
-If we ensure that all the tablet events are ignored, then Qt
-will always generate synthesized mouse events, avoiding the
-problem of lost Enter/Leave events.
-
-We also mark our own build of Qt about the presence of the fix
-(therefore, it doesn't need this hack).
----
- libs/ui/input/kis_input_manager.cpp | 20 ++++++++++++++++
-
-index 30a4677..d173543 100644
---- a/libs/ui/input/kis_input_manager.cpp
-+++ b/libs/ui/input/kis_input_manager.cpp
-@@ -496,6 +496,13 @@ bool KisInputManager::eventFilterImpl(QEvent * event)
- //Reset signal compressor to prevent processing events before press late
- d->resetCompressor();
- d->eatOneMousePress();
-+
-+#if defined Q_OS_LINUX && !defined QT_HAS_ENTER_LEAVE_PATCH
-+ // remove this hack when this patch is integrated:
-+ // https://codereview.qt-project.org/#/c/255384/
-+ event->setAccepted(false);
-+#endif
-+
- break;
- }
- case QEvent::TabletMove: {
-@@ -517,6 +524,12 @@ bool KisInputManager::eventFilterImpl(QEvent * event)
- */
- d->blockMouseEvents();
-
-+#if defined Q_OS_LINUX && !defined QT_HAS_ENTER_LEAVE_PATCH
-+ // remove this hack when this patch is integrated:
-+ // https://codereview.qt-project.org/#/c/255384/
-+ event->setAccepted(false);
-+#endif
-+
- break;
- }
- case QEvent::TabletRelease: {
-@@ -529,6 +542,13 @@ bool KisInputManager::eventFilterImpl(QEvent * event)
- retval = d->matcher.buttonReleased(tabletEvent->button(), tabletEvent);
- retval = true;
- event->setAccepted(true);
-+
-+#if defined Q_OS_LINUX && !defined QT_HAS_ENTER_LEAVE_PATCH
-+ // remove this hack when this patch is integrated:
-+ // https://codereview.qt-project.org/#/c/255384/
-+ event->setAccepted(false);
-+#endif
-+
- break;
- }
-
---
-cgit v1.1
-
-
diff --git a/kde/patch/krunner.patch b/kde/patch/krunner.patch
new file mode 100644
index 0000000..2cafdc6
--- /dev/null
+++ b/kde/patch/krunner.patch
@@ -0,0 +1,4 @@
+# KDEBUG 423003: prevent crash when at least PIM Contacts plugin is enabled.
+# Fixed in Frameworks 5.73.
+cat $CWD/patch/krunner/krunner_KDEBUG_423003.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+
diff --git a/kde/patch/krunner/krunner_KDEBUG_423003.patch b/kde/patch/krunner/krunner_KDEBUG_423003.patch
new file mode 100644
index 0000000..88f6297
--- /dev/null
+++ b/kde/patch/krunner/krunner_KDEBUG_423003.patch
@@ -0,0 +1,54 @@
+From 8f7ce559b84ee0c21de0256e6591793e4b95f411 Mon Sep 17 00:00:00 2001
+From: David Redondo <kde@david-redondo.de>
+Date: Tue, 14 Jul 2020 13:02:51 +0200
+Subject: [PATCH] Do not remove virtual method from build
+
+Method was deprecated in fc5738ab7c4025a87e2bbd656914b6187df7a9eb. Removing the
+method when building without deprecated methods (for example the pim runner
+does this) changes the vtable leading to crashes.
+BUG: 423003
+---
+ src/abstractrunner.cpp | 2 --
+ src/abstractrunner.h | 2 --
+ 2 files changed, 4 deletions(-)
+
+diff --git a/src/abstractrunner.cpp b/src/abstractrunner.cpp
+index 378c73d..34c44d1 100644
+--- a/src/abstractrunner.cpp
++++ b/src/abstractrunner.cpp
+@@ -244,12 +244,10 @@ void AbstractRunner::setHasRunOptions(bool hasRunOptions)
+ }
+ #endif
+
+-#if KRUNNER_BUILD_DEPRECATED_SINCE(5, 71)
+ void AbstractRunner::createRunOptions(QWidget *parent)
+ {
+ Q_UNUSED(parent)
+ }
+-#endif
+
+ AbstractRunner::Speed AbstractRunner::speed() const
+ {
+diff --git a/src/abstractrunner.h b/src/abstractrunner.h
+index cb4e32a..ae9558d 100644
+--- a/src/abstractrunner.h
++++ b/src/abstractrunner.h
+@@ -161,7 +161,6 @@ class KRUNNER_EXPORT AbstractRunner : public QObject
+ bool hasRunOptions();
+ #endif
+
+-#if KRUNNER_ENABLE_DEPRECATED_SINCE(5, 71)
+ /**
+ * If hasRunOptions() returns true, this method may be called to get
+ * a widget displaying the options the user can interact with to modify
+@@ -172,7 +171,6 @@ class KRUNNER_EXPORT AbstractRunner : public QObject
+ */
+ KRUNNER_DEPRECATED_VERSION_BELATED(5, 71, 5, 0, "No longer use, feature removed")
+ virtual void createRunOptions(QWidget *widget);
+-#endif
+
+ /**
+ * Called whenever an exact or possible match associated with this
+--
+GitLab
+
diff --git a/kde/patch/kscreenlocker.patch b/kde/patch/kscreenlocker.patch
deleted file mode 100644
index d1b51ea..0000000
--- a/kde/patch/kscreenlocker.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-# KDEBUG #358125, also CVE-2016-2312 (fixed in Plasma 5.5.5):
-# Dont quit the Greeter when last window closes.
-#cat $CWD/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Backport two important stability fixes from 5.14 -
-# Force software rendering when greeter crashed:
-#cat $CWD/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-# Load QtQuickSettings for software rendering (KDEBUG #347772):
-# Applied in Plasma 5.13.5:
-#cat $CWD/patch/kscreenlocker/kscreenlocker_rendersettings.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-
-
diff --git a/kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch b/kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch
deleted file mode 100644
index 492ef80..0000000
--- a/kde/patch/kscreenlocker/kscreenlocker_CVE-2016-2312.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From: Martin Gräßlin <mgraesslin@kde.org>
-Date: Fri, 05 Feb 2016 09:30:19 +0000
-Subject: [greeter] Dont quit when last window closes
-X-Git-Url: http://quickgit.kde.org/?p=kscreenlocker.git&a=commitdiff&h=fae65f1cdd6446042b31ccd0eafd7a4c0b6623e3
----
-[greeter] Dont quit when last window closes
-
-Qt allows to have no screens. If all XRandR screens are disconnected
-there are also no QScreens. This is from an X11 perspective wrong, but
-we have to deal with it. No QScreens means that all views are destroyed
-and no new ones are created. Thus all windows close and the greeter
-exited successfully which in turn unlocked the screen.
-
-This change ensures that the greeter doesn't exit when all windows close.
-
-Funnily this was not a problem with the well known issue of Qt
-crashing when all screens are disconnected. The lock screen handles
-crashes gracefully and just restarts or more likely Qt also crashes
-the application using KSld and thus taking down the complete session.
-
-BUG: 358125
-FIXED-IN: 5.5.5
----
-
-
---- a/greeter/main.cpp
-+++ b/greeter/main.cpp
-@@ -59,6 +59,7 @@
- qputenv("QT_IM_MODULE", QByteArrayLiteral("compose"));
- }
- ScreenLocker::UnlockApp app(argc, argv);
-+ app.setQuitOnLastWindowClosed(false);
- QCoreApplication::setApplicationName(QStringLiteral("kscreenlocker_greet"));
- QCoreApplication::setApplicationVersion(QStringLiteral("0.1"));
- QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
-
diff --git a/kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch b/kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch
deleted file mode 100644
index 06045d7..0000000
--- a/kde/patch/kscreenlocker/kscreenlocker_crash_force_softrender.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From 875e44f56d4597ba3b65f5bf4ff2b315376c05a4 Mon Sep 17 00:00:00 2001
-From: Kai Uwe Broulik <kde@privat.broulik.de>
-Date: Wed, 11 Jul 2018 18:01:41 +0200
-Subject: Force software rendering when greeter crashed
-
-We have a fallback QML theme for when the look and feel package is broken but when the
-graphics driver is broken (e.g. proprietary graphics driver update) the lock screen would
-stop working. When the greeter crashed, better play safe and force software rendering
-
-Reviewed-By: d_ed
----
- ksldapp.cpp | 13 +++++++++++--
- ksldapp.h | 9 +++++++++
- 2 files changed, 20 insertions(+), 2 deletions(-)
-
-diff --git a/ksldapp.cpp b/ksldapp.cpp
-index 892826f..5fe28ea 100644
---- a/ksldapp.cpp
-+++ b/ksldapp.cpp
-@@ -66,6 +66,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
- namespace ScreenLocker
- {
-
-+static const QString s_qtQuickBackend = QStringLiteral("QT_QUICK_BACKEND");
-+
- static KSldApp * s_instance = nullptr;
-
- KSldApp* KSldApp::self()
-@@ -226,6 +228,8 @@ void KSldApp::initialize()
- // failure, restart lock process
- m_greeterCrashedCounter++;
- if (m_greeterCrashedCounter < 4) {
-+ // Perhaps it crashed due to a graphics driver issue, force software rendering now
-+ setForceSoftwareRendering(true);
- startLockProcess(EstablishLock::Immediate);
- } else if (m_lockWindow) {
- m_lockWindow->emergencyShow();
-@@ -385,6 +389,7 @@ void KSldApp::lock(EstablishLock establishLock)
-
- m_lockState = AcquiringLock;
-
-+ setForceSoftwareRendering(false);
- // start unlock screen process
- startLockProcess(establishLock);
- emit lockStateChanged();
-@@ -546,6 +551,8 @@ bool KSldApp::isFdoPowerInhibited() const
-
- void KSldApp::startLockProcess(EstablishLock establishLock)
- {
-+ QProcessEnvironment env = m_greeterEnv;
-+
- if (m_isWayland && m_waylandDisplay) {
- int sx[2];
- if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sx) < 0) {
-@@ -566,9 +573,7 @@ void KSldApp::startLockProcess(EstablishLock establishLock)
- emit greeterClientConnectionChanged();
- int socket = dup(sx[1]);
- if (socket >= 0) {
-- QProcessEnvironment env = m_greeterEnv;
- env.insert("WAYLAND_SOCKET", QByteArray::number(socket));
-- m_lockProcess->setProcessEnvironment(env);
- }
- }
- QStringList args;
-@@ -587,6 +592,9 @@ void KSldApp::startLockProcess(EstablishLock establishLock)
- if (m_lockGrace == -1) {
- args << QStringLiteral("--nolock");
- }
-+ if (m_forceSoftwareRendering) {
-+ env.insert(s_qtQuickBackend, QStringLiteral("software"));
-+ }
-
- // start the Wayland server
- int fd = m_waylandServer->start();
-@@ -598,6 +606,7 @@ void KSldApp::startLockProcess(EstablishLock establishLock)
- args << QStringLiteral("--ksldfd");
- args << QString::number(fd);
-
-+ m_lockProcess->setProcessEnvironment(env);
- m_lockProcess->start(QStringLiteral(KSCREENLOCKER_GREET_BIN), args);
- close(fd);
- }
-diff --git a/ksldapp.h b/ksldapp.h
-index 4849588..b6d6703 100644
---- a/ksldapp.h
-+++ b/ksldapp.h
-@@ -127,6 +127,14 @@ public:
- m_lockGrace = msec;
- }
-
-+ bool forceSoftwareRendering() const {
-+ return m_forceSoftwareRendering;
-+ }
-+
-+ void setForceSoftwareRendering(bool force) {
-+ m_forceSoftwareRendering = force;
-+ }
-+
- Q_SIGNALS:
- void locked();
- void unlocked();
-@@ -179,6 +187,7 @@ private:
- LogindIntegration *m_logind;
- GlobalAccel *m_globalAccel = nullptr;
- bool m_hasXInput2 = false;
-+ bool m_forceSoftwareRendering = false;
-
- bool m_isX11;
- bool m_isWayland;
---
-cgit v0.11.2
-
diff --git a/kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch b/kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch
deleted file mode 100644
index 2802a1a..0000000
--- a/kde/patch/kscreenlocker/kscreenlocker_rendersettings.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 3f104cbb0a34024dc1aa45538d2ef2403a7a45f0 Mon Sep 17 00:00:00 2001
-From: David Edmundson <kde@davidedmundson.co.uk>
-Date: Fri, 10 Aug 2018 01:18:42 +0200
-Subject: Load QtQuickSettings for software rendering
-
-We had support for falling back on errors yet somehow
-the initial basic loading was missing.
-
-Summary: BUG: 347772
-
-Test Plan: Compiles
-
-Reviewers: #plasma, broulik
-
-Reviewed By: #plasma, broulik
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D14708
----
- greeter/main.cpp | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/greeter/main.cpp b/greeter/main.cpp
-index ff64a55..6db87e1 100644
---- a/greeter/main.cpp
-+++ b/greeter/main.cpp
-@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- *********************************************************************/
- #include <KLocalizedString>
-+#include <KQuickAddons/QtQuickSettings>
-
- #include <QDateTime>
- #include <QCommandLineParser>
-@@ -85,6 +86,8 @@ int main(int argc, char* argv[])
- QCoreApplication::setApplicationVersion(QStringLiteral("0.1"));
- QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
-
-+ KQuickAddons::QtQuickSettings::init();
-+
- // disable session management for the greeter
- auto disableSessionManagement = [](QSessionManager &sm) {
- sm.setRestartHint(QSessionManager::RestartNever);
---
-cgit v0.11.2
-
diff --git a/kde/patch/kstars.patch b/kde/patch/kstars.patch
deleted file mode 100644
index 8367818..0000000
--- a/kde/patch/kstars.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-#cat $CWD/patch/kstars/kstars_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kstars/kstars_isnan.patch b/kde/patch/kstars/kstars_isnan.patch
deleted file mode 100644
index 1c4aef3..0000000
--- a/kde/patch/kstars/kstars_isnan.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From: Christian Dersch <lupinix@mailbox.org>
-Date: Wed, 03 Feb 2016 10:19:55 +0000
-Subject: Fix compilation with gcc 6.x (namespace std has to be used explicitly in some cases, e.g. when ambiguous)
-X-Git-Url: http://quickgit.kde.org/?p=kstars.git&a=commitdiff&h=7d34e52f4dd6e15b871596b3c64d4c7cdba599b4
----
-Fix compilation with gcc 6.x (namespace std has to be used explicitly in some cases, e.g. when ambiguous)
-REVIEW:126976
----
-
-
---- a/kstars/fitsviewer/fitsdata.cpp
-+++ b/kstars/fitsviewer/fitsdata.cpp
-@@ -548,7 +548,7 @@
- int diff_x=s1->x - s2->x;
- int diff_y=s1->y - s2->y;
-
-- dis = abs( sqrt( diff_x*diff_x + diff_y*diff_y));
-+ dis = std::abs( sqrt( diff_x*diff_x + diff_y*diff_y));
- dis -= s1->width/2;
- dis -= s2->width/2;
-
-
---- a/kstars/tools/horizonmanager.cpp
-+++ b/kstars/tools/horizonmanager.cpp
-@@ -192,7 +192,7 @@
- az = dms::fromString(regionItem->child(i, 1)->data(Qt::DisplayRole).toString(), true);
- alt = dms::fromString(regionItem->child(i, 2)->data(Qt::DisplayRole).toString(), true);
-
-- if (isnan(az.Degrees()) || isnan(alt.Degrees()))
-+ if (std::isnan(az.Degrees()) || std::isnan(alt.Degrees()))
- return false;
-
- p.setAz(az);
-@@ -534,9 +534,9 @@
- dms azAngle = dms::fromString(parent->child(item->row(),1)->data(Qt::DisplayRole).toString(), true);
- dms altAngle = dms::fromString(parent->child(item->row(),2)->data(Qt::DisplayRole).toString(), true);
-
-- if (isnan(azAngle.Degrees()))
-+ if (std::isnan(azAngle.Degrees()))
- azOK = false;
-- if (isnan(altAngle.Degrees()))
-+ if (std::isnan(altAngle.Degrees()))
- altOK = false;
-
- if ( (item->column() == 1 && azOK == false) || (item->column() == 2 && altOK == false) )
-
diff --git a/kde/patch/ksudoku.patch b/kde/patch/ksudoku.patch
deleted file mode 100644
index d379585..0000000
--- a/kde/patch/ksudoku.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Qt5 apps accept qwindowtitle, not caption. KDEBUG 381087,
-# however ksudoku-17.04.x is still kdelibs4 based:
-#cat $CWD/patch/ksudoku/ksudoku_qwindowtitle.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ksudoku/ksudoku_qwindowtitle.patch b/kde/patch/ksudoku/ksudoku_qwindowtitle.patch
deleted file mode 100644
index 3417b34..0000000
--- a/kde/patch/ksudoku/ksudoku_qwindowtitle.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Qt5 .desktop files for apps accept qwindowtitle, not caption.
-However, the 17.04 branch of ksudoku is still kdelibs4 based, and the
-patch applied to KDE BUG 381087 broke the launch of ksudoku here:
-
---- a/src/gui/org.kde.ksudoku.desktop 2017-06-13 02:44:11.000000000 +0200
-+++ b/src/gui/org.kde.ksudoku.desktop 2017-07-15 11:58:32.027477614 +0200
-@@ -50,7 +50,7 @@
- Name[x-test]=xxKSudokuxx
- Name[zh_CN]=KSudoku
- Name[zh_TW]=KSudoku
--Exec=ksudoku %i -qwindowtitle %c
-+Exec=ksudoku %i -caption %c
- Icon=ksudoku
- Type=Application
- X-DocPath=ksudoku/index.html
diff --git a/kde/patch/ktexteditor.patch b/kde/patch/ktexteditor.patch
deleted file mode 100644
index a4f0aad..0000000
--- a/kde/patch/ktexteditor.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Fix indentation for some languages (e.g. Python) in Kate and KDevelop:
-#cat $CWD/patch/ktexteditor/ktexteditor_fix_indentation.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ktexteditor/ktexteditor_fix_indentation.patch b/kde/patch/ktexteditor/ktexteditor_fix_indentation.patch
deleted file mode 100644
index fc5d9d9..0000000
--- a/kde/patch/ktexteditor/ktexteditor_fix_indentation.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From aeebeadb5f5955995c17de56cf83ba7166a132dd Mon Sep 17 00:00:00 2001
-From: Sven Brauch <mail@svenbrauch.de>
-Date: Mon, 16 Oct 2017 18:35:50 +0200
-Subject: fix some indenters from indenting on random characters
-
-If triggerCharacters was not set, toString() would return "undefined",
-making indenters trigger on u, n, d, e, f, i and n.
-
-Differential Revision: https://phabricator.kde.org/D8333
----
- src/script/kateindentscript.cpp | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/src/script/kateindentscript.cpp b/src/script/kateindentscript.cpp
-index 15ce387..380bd45 100644
---- a/src/script/kateindentscript.cpp
-+++ b/src/script/kateindentscript.cpp
-@@ -46,7 +46,10 @@ const QString &KateIndentScript::triggerCharacters()
-
- m_triggerCharactersSet = true;
-
-- m_triggerCharacters = global(QStringLiteral("triggerCharacters")).toString();
-+ auto triggerCharacters = global(QStringLiteral("triggerCharacters"));
-+ if ( !triggerCharacters.isUndefined() ) {
-+ m_triggerCharacters = triggerCharacters.toString();
-+ }
-
- //qCDebug(LOG_KTE) << "trigger chars: '" << m_triggerCharacters << "'";
-
---
-cgit v0.11.2
-
diff --git a/kde/patch/ktorrent.patch b/kde/patch/ktorrent.patch
index 123f3af..0fdb4aa 100644
--- a/kde/patch/ktorrent.patch
+++ b/kde/patch/ktorrent.patch
@@ -1,3 +1,10 @@
# Embed a copy of the GeoIP database since the download link no longer works.
cat $CWD/patch/ktorrent/ktorrent.use.package.geoip.database.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+# Fix linking against taglib (ktorrent 5.2),
+# Thanks to Gentoo.
+cat $CWD/patch/ktorrent/ktorrent_taglib_linking.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
+
+# Fix showing ktorrent in the system tray,
+# Thanks to Gentoo.
+cat $CWD/patch/ktorrent/ktorrent_systray.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/ktorrent/ktorrent_systray.patch b/kde/patch/ktorrent/ktorrent_systray.patch
new file mode 100644
index 0000000..50049af
--- /dev/null
+++ b/kde/patch/ktorrent/ktorrent_systray.patch
@@ -0,0 +1,24 @@
+From 9747a8f524942b57e2fd42254c3de73f9d42918c Mon Sep 17 00:00:00 2001
+From: Matt Scheirer <matt.scheirer@gmail.com>
+Date: Sun, 17 May 2020 02:36:09 -0400
+Subject: [PATCH] Fix starting in tray by removing redundant show() in main
+
+---
+ ktorrent/main.cpp | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/ktorrent/main.cpp b/ktorrent/main.cpp
+index b5866c22..8e532c9c 100644
+--- a/ktorrent/main.cpp
++++ b/ktorrent/main.cpp
+@@ -208,7 +208,6 @@ int main(int argc, char** argv)
+ bt::InitLog(kt::DataDir(kt::CreateIfNotExists) + QLatin1String("log"), true, true, logToStdout);
+
+ kt::GUI widget;
+- widget.show();
+
+ auto handleCmdLine = [&widget, &parser](const QStringList &arguments, const QString &workingDirectory)
+ {
+--
+GitLab
+
diff --git a/kde/patch/ktorrent/ktorrent_taglib_linking.patch b/kde/patch/ktorrent/ktorrent_taglib_linking.patch
new file mode 100644
index 0000000..7f612c8
--- /dev/null
+++ b/kde/patch/ktorrent/ktorrent_taglib_linking.patch
@@ -0,0 +1,248 @@
+From f4c1c91d9b091941ebb4dae6aef95bcf9bc1c388 Mon Sep 17 00:00:00 2001
+From: David Faure <faure@kde.org>
+Date: Sun, 21 Jun 2020 14:19:49 +0200
+Subject: [PATCH] Update FindTaglib from ECM.
+
+This fixes linking for me, there was just nothing in TAGLIB_LIBRARIES
+on my system (taglib in the same custom prefix as KDE code)
+---
+ cmake/modules/FindTaglib.cmake | 191 +++++++++++------------------
+ plugins/mediaplayer/CMakeLists.txt | 3 +-
+ 2 files changed, 74 insertions(+), 120 deletions(-)
+
+diff --git a/cmake/modules/FindTaglib.cmake b/cmake/modules/FindTaglib.cmake
+index 13db60b2..1e1b9075 100644
+--- a/cmake/modules/FindTaglib.cmake
++++ b/cmake/modules/FindTaglib.cmake
+@@ -1,135 +1,90 @@
+-# - Try to find the Taglib library
+-# Once done this will define
++#.rst:
++# FindTaglib
++#-----------
+ #
+-# TAGLIB_FOUND - system has the taglib library
+-# TAGLIB_CFLAGS - the taglib cflags
+-# TAGLIB_LIBRARIES - The libraries needed to use taglib
+-
+-# Copyright (c) 2006, Laurent Montel, <montel@kde.org>
++# Try to find the Taglib library.
+ #
+-# Redistribution and use is allowed according to the terms of the BSD license.
+-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+-
+-if(NOT TAGLIB_MIN_VERSION)
+- set(TAGLIB_MIN_VERSION "1.6")
+-endif()
+-
+-if(NOT WIN32)
+- find_program(TAGLIBCONFIG_EXECUTABLE NAMES taglib-config PATHS
+- ${BIN_INSTALL_DIR}
+- )
+-endif()
+-
+-#reset vars
+-set(TAGLIB_LIBRARIES)
+-set(TAGLIB_CFLAGS)
+-
+-# if taglib-config has been found
+-if(TAGLIBCONFIG_EXECUTABLE)
+-
+- exec_program(${TAGLIBCONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB_VERSION)
+-
+- if("${TAGLIB_MIN_VERSION}" VERSION_GREATER TAGLIB_VERSION)
+- message(STATUS "TagLib version too old: version searched :${TAGLIB_MIN_VERSION}, found ${TAGLIB_VERSION}")
+- set(TAGLIB_FOUND FALSE)
+- else()
+-
+- exec_program(${TAGLIBCONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB_LIBRARIES)
+-
+- exec_program(${TAGLIBCONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE TAGLIB_CFLAGS)
++# This will define the following variables:
++#
++# ``Taglib_FOUND``
++# True if the system has the taglib library of at least the minimum
++# version specified by the version parameter to find_package()
++# ``Taglib_INCLUDE_DIRS``
++# The taglib include dirs for use with target_include_directories
++# ``Taglib_LIBRARIES``
++# The taglib libraries for use with target_link_libraries()
++# ``Taglib_VERSION``
++# The version of taglib that was found
++#
++# If ``Taglib_FOUND is TRUE, it will also define the following imported
++# target:
++#
++# ``Taglib::Taglib``
++# The Taglib library
++#
++# Since 5.72.0
++#
++# SPDX-FileCopyrightText: 2006 Laurent Montel <montel@kde.org>
++# SPDX-FileCopyrightText: 2019 Heiko Becker <heirecka@exherbo.org>
++# SPDX-FileCopyrightText: 2020 Elvis Angelaccio <elvis.angelaccio@kde.org>
++# SPDX-License-Identifier: BSD-3-Clause
+
+- if(TAGLIB_LIBRARIES AND TAGLIB_CFLAGS)
+- set(TAGLIB_FOUND TRUE)
+- endif()
+- string(REGEX REPLACE " *-I" ";" TAGLIB_INCLUDES "${TAGLIB_CFLAGS}")
+- endif()
+- mark_as_advanced(TAGLIB_CFLAGS TAGLIB_LIBRARIES TAGLIB_INCLUDES)
++find_package(PkgConfig QUIET)
+
+-else()
++pkg_search_module(PC_TAGLIB QUIET taglib)
+
+- find_path(TAGLIB_INCLUDES
+- NAMES
+- tag.h
++find_path(Taglib_INCLUDE_DIRS
++ NAMES tag.h
+ PATH_SUFFIXES taglib
+- PATHS
+- ${KDE4_INCLUDE_DIR}
+- ${INCLUDE_INSTALL_DIR}
+- )
+-
+- if(NOT WIN32)
+- # on non-win32 we don't need to take care about WIN32_DEBUG_POSTFIX
++ HINTS ${PC_TAGLIB_INCLUDEDIR}
++)
+
+- find_library(TAGLIB_LIBRARIES tag PATHS ${KDE4_LIB_DIR} ${LIB_INSTALL_DIR})
++find_library(Taglib_LIBRARIES
++ NAMES tag
++ HINTS ${PC_TAGLIB_LIBDIR}
++)
+
+- else()
++set(Taglib_VERSION ${PC_TAGLIB_VERSION})
+
+- # 1. get all possible libnames
+- set(args PATHS ${KDE4_LIB_DIR} ${LIB_INSTALL_DIR})
+- set(newargs "")
+- set(libnames_release "")
+- set(libnames_debug "")
++if (Taglib_INCLUDE_DIRS AND NOT Taglib_VERSION)
++ if(EXISTS "${Taglib_INCLUDE_DIRS}/taglib.h")
++ file(READ "${Taglib_INCLUDE_DIRS}/taglib.h" TAGLIB_H)
+
+- list(LENGTH args listCount)
++ string(REGEX MATCH "#define TAGLIB_MAJOR_VERSION[ ]+[0-9]+" TAGLIB_MAJOR_VERSION_MATCH ${TAGLIB_H})
++ string(REGEX MATCH "#define TAGLIB_MINOR_VERSION[ ]+[0-9]+" TAGLIB_MINOR_VERSION_MATCH ${TAGLIB_H})
++ string(REGEX MATCH "#define TAGLIB_PATCH_VERSION[ ]+[0-9]+" TAGLIB_PATCH_VERSION_MATCH ${TAGLIB_H})
+
+- # just one name
+- list(APPEND libnames_release "tag")
+- list(APPEND libnames_debug "tagd")
+-
+- set(newargs ${args})
+-
+- # search the release lib
+- find_library(TAGLIB_LIBRARIES_RELEASE
+- NAMES ${libnames_release}
+- ${newargs}
+- )
+-
+- # search the debug lib
+- find_library(TAGLIB_LIBRARIES_DEBUG
+- NAMES ${libnames_debug}
+- ${newargs}
+- )
+-
+- if(TAGLIB_LIBRARIES_RELEASE AND TAGLIB_LIBRARIES_DEBUG)
+-
+- # both libs found
+- set(TAGLIB_LIBRARIES optimized ${TAGLIB_LIBRARIES_RELEASE}
+- debug ${TAGLIB_LIBRARIES_DEBUG})
+-
+- else()
+-
+- if(TAGLIB_LIBRARIES_RELEASE)
+-
+- # only release found
+- set(TAGLIB_LIBRARIES ${TAGLIB_LIBRARIES_RELEASE})
+-
+- else()
+-
+- # only debug (or nothing) found
+- set(TAGLIB_LIBRARIES ${TAGLIB_LIBRARIES_DEBUG})
+-
+- endif()
+-
+- endif()
+-
+- mark_as_advanced(TAGLIB_LIBRARIES_RELEASE)
+- mark_as_advanced(TAGLIB_LIBRARIES_DEBUG)
++ string(REGEX REPLACE ".*_MAJOR_VERSION[ ]+(.*)" "\\1" TAGLIB_MAJOR_VERSION "${TAGLIB_MAJOR_VERSION_MATCH}")
++ string(REGEX REPLACE ".*_MINOR_VERSION[ ]+(.*)" "\\1" TAGLIB_MINOR_VERSION "${TAGLIB_MINOR_VERSION_MATCH}")
++ string(REGEX REPLACE ".*_PATCH_VERSION[ ]+(.*)" "\\1" TAGLIB_PATCH_VERSION "${TAGLIB_PATCH_VERSION_MATCH}")
+
++ set(Taglib_VERSION "${TAGLIB_MAJOR_VERSION}.${TAGLIB_MINOR_VERSION}.${TAGLIB_PATCH_VERSION}")
+ endif()
+-
+- include(FindPackageMessage)
+- include(FindPackageHandleStandardArgs)
+- find_package_handle_standard_args(Taglib DEFAULT_MSG TAGLIB_INCLUDES TAGLIB_LIBRARIES)
+-
+ endif()
+
+-
+-if(TAGLIB_FOUND)
+- if(NOT Taglib_FIND_QUIETLY AND TAGLIBCONFIG_EXECUTABLE)
+- message(STATUS "Taglib found: ${TAGLIB_LIBRARIES}")
+- endif()
+-else()
+- if(Taglib_FIND_REQUIRED)
+- message(FATAL_ERROR "Could not find Taglib")
+- endif()
++include(FindPackageHandleStandardArgs)
++find_package_handle_standard_args(Taglib
++ FOUND_VAR
++ Taglib_FOUND
++ REQUIRED_VARS
++ Taglib_LIBRARIES
++ Taglib_INCLUDE_DIRS
++ VERSION_VAR
++ Taglib_VERSION
++)
++
++if (Taglib_FOUND AND NOT TARGET Taglib::Taglib)
++ add_library(Taglib::Taglib UNKNOWN IMPORTED)
++ set_target_properties(Taglib::Taglib PROPERTIES
++ IMPORTED_LOCATION "${Taglib_LIBRARIES}"
++ INTERFACE_INCLUDE_DIRECTORIES "${Taglib_INCLUDE_DIRS}"
++ )
+ endif()
+
++mark_as_advanced(Taglib_LIBRARIES Taglib_INCLUDE_DIRS)
++
++include(FeatureSummary)
++set_package_properties(Taglib PROPERTIES
++ URL "https://taglib.org/"
++ DESCRIPTION "A library for reading and editing the meta-data of audio formats"
++)
+diff --git a/plugins/mediaplayer/CMakeLists.txt b/plugins/mediaplayer/CMakeLists.txt
+index 8bbeeb74..5fbe056f 100644
+--- a/plugins/mediaplayer/CMakeLists.txt
++++ b/plugins/mediaplayer/CMakeLists.txt
+@@ -1,5 +1,4 @@
+ find_package(Taglib REQUIRED)
+-include_directories(${TAGLIB_INCLUDES})
+ #find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Multimedia MultimediaWidgets)
+ #include_directories(${Qt5Multimedia_INCLUDE_DIRS})
+ include_directories(${PHONON_INCLUDES})
+@@ -34,7 +33,7 @@ kcoreaddons_desktop_to_json(ktorrent_mediaplayer ktorrent_mediaplayer.desktop)
+ target_link_libraries(
+ ktorrent_mediaplayer
+ ktcore
+- ${TAGLIB_LIBRARIES}
++ Taglib::Taglib
+ Phonon::phonon4qt5
+ KF5::Torrent
+ KF5::I18n
+--
+GitLab
+
+
diff --git a/kde/patch/ktp-accounts-kcm.patch b/kde/patch/ktp-accounts-kcm.patch
deleted file mode 100644
index ea37b9e..0000000
--- a/kde/patch/ktp-accounts-kcm.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix a crash in KDE Telepathy which was supposed to be fixed in 15.08.2:
-# See also https://bugs.kde.org/show_bug.cgi?id=351785
-#cat $CWD/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch b/kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch
deleted file mode 100644
index aa77aae..0000000
--- a/kde/patch/ktp-accounts-kcm/ktp-accounts-kcm_kdebug_351785.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Martin Klapetek <mklapetek@kde.org>
-Date: Thu, 17 Sep 2015 16:11:30 +0000
-Subject: [kaccounts] Emit configUiReady() when config UI is ready
-X-Git-Url: http://quickgit.kde.org/?p=ktp-accounts-kcm.git&a=commitdiff&h=07c7cc5309e11171b2e552678d58257ccfc44e42
----
-[kaccounts] Emit configUiReady() when config UI is ready
-
-Should prevent the crash when clicking the Configure button
-
-(requires kaccounts-integration 15.08.2)
-
-BUG: 351785
-FIXED-IN: 15.08.2
----
-
-
---- a/plugins/kaccounts/kaccounts-ui-provider.cpp
-+++ b/plugins/kaccounts/kaccounts-ui-provider.cpp
-@@ -106,10 +106,10 @@
-
- if (d->type == KAccountsUiPlugin::ConfigureAccountDialog) {
- if (d->accountManager->isReady()) {
-- Q_EMIT uiReady();
-+ Q_EMIT configUiReady();
- } else {
- // let's wait for AM to become ready first
-- connect(d->accountManager->becomeReady(), &Tp::PendingOperation::finished, this, &KAccountsUiProvider::uiReady);
-+ connect(d->accountManager->becomeReady(), &Tp::PendingOperation::finished, this, &KAccountsUiProvider::configUiReady);
- }
- }
- }
-
diff --git a/kde/patch/kwin.patch b/kde/patch/kwin.patch
deleted file mode 100644
index 9f05f30..0000000
--- a/kde/patch/kwin.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-# Trivial patch for testing the CK2 session controller interface
-# as a replacement for systemd-logind;
-#cat $CWD/patch/kwin/kwin_replace_logind_with_ck2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Workaround Qt regression no longer delivering events for the root window.
-# Fixed in kwin 5.10.3.
-#cat $CWD/patch/kwin/kwin_qt59_rootwindow_events.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix compilation with cmake 3.10 (fixed in 5.12.0):
-#cat $CWD/patch/kwin/kwin_cmake310.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/kwin/kwin_cmake310.patch b/kde/patch/kwin/kwin_cmake310.patch
deleted file mode 100644
index 5675ba5..0000000
--- a/kde/patch/kwin/kwin_cmake310.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-Taken from:
-https://gitweb.gentoo.org/repo/gentoo.git/tree/kde-plasma/kwin/files/kwin-5.11.5-cmake-3.10.patch
-
-From cd544890ced4192d07467c89e23adbb62d8cea5c Mon Sep 17 00:00:00 2001
-From: Milian Wolff <mail@milianw.de>
-Date: Mon, 18 Dec 2017 11:40:35 +0100
-Subject: Fix build with CMake 3.10
-
-Looks like a classic false-positive, but this makes the compile
-pass for me without making the code harder to read:
-
-AutoMoc error
--------------
- "/ssd/milian/projects/kf5/src/kde/workspace/kwin/kcmkwin/kwinscripts/main.cpp"
-The file contains a K_PLUGIN_FACTORY macro, but does not include "main.moc"!
-Consider to
- - add #include "main.moc"
- - enable SKIP_AUTOMOC for this file
-
-So we just add the include and then get rid of the duplicate
-definition of the plugin factory and the problem is resolved.
----
- kcmkwin/kwinscripts/main.cpp | 2 ++
- kcmkwin/kwinscripts/module.cpp | 2 --
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/kcmkwin/kwinscripts/main.cpp b/kcmkwin/kwinscripts/main.cpp
-index f5ee04b..baa5175 100644
---- a/kcmkwin/kwinscripts/main.cpp
-+++ b/kcmkwin/kwinscripts/main.cpp
-@@ -22,3 +22,5 @@
-
- K_PLUGIN_FACTORY(KcmKWinScriptsFactory,
- registerPlugin<Module>("kwin-scripts");)
-+
-+#include "main.moc"
-diff --git a/kcmkwin/kwinscripts/module.cpp b/kcmkwin/kwinscripts/module.cpp
-index a0d698e..ccf7d41 100644
---- a/kcmkwin/kwinscripts/module.cpp
-+++ b/kcmkwin/kwinscripts/module.cpp
-@@ -40,8 +40,6 @@
-
- #include "version.h"
-
--K_PLUGIN_FACTORY_DECLARATION(KcmKWinScriptsFactory)
--
- Module::Module(QWidget *parent, const QVariantList &args) :
- KCModule(parent, args),
- ui(new Ui::Module),
---
-cgit v0.11.2
-
diff --git a/kde/patch/kwin/kwin_qt59_rootwindow_events.patch b/kde/patch/kwin/kwin_qt59_rootwindow_events.patch
deleted file mode 100644
index 178d081..0000000
--- a/kde/patch/kwin/kwin_qt59_rootwindow_events.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From a6dee74ee455d1da47dd5c9d55a84adbb5e1426a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Martin=20Fl=C3=B6ser?= <mgraesslin@kde.org>
-Date: Sun, 18 Jun 2017 14:23:33 +0200
-Subject: Workaround Qt regression of no longer delivering events for the root
- window
-
-Summary:
-With qtbase 2b34aefcf02f09253473b096eb4faffd3e62b5f4 we do no longer get
-events reported for the X11 root window. Our keyboard handling in effects
-like PresentWindows and DesktopGrid relied on that.
-
-This change works around the regression by calling winId() on
-qApp->desktop() as suggested in the change. This is a short term solution
-for the 5.10 branch.
-
-This needs to be addressed properly by no longer relying on Qt in this
-area. KWin already does not rely on Qt for Wayland in that area and is
-able to compose the QKeyEvents. This should also be done on X11. It just
-needs some more hook up code for xkb, but that's needed anyway to improve
-modifier only shortcuts and friends.
-
-BUG: 360841
-FIXED-IN: 5.10.3
-
-Reviewers: #kwin, #plasma
-
-Subscribers: plasma-devel, kwin
-
-Tags: #kwin
-
-Differential Revision: https://phabricator.kde.org/D6258
----
- effects.cpp | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/effects.cpp b/effects.cpp
-index d2c4768..8155de6 100644
---- a/effects.cpp
-+++ b/effects.cpp
-@@ -48,6 +48,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
- #include "kwinglutils.h"
-
- #include <QDebug>
-+#include <QDesktopWidget>
-
- #include <Plasma/Theme>
-
-@@ -599,6 +600,11 @@ bool EffectsHandlerImpl::grabKeyboard(Effect* effect)
- bool ret = grabXKeyboard();
- if (!ret)
- return false;
-+ // Workaround for Qt 5.9 regression introduced with 2b34aefcf02f09253473b096eb4faffd3e62b5f4
-+ // we no longer get any events for the root window, one needs to call winId() on the desktop window
-+ // TODO: change effects event handling to create the appropriate QKeyEvent without relying on Qt
-+ // as it's done already in the Wayland case.
-+ qApp->desktop()->winId();
- }
- keyboard_grab_effect = effect;
- return true;
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/kwin/kwin_replace_logind_with_ck2.patch b/kde/patch/kwin/kwin_replace_logind_with_ck2.patch
deleted file mode 100644
index 294a691..0000000
--- a/kde/patch/kwin/kwin_replace_logind_with_ck2.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From: Eric Koegel <eric.koegel@gmail.com>
-Date: Sun, 24 Jul 2016 14:37:26 +0300
-
-Trivial patch for testing the CK2 session controller interface
-as a replacement for systemd-logind;
-Eric Koegel's original patch was rebased to kwin-5.10.2 by Eric Hameleers
-
-diff -uar kwin-5.10.2.orig/logind.cpp kwin-5.10.2/logind.cpp
---- kwin-5.10.2.orig/logind.cpp 2017-06-13 20:19:37.000000000 +0200
-+++ kwin-5.10.2/logind.cpp 2017-06-18 20:49:56.018661568 +0200
-@@ -58,10 +58,10 @@
- namespace KWin
- {
-
--const static QString s_login1Service = QStringLiteral("org.freedesktop.login1");
--const static QString s_login1Path = QStringLiteral("/org/freedesktop/login1");
--const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.login1.Manager");
--const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session");
-+const static QString s_login1Service = QStringLiteral("org.freedesktop.ConsoleKit");
-+const static QString s_login1Path = QStringLiteral("/org/freedesktop/ConsoleKit/Manager");
-+const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.ConsoleKit.Manager");
-+const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.ConsoleKit.Session");
- const static QString s_dbusPropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties");
-
- LogindIntegration *LogindIntegration::s_self = nullptr;
-@@ -151,7 +151,7 @@
- return;
- }
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "The session is not registered with logind" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "The session is not registered with ConsoleKit2" << reply.error().message();
- return;
- }
- m_sessionPath = reply.value().path();
-@@ -199,7 +199,7 @@
- m_sessionPath,
- s_dbusPropertiesInterface,
- QStringLiteral("Get"));
-- message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("Active")}));
-+ message.setArguments(QVariantList({s_login1SessionInterface, QStringLiteral("active")}));
- QDBusPendingReply<QVariant> reply = m_bus.asyncCall(message);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
- connect(watcher, &QDBusPendingCallWatcher::finished, this,
-@@ -207,7 +207,7 @@
- QDBusPendingReply<QVariant> reply = *self;
- self->deleteLater();
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "Failed to get Active Property of logind session:" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "Failed to get Active Property of ConsoleKit2 session:" << reply.error().message();
- return;
- }
- const bool active = reply.value().toBool();
-@@ -236,7 +236,7 @@
- QDBusPendingReply<QVariant> reply = *self;
- self->deleteLater();
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "Failed to get VTNr Property of logind session:" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "Failed to get VTNr Property of ConsoleKit2 session:" << reply.error().message();
- return;
- }
- const int vt = reply.value().toUInt();
-@@ -365,12 +365,12 @@
- QDBusPendingReply<QVariant> reply = *self;
- self->deleteLater();
- if (!reply.isValid()) {
-- qCDebug(KWIN_CORE) << "Failed to get Seat Property of logind session:" << reply.error().message();
-+ qCDebug(KWIN_CORE) << "Failed to get Seat Property of ConsoleKit2 session:" << reply.error().message();
- return;
- }
- DBusLogindSeat seat = qdbus_cast<DBusLogindSeat>(reply.value().value<QDBusArgument>());
- const QString seatPath = seat.path.path();
-- qCDebug(KWIN_CORE) << "Logind seat:" << seat.name << "/" << seatPath;
-+ qCDebug(KWIN_CORE) << "ConsoleKit2 seat:" << seat.name << "/" << seatPath;
- if (m_seatPath != seatPath) {
- m_seatPath = seatPath;
- }
-@@ -385,7 +385,7 @@
- }
- QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service,
- m_seatPath,
-- QStringLiteral("org.freedesktop.login1.Seat"),
-+ QStringLiteral("org.freedesktop.ConsoleKit.Seat"),
- QStringLiteral("SwitchTo"));
- message.setArguments(QVariantList{vtNr});
- m_bus.asyncCall(message);
diff --git a/kde/patch/libkdcraw.patch b/kde/patch/libkdcraw.patch
deleted file mode 100644
index fd8cf51..0000000
--- a/kde/patch/libkdcraw.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Backport a patch from git to support our newer cmake:
-#cat $CWD/patch/libkdcraw/libkdcraw_cmake_minver.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkdcraw/libkdcraw_cmake_minver.patch b/kde/patch/libkdcraw/libkdcraw_cmake_minver.patch
deleted file mode 100644
index 3446a19..0000000
--- a/kde/patch/libkdcraw/libkdcraw_cmake_minver.patch
+++ /dev/null
@@ -1,7 +0,0 @@
---- libkdcraw-15.08.0.orig/CMakeLists.txt 2015-05-14 22:54:16.000000000 +0200
-+++ libkdcraw-15.08.0/CMakeLists.txt 2015-08-25 13:37:50.880746449 +0200
-@@ -1,3 +1,4 @@
-+cmake_minimum_required(VERSION 2.8.9)
- #
- # Copyright (c) 2010-2014, Gilles Caulier, <caulier dot gilles at gmail dot com>
- #
diff --git a/kde/patch/libkexiv2.patch b/kde/patch/libkexiv2.patch
deleted file mode 100644
index 5a61c23..0000000
--- a/kde/patch/libkexiv2.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Backport a patch from git to support our newer cmake:
-#cat $CWD/patch/libkexiv2/libkexiv2_cmake_minver.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkexiv2/libkexiv2_cmake_minver.patch b/kde/patch/libkexiv2/libkexiv2_cmake_minver.patch
deleted file mode 100644
index a83861c..0000000
--- a/kde/patch/libkexiv2/libkexiv2_cmake_minver.patch
+++ /dev/null
@@ -1,7 +0,0 @@
---- libkexiv2-15.08.0.orig/CMakeLists.txt 2015-04-30 21:04:22.000000000 +0200
-+++ libkexiv2-15.08.0/CMakeLists.txt 2015-08-25 13:14:34.093738317 +0200
-@@ -1,3 +1,4 @@
-+cmake_minimum_required(VERSION 2.8.9)
- #
- # Copyright (c) 2010-2014, Gilles Caulier, <caulier dot gilles at gmail dot com>
- #
diff --git a/kde/patch/libkface.patch b/kde/patch/libkface.patch
index 9775e82..f488cf6 100644
--- a/kde/patch/libkface.patch
+++ b/kde/patch/libkface.patch
@@ -1,3 +1,2 @@
# Compile libkface against opencv 3.2:
cat $CWD/patch/libkface/libkface_opencv3.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkleo.patch b/kde/patch/libkleo.patch
deleted file mode 100644
index 9c1cef3..0000000
--- a/kde/patch/libkleo.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Compile libkleo with gcc7:
-# Fixed in Applications 17.04.2:
-#cat $CWD/patch/libkleo/libkleo_gcc7.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libkleo/libkleo_gcc7.patch b/kde/patch/libkleo/libkleo_gcc7.patch
deleted file mode 100644
index 40e0616..0000000
--- a/kde/patch/libkleo/libkleo_gcc7.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 675ce908a33d16f3b78d3fc741b0ff45790e4770 Mon Sep 17 00:00:00 2001
-From: Fabian Vogt <fabian@ritter-vogt.de>
-Date: Wed, 17 May 2017 17:05:41 +0200
-Subject: Fix compilation with GCC 7
-
-std::bind is part of functional, and GCC 7 requires an explicit include.
----
- src/kleo/enum.cpp | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/kleo/enum.cpp b/src/kleo/enum.cpp
-index 15ea1fd..829d4fd 100644
---- a/src/kleo/enum.cpp
-+++ b/src/kleo/enum.cpp
-@@ -33,6 +33,9 @@
- #include "enum.h"
- #include "libkleo_debug.h"
- #include "models/keycache.h"
-+
-+#include <functional>
-+
- #include <KLocalizedString>
-
- #include <gpgme++/key.h>
---
-cgit v0.11.2
-
diff --git a/kde/patch/libksysguard.patch b/kde/patch/libksysguard.patch
deleted file mode 100644
index d45baac..0000000
--- a/kde/patch/libksysguard.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Fix for "error: isnan was not declared in this scope"
-# Fixed post Plasma 5.5.5.
-#cat $CWD/patch/libksysguard/libksysguard_isnan.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/libksysguard/libksysguard_isnan.patch b/kde/patch/libksysguard/libksysguard_isnan.patch
deleted file mode 100644
index c6ce1e9..0000000
--- a/kde/patch/libksysguard/libksysguard_isnan.patch
+++ /dev/null
@@ -1,176 +0,0 @@
-From: David Rosca <nowrep@gmail.com>
-Date: Tue, 23 Feb 2016 16:32:35 +0000
-Subject: signalplotter: Use std namespaced isnan and isinf
-X-Git-Tag: v5.5.95
-X-Git-Url: http://quickgit.kde.org/?p=libksysguard.git&a=commitdiff&h=b0578798eb3f5bdad0a25ea9b4a52c53ebcfc020
----
-signalplotter: Use std namespaced isnan and isinf
-
-Test Plan: Fixes build for me.
-
-Reviewers: #plasma, ivan
-
-Reviewed By: ivan
-
-Subscribers: ivan, plasma-devel
-
-Projects: #plasma
-
-Differential Revision: https://phabricator.kde.org/D1010
----
-
-
---- a/signalplotter/ksignalplotter.cpp
-+++ b/signalplotter/ksignalplotter.cpp
-@@ -32,8 +32,6 @@
- #include "ksignalplotter_p.h"
- #include "processcore/processcore_debug.h"
-
--#include <math.h> //For floor, ceil, log10 etc for calculating ranges
--
- #include <QPainter>
- #include <QPixmap>
- #include <QPainterPath>
-@@ -49,7 +47,7 @@
-
- #include <klocalizedstring.h>
- #include <kiconloader.h>
--#include <math.h>
-+#include <cmath>
- #include <limits>
-
- #ifdef SVG_SUPPORT
-@@ -485,20 +483,20 @@
- qreal value=0;
- for(int i = sampleBuf.count()-1; i>= 0; i--) {
- qreal newValue = sampleBuf[i];
-- if( !isinf(newValue) && !isnan(newValue) )
-+ if( !std::isinf(newValue) && !std::isnan(newValue) )
- value += newValue;
- }
-- if(isnan(mMinValue) || mMinValue > value) mMinValue = value;
-- if(isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
-+ if(std::isnan(mMinValue) || mMinValue > value) mMinValue = value;
-+ if(std::isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
- if(value > 0.7*mMaxValue)
- mRescaleTime = time;
- } else {
- qreal value;
- for(int i = sampleBuf.count()-1; i>= 0; i--) {
- value = sampleBuf[i];
-- if( !isinf(value) && !isnan(value) ) {
-- if(isnan(mMinValue) || mMinValue > value) mMinValue = value;
-- if(isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
-+ if( !std::isinf(value) && !std::isnan(value) ) {
-+ if(std::isnan(mMinValue) || mMinValue > value) mMinValue = value;
-+ if(std::isnan(mMaxValue) || mMaxValue < value) mMaxValue = value;
- if(value > 0.7*mMaxValue)
- mRescaleTime = time;
- }
-@@ -789,9 +787,9 @@
- qreal max = mUserMaxValue;
- qreal min = mUserMinValue;
- if( mUseAutoRange ) {
-- if(!isnan(mMaxValue) && mMaxValue * 0.99 > max) //Allow max value to go very slightly over the given max, for rounding reasons
-+ if(!std::isnan(mMaxValue) && mMaxValue * 0.99 > max) //Allow max value to go very slightly over the given max, for rounding reasons
- max = mMaxValue;
-- if(!isnan(mMinValue) && mMinValue * 0.99 < min) {
-+ if(!std::isnan(mMinValue) && mMinValue * 0.99 < min) {
- min = mMinValue;
- }
- }
-@@ -920,23 +918,23 @@
- bool firstLine = true;
- for (int j = 0; j < count; ++j) {
- qreal point0 = datapoints[j];
-- if( isnan(point0) )
-+ if( std::isnan(point0) )
- continue; //Just do not draw points with nans. skip them
-
- qreal point1 = prev_datapoints[j];
- qreal point2 = prev_prev_datapoints[j];
-
-- if(isnan(point1))
-+ if(std::isnan(point1))
- point1 = point0;
-- else if(mSmoothGraph && !isinf(point1)) {
-+ else if(mSmoothGraph && !std::isinf(point1)) {
- // Apply a weighted average just to smooth the graph out a bit
- // Do not try to smooth infinities or nans
- point0 = (2*point0 + point1)/3;
-- if(!isnan(point2) && !isinf(point2))
-+ if(!std::isnan(point2) && !std::isinf(point2))
- point1 = (2*point1 + point2)/3;
- // We don't bother to average out y2. This will introduce slight inaccuracies in the gradients, but they aren't really noticeable.
- }
-- if(isnan(point2))
-+ if(std::isnan(point2))
- point2 = point1;
-
- if (mStackBeams) {
-@@ -1046,12 +1044,12 @@
- }
- QString KSignalPlotter::lastValueAsString( int i, int precision) const
- {
-- if(d->mBeamData.isEmpty() || d->mBeamData.first().size() <= i || isnan(d->mBeamData.first().at(i))) return QString();
-+ if(d->mBeamData.isEmpty() || d->mBeamData.first().size() <= i || std::isnan(d->mBeamData.first().at(i))) return QString();
- return valueAsString(d->mBeamData.first().at(i), precision); //retrieve the newest value for this beam
- }
- QString KSignalPlotter::valueAsString( qreal value, int precision) const
- {
-- if(isnan(value))
-+ if(std::isnan(value))
- return QString();
- value = value / d->mScaleDownBy; // scale the value. E.g. from Bytes to KiB
- return d->scaledValueAsString(value, precision);
-
---- a/tests/signalplottertest.cpp
-+++ b/tests/signalplottertest.cpp
-@@ -56,8 +56,8 @@
- s->addBeam(Qt::blue);
- s->addBeam(Qt::red);
-
-- QVERIFY( isnan(s->lastValue(0)) ); //unset, so should default to NaN
-- QVERIFY( isnan(s->lastValue(1)) ); //unset, so should default to NaN
-+ QVERIFY( std::isnan(s->lastValue(0)) ); //unset, so should default to NaN
-+ QVERIFY( std::isnan(s->lastValue(1)) ); //unset, so should default to NaN
- QCOMPARE(s->numBeams(), 2);
- QVERIFY(s->beamColor(0) == Qt::blue);
- QVERIFY(s->beamColor(1) == Qt::red);
-@@ -92,7 +92,7 @@
- QVERIFY(s->beamColor(0) == Qt::blue);
- QVERIFY(s->beamColor(1) == Qt::red);
- QCOMPARE(s->lastValue(0), 1.0);
-- QVERIFY( isnan(s->lastValue(1)) ); //unset, so should default to NaN
-+ QVERIFY( std::isnan(s->lastValue(1)) ); //unset, so should default to NaN
- }
-
- void TestSignalPlotter::testReorderBeams()
-@@ -153,8 +153,8 @@
- s->addBeam(Qt::blue);
- s->addBeam(Qt::red);
- QCOMPARE(s->numBeams(), 2);
-- QVERIFY(isnan(s->lastValue(0))); //unset, so should default to NaN
-- QVERIFY(isnan(s->lastValue(1))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(0))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(1))); //unset, so should default to NaN
- //Add some data
- QList<qreal> data;
- data << 1.0 << 2.0;
-@@ -189,13 +189,13 @@
- QCOMPARE(s->numBeams(), 3);
- QCOMPARE(s->lastValue(0), 2.0);
- QCOMPARE(s->lastValue(1), 1.0);
-- QVERIFY(isnan(s->lastValue(2))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(2))); //unset, so should default to NaN
-
- newOrder.clear();
- newOrder << 2 << 0 << 1;
- s->reorderBeams(newOrder);
- QCOMPARE(s->numBeams(), 3);
-- QVERIFY(isnan(s->lastValue(0))); //unset, so should default to NaN
-+ QVERIFY(std::isnan(s->lastValue(0))); //unset, so should default to NaN
- QCOMPARE(s->lastValue(1), 2.0);
- QCOMPARE(s->lastValue(2), 1.0);
- }
-
diff --git a/kde/patch/marble.patch b/kde/patch/marble.patch
deleted file mode 100644
index eb2b7fc..0000000
--- a/kde/patch/marble.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# Ensure marble bindings for Qt4 get compiled:
-# No longer needed in Applications 15.12.0, libkface was ported to KF5.
-#cat $CWD/patch/marble/marble_qt4.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/marble/marble_qt4.patch b/kde/patch/marble/marble_qt4.patch
deleted file mode 100644
index e497023..0000000
--- a/kde/patch/marble/marble_qt4.patch
+++ /dev/null
@@ -1,47 +0,0 @@
---- marble-15.08.0.orig/CMakeLists.txt 2015-08-12 13:14:02.000000000 +0200
-+++ marble-15.08.0/CMakeLists.txt 2015-08-29 00:24:00.767298683 +0200
-@@ -45,6 +45,8 @@
- ####################################################
- # Specific options for building with Qt 4 vs 5
-
-+option(QT5BUILD "Build for Qt5" ON)
-+
- if(ANDROID)
- if (NOT DEFINED ENV{Qt5_host})
- message(FATAL_ERROR "Configure the env variable Qt5_host to point to your host Qt5 installation.")
-@@ -79,6 +81,7 @@
- include_directories(SYSTEM "$ENV{ANDROID_NDK}/platforms/$ENV{ANDROID_PLATFORM}/arch-arm/usr/include")
- message(STATUS "Include directories: " "$ENV{ANDROID_NDK}/platforms/$ENV{ANDROID_PLATFORM}/arch-arm/usr/include")
- else()
-+ if(QT5BUILD)
- find_package(Qt5WebKit)
- find_package(Qt5WebKitWidgets)
- find_package(Qt5DBus)
-@@ -86,8 +89,10 @@
- if ( NOT Qt5WebKit_FOUND )
- set ( MARBLE_NO_WEBKIT TRUE )
- endif()
-+ endif()
- endif()
-
-+if(QT5BUILD)
- find_package(Qt5Core)
- find_package(Qt5Xml)
- find_package(Qt5Network)
-@@ -100,6 +105,7 @@
- find_package(Qt5Quick)
- find_package(Qt5OpenGL)
- find_package(Qt5PrintSupport)
-+endif()
-
- if(QTONLY)
- # Forward the old QTONLY=TRUE option to the new WITH_KDE=FALSE
-@@ -111,8 +117,6 @@
- unset(QTONLY)
- endif()
-
--option(QT5BUILD "Build for Qt5" ON)
--
- if(QT5BUILD AND Qt5Core_FOUND)
- cmake_minimum_required(VERSION 2.8.12)
- set(QT4BUILD FALSE)
diff --git a/kde/patch/messagelib.patch b/kde/patch/messagelib.patch
deleted file mode 100644
index a76851e..0000000
--- a/kde/patch/messagelib.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# CVE-2018-19516: HTML email can open browser window automatically.
-# Fixed in messagelib of KDE Applications 18.12.0.
-#cat $CWD/patch/messagelib/messagelib_CVE-2018-19516.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/messagelib/messagelib_CVE-2018-19516.patch b/kde/patch/messagelib/messagelib_CVE-2018-19516.patch
deleted file mode 100644
index 599dd39..0000000
--- a/kde/patch/messagelib/messagelib_CVE-2018-19516.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-From 34765909cdf8e55402a8567b48fb288839c61612 Mon Sep 17 00:00:00 2001
-From: Laurent Montel <montel@kde.org>
-Date: Fri, 23 Nov 2018 07:37:02 +0100
-Subject: Exclude Refresh from MetaData (Not necessary)
-
-diff -uar messagelib-18.08.3.orig/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp messagelib-18.08.3/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp
---- messagelib-18.08.3.orig/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp 2018-10-31 07:56:07.000000000 +0100
-+++ messagelib-18.08.3/messageviewer/src/messagepartthemes/default/defaultrenderer.cpp 2018-12-09 23:38:11.009130622 +0100
-@@ -308,6 +308,11 @@
- return htmlSource;
- }
- extraHead = s.mid(startIndex + 6 , endIndex - startIndex - 6);
-+ //Don't authorize to refresh content.
-+ if (s.contains(QStringLiteral("http-equiv=\"REFRESH\""), Qt::CaseInsensitive)) {
-+ extraHead.clear();
-+ }
-+
- s = s.mid(endIndex + 7).trimmed();
- }
-
diff --git a/kde/patch/okular.patch b/kde/patch/okular.patch
deleted file mode 100644
index 0875170..0000000
--- a/kde/patch/okular.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Address CVE-2020-9359 (repaired in 20.04.0):
-#cat $CWD/patch/okular/cve-2020-9359.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/okular/cve-2020-9359.patch b/kde/patch/okular/cve-2020-9359.patch
deleted file mode 100644
index d82c91c..0000000
--- a/kde/patch/okular/cve-2020-9359.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-Okular: Local binary execution via action links
-CVE: CVE-2020-9359
-
-Okular can be tricked into executing local binaries via specially crafted
-PDF files.
-This binary execution can require almost no user interaction.
-No parameters can be passed to those local binaries.
-We have not been able to identify any binary that will cause actual damage,
-be it in the hardware or software level, when run without parameters.
-
-We remain relatively confident that for this issue to do any actual damage,
-it has to run a binary specially crafted. That binary must have been deployed
-to the user system via another method, be it the user downloading it directly
-as an email attachment, webpage download, etc. or by the system being
-already compromised.
-
-
-diff --git a/core/document.cpp b/core/document.cpp
-index 3215a1abce6292a6cc25c5f8b645232c92d75ec5..0aa5b698019a2660f2d6baabd54cef1e82002b0e 100644
---- a/core/document.cpp
-+++ b/core/document.cpp
-@@ -4388,7 +4388,8 @@ void Document::processAction( const Action * action )
- {
- const QUrl realUrl = KIO::upUrl(d->m_url).resolved(url);
- // KRun autodeletes
-- new KRun( realUrl, d->m_widget );
-+ KRun *r = new KRun( realUrl, d->m_widget );
-+ r->setRunExecutables(false);
- }
- }
- } break;
-
diff --git a/kde/patch/oxygen-gtk2.patch b/kde/patch/oxygen-gtk2.patch
index 4ca11e9..a2dd03e 100644
--- a/kde/patch/oxygen-gtk2.patch
+++ b/kde/patch/oxygen-gtk2.patch
@@ -1,3 +1,2 @@
# Add more firefox-derived browsers as supported by the theme:
cat $CWD/patch/oxygen-gtk2/oxygen-gtk2_KDEBUG_341181.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/oxygen-gtk3.patch b/kde/patch/oxygen-gtk3.patch
deleted file mode 100644
index 1f0f0aa..0000000
--- a/kde/patch/oxygen-gtk3.patch
+++ /dev/null
@@ -1,3 +0,0 @@
-# Compile against Slackware's older version of gtk+3:
-cat $CWD/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch b/kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch
deleted file mode 100644
index 075cd08..0000000
--- a/kde/patch/oxygen-gtk3/oxygen-gtk3-1.3.1_gtk3.8.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-diff -urN oxygen-gtk3-1.3.1/src/oxygenthemingengine.cpp oxygen-gtk3-1.3.1-patched/src/oxygenthemingengine.cpp
---- oxygen-gtk3-1.3.1/src/oxygenthemingengine.cpp 2013-12-11 23:38:20.000000000 +1100
-+++ oxygen-gtk3-1.3.1-patched/src/oxygenthemingengine.cpp 2013-12-17 23:11:11.684864006 +1100
-@@ -493,13 +493,6 @@
-
- }
-
-- } else if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_LIST_ROW ) ) {
--
-- GtkStateFlags state( gtk_theming_engine_get_state( engine ) );
-- StyleOptions options( widget, state );
-- if( options & (Selected|Hover) )
-- { Style::instance().renderSelection( context, x, y, w, h, TileSet::Horizontal, options ); }
--
- } else if(
- gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_SPINBUTTON ) &&
- !gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_ENTRY ) )
-@@ -507,10 +500,7 @@
-
- return;
-
-- } else if(
-- gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_TOOLBAR ) ||
-- gtk_widget_path_is_type( path, GTK_TYPE_HEADER_BAR ) )
-- {
-+ } else if( gtk_theming_engine_has_class( engine, GTK_STYLE_CLASS_TOOLBAR ) ) {
-
- // render background
- if( !Gtk::gtk_widget_is_applet( widget ) )
diff --git a/kde/patch/perlqt.patch b/kde/patch/perlqt.patch
index 1cdd7db..669a723 100644
--- a/kde/patch/perlqt.patch
+++ b/kde/patch/perlqt.patch
@@ -1,3 +1,2 @@
# Fix build:
cat $CWD/patch/perlqt/perlqt.gcc6.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-browser-integration.patch b/kde/patch/plasma-browser-integration.patch
index c82fee9..38642df 100644
--- a/kde/patch/plasma-browser-integration.patch
+++ b/kde/patch/plasma-browser-integration.patch
@@ -1,3 +1,2 @@
# Fix hardcoded mozilla 'lib' libdir:
cat $CWD/patch/plasma-browser-integration/plasma-browser-integration_KDEBUG-113461.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-desktop.patch b/kde/patch/plasma-desktop.patch
deleted file mode 100644
index 8a69d4c..0000000
--- a/kde/patch/plasma-desktop.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-# Fix errors in translation strings for bs and sr:
-#cat $CWD/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Forgotten includes:
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix for Plasma 5.5.0 (KDEBUG #356398):
-#cat $CWD/patch/plasma-desktop//plasma-desktop_kickoff_kdebug_356398.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix for Plasma 5.14.4 (KDEBUG #401508):
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# KDEBUG #401508): unlock widgets.
-# Fixed in Plasma 5.18.1:
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# KDEBUG #416358): Cannot apply font changes (button remains inactive).
-# Fixed in Plasma 5.18.1:
-#cat $CWD/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff b/kde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff
deleted file mode 100755
index 3b96d54..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop-4.99.0_kfontinst_po.diff
+++ /dev/null
@@ -1,60 +0,0 @@
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/bs/kfontinst.po b/po/bs/kfontinst.po
---- a/po/bs/kfontinst.po 2014-05-09 17:23:01.000000000 +0200
-+++ b/po/bs/kfontinst.po 2014-05-18 18:38:26.513853094 +0200
-@@ -1169,7 +1169,7 @@ msgstr "abcčćdđefghijklmnoprsštuvzž
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr/kfontinst.po b/po/sr/kfontinst.po
---- a/po/sr/kfontinst.po 2014-05-09 17:27:16.000000000 +0200
-+++ b/po/sr/kfontinst.po 2014-05-18 18:38:40.837414520 +0200
-@@ -1221,7 +1221,7 @@ msgstr "абвгдђежзијклљмн
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr@ijekavian/kfontinst.po b/po/sr@ijekavian/kfontinst.po
---- a/po/sr@ijekavian/kfontinst.po 2014-05-09 17:27:20.000000000 +0200
-+++ b/po/sr@ijekavian/kfontinst.po 2014-05-18 18:38:54.049932456 +0200
-@@ -1221,7 +1221,7 @@ msgstr "абвгдђежзијклљмн
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr@ijekavianlatin/kfontinst.po b/po/sr@ijekavianlatin/kfontinst.po
---- a/po/sr@ijekavianlatin/kfontinst.po 2014-05-09 17:27:24.000000000 +0200
-+++ b/po/sr@ijekavianlatin/kfontinst.po 2014-05-18 18:39:09.884553255 +0200
-@@ -1224,7 +1224,7 @@ msgstr "abcčćdđefghijklmnoprsštuvzž
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name."
-diff -U 3 -H -d -p -r -N -x .svn -x .git -- a/po/sr@latin/kfontinst.po b/po/sr@latin/kfontinst.po
---- a/po/sr@latin/kfontinst.po 2014-05-09 17:27:27.000000000 +0200
-+++ b/po/sr@latin/kfontinst.po 2014-05-18 18:39:21.351002849 +0200
-@@ -1223,7 +1223,7 @@ msgstr "abcčćdđefghijklmnoprsštuvzž
- #: lib/FcEngine.cpp:1004
- msgctxt "Numbers and characters"
- msgid "0123456789.:,;(*!?'/\\\")£$€%^&-+@~#<>{}[]"
--msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@
-+msgstr "0123456789.:,;(*!?'/\\\")£$€%^&amp;-+@~#<>{}[]"
-
- #: lib/FcEngine.cpp:1401
- msgid "ERROR: Could not determine font's name." \ No newline at end of file
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch b/kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch
deleted file mode 100644
index 2e4a099..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdebug_401508.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From ed34cc5f181e61d1fc98872866c5d7300a90af86 Mon Sep 17 00:00:00 2001
-From: Eike Hein <hein@kde.org>
-Date: Thu, 29 Nov 2018 00:22:17 +0900
-Subject: Fix group popup dialog
-
-Summary:
-Fixes regression introduced with ab26ebb18b74: That diff contained
-a change unrelated to the original submission, swapping a || out for
-&& in response to a review note. This turns out to have broken things.
-
-BUG:401508
-
-Reviewers: davidedmundson
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D17219
----
- applets/taskmanager/package/contents/ui/GroupDialog.qml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/applets/taskmanager/package/contents/ui/GroupDialog.qml b/applets/taskmanager/package/contents/ui/GroupDialog.qml
-index 6f59275..28238dc 100644
---- a/applets/taskmanager/package/contents/ui/GroupDialog.qml
-+++ b/applets/taskmanager/package/contents/ui/GroupDialog.qml
-@@ -262,7 +262,7 @@ PlasmaCore.Dialog {
- // Setting VisualDataModel.rootIndex drops groupRepeater.count to 0
- // before the actual row count. updateSize is therefore invoked twice;
- // only update size once the repeater count matches the model role.
-- } else if (!groupRepeater.aboutToPopulate && visualParent.childCount == groupRepeater.count) {
-+ } else if (!groupRepeater.aboutToPopulate || visualParent.childCount == groupRepeater.count) {
- var task;
- var maxWidth = 0;
- var maxHeight = 0;
---
-cgit v1.1
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch b/kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch
deleted file mode 100644
index 34ca670..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdebug_416358.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/kcms/fonts/fonts.cpp b/kcms/fonts/fonts.cpp
---- a/kcms/fonts/fonts.cpp
-+++ b/kcms/fonts/fonts.cpp
-@@ -572,8 +572,8 @@
- // previews
- engine()->addImageProvider("preview", new PreviewImageProvider(m_settings->font()));
-
-- // reload state after loading by emiting a settings signal
-- emit m_settings->activeFontChanged();
-+ // KCM expect save state to be false at this point (can be true because of setNearestExistingFonts
-+ setNeedsSave(false);
- }
-
- void KFonts::save()
-
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch b/kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch
deleted file mode 100644
index a840d6e..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdebug_417424.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 2bc3c5e92d4789146548e8de4d520cd191994e1c Mon Sep 17 00:00:00 2001
-From: Marco Martin <notmart@gmail.com>
-Date: Tue, 11 Feb 2020 16:41:26 +0100
-Subject: unlock widgets
-
-5.18 doesn't offer a way anymore from the gui
-so unlock them if they're locked
-BUG:417424
----
- desktoppackage/contents/updates/unlock_widgets.js | 2 ++
- 1 file changed, 2 insertions(+)
- create mode 100644 desktoppackage/contents/updates/unlock_widgets.js
-
-diff --git a/desktoppackage/contents/updates/unlock_widgets.js b/desktoppackage/contents/updates/unlock_widgets.js
-new file mode 100644
-index 0000000..c332270
---- /dev/null
-+++ b/desktoppackage/contents/updates/unlock_widgets.js
-@@ -0,0 +1,2 @@
-+
-+__AppInterface.locked = false;
---
-cgit v1.1
-
-
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff b/kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff
deleted file mode 100644
index 74d541c..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kdelibs4support.diff
+++ /dev/null
@@ -1,88 +0,0 @@
---- plasma-desktop-20140602git/kcms/kfontinst/lib/CMakeLists.txt.orig 2014-06-03 16:08:19.294297273 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/lib/CMakeLists.txt 2014-06-03 16:09:12.420293700 +0200
-@@ -15,6 +15,6 @@
- set_target_properties(kfontinst PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION 5 )
-
- add_library(kfontinstui SHARED ${kfontinstui_LIB_SRCS})
--target_link_libraries(kfontinstui Qt5::X11Extras KF5::KIOCore KF5::KIOWidgets ${FREETYPE_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${X11_X11_LIB} ${X11_Xft_LIB} kfontinst )
-+target_link_libraries(kfontinstui Qt5::X11Extras KF5::KIOCore KF5::KIOWidgets KF5::KDELibs4Support XCB::XCB XCB::IMAGE ${FREETYPE_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${X11_X11_LIB} ${X11_Xft_LIB} kfontinst )
- set_target_properties(kfontinstui PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION 5 )
- install(TARGETS kfontinst kfontinstui ${INSTALL_TARGETS_DEFAULT_ARGS} )
---- plasma-desktop-20140602git/kcms/kfontinst/dbus/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/dbus/CMakeLists.txt 2014-06-03 17:17:01.382378586 +0200
-@@ -14,11 +14,11 @@
-
- set_target_properties(fontinst_bin PROPERTIES OUTPUT_NAME fontinst)
- target_link_libraries(fontinst_bin
-- Qt5::DBus Qt5::Xml ${FONTCONFIG_LIBRARIES} kfontinst)
-+ Qt5::DBus Qt5::Xml Qt5::X11Extras KF5::KDELibs4Support XCB::XCB XCB::IMAGE ${FONTCONFIG_LIBRARIES} kfontinst)
-
- set_target_properties(fontinst_helper PROPERTIES OUTPUT_NAME fontinst_helper)
- target_link_libraries(fontinst_helper
-- Qt5::DBus Qt5::Xml ${FONTCONFIG_LIBRARIES} kfontinst)
-+ Qt5::DBus Qt5::Xml Qt5::X11Extras KF5::KDELibs4Support XCB::XCB XCB::IMAGE ${FONTCONFIG_LIBRARIES} kfontinst)
-
- install(TARGETS fontinst_bin DESTINATION ${LIBEXEC_INSTALL_DIR} )
- install(TARGETS fontinst_helper DESTINATION ${LIBEXEC_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/kcmfontinst/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/kcmfontinst/CMakeLists.txt 2014-06-03 19:19:00.376164975 +0200
-@@ -10,6 +10,7 @@
- add_library(kcm_fontinst MODULE ${kcm_fontinst_PART_SRCS})
-
- target_link_libraries(kcm_fontinst
-+ Qt5::X11Extras
- KF5::Archive
- KF5::KCMUtils
- KF5::Su
---- plasma-desktop-20140602git/kcms/kfontinst/apps/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/apps/CMakeLists.txt 2014-06-03 19:27:47.209175028 +0200
-@@ -31,6 +31,7 @@
- )
- target_link_libraries(kfontprint_bin
- Qt5::PrintSupport
-+ Qt5::X11Extras
- KF5::IconThemes
- KF5::KDELibs4Support
- ${X11_X11_LIB}
-@@ -38,7 +39,7 @@
- kfontinstui
- kfontinst
- )
--target_link_libraries(kfontview_bin KF5::Parts KF5::XmlGui kfontinstui kfontinst )
-+target_link_libraries(kfontview_bin KF5::Parts KF5::XmlGui KF5::KDELibs4Support kfontinstui kfontinst )
-
- install(TARGETS kfontinst_bin ${INSTALL_TARGETS_DEFAULT_ARGS} )
- install(TARGETS kfontprint_bin DESTINATION ${LIBEXEC_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/kio/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/kio/CMakeLists.txt 2014-06-03 19:31:34.379189708 +0200
-@@ -5,7 +5,7 @@
- set(kio_fonts_PART_SRCS FontInstInterface.cpp KioFonts.cpp ${libkfontinstdbusiface_SRCS})
- # qt5_add_dbus_interface(kio_fonts_PART_SRCS ../dbus/org.kde.fontinst.xml FontinstIface)
- add_library(kio_fonts MODULE ${kio_fonts_PART_SRCS} ${KFI_FONTINST_AUTH_SRC} )
--target_link_libraries(kio_fonts Qt5::DBus Qt5::X11Extras Qt5::Xml KF5::Archive KF5::KIOCore KF5::KIOWidgets kfontinst )
-+target_link_libraries(kio_fonts Qt5::DBus Qt5::X11Extras Qt5::Xml KF5::Archive KF5::KIOCore KF5::KIOWidgets KF5::KDELibs4Support kfontinst )
- install(TARGETS kio_fonts DESTINATION ${PLUGIN_INSTALL_DIR} )
- install( FILES fonts.desktop DESTINATION ${DATA_INSTALL_DIR}/konqsidebartng/virtual_folders/services )
- install( FILES fonts.protocol DESTINATION ${SERVICES_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/thumbnail/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/thumbnail/CMakeLists.txt 2014-06-03 19:34:23.357198688 +0200
-@@ -7,7 +7,7 @@
-
- add_library(fontthumbnail MODULE ${fontthumbnail_PART_SRCS})
-
--target_link_libraries(fontthumbnail KF5::Archive KF5::KIOCore KF5::KIOWidgets kfontinstui kfontinst )
-+target_link_libraries(fontthumbnail KF5::Archive KF5::KIOCore KF5::KIOWidgets KF5::KDELibs4Support kfontinstui kfontinst )
-
- install(TARGETS fontthumbnail DESTINATION ${PLUGIN_INSTALL_DIR} )
- install( FILES fontthumbnail.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
---- plasma-desktop-20140602git/kcms/kfontinst/viewpart/CMakeLists.txt.orig 2014-06-02 13:47:27.000000000 +0200
-+++ plasma-desktop-20140602git/kcms/kfontinst/viewpart/CMakeLists.txt 2014-06-03 19:42:35.590219674 +0200
-@@ -8,7 +8,7 @@
-
- add_library(kfontviewpart MODULE ${kfontviewpart_PART_SRCS})
-
--target_link_libraries(kfontviewpart KF5::Archive KF5::Parts KF5::XmlGui ${FONTCONFIG_LIBRARIES} kfontinstui kfontinst )
-+target_link_libraries(kfontviewpart KF5::Archive KF5::Parts KF5::XmlGui KF5::KDELibs4Support ${FONTCONFIG_LIBRARIES} kfontinstui kfontinst )
-
- install(TARGETS kfontviewpart DESTINATION ${PLUGIN_INSTALL_DIR} )
- install( FILES kfontviewpart.rc DESTINATION ${DATA_INSTALL_DIR}/kfontinst )
diff --git a/kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch b/kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch
deleted file mode 100644
index a4d8d9f..0000000
--- a/kde/patch/plasma-desktop/plasma-desktop_kickoff_kdebug_356398.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Eike Hein <hein@kde.org>
-Date: Tue, 08 Dec 2015 19:26:26 +0000
-Subject: Fix migration of multiple favorites.
-X-Git-Url: http://quickgit.kde.org/?p=plasma-desktop.git&a=commitdiff&h=97ced66da372737ae5d36d86c9bc0c6fe684d842
----
-Fix migration of multiple favorites.
-
-BUG:356398
----
-
-
---- a/desktoppackage/contents/updates/obsolete_kickoffrc.js
-+++ b/desktoppackage/contents/updates/obsolete_kickoffrc.js
-@@ -1,7 +1,7 @@
- var kickoffConfig = ConfigFile("kickoffrc");
-
- kickoffConfig.group = "Favorites";
--var favorites = kickoffConfig.readEntry("FavoriteURLs");
-+var favorites = kickoffConfig.readEntry("FavoriteURLs").split(',');
-
- kickoffConfig.group = "SystemApplications";
- var systemApplications = kickoffConfig.readEntry("DesktopFiles").split(',');
-
-
diff --git a/kde/patch/plasma-framework.patch b/kde/patch/plasma-framework.patch
index 601f16c..cca9a13 100644
--- a/kde/patch/plasma-framework.patch
+++ b/kde/patch/plasma-framework.patch
@@ -1,12 +1,3 @@
-# KDE Plasma with KF 5.18 crash, if mouse repeatedly hovers over TaskManager
-# KDEBUG 357895; fixed in Frameworks 5.20.
-#cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Icons for SNI Qt apps not appearing
-# KDEBUG 359388; fixed in Frameworks 5.20.
-#cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
# Password is asked twice when connecting to a new WiFi network,
# KDEBUG 423093; fixed in Frameworks 5.72 and Plasma 5.20.
-cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_423093.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
+#cat $CWD/patch/plasma-framework/plasma-framework_KDEBUG_423093.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch b/kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch
deleted file mode 100644
index 9480314..0000000
--- a/kde/patch/plasma-framework/plasma-framework_KDEBUG_357895.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: David Rosca <nowrep@gmail.com>
-Date: Mon, 15 Feb 2016 18:05:26 +0000
-Subject: WindowThumbnail: Discard glx pixmap in stopRedirecting()
-X-Git-Url: http://quickgit.kde.org/?p=plasma-framework.git&a=commitdiff&h=1e196fdfb2a6eaf1664e1155c086616d55c6712b
----
-WindowThumbnail: Discard glx pixmap in stopRedirecting()
-
-BUG: 357895
-FIXED-IN: 5.20
-REVIEW: 127072
----
-
-
---- a/src/declarativeimports/core/windowthumbnail.cpp
-+++ b/src/declarativeimports/core/windowthumbnail.cpp
-@@ -584,6 +584,7 @@
- return;
- }
- xcb_composite_unredirect_window(c, m_winId, XCB_COMPOSITE_REDIRECT_AUTOMATIC);
-+ discardPixmap();
- if (m_damage == XCB_NONE) {
- return;
- }
-
diff --git a/kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch b/kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch
deleted file mode 100644
index 078dbfd..0000000
--- a/kde/patch/plasma-framework/plasma-framework_KDEBUG_359388.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Dan Vrátil <dvratil@kde.org>
-Date: Tue, 16 Feb 2016 16:59:32 +0000
-Subject: Fix IconItem not loading non-theme icons with name
-X-Git-Url: http://quickgit.kde.org/?p=plasma-framework.git&a=commitdiff&h=525bf2d377c21b41971a72d694a507bf2af0ada6
----
-Fix IconItem not loading non-theme icons with name
-
-Commit 5184ac introduced a small regression that caused IconItem
-to no longer load non-theme icons with name set, for instance icons
-coming from sni-qt, causing sni-qt apps to not show in systray.
-
-BUG: 359388
-FIXED-IN: 5.20
-REVIEW: 127091
----
-
-
---- a/src/declarativeimports/core/iconitem.cpp
-+++ b/src/declarativeimports/core/iconitem.cpp
-@@ -148,6 +148,10 @@
- //fail, use QIcon
- } else {
- m_icon = QIcon::fromTheme(sourceString);
-+ if (m_icon.isNull()) {
-+ // fallback for non-theme icons
-+ m_icon = source.value<QIcon>();
-+ }
- delete m_svgIcon;
- m_svgIcon = 0;
- m_imageIcon = QImage();
-
diff --git a/kde/patch/plasma-pa.patch b/kde/patch/plasma-pa.patch
deleted file mode 100644
index 2349f09..0000000
--- a/kde/patch/plasma-pa.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Port from gconf to gsettings (wait until post 5.13.4)
-# because PA 12 dropped support for gconf and this broke the advanced settings
-# in the PA audio configuration:
-#cat $CWD/patch/plasma-pa/plasma-pa_enable_gsettings.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch b/kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch
deleted file mode 100644
index ef212d5..0000000
--- a/kde/patch/plasma-pa/plasma-pa_enable_gsettings.patch
+++ /dev/null
@@ -1,583 +0,0 @@
-# https://phabricator.kde.org/D14147
-# Port from gconf to gsettings
-# Step 1 was to make gconf optional in 5.13.4
-# ----------------------------------
-
-diff --git a/CMakeLists.txt b/CMakeLists.txt
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -22,9 +22,6 @@
- include(FindPkgConfig)
- pkg_check_modules(GCONF gconf-2.0)
- pkg_check_modules(GOBJECT gobject-2.0)
--if (GCONF_FOUND AND GOBJECT_FOUND)
-- set(HAVE_GCONF TRUE)
--endif()
-
- find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS
- Core
-@@ -44,6 +41,21 @@
- find_package(PulseAudio 5.0.0 REQUIRED)
- find_package(Canberra REQUIRED)
- find_package(GLIB2 REQUIRED)
-+find_package(GIO)
-+
-+if(USE_GCONF AND USE_GSETTINGS)
-+ message(FATAL_ERROR "USE_GCONF and USE_GSETTINGS cannot be used at the same time")
-+endif()
-+
-+# if GSetting is available and user does not force GConf build use GSettings
-+if(GIO_FOUND AND GLIB2_FOUND AND NOT USE_GCONF)
-+ set(USE_GSETTINGS TRUE)
-+endif()
-+
-+# don't use GConf if not availabe
-+if (NOT GCONF_FOUND OR NOT GOBJECT_FOUND)
-+ set(USE_GCONF FALSE)
-+endif()
-
- configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
-
-diff --git a/cmake/FindGIO.cmake b/cmake/FindGIO.cmake
-new file mode 100644
---- /dev/null
-+++ b/cmake/FindGIO.cmake
-@@ -0,0 +1,72 @@
-+# - Try to find the GIO libraries
-+# Once done this will define
-+#
-+# GIO_FOUND - system has GIO
-+# GIO_INCLUDE_DIR - the GIO include directory
-+# GIO_LIBRARIES - GIO library
-+#
-+# Copyright (c) 2010 Dario Freddi <drf@kde.org>
-+#
-+# Redistribution and use is allowed according to the terms of the BSD license.
-+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-+
-+if(GIO_INCLUDE_DIR AND GIO_LIBRARIES)
-+ # Already in cache, be silent
-+ set(GIO_FIND_QUIETLY TRUE)
-+endif(GIO_INCLUDE_DIR AND GIO_LIBRARIES)
-+
-+if (NOT WIN32)
-+ include(UsePkgConfig)
-+ pkgconfig(gio-2.0 _LibGIOIncDir _LibGIOLinkDir _LibGIOLinkFlags _LibGIOCflags)
-+endif(NOT WIN32)
-+
-+MESSAGE(STATUS "gio include dir: ${_LibGIOIncDir}")
-+
-+# first try without default paths to respect PKG_CONFIG_PATH
-+
-+find_path(GIO_MAIN_INCLUDE_DIR glib.h
-+ PATH_SUFFIXES glib-2.0
-+ PATHS ${_LibGIOIncDir}
-+ NO_DEFAULT_PATH)
-+
-+find_path(GIO_MAIN_INCLUDE_DIR glib.h
-+ PATH_SUFFIXES glib-2.0
-+ PATHS ${_LibGIOIncDir} )
-+
-+MESSAGE(STATUS "found gio main include dir: ${GIO_MAIN_INCLUDE_DIR}")
-+
-+# search the glibconfig.h include dir under the same root where the library is found
-+find_library(GIO_LIBRARIES
-+ NAMES gio-2.0
-+ PATHS ${_LibGIOLinkDir}
-+ NO_DEFAULT_PATH)
-+
-+find_library(GIO_LIBRARIES
-+ NAMES gio-2.0
-+ PATHS ${_LibGIOLinkDir})
-+
-+
-+get_filename_component(GIOLibDir "${GIO_LIBRARIES}" PATH)
-+
-+find_path(GIO_INTERNAL_INCLUDE_DIR glibconfig.h
-+ PATH_SUFFIXES glib-2.0/include
-+ PATHS ${_LibGIOIncDir} "${GIOLibDir}" ${CMAKE_SYSTEM_LIBRARY_PATH}
-+ NO_DEFAULT_PATH)
-+
-+find_path(GIO_INTERNAL_INCLUDE_DIR glibconfig.h
-+ PATH_SUFFIXES glib-2.0/include
-+ PATHS ${_LibGIOIncDir} "${GIOLibDir}" ${CMAKE_SYSTEM_LIBRARY_PATH})
-+
-+set(GIO_INCLUDE_DIR "${GIO_MAIN_INCLUDE_DIR}")
-+
-+# not sure if this include dir is optional or required
-+# for now it is optional
-+if(GIO_INTERNAL_INCLUDE_DIR)
-+ set(GIO_INCLUDE_DIR ${GIO_INCLUDE_DIR} "${GIO_INTERNAL_INCLUDE_DIR}")
-+endif(GIO_INTERNAL_INCLUDE_DIR)
-+
-+include(FindPackageHandleStandardArgs)
-+find_package_handle_standard_args(GIO DEFAULT_MSG GIO_LIBRARIES GIO_MAIN_INCLUDE_DIR)
-+
-+mark_as_advanced(GIO_INCLUDE_DIR GIO_LIBRARIES)
-+
-diff --git a/config.h.cmake b/config.h.cmake
---- a/config.h.cmake
-+++ b/config.h.cmake
-@@ -1,3 +1,4 @@
- /* config.h. Generated by cmake from config.h.cmake */
-
--#cmakedefine01 HAVE_GCONF
-+#cmakedefine01 USE_GSETTINGS
-+#cmakedefine01 USE_GCONF
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -37,11 +37,16 @@
- set_property(SOURCE qml/dbus/osdService.xml APPEND PROPERTY CLASSNAME OsdServiceInterface)
- qt5_add_dbus_interface(dbus_SRCS qml/dbus/osdService.xml osdservice)
-
--if (HAVE_GCONF)
-+if (USE_GCONF)
- include_directories(${GCONF_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS})
- set(cpp_SRCS ${cpp_SRCS} gconfitem.cpp)
- endif()
-
-+if (USE_GSETTINGS)
-+ include_directories(${GIO_INCLUDE_DIRS} ${GOBJECT_INCLUDE_DIRS})
-+ set(cpp_SRCS ${cpp_SRCS} gsettingsitem.cpp)
-+endif()
-+
- add_library(plasma-volume-declarative SHARED ${dbus_SRCS} ${cpp_SRCS} ${qml_SRCS})
- target_link_libraries(plasma-volume-declarative
- Qt5::Core
-@@ -52,12 +57,18 @@
- ${PULSEAUDIO_LIBRARY}
- ${PULSEAUDIO_MAINLOOP_LIBRARY}
- ${CANBERRA_LIBRARIES}
-+ ${GOBJECT_LIBRARIES}
- )
-
--if (HAVE_GCONF)
-+if (USE_GCONF)
- target_link_libraries(plasma-volume-declarative
- ${GCONF_LDFLAGS}
-- ${GOBJECT_LDFLAGS}
-+ )
-+endif()
-+
-+if (USE_GSETTINGS)
-+ target_link_libraries(plasma-volume-declarative
-+ ${GIO_LIBRARIES}
- )
- endif()
-
-diff --git a/src/gsettingsitem.h b/src/gsettingsitem.h
-new file mode 100644
---- /dev/null
-+++ b/src/gsettingsitem.h
-@@ -0,0 +1,59 @@
-+/*
-+ * Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public License
-+ * version 2.1 as published by the Free Software Foundation.
-+ *
-+ * 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 St, Fifth Floor, Boston, MA
-+ * 02110-1301 USA
-+ *
-+ */
-+
-+#ifndef GSETTINGSITEM_H
-+#define GSETTINGSITEM_H
-+
-+#include <QVariant>
-+#include <QStringList>
-+#include <QObject>
-+
-+#include <gio/gio.h>
-+
-+class GSettingsItem : public QObject
-+{
-+ Q_OBJECT
-+
-+ public:
-+
-+ explicit GSettingsItem(const QString &key, QObject *parent = nullptr);
-+ virtual ~GSettingsItem() override;
-+
-+ QVariant value(const QString &key) const;
-+ void set(const QString &key, const QVariant &val);
-+
-+
-+Q_SIGNALS:
-+ void subtreeChanged();
-+
-+private:
-+ GSettings *m_settings;
-+
-+static void settingChanged(GSettings *settings, const gchar *key, gpointer data)
-+{
-+ Q_UNUSED(settings)
-+ Q_UNUSED(key)
-+
-+ GSettingsItem *self = static_cast<GSettingsItem *>(data);
-+ Q_EMIT self->subtreeChanged();
-+}
-+
-+};
-+
-+#endif // GCONFITEM_H
-diff --git a/src/gsettingsitem.cpp b/src/gsettingsitem.cpp
-new file mode 100644
---- /dev/null
-+++ b/src/gsettingsitem.cpp
-@@ -0,0 +1,93 @@
-+/*
-+ * Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public License
-+ * version 2.1 as published by the Free Software Foundation.
-+ *
-+ * 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 St, Fifth Floor, Boston, MA
-+ * 02110-1301 USA
-+ *
-+ */
-+
-+#include <QString>
-+#include <QVariant>
-+#include <QDebug>
-+
-+#include <gio/gio.h>
-+
-+#include "gsettingsitem.h"
-+#include "debug.h"
-+
-+QVariant GSettingsItem::value(const QString &key) const
-+{
-+ GVariant *gvalue = g_settings_get_value(m_settings, key.toLatin1().data());
-+
-+ QVariant toReturn;
-+
-+ switch (g_variant_classify(gvalue)) {
-+ case G_VARIANT_CLASS_BOOLEAN:
-+ toReturn = QVariant((bool)g_variant_get_boolean(gvalue));
-+ break;
-+ case G_VARIANT_CLASS_STRING:
-+ toReturn = QVariant(QString::fromUtf8(g_variant_get_string(gvalue, NULL)));
-+ break;
-+ default:
-+ qCDebug(PLASMAPA()) << "Unhandled variant type in value()";
-+ }
-+
-+ g_variant_unref(gvalue);
-+
-+ return toReturn;
-+}
-+
-+void GSettingsItem::set(const QString &key, const QVariant &val)
-+{
-+
-+ // It might be hard to detect the right GVariant type from
-+ // complext QVariant types such as string lists or more detailed
-+ // types such as integers (GVariant has different sizes),
-+ // therefore we get the current value for the key and convert
-+ // to QVariant using the GVariant type
-+ GVariant *oldValue = g_settings_get_value(m_settings, key.toLatin1().data());
-+ GVariant *newValue;
-+
-+ switch (g_variant_type_peek_string(g_variant_get_type(oldValue))[0]) {
-+ case G_VARIANT_CLASS_BOOLEAN:
-+ newValue = g_variant_new_boolean(val.toBool());
-+ break;
-+ case G_VARIANT_CLASS_STRING:
-+ newValue = g_variant_new_string(val.toString().toUtf8().constData());
-+ break;
-+ default:
-+ qCDebug(PLASMAPA()) << "Unhandled variant type in set()";
-+ }
-+
-+ if (newValue)
-+ g_settings_set_value(m_settings, key.toLatin1().data(), newValue);
-+
-+ g_variant_unref(oldValue);
-+}
-+
-+GSettingsItem::GSettingsItem(const QString &key, QObject *parent)
-+ : QObject (parent)
-+{
-+
-+ m_settings = g_settings_new_with_path("org.freedesktop.pulseaudio.module-group", key.toLatin1().data());
-+
-+ g_signal_connect(m_settings, "changed", G_CALLBACK(GSettingsItem::settingChanged), this);
-+}
-+
-+GSettingsItem::~GSettingsItem()
-+{
-+ g_settings_sync();
-+ if (m_settings)
-+ g_object_unref(m_settings);
-+}
-diff --git a/src/kcm/package/contents/ui/Advanced.qml b/src/kcm/package/contents/ui/Advanced.qml
---- a/src/kcm/package/contents/ui/Advanced.qml
-+++ b/src/kcm/package/contents/ui/Advanced.qml
-@@ -73,7 +73,7 @@
- text: i18n("Add virtual output device for simultaneous output on all local sound cards")
- checked: moduleManager.combineSinks
- onCheckedChanged: moduleManager.combineSinks = checked;
-- enabled: moduleManager.loadedModules.indexOf("module-gconf") != -1
-+ enabled: moduleManager.configModuleLoaded
- visible: moduleManager.settingsSupported
- }
-
-@@ -84,16 +84,16 @@
- text: i18n("Automatically switch all running streams when a new output becomes available")
- checked: moduleManager.switchOnConnect
- onCheckedChanged: moduleManager.switchOnConnect = checked;
-- enabled: moduleManager.loadedModules.indexOf("module-gconf") != -1
-+ enabled: moduleManager.configModuleLoaded
- visible: moduleManager.settingsSupported
- }
-
- Label {
- Layout.alignment: Qt.AlignHCenter
- enabled: false
- font.italic: true
-- text: i18n("Requires 'module-gconf' PulseAudio module")
-- visible: moduleManager.settingsSupported && moduleManager.loadedModules.indexOf("module-gconf") == -1
-+ text: i18n("Requires %1 PulseAudio module", moduleManager.configModuleName)
-+ visible: moduleManager.settingsSupported && !moduleManager.configModuleLoaded
- }
-
- Header {
-diff --git a/src/modulemanager.h b/src/modulemanager.h
---- a/src/modulemanager.h
-+++ b/src/modulemanager.h
-@@ -29,18 +29,18 @@
- // Properties need fully qualified classes even with pointers.
- #include "client.h"
-
--class GConfItem;
--
- namespace QPulseAudio
- {
--class GConfModule;
-+class ConfigModule;
-
- class ModuleManager : public QObject
- {
- Q_OBJECT
- Q_PROPERTY(bool settingsSupported READ settingsSupported CONSTANT)
- Q_PROPERTY(bool combineSinks READ combineSinks WRITE setCombineSinks NOTIFY combineSinksChanged)
- Q_PROPERTY(bool switchOnConnect READ switchOnConnect WRITE setSwitchOnConnect NOTIFY switchOnConnectChanged)
-+ Q_PROPERTY(bool configModuleLoaded READ configModuleLoaded NOTIFY loadedModulesChanged)
-+ Q_PROPERTY(QString configModuleName READ configModuleName CONSTANT)
- Q_PROPERTY(QStringList loadedModules READ loadedModules NOTIFY loadedModulesChanged)
- public:
- explicit ModuleManager(QObject *parent = nullptr);
-@@ -52,6 +52,8 @@
- bool switchOnConnect() const;
- void setSwitchOnConnect(bool switchOnConnect);
- QStringList loadedModules() const;
-+ bool configModuleLoaded() const;
-+ QString configModuleName() const;
-
- Q_SIGNALS:
- void combineSinksChanged();
-@@ -61,9 +63,9 @@
- private:
- void updateLoadedModules();
-
-- GConfModule *m_combineSinks;
-- GConfModule *m_switchOnConnect;
-- GConfModule *m_deviceManager;
-+ ConfigModule *m_combineSinks;
-+ ConfigModule *m_switchOnConnect;
-+ ConfigModule *m_deviceManager;
- QStringList m_loadedModules;
- };
-
-diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
---- a/src/modulemanager.cpp
-+++ b/src/modulemanager.cpp
-@@ -23,40 +23,54 @@
- #include "module.h"
- #include "../config.h"
-
--#if HAVE_GCONF
-+#if USE_GSETTINGS
-+#include "gsettingsitem.h"
-+
-+#define PA_SETTINGS_PATH_MODULES "/org/freedesktop/pulseaudio/module-groups"
-+#endif
-+
-+#if USE_GCONF
- #include "gconfitem.h"
--#define PA_GCONF_ROOT "/system/pulseaudio"
--#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
-+#define PA_SETTINGS_PATH_MODULES "/system/pulseaudio/modules"
- #endif
-
- #include <QTimer>
-
- namespace QPulseAudio
- {
-
--#if HAVE_GCONF
--class GConfModule : public GConfItem
-+#if USE_GCONF || USE_GSETTINGS
-+
-+#if USE_GSETTINGS
-+class ConfigModule : public GSettingsItem
-+#elif USE_GCONF
-+class ConfigModule : public GConfItem
-+#endif
- {
- public:
-- GConfModule(const QString &configName, const QString &moduleName, QObject *parent);
-+ ConfigModule(const QString &configName, const QString &moduleName, QObject *parent);
- bool isEnabled() const;
- void setEnabled(bool enabled, const QVariant &args=QVariant());
- private:
- QString m_moduleName;
- };
-
--GConfModule::GConfModule(const QString &configName, const QString &moduleName, QObject *parent) :
-- GConfItem(QStringLiteral(PA_GCONF_PATH_MODULES"/") + configName, parent),
-+ConfigModule::ConfigModule(const QString &configName, const QString &moduleName, QObject *parent) :
-+#if USE_GSETTINGS
-+ GSettingsItem(QStringLiteral(PA_SETTINGS_PATH_MODULES"/") + configName + QStringLiteral("/"), parent),
-+#elif USE_GCONF
-+ GConfItem(QStringLiteral(PA_SETTINGS_PATH_MODULES"/") + configName, parent),
-+#endif
- m_moduleName(moduleName)
- {
- }
-
--bool GConfModule::isEnabled() const
-+bool ConfigModule::isEnabled() const
- {
- return value(QStringLiteral("enabled")).toBool();
- }
-
--void GConfModule::setEnabled(bool enabled, const QVariant &args)
-+void ConfigModule::setEnabled(bool enabled, const QVariant &args)
- {
- set(QStringLiteral("locked"), true);
-
-@@ -69,20 +83,21 @@
- }
- set(QStringLiteral("locked"), false);
- }
--#endif
-
-+#endif
-
- ModuleManager::ModuleManager(QObject *parent) :
- QObject(parent)
- {
--#if HAVE_GCONF
-- m_combineSinks = new GConfModule(QStringLiteral("combine"), QStringLiteral("module-combine"), this);
-- m_switchOnConnect = new GConfModule(QStringLiteral("switch-on-connect"), QStringLiteral("module-switch-on-connect"), this);
-- m_deviceManager = new GConfModule(QStringLiteral("device-manager"), QStringLiteral("module-device-manager"), this);
-+#if USE_GCONF || USE_GSETTINGS
-
-- connect(m_combineSinks, &GConfItem::subtreeChanged, this, &ModuleManager::combineSinksChanged);
-- connect(m_switchOnConnect, &GConfItem::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
-- connect(m_deviceManager, &GConfItem::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
-+ m_combineSinks = new ConfigModule(QStringLiteral("combine"), QStringLiteral("module-combine"), this);
-+ m_switchOnConnect = new ConfigModule(QStringLiteral("switch-on-connect"), QStringLiteral("module-switch-on-connect"), this);
-+ m_deviceManager = new ConfigModule(QStringLiteral("device-manager"), QStringLiteral("module-device-manager"), this);
-+
-+ connect(m_combineSinks, &ConfigModule::subtreeChanged, this, &ModuleManager::combineSinksChanged);
-+ connect(m_switchOnConnect, &ConfigModule::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
-+ connect(m_deviceManager, &ConfigModule::subtreeChanged, this, &ModuleManager::switchOnConnectChanged);
- #endif
-
- QTimer *updateModulesTimer = new QTimer(this);
-@@ -100,48 +115,48 @@
-
- bool ModuleManager::settingsSupported() const
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- return true;
- #else
- return false;
- #endif
- }
-
- bool ModuleManager::combineSinks() const
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- return m_combineSinks->isEnabled();
- #else
- return false;
- #endif
- }
-
- void ModuleManager::setCombineSinks(bool combineSinks)
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- m_combineSinks->setEnabled(combineSinks);
- #else
-- Q_UNUSED(combineSinks)
-+ Q_UNUSED(combineSinks()
- #endif
- }
-
- bool ModuleManager::switchOnConnect() const
- {
-+#if USE_GCONF || USE_GSETTINGS
- //switch on connect and device-manager do the same task. Only one should be enabled
-
- //Note on the first run m_deviceManager will appear to be disabled even though it's actually running
- //because there is no gconf entry, however m_switchOnConnect will only exist if set by Plasma PA
- //hence only check this entry
--#if HAVE_GCONF
- return m_switchOnConnect->isEnabled() ;
- #else
- return false;
- #endif
- }
-
- void ModuleManager::setSwitchOnConnect(bool switchOnConnect)
- {
--#if HAVE_GCONF
-+#if USE_GCONF || USE_GSETTINGS
- m_deviceManager->setEnabled(!switchOnConnect);
- m_switchOnConnect->setEnabled(switchOnConnect);
- #else
-@@ -164,4 +179,19 @@
- Q_EMIT loadedModulesChanged();
- }
-
-+bool ModuleManager::configModuleLoaded() const
-+{
-+ return m_loadedModules.contains(configModuleName());
-+}
-+
-+QString ModuleManager::configModuleName() const
-+{
-+#if USE_GCONF
-+ return QStringLiteral("module-gconf");
-+#elif USE_GSETTINGS
-+ return QStringLiteral("module-gsettings");
-+#else
-+ return QString();
-+#endif
-+}
- }
-
diff --git a/kde/patch/plasma-wayland-protocols.patch b/kde/patch/plasma-wayland-protocols.patch
new file mode 100644
index 0000000..77ba5d6
--- /dev/null
+++ b/kde/patch/plasma-wayland-protocols.patch
@@ -0,0 +1,2 @@
+# Add the missing 'since="13"' to event name "window_with_uuid":
+cat $CWD/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch b/kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch
new file mode 100644
index 0000000..2450b1c
--- /dev/null
+++ b/kde/patch/plasma-wayland-protocols/plasma-wayland-protocols_add.missing.since.13.patch
@@ -0,0 +1,60 @@
+From 404ae95bc6c2e0a06f09bdcc81bedabcd5c720de Mon Sep 17 00:00:00 2001
+From: Aleix Pol <aleixpol@kde.org>
+Date: Mon, 27 Jul 2020 15:19:56 +0200
+Subject: [PATCH] plasma-window-management: add missing since
+
+---
+ src/protocols/plasma-window-management.xml | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/src/protocols/plasma-window-management.xml b/src/protocols/plasma-window-management.xml
+index e2fe6303..40e1252f 100644
+--- a/src/protocols/plasma-window-management.xml
++++ b/src/protocols/plasma-window-management.xml
+@@ -6,7 +6,7 @@
+ SPDX-License-Identifier: LGPL-2.1-or-later
+ ]]></copyright>
+
+- <interface name="org_kde_plasma_window_management" version="12">
++ <interface name="org_kde_plasma_window_management" version="13">
+ <description summary="application windows management">
+ This interface manages application windows.
+ It provides requests to show and hide the desktop and emits
+@@ -78,14 +78,6 @@
+ <arg name="id" type="uint" summary="Deprecated: internal window Id"/>
+ </event>
+
+- <event name="window_with_uuid">
+- <description summary="notify the client that a window was mapped">
+- This event will be sent immediately after a window is mapped.
+- </description>
+- <arg name="id" type="uint" summary="Deprecated: internal window Id"/>
+- <arg name="uuid" type="string" summary="internal window uuid"/>
+- </event>
+-
+ <event name="stacking_order_changed" since="11">
+ <description summary="notify the client when stacking order changed">
+ This event will be sent when stacking order changed and on bind
+@@ -99,9 +91,17 @@
+ </description>
+ <arg name="uuids" type="string" summary="internal windows id ;-separated"/>
+ </event>
++
++ <event name="window_with_uuid" since="13">
++ <description summary="notify the client that a window was mapped">
++ This event will be sent immediately after a window is mapped.
++ </description>
++ <arg name="id" type="uint" summary="Deprecated: internal window Id"/>
++ <arg name="uuid" type="string" summary="internal window uuid"/>
++ </event>
+ </interface>
+
+- <interface name="org_kde_plasma_window" version="12">
++ <interface name="org_kde_plasma_window" version="13">
+ <description summary="interface to control application windows">
+ Manages and control an application window.
+
+--
+GitLab
+
+
diff --git a/kde/patch/plasma-workspace.patch b/kde/patch/plasma-workspace.patch
deleted file mode 100644
index 8671c65..0000000
--- a/kde/patch/plasma-workspace.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add ConsoleKit2 support for screenlocker (ConsoleKit2 has implemented the
-# systemd-logind API for Lock, Unlock, PrepareForSleep and Inhibit.
-# This functionality has been incorporated into kscreenlocker-5.5.0.
-#cat $CWD/patch/plasma-workspace/plasma-workspace_consolekit2.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Apply commit that fixes compilation of 5.6.5:
-#cat $CWD/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Systray: Move all icon resolution to dataengine, preventing high CPU usage,
-# see https://phabricator.kde.org/D2986 :
-# Fixed in 5.9.0
-#cat $CWD/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix vulnerability (CVE-2018-6791 - KDEBUG_389815)
-# (already fixed in Plasma 5.12.0):
-#cat $CWD/patch/plasma-workspace/plasma-workspace_kdebug389815.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch b/kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch
deleted file mode 100644
index 4ad3c07..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace.systray_cpubug.patch
+++ /dev/null
@@ -1,152 +0,0 @@
-https://phabricator.kde.org/D2986
-Systray: Move all icon resolution to dataengine
-
-diff --git a/applets/systemtray/package/contents/ui/ConfigEntries.qml b/applets/systemtray/package/contents/ui/ConfigEntries.qml
---- a/applets/systemtray/package/contents/ui/ConfigEntries.qml
-+++ b/applets/systemtray/package/contents/ui/ConfigEntries.qml
-@@ -75,7 +75,7 @@
- "index": i,
- "taskId": item.Id,
- "name": item.Title,
-- "iconName": plasmoid.nativeInterface.resolveIcon(item.IconName, item.IconThemePath),
-+ "iconName": item.IconName,
- "icon": item.Icon
- });
- }
-diff --git a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml
---- a/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml
-+++ b/applets/systemtray/package/contents/ui/items/StatusNotifierItem.qml
-@@ -28,7 +28,7 @@
- text: Title
- mainText: ToolTipTitle != "" ? ToolTipTitle : Title
- subText: ToolTipSubTitle
-- icon: ToolTipIcon != "" ? ToolTipIcon : plasmoid.nativeInterface.resolveIcon(IconName != "" ? IconName : Icon, IconThemePath)
-+ icon: ToolTipIcon != "" ? ToolTipIcon : Icon ? Icon : IconName
- textFormat: Text.AutoText
- category: Category
-
-@@ -48,7 +48,7 @@
-
- PlasmaCore.IconItem {
- id: iconItem
-- source: plasmoid.nativeInterface.resolveIcon(IconName != "" ? IconName : Icon, IconThemePath)
-+ source: Icon ? Icon : IconName
- width: Math.min(parent.width, parent.height)
- height: width
- active: taskIcon.containsMouse
-diff --git a/applets/systemtray/systemtray.h b/applets/systemtray/systemtray.h
---- a/applets/systemtray/systemtray.h
-+++ b/applets/systemtray/systemtray.h
-@@ -60,12 +60,6 @@
-
- //Invokable utilities
- /**
-- * returns either a simple icon name or a custom path if the app is
-- * using a custom theme
-- */
-- Q_INVOKABLE QVariant resolveIcon(const QVariant &variant, const QString &iconThemePath);
--
-- /**
- * Given an AppletInterface pointer, shows a proper context menu for it
- */
- Q_INVOKABLE void showPlasmoidMenu(QQuickItem *appletInterface, int x, int y);
-diff --git a/applets/systemtray/systemtray.cpp b/applets/systemtray/systemtray.cpp
---- a/applets/systemtray/systemtray.cpp
-+++ b/applets/systemtray/systemtray.cpp
-@@ -37,37 +37,11 @@
- #include <Plasma/PluginLoader>
- #include <Plasma/ServiceJob>
-
--#include <KIconLoader>
--#include <KIconEngine>
- #include <KActionCollection>
- #include <KLocalizedString>
-
- #include <plasma_version.h>
-
--/*
-- * An app may also load icons from their own directories, so we need a new iconloader that takes this into account
-- * This is wrapped into a subclass of iconengine so the iconloader lifespan matches the icon object
-- */
--class AppIconEngine : public KIconEngine
--{
--public:
-- AppIconEngine(const QString &variant, const QString &path, const QString &appName);
-- ~AppIconEngine();
--private:
-- KIconLoader* m_loader;
--};
--
--AppIconEngine::AppIconEngine(const QString &variant, const QString &path, const QString &appName) :
-- KIconEngine(variant, m_loader = new KIconLoader(appName, QStringList()))
--{
-- m_loader->addAppDir(appName, path);
--}
--
--AppIconEngine::~AppIconEngine()
--{
-- delete m_loader;
--}
--
- class PlasmoidModel: public QStandardItemModel
- {
- public:
-@@ -169,32 +143,6 @@
- }
- }
-
--QVariant SystemTray::resolveIcon(const QVariant &variant, const QString &iconThemePath)
--{
-- if (variant.canConvert<QString>()) {
-- if (!iconThemePath.isEmpty()) {
-- const QString path = iconThemePath;
-- if (!path.isEmpty()) {
-- // FIXME: If last part of path is not "icons", this won't work!
-- auto tokens = path.splitRef('/', QString::SkipEmptyParts);
-- if (tokens.length() >= 3 && tokens.takeLast() == QLatin1String("icons")) {
-- const QString appName = tokens.takeLast().toString();
--
-- return QVariant(QIcon(new AppIconEngine(variant.toString(), path, appName)));
-- } else {
-- qCWarning(SYSTEM_TRAY) << "Wrong IconThemePath" << path << ": too short or does not end with 'icons'";
-- }
-- }
--
-- //return just the string hoping that IconItem will know how to interpret it anyways as either a normal icon or a SVG from the theme
-- return variant;
-- }
-- }
--
-- // Most importantly QIcons. Nothing to do for those.
-- return variant;
--}
--
- void SystemTray::showPlasmoidMenu(QQuickItem *appletInterface, int x, int y)
- {
- if (!appletInterface) {
-diff --git a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp
---- a/dataengines/statusnotifieritem/statusnotifieritemsource.cpp
-+++ b/dataengines/statusnotifieritem/statusnotifieritemsource.cpp
-@@ -240,14 +240,19 @@
- if (!m_customIconLoader) {
- m_customIconLoader = new KIconLoader(QString(), QStringList(), this);
- }
-+ // FIXME: If last part of path is not "icons", this won't work!
-+ QString appName;
-+ auto tokens = path.splitRef('/', QString::SkipEmptyParts);
-+ if (tokens.length() >= 3 && tokens.takeLast() == QLatin1String("icons"))
-+ appName = tokens.takeLast().toString();
-
- //icons may be either in the root directory of the passed path or in a appdir format
- //i.e hicolor/32x32/iconname.png
-
-- m_customIconLoader->reconfigure(QString(), QStringList(path));
-+ m_customIconLoader->reconfigure(appName, QStringList(path));
-
- //add app dir requires an app name, though this is completely unused in this context
-- m_customIconLoader->addAppDir(QStringLiteral("unused"), path);
-+ m_customIconLoader->addAppDir(appName.size() ? appName : QStringLiteral("unused"), path);
- }
- setData(QStringLiteral("IconThemePath"), path);
-
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch b/kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch
deleted file mode 100644
index 4f22b8e..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace_apply_767aa57.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Kai Uwe Broulik <kde@privat.broulik.de>
-Date: Mon, 13 Jun 2016 18:36:17 +0000
-Subject: [PanelView] Fix build...
-X-Git-Url: http://quickgit.kde.org/?p=plasma-workspace.git&a=commitdiff&h=767aa574400276b872aa0495f9af096784a8ed66
----
-[PanelView] Fix build...
-
-CCMAIL: notmart@gmail.com
----
-
-
---- a/shell/panelview.cpp
-+++ b/shell/panelview.cpp
-@@ -995,7 +995,7 @@
- {
- if (status == Plasma::Types::NeedsAttentionStatus) {
- showTemporarily();
-- } else if (status == Plasma::AcceptingInputStatus) {
-+ } else if (status == Plasma::Types::AcceptingInputStatus) {
- KWindowSystem::forceActiveWindow(winId());
- } else {
- restoreAutoHide();
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch b/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch
deleted file mode 100644
index 6131c90..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace_consolekit2.patch
+++ /dev/null
@@ -1,189 +0,0 @@
-From: Eric Koegel <eric.koegel@gmail.com>
-Date: Wed, 12 Aug 2015 08:33:39 +0000
-Subject: ConsoleKit2 support for screenlocker
-X-Git-Url: http://quickgit.kde.org/?p=plasma-workspace.git&a=commitdiff&h=72578284a1fda5f012cafcaccad6069fadbf9a25
----
-ConsoleKit2 support for screenlocker
-
-ConsoleKit2 has the same API as systemd-logind for Lock, Unlock,
-PrepareForSleep, and Inhibit. This patch adds the functionality
-for ConsoleKit2 while attempting to minimize code duplication.
-
-REVIEW: 124469
----
-
-
---- a/ksmserver/screenlocker/logind.cpp
-+++ b/ksmserver/screenlocker/logind.cpp
-@@ -25,13 +25,17 @@
- #include <QDebug>
- #include <QDBusConnection>
- #include <QDBusConnectionInterface>
--#include <QDBusPendingCallWatcher>
- #include <QDBusServiceWatcher>
-
- const static QString s_login1Service = QStringLiteral("org.freedesktop.login1");
- const static QString s_login1Path = QStringLiteral("/org/freedesktop/login1");
- const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.login1.Manager");
- const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session");
-+
-+const static QString s_consolekitService = QStringLiteral("org.freedesktop.ConsoleKit");
-+const static QString s_consolekitPath = QStringLiteral("/org/freedesktop/ConsoleKit/Manager");
-+const static QString s_consolekitManagerInterface = QStringLiteral("org.freedesktop.ConsoleKit.Manager");
-+const static QString s_consolekitSessionInterface = QStringLiteral("org.freedesktop.ConsoleKit.Session");
-
- LogindIntegration::LogindIntegration(const QDBusConnection &connection, QObject *parent)
- : QObject(parent)
-@@ -42,6 +46,10 @@
- this))
- , m_connected(false)
- , m_inhibitFileDescriptor()
-+ , m_service(nullptr)
-+ , m_path(nullptr)
-+ , m_managerInterface(nullptr)
-+ , m_sessionInterface(nullptr)
- {
- connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceRegistered, this, &LogindIntegration::logindServiceRegistered);
- connect(m_logindServiceWatcher, &QDBusServiceWatcher::serviceUnregistered, this,
-@@ -67,6 +75,11 @@
- }
- if (reply.value().contains(s_login1Service)) {
- logindServiceRegistered();
-+ // Don't register ck if we have logind
-+ return;
-+ }
-+ if (reply.value().contains(s_consolekitService)) {
-+ consolekitServiceRegistered();
- }
- }
- );
-@@ -89,6 +102,40 @@
- message.setArguments(QVariantList() << (quint32) QCoreApplication::applicationPid());
- QDBusPendingReply<QDBusObjectPath> session = m_bus.asyncCall(message);
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this);
-+
-+ m_service = &s_login1Service;
-+ m_path = &s_login1Path;
-+ m_managerInterface = &s_login1ManagerInterface;
-+ m_sessionInterface = &s_login1SessionInterface;
-+
-+ commonServiceRegistered(watcher);
-+}
-+
-+void LogindIntegration::consolekitServiceRegistered()
-+{
-+ // Don't try to register with ck if we have logind
-+ if (m_connected) {
-+ return;
-+ }
-+
-+ // get the current session
-+ QDBusMessage message = QDBusMessage::createMethodCall(s_consolekitService,
-+ s_consolekitPath,
-+ s_consolekitManagerInterface,
-+ QStringLiteral("GetCurrentSession"));
-+ QDBusPendingReply<QDBusObjectPath> session = m_bus.asyncCall(message);
-+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this);
-+
-+ m_service = &s_consolekitService;
-+ m_path = &s_consolekitPath;
-+ m_managerInterface = &s_consolekitManagerInterface;
-+ m_sessionInterface = &s_consolekitSessionInterface;
-+
-+ commonServiceRegistered(watcher);
-+}
-+
-+void LogindIntegration::commonServiceRegistered(QDBusPendingCallWatcher *watcher)
-+{
- connect(watcher, &QDBusPendingCallWatcher::finished, this,
- [this](QDBusPendingCallWatcher *self) {
- QDBusPendingReply<QDBusObjectPath> reply = *self;
-@@ -97,7 +144,7 @@
- return;
- }
- if (!reply.isValid()) {
-- qDebug() << "The session is not registered with logind" << reply.error().message();
-+ qDebug() << "The session is not registered: " << reply.error().message();
- return;
- }
- const QString sessionPath = reply.value().path();
-@@ -105,15 +152,15 @@
-
- // connections need to be done this way as the object exposes both method and signal
- // with name "Lock"/"Unlock". Qt is not able to automatically handle this.
-- m_bus.connect(s_login1Service,
-+ m_bus.connect(*m_service,
- sessionPath,
-- s_login1SessionInterface,
-+ *m_sessionInterface,
- QStringLiteral("Lock"),
- this,
- SIGNAL(requestLock()));
-- m_bus.connect(s_login1Service,
-+ m_bus.connect(*m_service,
- sessionPath,
-- s_login1SessionInterface,
-+ *m_sessionInterface,
- QStringLiteral("Unlock"),
- this,
- SIGNAL(requestUnlock()));
-@@ -123,9 +170,9 @@
- );
-
- // connect to manager object's signals we need
-- m_bus.connect(s_login1Service,
-- s_login1Path,
-- s_login1ManagerInterface,
-+ m_bus.connect(*m_service,
-+ *m_path,
-+ *m_managerInterface,
- QStringLiteral("PrepareForSleep"),
- this,
- SIGNAL(prepareForSleep(bool)));
-@@ -136,9 +183,14 @@
- if (m_inhibitFileDescriptor.isValid()) {
- return;
- }
-- QDBusMessage message = QDBusMessage::createMethodCall(s_login1Service,
-- s_login1Path,
-- s_login1ManagerInterface,
-+
-+ if (!m_connected) {
-+ return;
-+ }
-+
-+ QDBusMessage message = QDBusMessage::createMethodCall(*m_service,
-+ *m_path,
-+ *m_managerInterface,
- QStringLiteral("Inhibit"));
- message.setArguments(QVariantList({QStringLiteral("sleep"),
- i18n("Screen Locker"),
-
---- a/ksmserver/screenlocker/logind.h
-+++ b/ksmserver/screenlocker/logind.h
-@@ -23,6 +23,7 @@
- #include <QDBusConnection>
- #include <QDBusUnixFileDescriptor>
- #include <QObject>
-+#include <QDBusPendingCallWatcher>
-
- class QDBusServiceWatcher;
-
-@@ -59,10 +60,16 @@
- **/
- explicit LogindIntegration(const QDBusConnection &connection, QObject *parent = nullptr);
- void logindServiceRegistered();
-+ void consolekitServiceRegistered();
-+ void commonServiceRegistered(QDBusPendingCallWatcher *watcher);
- QDBusConnection m_bus;
- QDBusServiceWatcher *m_logindServiceWatcher;
- bool m_connected;
- QDBusUnixFileDescriptor m_inhibitFileDescriptor;
-+ const QString *m_service;
-+ const QString *m_path;
-+ const QString *m_managerInterface;
-+ const QString *m_sessionInterface;
- };
-
- #endif
-
diff --git a/kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch b/kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch
deleted file mode 100644
index e2f1e48..0000000
--- a/kde/patch/plasma-workspace/plasma-workspace_kdebug389815.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From f32002ce50edc3891f1fa41173132c820b917d57 Mon Sep 17 00:00:00 2001
-From: Marco Martin <notmart@gmail.com>
-Date: Mon, 5 Feb 2018 13:12:51 +0100
-Subject: Make sure device paths are quoted
-
-in the case a vfat removable device has $() or `` in its label,
-such as $(touch foo) the quoted command may get executed,
-leaving an attack vector. Use KMacroExpander::expandMacrosShellQuote
-to make sure everything is quoted and not interpreted as a command
-
-BUG:389815
----
- soliduiserver/deviceserviceaction.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/soliduiserver/deviceserviceaction.cpp b/soliduiserver/deviceserviceaction.cpp
-index f49c967..738b27c 100644
---- a/soliduiserver/deviceserviceaction.cpp
-+++ b/soliduiserver/deviceserviceaction.cpp
-@@ -158,7 +158,7 @@ void DelayedExecutor::delayedExecute(const QString &udi)
-
- QString exec = m_service.exec();
- MacroExpander mx(device);
-- mx.expandMacros(exec);
-+ mx.expandMacrosShellQuote(exec);
-
- KRun::runCommand(exec, QString(), m_service.icon(), 0);
- deleteLater();
---
-cgit v0.11.2
-
-
diff --git a/kde/patch/plasma5-nm.patch b/kde/patch/plasma5-nm.patch
deleted file mode 100644
index deb03e5..0000000
--- a/kde/patch/plasma5-nm.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-# Patches that address reported bugs in plasma-nm 0.9.3.1:
-#cat $CWD/patch/plasma-nm/plasma-nm-fixes.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# The plasma-nm-5.2.2 needs a patch to work with the new modemmanager-qt in
-# frameworks 5.9.0. This patch is no longer needed for plasma-nm-5.3.0:
-#cat $CWD/patch/plasma-nm/plasma-nm_modemmanager-qt_api.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix compilation against NetworkManager 1.0.6:
-#cat $CWD/patch/plasma-nm/plasma-nm_networkmanager.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Password is asked twice when connecting to a new WiFi network,
-# KDEBUG 423093; fixed in Frameworks 5.72 and Plasma 5.20.
-cat $CWD/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/plasma5-nm/plasma-nm-fixes.patch b/kde/patch/plasma5-nm/plasma-nm-fixes.patch
deleted file mode 100644
index d98448d..0000000
--- a/kde/patch/plasma5-nm/plasma-nm-fixes.patch
+++ /dev/null
@@ -1,322 +0,0 @@
-diff --git a/applet/declarative/contents/ui/main.qml b/applet/declarative/contents/ui/main.qml
-index 8ea88cc..aa81707 100644
---- a/applet/declarative/contents/ui/main.qml
-+++ b/applet/declarative/contents/ui/main.qml
-@@ -19,6 +19,7 @@
- */
-
- import QtQuick 1.1
-+import org.kde.plasma.extras 0.1 as PlasmaExtras
- import org.kde.plasma.components 0.1 as PlasmaComponents
- import org.kde.plasma.core 0.1 as PlasmaCore
- import org.kde.networkmanagement 0.1 as PlasmaNM
-@@ -77,16 +78,7 @@ Item {
- anchors.fill: parent
- }
-
-- ListView {
-- id: connectionView;
--
-- property bool expandedItem: false;
-- property string previouslyExpandedItem: "";
--
-- property bool activeExpanded: true;
-- property bool previousExpanded: true;
-- property bool unknownExpanded: true;
--
-+ PlasmaExtras.ScrollArea {
- anchors {
- left: parent.left;
- right: parent.right;
-@@ -95,50 +87,64 @@ Item {
- topMargin: padding.margins.top;
- bottomMargin: padding.margins.bottom
- }
-- clip: true
-- model: connectionSortModel;
-- currentIndex: -1;
-- interactive: true;
-- boundsBehavior: Flickable.StopAtBounds;
-- section.property: "itemSection";
-- section.delegate: SectionHeader {
-- onHideSection: {
-- if (section == i18n("Active connections")) {
-- connectionView.activeExpanded = false;
-- } else if (section == i18n("Previous connections")) {
-- connectionView.previousExpanded = false;
-- } else {
-- connectionView.unknownExpanded = false;
-+
-+ ListView {
-+ id: connectionView;
-+
-+ property bool expandedItem: false;
-+ property string previouslyExpandedItem: "";
-+
-+ property bool activeExpanded: true;
-+ property bool previousExpanded: true;
-+ property bool unknownExpanded: true;
-+
-+ anchors.fill: parent;
-+
-+ clip: true
-+ model: connectionSortModel;
-+ currentIndex: -1;
-+ interactive: true;
-+ boundsBehavior: Flickable.StopAtBounds;
-+ section.property: "itemSection";
-+ section.delegate: SectionHeader {
-+ onHideSection: {
-+ if (section == i18n("Active connections")) {
-+ connectionView.activeExpanded = false;
-+ } else if (section == i18n("Previous connections")) {
-+ connectionView.previousExpanded = false;
-+ } else {
-+ connectionView.unknownExpanded = false;
-+ }
- }
-- }
-
-- onShowSection: {
-- if (section == i18n("Active connections")) {
-- connectionView.activeExpanded = true;
-- } else if (section == i18n("Previous connections")) {
-- connectionView.previousExpanded = true;
-- } else {
-- connectionView.unknownExpanded = true;
-+ onShowSection: {
-+ if (section == i18n("Active connections")) {
-+ connectionView.activeExpanded = true;
-+ } else if (section == i18n("Previous connections")) {
-+ connectionView.previousExpanded = true;
-+ } else {
-+ connectionView.unknownExpanded = true;
-+ }
- }
- }
-- }
-
-- delegate: ConnectionItem {
-- expanded: connectionView.expandedItem && connectionView.previouslyExpandedItem == itemUni;
-- onItemExpanded: {
-- if (itemExpanded) {
-- connectionView.expandedItem = true;
-- connectionView.previouslyExpandedItem = itemUni;;
-- connectionView.currentIndex = index;
-- } else {
-- connectionView.expandedItem = false;
-- connectionView.previouslyExpandedItem = "";
-+ delegate: ConnectionItem {
-+ expanded: connectionView.expandedItem && connectionView.previouslyExpandedItem == itemUni;
-+ onItemExpanded: {
-+ if (itemExpanded) {
-+ connectionView.expandedItem = true;
-+ connectionView.previouslyExpandedItem = itemUni;;
-+ connectionView.currentIndex = index;
-+ } else {
-+ connectionView.expandedItem = false;
-+ connectionView.previouslyExpandedItem = "";
-+ }
- }
-- }
-
-- ListView.onRemove: {
-- if (ListView.isCurrentItem) {
-- connectionView.previouslyExpandedItem = "";
-+ ListView.onRemove: {
-+ if (ListView.isCurrentItem) {
-+ connectionView.previouslyExpandedItem = "";
-+ }
- }
- }
- }
-diff --git a/declarative-plugins/applet/connectionicon.cpp b/declarative-plugins/applet/connectionicon.cpp
-index c3f8540..76bdca0 100644
---- a/declarative-plugins/applet/connectionicon.cpp
-+++ b/declarative-plugins/applet/connectionicon.cpp
-@@ -166,12 +166,24 @@ void ConnectionIcon::setIcons()
-
- foreach (const NetworkManager::ActiveConnection::Ptr & active, actives) {
- if (((active->default4() || active->default6()) && active->state() == NetworkManager::ActiveConnection::Activated) || !defaultRouteExists) {
-+ NetworkManager::ActiveConnection::Ptr activeConnection;
-+ if (active->vpn()) {
-+ NetworkManager::ActiveConnection::Ptr activeTmp;
-+ activeTmp = NetworkManager::findActiveConnection(active->specificObject());
-+ if (activeTmp) {
-+ activeConnection = activeTmp;
-+ }
-
-- if (active->vpn() || active->devices().isEmpty()) {
-+ vpnFound = true;
-+ NMAppletDebug() << "Emit signal setHoverIcon(object-locked)";
-+ Q_EMIT setHoverIcon("object-locked");
-+ } else {
-+ activeConnection = active;
-+ }
-+ if (activeConnection->devices().isEmpty()) {
- continue;
- }
--
-- NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(active->devices().first());
-+ NetworkManager::Device::Ptr device = NetworkManager::findNetworkInterface(activeConnection->devices().first());
- if (device) {
- NetworkManager::Device::Type type = device->type();
-
-@@ -184,7 +196,7 @@ void ConnectionIcon::setIcons()
- setWirelessIconForSignalStrength(100);
- connectionFound = true;
- } else {
-- NetworkManager::AccessPoint::Ptr ap = wifiDevice->findAccessPoint(active->specificObject());
-+ NetworkManager::AccessPoint::Ptr ap = wifiDevice->findAccessPoint(activeConnection->specificObject());
- if (ap) {
- setWirelessIcon(device, ap->ssid());
- connectionFound = true;
-@@ -222,9 +234,7 @@ void ConnectionIcon::setIcons()
- }
- }
- }
-- }
--
-- if (active->vpn() && active->state() == NetworkManager::ActiveConnection::Activated) {
-+ } else if (active->vpn() && active->state() == NetworkManager::ActiveConnection::Activated) {
- vpnFound = true;
- NMAppletDebug() << "Emit signal setHoverIcon(object-locked)";
- Q_EMIT setHoverIcon("object-locked");
-diff --git a/declarative-plugins/applet/networkstatus.cpp b/declarative-plugins/applet/networkstatus.cpp
-index d63066d..8149da9 100644
---- a/declarative-plugins/applet/networkstatus.cpp
-+++ b/declarative-plugins/applet/networkstatus.cpp
-@@ -129,8 +129,8 @@ void NetworkStatus::changeTooltip()
- }
-
- QString tooltip = "<qt>";
-- QString format = "<b>%1 - %2</b><br>%3<br><br>";
-- QString formatDefault = "<b>%1 - %2</b><br><b>%3</b><br><br>";
-+ const QString format = "<b>%1 - %2</b><br>%3<br><br>";
-+ const QString formatDefault = "<b>%1 - %2</b><br><b>%3</b><br><br>";
-
- foreach (const NetworkManager::ActiveConnection::Ptr & active, NetworkManager::activeConnections()) {
- if (!active->devices().isEmpty()) {
-@@ -145,7 +145,6 @@ void NetworkStatus::changeTooltip()
- } else {
- devName = device->ipInterfaceName();
- }
--// conType = NetworkManager::ConnectionSettings::typeAsString(active->connection()->settings()->connectionType());
- if (active->vpn()) {
- conType = i18n("VPN Connection");
- } else {
-diff --git a/declarative-plugins/model/model.cpp b/declarative-plugins/model/model.cpp
-index 1b3f4c3..bb88362 100644
---- a/declarative-plugins/model/model.cpp
-+++ b/declarative-plugins/model/model.cpp
-@@ -230,7 +230,7 @@ void Model::addConnection(const QString& connection, const QString& device)
- {
- NetworkManager::Connection::Ptr con = NetworkManager::findConnection(connection);
-
-- if (con->settings()->isSlave()) {
-+ if (con->settings()->isSlave() || con->name().isEmpty() || con->uuid().isEmpty()) {
- return;
- }
-
-@@ -395,7 +395,11 @@ void Model::removeWirelessNetwork(const QString& ssid, const QString& device)
- if (wirelessDevice) {
- accessPoint = wirelessDevice->findAccessPoint(item->specificPath());
- }
-- if (accessPoint && accessPoint->mode() == NetworkManager::AccessPoint::Adhoc &&
-+
-+ // When accesspoint in ad-hoc mode dissapears, we should remove the item only when there is no connection. Similar case is when
-+ // a wireless device is in AP mode, but in this case there could be only one visible AP and this should always be associated with some connection.
-+ if (accessPoint && ((accessPoint->mode() == NetworkManager::AccessPoint::Adhoc && !item->connectionPath().isEmpty()) ||
-+ wirelessDevice->mode() == NetworkManager::WirelessDevice::ApMode) &&
- NetworkManager::isWirelessEnabled() && NetworkManager::isWirelessHardwareEnabled()) {
- item->setWirelessNetwork(QString());
- if (updateItem(item)) {
-diff --git a/declarative-plugins/model/modelitem.cpp b/declarative-plugins/model/modelitem.cpp
-index 9a5931f..58d5c42 100644
---- a/declarative-plugins/model/modelitem.cpp
-+++ b/declarative-plugins/model/modelitem.cpp
-@@ -151,6 +151,17 @@ QString ModelItem::icon() const
- break;
- case NetworkManager::ConnectionSettings::Wireless:
- if (m_signal == 0 ) {
-+ if (!m_connectionPath.isEmpty()) {
-+ NetworkManager::Connection::Ptr con = NetworkManager::findConnection(m_connectionPath);
-+ if (con) {
-+ NetworkManager::WirelessSetting::Ptr wirelessSetting;
-+ wirelessSetting = con->settings()->setting(NetworkManager::Setting::Wireless).dynamicCast<NetworkManager::WirelessSetting>();
-+ if (wirelessSetting && (wirelessSetting->mode() == NetworkManager::WirelessSetting::Adhoc ||
-+ wirelessSetting->mode() == NetworkManager::WirelessSetting::Ap)) {
-+ return "network-wireless-100";
-+ }
-+ }
-+ }
- return "network-wireless-00";
- } else if (m_signal < 20) {
- return "network-wireless-20";
-diff --git a/kded/bluetoothmonitor.cpp b/kded/bluetoothmonitor.cpp
-index 2221d09..5d0218b 100644
---- a/kded/bluetoothmonitor.cpp
-+++ b/kded/bluetoothmonitor.cpp
-@@ -220,6 +220,7 @@ void BluetoothMonitor::init()
-
- mDunDevice = reply.value();
- }
-+
- #if WITH_MODEMMANAGER_SUPPORT
- void BluetoothMonitor::modemAdded(const QString &udi)
- {
-diff --git a/lib/editor/bridgewidget.cpp b/lib/editor/bridgewidget.cpp
-index 8815eb2..95344c4 100644
---- a/lib/editor/bridgewidget.cpp
-+++ b/lib/editor/bridgewidget.cpp
-@@ -216,5 +216,5 @@ void BridgeWidget::populateBridges()
-
- bool BridgeWidget::isValid() const
- {
-- return !m_ui->ifaceName->text().isEmpty() && m_ui->bridges->count() > 0;
-+ return !m_ui->ifaceName->text().isEmpty();
- }
-diff --git a/vpn/vpnc/vpnc.cpp b/vpn/vpnc/vpnc.cpp
-index d4a511d..645249d 100644
---- a/vpn/vpnc/vpnc.cpp
-+++ b/vpn/vpnc/vpnc.cpp
-@@ -145,7 +145,6 @@ NMVariantMapMap VpncUiPlugin::importConnectionSettings(const QString &fileName)
- KConfigGroup cg(config, "main"); // Keys&Values are stored under [main]
- if (cg.exists()) {
- // Setup cisco-decrypt binary to decrypt the passwords
-- QStringList decrArgs;
- const QString ciscoDecryptBinary = KStandardDirs::findExe("cisco-decrypt", QString::fromLocal8Bit(qgetenv("PATH")) + ":/usr/lib/vpnc");
- if (ciscoDecryptBinary.isEmpty()) {
- mErrorMessage = i18n("Needed executable cisco-decrypt could not be found.");
-@@ -174,11 +173,11 @@ NMVariantMapMap VpncUiPlugin::importConnectionSettings(const QString &fileName)
- }
- else if (!decrPlugin->readStringKeyValue(cg,"enc_UserPassword").isEmpty() && !ciscoDecryptBinary.isEmpty()) {
- // Decrypt the password and insert into map
-- decrArgs.clear();
-- decrArgs << decrPlugin->readStringKeyValue(cg,"enc_UserPassword");
-- decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary, decrArgs);
-+ decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary);
- decrPlugin->ciscoDecrypt->start();
-- if (decrPlugin->ciscoDecrypt->waitForStarted() && decrPlugin->ciscoDecrypt->waitForFinished()) {
-+ decrPlugin->ciscoDecrypt->waitForStarted();
-+ decrPlugin->ciscoDecrypt->write(decrPlugin->readStringKeyValue(cg,"enc_UserPassword").toUtf8());
-+ if (decrPlugin->ciscoDecrypt->waitForFinished()) {
- secretData.insert(NM_VPNC_KEY_XAUTH_PASSWORD, decrPlugin->decryptedPasswd);
- }
- }
-@@ -203,11 +202,11 @@ NMVariantMapMap VpncUiPlugin::importConnectionSettings(const QString &fileName)
- }
- else if (!decrPlugin->readStringKeyValue(cg,"enc_GroupPwd").isEmpty() && !ciscoDecryptBinary.isEmpty()) {
- //Decrypt the password and insert into map
-- decrArgs.clear();
-- decrArgs << decrPlugin->readStringKeyValue(cg,"enc_GroupPwd");
-- decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary, decrArgs);
-+ decrPlugin->ciscoDecrypt->setProgram(ciscoDecryptBinary);
- decrPlugin->ciscoDecrypt->start();
-- if (decrPlugin->ciscoDecrypt->waitForStarted() && decrPlugin->ciscoDecrypt->waitForFinished()) {
-+ decrPlugin->ciscoDecrypt->waitForStarted();
-+ decrPlugin->ciscoDecrypt->write(decrPlugin->readStringKeyValue(cg,"enc_GroupPwd").toUtf8());
-+ if (decrPlugin->ciscoDecrypt->waitForFinished()) {
- secretData.insert(NM_VPNC_KEY_SECRET, decrPlugin->decryptedPasswd);
- data.insert(NM_VPNC_KEY_SECRET"-flags", QString::number(NetworkManager::Setting::AgentOwned));
- }
diff --git a/kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch b/kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch
deleted file mode 100644
index 4c59f4c..0000000
--- a/kde/patch/plasma5-nm/plasma-nm_modemmanager-qt_api.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From: Jan Grulich <jgrulich@redhat.com>
-Date: Tue, 31 Mar 2015 12:37:16 +0000
-Subject: Adapt to modemmanager-qt API changes
-X-Git-Url: http://quickgit.kde.org/?p=plasma-nm.git&a=commitdiff&h=4d72cb7966edda33bc72c77fc2a126844fc1f134
----
-Adapt to modemmanager-qt API changes
----
-
-
---- a/libs/models/networkmodel.cpp
-+++ b/libs/models/networkmodel.cpp
-@@ -246,10 +246,10 @@
- if (modem->hasInterface(ModemManager::ModemDevice::ModemInterface)) {
- ModemManager::Modem::Ptr modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
- if (modemNetwork) {
-- connect(modemNetwork.data(), SIGNAL(signalQualityChanged(uint)),
-- SLOT(gsmNetworkSignalQualityChanged(uint)), Qt::UniqueConnection);
-- connect(modemNetwork.data(), SIGNAL(accessTechnologyChanged(ModemManager::Modem::AccessTechnologies)),
-- SLOT(gsmNetworkAccessTechnologyChanged(ModemManager::Modem::AccessTechnologies)), Qt::UniqueConnection);
-+ connect(modemNetwork.data(), SIGNAL(signalQualityChanged(ModemManager::SignalQualityPair)),
-+ SLOT(gsmNetworkSignalQualityChanged(ModemManager::SignalQualityPair)), Qt::UniqueConnection);
-+ connect(modemNetwork.data(), SIGNAL(accessTechnologiesChanged(QFlags<MMModemAccessTechnology>)),
-+ SLOT(gsmNetworkAccessTechnologiesChanged(QFlags<MMModemAccessTechnology>)), Qt::UniqueConnection);
- connect(modemNetwork.data(), SIGNAL(currentModesChanged()),
- SLOT(gsmNetworkCurrentModesChanged()), Qt::UniqueConnection);
- }
-@@ -847,9 +847,9 @@
- }
-
- #if WITH_MODEMMANAGER_SUPPORT
--void NetworkModel::gsmNetworkAccessTechnologyChanged(ModemManager::Modem::AccessTechnologies technology)
--{
-- Q_UNUSED(technology);
-+void NetworkModel::gsmNetworkAccessTechnologiesChanged(QFlags<MMModemAccessTechnology> accessTechnologies)
-+{
-+ Q_UNUSED(accessTechnologies);
- ModemManager::Modem * gsmNetwork = qobject_cast<ModemManager::Modem*>(sender());
- if (gsmNetwork) {
- Q_FOREACH (const NetworkManager::Device::Ptr & dev, NetworkManager::networkInterfaces()) {
-@@ -893,7 +893,7 @@
- }
- }
-
--void NetworkModel::gsmNetworkSignalQualityChanged(uint signal)
-+void NetworkModel::gsmNetworkSignalQualityChanged(const ModemManager::SignalQualityPair &signalQuality)
- {
- ModemManager::Modem * gsmNetwork = qobject_cast<ModemManager::Modem*>(sender());
- if (gsmNetwork) {
-@@ -905,7 +905,7 @@
- ModemManager::Modem::Ptr modemNetwork = modem->interface(ModemManager::ModemDevice::ModemInterface).objectCast<ModemManager::Modem>();
- if (modemNetwork && modemNetwork->device() == gsmNetwork->device()) {
- Q_FOREACH (NetworkModelItem * item, m_list.returnItems(NetworkItemsList::Device, dev->uni())) {
-- item->setSignal(signal);
-+ item->setSignal(signalQuality.signal);
- updateItem(item);
- }
- }
-
---- a/libs/models/networkmodel.h
-+++ b/libs/models/networkmodel.h
-@@ -94,9 +94,9 @@
- void deviceRemoved(const QString& device);
- void deviceStateChanged(NetworkManager::Device::State state, NetworkManager::Device::State oldState, NetworkManager::Device::StateChangeReason reason);
- #if WITH_MODEMMANAGER_SUPPORT
-- void gsmNetworkAccessTechnologyChanged(ModemManager::Modem::AccessTechnologies technology);
-+ void gsmNetworkAccessTechnologiesChanged(QFlags<MMModemAccessTechnology> accessTechnologies);
- void gsmNetworkCurrentModesChanged();
-- void gsmNetworkSignalQualityChanged(uint signal);
-+ void gsmNetworkSignalQualityChanged(const ModemManager::SignalQualityPair &signalQuality);
- #endif
- void ipConfigChanged();
- void ipInterfaceChanged();
-
diff --git a/kde/patch/plasma5-nm/plasma-nm_networkmanager.patch b/kde/patch/plasma5-nm/plasma-nm_networkmanager.patch
deleted file mode 100644
index e635954..0000000
--- a/kde/patch/plasma5-nm/plasma-nm_networkmanager.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-Patch taken from gentoo:
-https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=bd7dad9ddb35e1e3e68ad43176c5e48fbb25338d
-
-Fixes build with networkmanager-1.0.6.
-
-Triggered by http://cgit.freedesktop.org/NetworkManager/NetworkManager/commit/?h=nm-1-0&id=6f616d4c4b04d5478f60d0311317bc84c5459ea4.
-
---- CMakeLists.txt
-+++ CMakeLists.txt
-@@ -49,6 +49,7 @@
- ${CMAKE_CURRENT_SOURCE_DIR}/libs
- ${CMAKE_CURRENT_SOURCE_DIR}/libs/editor/
- ${NETWORKMANAGER_INCLUDE_DIRS}
-+ ${NM-UTIL_INCLUDE_DIRS}
- ${NETWORKMANAGERQT_INCLUDE_DIRS}
- ${KDE4_INCLUDES})
-
diff --git a/kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch b/kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch
deleted file mode 100644
index 53ea613..0000000
--- a/kde/patch/plasma5-nm/plasma5-nm_KDEBUG_423093.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 271332cfc19ede398854113d037abfb35503179f Mon Sep 17 00:00:00 2001
-From: Nate Graham <nate@kde.org>
-Date: Thu, 18 Jun 2020 15:34:40 +0000
-Subject: [PATCH] [WIP] [applet] Fix inline password field component not
- working properly
-
-BUG: 423093
-FIXED-IN: 5.20
----
- applet/contents/ui/ConnectionItem.qml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/applet/contents/ui/ConnectionItem.qml b/applet/contents/ui/ConnectionItem.qml
-index 98240928..06c7ab25 100644
---- a/applet/contents/ui/ConnectionItem.qml
-+++ b/applet/contents/ui/ConnectionItem.qml
-@@ -231,8 +231,8 @@ PlasmaExtras.ExpandableListItem {
- if (!predictableWirelessPassword && !Uuid) {
- handler.addAndActivateConnection(DevicePath, SpecificPath)
- } else if (connectionItem.customExpandedViewContent == passwordDialogComponent) {
-- if (passwordDialogComponent.password != "") {
-- handler.addAndActivateConnection(DevicePath, SpecificPath, passwordDialogComponent.password)
-+ if (connectionItem.customExpandedViewContentItem.password != "") {
-+ handler.addAndActivateConnection(DevicePath, SpecificPath, connectionItem.customExpandedViewContentItem.password)
- connectionItem.customExpandedViewContent = detailsComponent
- connectionItem.collapse()
- } else {
---
-2.27.0
-
-
diff --git a/kde/patch/powerdevil.patch b/kde/patch/powerdevil.patch
deleted file mode 100644
index b7e2bae..0000000
--- a/kde/patch/powerdevil.patch
+++ /dev/null
@@ -1,4 +0,0 @@
-# PowerDevil fails to setup power settings on a fresh install.
-# Fixed in 5.12.5.
-#cat $CWD/patch/powerdevil/powerdevil-5.12.4_firstrun.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch b/kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch
deleted file mode 100644
index 165e67b..0000000
--- a/kde/patch/powerdevil/powerdevil-5.12.4_firstrun.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From be91abe7fc8cc731b57bec4cf2c004c07b0fd79b Mon Sep 17 00:00:00 2001
-From: Kai Uwe Broulik <kde@privat.broulik.de>
-Date: Wed, 25 Apr 2018 10:56:16 +0200
-Subject: Ignore "migration" key for determining whether the config is empty
-
-Otherwise we would never generate the default power management configuration
-leading to it not suspending on lid close, not handling power buttons etc etc
-
-CHANGELOG: Fixed bug that caused power management system to not work on a fresh install
-
-Reviewed-By: David Edmundson
-
-BUG: 391782
-FIXED-IN: 5.12.5
----
- daemon/powerdevilcore.cpp | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/daemon/powerdevilcore.cpp b/daemon/powerdevilcore.cpp
-index 2cf936e..53b7521 100644
---- a/daemon/powerdevilcore.cpp
-+++ b/daemon/powerdevilcore.cpp
-@@ -108,9 +108,15 @@ void Core::onBackendReady()
-
- m_profilesConfig = KSharedConfig::openConfig("powermanagementprofilesrc", KConfig::CascadeConfig);
-
-+ QStringList groups = m_profilesConfig->groupList();
-+ // the "migration" key is for shortcuts migration in added by migratePre512KeyboardShortcuts
-+ // and as such our configuration would never be considered empty, ignore it!
-+ groups.removeOne(QStringLiteral("migration"));
-+
- // Is it brand new?
-- if (m_profilesConfig->groupList().isEmpty()) {
-+ if (groups.isEmpty()) {
- // Generate defaults
-+ qCDebug(POWERDEVIL) << "Generating a default configuration";
- bool toRam = m_backend->supportedSuspendMethods() & PowerDevil::BackendInterface::ToRam;
- bool toDisk = m_backend->supportedSuspendMethods() & PowerDevil::BackendInterface::ToDisk;
- ProfileGenerator::generateProfiles(toRam, toDisk);
---
-cgit v0.11.2
-
diff --git a/kde/patch/pykde4.patch b/kde/patch/pykde4.patch
index 48073d4..d5eb044 100644
--- a/kde/patch/pykde4.patch
+++ b/kde/patch/pykde4.patch
@@ -2,4 +2,3 @@
cat $CWD/patch/pykde4/0001-use-LIB_PYTHON-realpath.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
cat $CWD/patch/pykde4/0002-Add-some-missing-link-libraries.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
cat $CWD/patch/pykde4/0003-Fix-build-with-sip-4.19.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/qqc2-desktop-style.patch b/kde/patch/qqc2-desktop-style.patch
deleted file mode 100644
index 36e0bb1..0000000
--- a/kde/patch/qqc2-desktop-style.patch
+++ /dev/null
@@ -1,5 +0,0 @@
-# Use scrollbar height as bottom padding, not width.
-# Should be fixed post qqc2-desktop-style 5.67.0):
-#cat $CWD/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-
diff --git a/kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch b/kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch
deleted file mode 100644
index 9f577e2..0000000
--- a/kde/patch/qqc2-desktop-style/qqc2-desktop-style_scrollbar.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 6995b4ae81a2f3ca3c24d2fa6d1560bfe0898737 Mon Sep 17 00:00:00 2001
-From: Arjen Hiemstra <ahiemstra@heimr.nl>
-Date: Mon, 10 Feb 2020 11:47:00 +0100
-Subject: ScrollView: Use scrollbar height as bottom padding, not width
-
-Summary:
-Apparently I accidentally used the bottom scrollbar width instead of
-height. Oops.
-
-Test Plan: ScrollView with horizontal scrollbar no longer hides content
-
-Reviewers: #plasma, davidedmundson
-
-Reviewed By: #plasma, davidedmundson
-
-Subscribers: plasma-devel
-
-Tags: #plasma
-
-Differential Revision: https://phabricator.kde.org/D27280
----
- org.kde.desktop/ScrollView.qml | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/org.kde.desktop/ScrollView.qml b/org.kde.desktop/ScrollView.qml
-index 4bea5c7..38bc8ed 100644
---- a/org.kde.desktop/ScrollView.qml
-+++ b/org.kde.desktop/ScrollView.qml
-@@ -45,7 +45,7 @@ T.ScrollView {
- rightPadding: (internal.backgroundVisible && background.hasOwnProperty("rightPadding") ? background.rightPadding : 0)
- + (!LayoutMirroring.enabled ? internal.verticalScrollBarWidth : 0)
- bottomPadding: (internal.backgroundVisible && background.hasOwnProperty("bottomPadding") ? background.bottomPadding : 0)
-- + internal.horizontalScrollBarWidth
-+ + internal.horizontalScrollBarHeight
-
- //create a background only after Component.onCompleted, see on the component creation below for explanation
- Component.onCompleted: {
-@@ -97,7 +97,7 @@ T.ScrollView {
-
- readonly property bool backgroundVisible: controlRoot.background && controlRoot.background.visible
- readonly property real verticalScrollBarWidth: controlRoot.ScrollBar.vertical.visible && !Kirigami.Settings.tabletMode ? controlRoot.ScrollBar.vertical.width : 0
-- readonly property real horizontalScrollBarWidth: controlRoot.ScrollBar.horizontal.visible && !Kirigami.Settings.tabletMode ? controlRoot.ScrollBar.horizontal.width : 0
-+ readonly property real horizontalScrollBarHeight: controlRoot.ScrollBar.horizontal.visible && !Kirigami.Settings.tabletMode ? controlRoot.ScrollBar.horizontal.height : 0
- }
- ]
- ScrollBar.vertical: ScrollBar {
---
-cgit v1.1
-
-
-
diff --git a/kde/patch/sddm-theme-breeze.patch b/kde/patch/sddm-theme-breeze.patch
deleted file mode 100644
index c500dba..0000000
--- a/kde/patch/sddm-theme-breeze.patch
+++ /dev/null
@@ -1,2 +0,0 @@
-# SDDM changed its location for the themes:
-#cat $CWD/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
diff --git a/kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff b/kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff
deleted file mode 100644
index 96817ad..0000000
--- a/kde/patch/sddm-theme-breeze/sddm-theme-breeze_path.diff
+++ /dev/null
@@ -1,10 +0,0 @@
-diff -uar sddm-theme-breeze-20140601.orig/CMakeLists.txt sddm-theme-breeze-20140601/CMakeLists.txt
---- sddm-theme-breeze-20140601.orig/CMakeLists.txt 2014-06-01 05:19:59.000000000 +0200
-+++ sddm-theme-breeze-20140601/CMakeLists.txt 2014-09-15 14:08:36.883149093 +0200
-@@ -3,5 +3,5 @@
- message("This cmake file does some weird stuff for the neon ISO")
- message("unless you are Rohan or Harold turn back now and revert this commit")
-
--INSTALL(DIRECTORY breeze DESTINATION ${CMAKE_INSTALL_PREFIX}/share/apps/sddm/themes/)
-+INSTALL(DIRECTORY breeze DESTINATION ${CMAKE_INSTALL_PREFIX}/share/sddm/themes/)
- INSTALL(FILES plasmarc DESTINATION /var/lib/sddm/.config)
diff --git a/kde/patch/spectacle.patch b/kde/patch/spectacle.patch
deleted file mode 100644
index 9ab4616..0000000
--- a/kde/patch/spectacle.patch
+++ /dev/null
@@ -1,7 +0,0 @@
-# Fix for broken HiDPI support.
-# Fixed post Applications 16.04.0:
-#cat $CWD/patch/spectacle/spectacle_hidpi.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-# Fix for broken rectangular image capture on Nvidia GPU (KDEBUG 362241):
-# Fixed post Applications 16.04.0:
-#cat $CWD/patch/spectacle/spectacle_rect_capture.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/spectacle/spectacle_hidpi.patch b/kde/patch/spectacle/spectacle_hidpi.patch
deleted file mode 100644
index 19cf923..0000000
--- a/kde/patch/spectacle/spectacle_hidpi.patch
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/src/QuickEditor/EditorRoot.qml
-+++ b/src/QuickEditor/EditorRoot.qml
-@@ -36,10 +36,10 @@
- }
-
- selection = cropRectangle.createObject(parent, {
-- "x": xx,
-- "y": yy,
-+ "x": xx,
-+ "y": yy,
- "height": hh,
-- "width": ww
-+ "width": ww
- });
-
- cropDisplayCanvas.requestPaint();
-@@ -73,8 +73,8 @@
- source: "image://snapshot/rawimage";
- cache: false;
-
-- height: Window.height;
-- width: Window.width;
-+ height: Window.height / Screen.devicePixelRatio;
-+ width: Window.width / Screen.devicePixelRatio;
- fillMode: Image.PreserveAspectFit;
- }
-
-
diff --git a/kde/patch/spectacle/spectacle_rect_capture.patch b/kde/patch/spectacle/spectacle_rect_capture.patch
deleted file mode 100644
index 8556674..0000000
--- a/kde/patch/spectacle/spectacle_rect_capture.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Boudhayan Gupta <me@BaloneyGeek.com>
-Date: Mon, 25 Apr 2016 18:27:49 +0000
-Subject: Unbreak rectangular image grabs for nvidia users.
-X-Git-Url: http://quickgit.kde.org/?p=spectacle.git&a=commitdiff&h=abbbe6d13de870f9e9349acc2542cffc5d41b76d
----
-Unbreak rectangular image grabs for nvidia users.
-
-BUG: 362241
-FIXED-IN: 16.04.1
-Patch rebased for Slackware (did not apply cleanly)
----
-
-
-diff -uar spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.cpp spectacle-16.04.0/src/QuickEditor/QuickEditor.cpp
---- spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.cpp 2016-04-13 18:54:34.000000000 +0200
-+++ spectacle-16.04.0/src/QuickEditor/QuickEditor.cpp 2016-05-02 12:25:49.554524405 +0200
-@@ -138,23 +138,6 @@
- d->mGrabRect = QRect(x, y, width, height);
- SpectacleConfig::instance()->setCropRegion(d->mGrabRect);
-
-- QQuickItem *target = d->mQuickView->rootObject()->findChild<QQuickItem *>(QStringLiteral("imageBackground"));
-- d->mCurrentGrabResult = target->grabToImage();
-- if (d->mCurrentGrabResult.isNull()) {
-- emit grabCancelled();
-- return;
-- }
--
-- connect(d->mCurrentGrabResult.data(), &QQuickItemGrabResult::ready, this, &QuickEditor::grabReadyHandler);
--}
--
--void QuickEditor::grabReadyHandler()
--{
-- Q_D(QuickEditor);
--
-- QImage croppedImage = d->mCurrentGrabResult->image().copy(d->mGrabRect);
-- QPixmap croppedPixmap = QPixmap::fromImage(croppedImage);
--
- d->mQuickView->hide();
-- emit grabDone(croppedPixmap, d->mGrabRect);
-+ emit grabDone(mImageStore->mPixmap.copy(d->mGrabRect), d->mGrabRect);
- }
-diff -uar spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.h spectacle-16.04.0/src/QuickEditor/QuickEditor.h
---- spectacle-16.04.0.orig/src/QuickEditor/QuickEditor.h 2016-04-13 18:54:34.000000000 +0200
-+++ spectacle-16.04.0/src/QuickEditor/QuickEditor.h 2016-05-02 12:22:48.124516811 +0200
-@@ -39,7 +39,6 @@
- private slots:
-
- void acceptImageHandler(int x, int y, int width, int height);
-- void grabReadyHandler();
-
- private:
-
diff --git a/kde/patch/strigi-multimedia.patch b/kde/patch/strigi-multimedia.patch
index aebad0d..77b9424 100644
--- a/kde/patch/strigi-multimedia.patch
+++ b/kde/patch/strigi-multimedia.patch
@@ -1,3 +1,2 @@
# Fix build:
cat $CWD/patch/strigi-multimedia/strigi-multimedia_port.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/umbrello.patch b/kde/patch/umbrello.patch
deleted file mode 100644
index 641688c..0000000
--- a/kde/patch/umbrello.patch
+++ /dev/null
@@ -1,10 +0,0 @@
-# Fix compilation error (undefined listitem in classifierlistpage.cpp)
-# Fixed post KDE 4.11.4 in
-# http://quickgit.kde.org/?p=umbrello.git&a=commit&h=5f9f6a68716a8aced2c5f962247d9b05b326fcf5
-#cat $CWD/patch/umbrello/umbrello-4.11.4_listitem.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
-# Fix compilation error "specialization of template<class T> struct QMetaTypeId in different namespace [-fpermissive]".
-# Fixed in Applications 18.12.0
-# https://cgit.kde.org/umbrello.git/patch/?id=62a9e5e6afdd920779f1211afb0381857659e578
-#cat $CWD/patch/umbrello/umbrello_qt510_kaboutdata_h.patch | patch -p1 --verbose || { touch ${SLACK_KDE_BUILD_DIR}/${PKGNAME}.failed ; continue ; }
-
diff --git a/kde/patch/umbrello/umbrello-4.11.4_listitem.patch b/kde/patch/umbrello/umbrello-4.11.4_listitem.patch
deleted file mode 100644
index f5cb615..0000000
--- a/kde/patch/umbrello/umbrello-4.11.4_listitem.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/umbrello/dialogs/classifierlistpage.cpp
-+++ b/umbrello/dialogs/classifierlistpage.cpp
-@@ -346,7 +346,7 @@
- }
-
- if (itemIndex >= 0 && (itemIndex < getItemList().size())) {
-- listItem = getItemList().at( itemIndex );
-+ UMLClassifierListItem* listItem = getItemList().at( itemIndex );
-
- //now update screen
- m_docTE->setText( listItem->doc() );
-
-
diff --git a/kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch b/kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch
deleted file mode 100644
index a27b0ed..0000000
--- a/kde/patch/umbrello/umbrello_qt510_kaboutdata_h.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 62a9e5e6afdd920779f1211afb0381857659e578 Mon Sep 17 00:00:00 2001
-From: Ralf Habacker <ralf.habacker@freenet.de>
-Date: Thu, 6 Dec 2018 13:36:34 +0100
-Subject: Fix KDE CI compile error with Qt 5.10 on linux
-
-The error was "specialization of template<class T>
-struct QMetaTypeId in different namespace [-fpermissive]"
-
-The Qt 5.10 related issue is fixed by using another approach
-to exclude KF5 class KAboutData.
----
- umbrello/main.cpp | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/umbrello/main.cpp b/umbrello/main.cpp
-index e3315fa..9d2acd8 100644
---- a/umbrello/main.cpp
-+++ b/umbrello/main.cpp
-@@ -19,9 +19,8 @@
-
- // kde includes
- #if QT_VERSION > 0x050000
--namespace dummy {
--#include <kaboutdata.h>
--}
-+// prevent including of <kaboutdata.h>
-+#define KABOUTDATA_H
- #include <k4aboutdata.h>
- #define KAboutData K4AboutData
- #include <KCrash>
---
-cgit v0.11.2
-
diff --git a/kde/slack-desc/akonadi b/kde/slack-desc/akonadi
index 14a0d1b..f0c8da9 100644
--- a/kde/slack-desc/akonadi
+++ b/kde/slack-desc/akonadi
@@ -13,7 +13,7 @@ akonadi: and meta data providing concurrent read, write, and query access.
akonadi: It will provide a unique desktop wide object identification and
akonadi: retrieval.
akonadi:
+akonadi: Homepage: http://www.kdepim.org/akonadi/
akonadi:
akonadi:
-akonadi: Homepage: http://www.kdepim.org/akonadi/
akonadi:
diff --git a/kde/slack-desc/akonadi-calendar b/kde/slack-desc/akonadi-calendar
index 712ec19..5a8b58f 100644
--- a/kde/slack-desc/akonadi-calendar
+++ b/kde/slack-desc/akonadi-calendar
@@ -15,5 +15,5 @@ akonadi-calendar:
akonadi-calendar:
akonadi-calendar:
akonadi-calendar:
-akonadi-calendar: Home page: http://www.kde.org/
+akonadi-calendar:
akonadi-calendar:
diff --git a/kde/slack-desc/akonadi-calendar-tools b/kde/slack-desc/akonadi-calendar-tools
index e018173..dead865 100644
--- a/kde/slack-desc/akonadi-calendar-tools
+++ b/kde/slack-desc/akonadi-calendar-tools
@@ -15,5 +15,5 @@ akonadi-calendar-tools:
akonadi-calendar-tools:
akonadi-calendar-tools:
akonadi-calendar-tools:
-akonadi-calendar-tools: Home page: http://www.kde.org/
+akonadi-calendar-tools:
akonadi-calendar-tools:
diff --git a/kde/slack-desc/akonadi-contacts b/kde/slack-desc/akonadi-contacts
index 872802c..068b9f9 100644
--- a/kde/slack-desc/akonadi-contacts
+++ b/kde/slack-desc/akonadi-contacts
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-contacts: akonadi-contacts (implement contact management in akonadi)
akonadi-contacts:
-akonadi-contacts: akonadi-contacts contains libraries and daemons to implement
-akonadi-contacts: Contact Management in Akonadi.
+akonadi-contacts: akonadi-contacts contains libraries and daemons to implement Contact
+akonadi-contacts: Management in Akonadi.
+akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
akonadi-contacts:
-akonadi-contacts: Home page: http://www.kde.org/
akonadi-contacts:
diff --git a/kde/slack-desc/akonadi-import-wizard b/kde/slack-desc/akonadi-import-wizard
index 4f0e90a..83d47e8 100644
--- a/kde/slack-desc/akonadi-import-wizard
+++ b/kde/slack-desc/akonadi-import-wizard
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-akonadi-import-wizard: akonadi-import-wizard (import data from other mail clients to KMail)
+akonadi-import-wizard: akonadi-import-wizard (import data to KMail)
akonadi-import-wizard:
akonadi-import-wizard: Import data from other mail clients to KMail.
akonadi-import-wizard:
@@ -15,5 +15,5 @@ akonadi-import-wizard:
akonadi-import-wizard:
akonadi-import-wizard:
akonadi-import-wizard:
-akonadi-import-wizard: Home page: http://www.kde.org/
+akonadi-import-wizard:
akonadi-import-wizard:
diff --git a/kde/slack-desc/akonadi-mime b/kde/slack-desc/akonadi-mime
index 80aa41d..295f57a 100644
--- a/kde/slack-desc/akonadi-mime
+++ b/kde/slack-desc/akonadi-mime
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-mime: akonadi-mime (implement mimeing in akonadi)
akonadi-mime:
-akonadi-mime: akonadi-mime contains libraries and daemons to implement
-akonadi-mime: basic email handling in Akonadi.
+akonadi-mime: akonadi-mime contains libraries and daemons to implement basic email
+akonadi-mime: handling in Akonadi.
+akonadi-mime:
akonadi-mime:
akonadi-mime:
akonadi-mime:
akonadi-mime:
akonadi-mime:
-akonadi-mime: Home page: http://www.kde.org/
akonadi-mime:
diff --git a/kde/slack-desc/akonadi-notes b/kde/slack-desc/akonadi-notes
index 2893b64..d9be735 100644
--- a/kde/slack-desc/akonadi-notes
+++ b/kde/slack-desc/akonadi-notes
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-notes: akonadi-notes (implement management of notes in akonadi)
akonadi-notes:
-akonadi-notes: akonadi-notes contains libraries and daemons to implement
-akonadi-notes: management of notes in Akonadi.
+akonadi-notes: akonadi-notes contains libraries and daemons to implement management
+akonadi-notes: of notes in Akonadi.
+akonadi-notes:
akonadi-notes:
akonadi-notes:
akonadi-notes:
akonadi-notes:
akonadi-notes:
-akonadi-notes: Home page: http://www.kde.org/
akonadi-notes:
diff --git a/kde/slack-desc/akonadi-search b/kde/slack-desc/akonadi-search
index 9d345b4..86a1e69 100644
--- a/kde/slack-desc/akonadi-search
+++ b/kde/slack-desc/akonadi-search
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
akonadi-search: akonadi-search (implement searching in akonadi)
akonadi-search:
-akonadi-search: akonadi-search contains libraries and daemons to implement
-akonadi-search: searching in Akonadi.
+akonadi-search: akonadi-search contains libraries and daemons to implement searching
+akonadi-search: in Akonadi.
+akonadi-search:
akonadi-search:
akonadi-search:
akonadi-search:
akonadi-search:
akonadi-search:
-akonadi-search: Home page: http://www.kde.org/
akonadi-search:
diff --git a/kde/slack-desc/akonadiconsole b/kde/slack-desc/akonadiconsole
index 9ac1808..cb08cb3 100644
--- a/kde/slack-desc/akonadiconsole
+++ b/kde/slack-desc/akonadiconsole
@@ -15,5 +15,5 @@ akonadiconsole:
akonadiconsole:
akonadiconsole:
akonadiconsole:
-akonadiconsole: Home page: http://www.kde.org/
+akonadiconsole:
akonadiconsole:
diff --git a/kde/slack-desc/akregator b/kde/slack-desc/akregator
index b3b466a..b4e46c4 100644
--- a/kde/slack-desc/akregator
+++ b/kde/slack-desc/akregator
@@ -15,5 +15,5 @@ akregator:
akregator:
akregator:
akregator:
-akregator: Home page: http://www.kde.org/
+akregator:
akregator:
diff --git a/kde/slack-desc/alkimia b/kde/slack-desc/alkimia
index 9230682..803af97 100644
--- a/kde/slack-desc/alkimia
+++ b/kde/slack-desc/alkimia
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-alkimia: alkimia (Library used by KDE Finance applications)
+alkimia: alkimia (KDE Finance library)
alkimia:
alkimia: Alkimia is a library used by KDE Finance applications, like Kmymoney.
alkimia:
@@ -15,5 +15,5 @@ alkimia:
alkimia:
alkimia:
alkimia:
-alkimia: Home page: http://www.kde.org/
+alkimia:
alkimia:
diff --git a/kde/slack-desc/analitza b/kde/slack-desc/analitza
index 84123be..793ac3a 100644
--- a/kde/slack-desc/analitza
+++ b/kde/slack-desc/analitza
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-analitza: analitza (library to add mathematical features to programs)
+analitza: analitza (KDE mathematical library)
analitza:
analitza: The analitza library will let you add mathematical features
analitza: to your program.
diff --git a/kde/slack-desc/ark b/kde/slack-desc/ark
index 93dd1c8..89db562 100644
--- a/kde/slack-desc/ark
+++ b/kde/slack-desc/ark
@@ -10,7 +10,7 @@ ark: ark (KDE archiver tool)
ark:
ark: This is KDE's application to work with compressed archives.
ark:
-ark: Ark's home page is: http://kde.org
+ark:
ark:
ark:
ark:
diff --git a/kde/slack-desc/artikulate b/kde/slack-desc/artikulate
index be00419..36479ff 100644
--- a/kde/slack-desc/artikulate
+++ b/kde/slack-desc/artikulate
@@ -9,11 +9,11 @@
artikulate: artikulate (pronunciation trainer)
artikulate:
artikulate: Artikulate is a pronunciation trainer, which helps in improving and
-artikulate: perfecting pronunciation skills. Learners train their pronunciation
+artikulate: perfecting pronunciation skills. Learners train their pronunciation
artikulate: by recording their own voices and comparing them to native speaker
-artikulate: recordings.
-artikulate: Artikulate is part of the KDE Education Project.
+artikulate: recordings. Artikulate is part of the KDE Education Project.
+artikulate:
+artikulate:
artikulate:
artikulate:
-artikulate: For more information, visit: http://www.kde.org
artikulate:
diff --git a/kde/slack-desc/attica-framework b/kde/slack-desc/attica-framework
index ad9b478..36d9080 100644
--- a/kde/slack-desc/attica-framework
+++ b/kde/slack-desc/attica-framework
@@ -16,4 +16,4 @@ attica-framework:
attica-framework:
attica-framework:
attica-framework:
-attica-framework: Homepage: http://kde.org/
+attica-framework:
diff --git a/kde/slack-desc/audiocd-kio b/kde/slack-desc/audiocd-kio
index a82bd28..56e1944 100644
--- a/kde/slack-desc/audiocd-kio
+++ b/kde/slack-desc/audiocd-kio
@@ -15,5 +15,5 @@ audiocd-kio:
audiocd-kio:
audiocd-kio:
audiocd-kio:
-audiocd-kio: For more information, visit: http://www.kde.org
+audiocd-kio:
audiocd-kio:
diff --git a/kde/slack-desc/baloo5 b/kde/slack-desc/baloo5
index d275b83..d4ffebd 100644
--- a/kde/slack-desc/baloo5
+++ b/kde/slack-desc/baloo5
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
baloo5: baloo5 (framework for searching and managing metadata)
baloo5:
-baloo5: Baloo is a framework for searching and managing metadata.
-baloo5: Baloo focuses on providing a very small memory footprint along
-baloo5: with with extremely fast searching.
-baloo5: It also supports storing additional file based metadata via
-baloo5: extended attributes.
+baloo5: Baloo is a framework for searching and managing metadata. Baloo
+baloo5: focuses on providing a very small memory footprint along with
+baloo5: extremely fast searching. It also supports storing additional file
+baloo5: based metadata via extended attributes.
+baloo5:
+baloo5:
baloo5:
baloo5:
-baloo5: For more information, visit: http://www.kde.org
baloo5:
diff --git a/kde/slack-desc/baloo5-widgets b/kde/slack-desc/baloo5-widgets
index e4d4a86..010def6 100644
--- a/kde/slack-desc/baloo5-widgets
+++ b/kde/slack-desc/baloo5-widgets
@@ -9,11 +9,11 @@
baloo5-widgets: baloo5-widgets (widgets for baloo)
baloo5-widgets:
baloo5-widgets: Baloo is a framework for searching and managing metadata.
-baloo5-widgets: Balooo-widgets contains widgets for use with Baloo.
+baloo5-widgets: Baloo5-widgets contains widgets for use with Baloo.
+baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
baloo5-widgets:
-baloo5-widgets: For more information, visit: http://www.kde.org
baloo5-widgets:
diff --git a/kde/slack-desc/blinken b/kde/slack-desc/blinken
index 72773dd..edcb442 100644
--- a/kde/slack-desc/blinken
+++ b/kde/slack-desc/blinken
@@ -10,7 +10,7 @@ blinken: blinken (a memory enhancement game)
blinken:
blinken: Blinken is a memory enhancement game for KDE.
blinken:
-blinken: For more information, visit: http://edu.kde.org/
+blinken:
blinken:
blinken:
blinken:
diff --git a/kde/slack-desc/bluez-qt b/kde/slack-desc/bluez-qt
index 2848c69..bae4410 100644
--- a/kde/slack-desc/bluez-qt
+++ b/kde/slack-desc/bluez-qt
@@ -9,11 +9,11 @@
bluez-qt: bluez-qt (Qt wrapper for BlueZ 5 DBus API)
bluez-qt:
bluez-qt: BluezQt is a library for communication with BlueZ system and session
-bluez-qt: daemons.
-bluez-qt: * Manager class is used to communicate with system daemon
-bluez-qt: - org.bluez
-bluez-qt: * ObexManager class is used to communicate with session daemon
-bluez-qt: - org.bluez.obex
+bluez-qt: daemons. Manager class is used to communicate with system daemon
+bluez-qt: org.bluez. ObexManager class is used to communicate with session
+bluez-qt: daemon org.bluez.obex.
bluez-qt:
bluez-qt: Homepage: https://projects.kde.org/projects/frameworks/bluez-qt
bluez-qt:
+bluez-qt:
+bluez-qt:
diff --git a/kde/slack-desc/bomber b/kde/slack-desc/bomber
index cae9a73..2777aea 100644
--- a/kde/slack-desc/bomber
+++ b/kde/slack-desc/bomber
@@ -9,11 +9,11 @@
bomber: bomber (arcade bombing game for KDE)
bomber:
bomber: Bomber is a single player arcade game. The player is invading various
-bomber: cities in a plane that is decreasing in height. The goal of the game
-bomber: is to destroy all the buildings and advance to the next level.
-bomber: Each level gets a bit harder by increasing the speed of the plane
-bomber: and the height of the buildings.
+bomber: cities in a plane that is decreasing in height. The goal of the game
+bomber: is to destroy all the buildings and advance to the next level. Each
+bomber: level gets a bit harder by increasing the speed of the plane and the
+bomber: height of the buildings.
+bomber:
bomber:
bomber:
-bomber: For more information, visit: http://www.kde.org
bomber:
diff --git a/kde/slack-desc/bovo b/kde/slack-desc/bovo
index 8ccebb3..508eda9 100644
--- a/kde/slack-desc/bovo
+++ b/kde/slack-desc/bovo
@@ -10,10 +10,10 @@ bovo: bovo (five-in-a-row board game)
bovo:
bovo: Bovo is a Gomoku ("five points" in Japanese) like game for two
bovo: players, where the opponents alternate in placing their respective
-bovo: pictogram on the game board. Also known as: Connect Five,
-bovo: Five in a row, X and O, Naughts and Crosses.
+bovo: pictogram on the game board. Also known as: Connect Five, Five in a
+bovo: row, X and O, Naughts and Crosses.
+bovo:
bovo:
bovo:
bovo:
-bovo: For more information, visit: http://www.kde.org
bovo:
diff --git a/kde/slack-desc/breeze b/kde/slack-desc/breeze
index 6c30973..91c3779 100644
--- a/kde/slack-desc/breeze
+++ b/kde/slack-desc/breeze
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
breeze: breeze (artwork for Plasma)
breeze:
-breeze: Artwork, styles and assets for the Breeze visual style for
-breeze: the Plasma Desktop.
+breeze: Artwork, styles and assets for the Breeze visual style for the Plasma
+breeze: Desktop.
+breeze:
breeze:
breeze:
breeze:
breeze:
breeze:
breeze:
-breeze: Homepage: http://kde.org/
diff --git a/kde/slack-desc/breeze-grub b/kde/slack-desc/breeze-grub
index 34daf09..b4c5095 100644
--- a/kde/slack-desc/breeze-grub
+++ b/kde/slack-desc/breeze-grub
@@ -15,5 +15,5 @@ breeze-grub:
breeze-grub:
breeze-grub:
breeze-grub:
-breeze-grub: For more information, visit: http://www.kde.org
+breeze-grub:
breeze-grub:
diff --git a/kde/slack-desc/breeze-gtk b/kde/slack-desc/breeze-gtk
index f81c0ca..c4c2ed5 100644
--- a/kde/slack-desc/breeze-gtk
+++ b/kde/slack-desc/breeze-gtk
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':' except on otherwise blank lines.
- |-----handy-ruler------------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
breeze-gtk: breeze-gtk (Breeze widget theme for GTK 2 and 3)
breeze-gtk:
breeze-gtk: Breeze widget theme for GTK 2 and 3.
@@ -16,4 +16,4 @@ breeze-gtk:
breeze-gtk:
breeze-gtk:
breeze-gtk:
-breeze-gtk: Homepage: http://kde.org/
+breeze-gtk:
diff --git a/kde/slack-desc/breeze-icons b/kde/slack-desc/breeze-icons
index 3c8788d..a23df6f 100644
--- a/kde/slack-desc/breeze-icons
+++ b/kde/slack-desc/breeze-icons
@@ -10,10 +10,10 @@ breeze-icons: breeze-icons (Breeze icon themes for KDE Plasma)
breeze-icons:
breeze-icons: Breeze icon themes for KDE Plasma.
breeze-icons:
+breeze-icons: For more information, visit:
+breeze-icons: https://projects.kde.org/projects/kde/workspace/breeze
breeze-icons:
breeze-icons:
breeze-icons:
breeze-icons:
-breeze-icons: For more information, visit:
-breeze-icons: https://projects.kde.org/projects/kde/workspace/breeze
breeze-icons:
diff --git a/kde/slack-desc/calendarsupport b/kde/slack-desc/calendarsupport
index e868865..4bd87a4 100644
--- a/kde/slack-desc/calendarsupport
+++ b/kde/slack-desc/calendarsupport
@@ -15,5 +15,5 @@ calendarsupport:
calendarsupport:
calendarsupport:
calendarsupport:
-calendarsupport: Home page: http://www.kde.org/
+calendarsupport:
calendarsupport:
diff --git a/kde/slack-desc/calligra b/kde/slack-desc/calligra
index a1f5261..fbce9db 100644
--- a/kde/slack-desc/calligra
+++ b/kde/slack-desc/calligra
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
calligra: calligra (KDE office productivity suite)
calligra:
-calligra: Calligra office productivity applications. Included are a word
+calligra: Calligra office productivity applications. Included are a word
calligra: processor, spreadsheet, presentation program, chart and graph creator,
calligra: vector graphics tool, database report creator, flowcharting program,
-calligra: integrated data management program, a pixel graphics editor,
-calligra: a mathematical formula editor, and Calligra Workspace
-calligra: (a combination of all of the above).
+calligra: integrated data management program, a pixel graphics editor, a
+calligra: mathematical formula editor, and Calligra Workspace (a combination of
+calligra: all of the above).
calligra:
-calligra: For more information, see: http://calligra-suite.org/
+calligra: Homepage: http://calligra-suite.org/
calligra:
diff --git a/kde/slack-desc/calligraplan b/kde/slack-desc/calligraplan
index f092af2..cb3e4d6 100644
--- a/kde/slack-desc/calligraplan
+++ b/kde/slack-desc/calligraplan
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
calligraplan: calligraplan (project planner)
calligraplan:
-calligraplan: Calligra Plan is a project management application.
-calligraplan: It is intended for managing moderately large projects
-calligraplan: with multiple resources.
+calligraplan: Calligra Plan is a project management application. It is intended for
+calligraplan: managing moderately large projects with multiple resources.
+calligraplan:
+calligraplan: Homepage: http://www.calligra-suite.org/
calligraplan:
calligraplan:
calligraplan:
calligraplan:
-calligraplan: Home page: http://www.calligra-suite.org/
calligraplan:
diff --git a/kde/slack-desc/cantor b/kde/slack-desc/cantor
index 34cf867..7e9e65e 100644
--- a/kde/slack-desc/cantor
+++ b/kde/slack-desc/cantor
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
cantor: cantor (front-end to mathematics software)
cantor:
-cantor: Cantor is a frontend to several existing mathematical software
-cantor: such as R, Sage and Maxima: Cantor.
-cantor: Cantor offers a worksheet as a nice GUI for all those backends
-cantor: and is not targeted to kids but to scientists.
+cantor: Cantor is a frontend to several existing mathematical software such as
+cantor: R, Sage and Maxima. Cantor offers a worksheet as a nice GUI for all
+cantor: those backends and is not targeted to kids but to scientists.
+cantor:
+cantor:
cantor:
-cantor: For more information, visit: http://edu.kde.org/
cantor:
cantor:
cantor:
diff --git a/kde/slack-desc/cervisia b/kde/slack-desc/cervisia
index 2f6de97..141da3d 100644
--- a/kde/slack-desc/cervisia
+++ b/kde/slack-desc/cervisia
@@ -15,5 +15,5 @@ cervisia:
cervisia:
cervisia:
cervisia:
-cervisia: For more information, visit: http://www.kde.org
+cervisia:
cervisia:
diff --git a/kde/slack-desc/digikam b/kde/slack-desc/digikam
index 607801e..0f1c812 100644
--- a/kde/slack-desc/digikam
+++ b/kde/slack-desc/digikam
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
-digikam: digiKam (KDE Photo Management Application)
+ |-----handy-ruler------------------------------------------------------|
+digikam: digikam (KDE Photo Management Application)
digikam:
digikam: digiKam is a simple digital photo management application for KDE,
-digikam: which makes importing and organizing digital photos a "snap". The
-digikam: photos can be organized in albums which can be sorted
-digikam: chronologically, by directory layout, or by custom collections. An
-digikam: easy to use interface enables you to connect to your camera and
-digikam: preview, download, and/or delete your images.
+digikam: which makes importing and organizing digital photos a snap. The photos
+digikam: can be organized in albums which can be sorted chronologically, by
+digikam: directory layout, or by custom collections. An easy to use interface
+digikam: enables you to connect to your camera and preview, download, and/or
+digikam: delete your images.
digikam:
digikam: Homepage: http://www.digikam.org/
digikam:
diff --git a/kde/slack-desc/discover b/kde/slack-desc/discover
index 6d659c5..7f11c78 100644
--- a/kde/slack-desc/discover
+++ b/kde/slack-desc/discover
@@ -10,10 +10,10 @@ discover: discover (KDE package management tools)
discover:
discover: A collection of package management tools for KDE.
discover:
+discover: For more information, visit:
+discover: https://projects.kde.org/projects/kde/workspace/discover
discover:
discover:
discover:
discover:
-discover: For more information, visit:
-discover: https://projects.kde.org/projects/kde/workspace/discover
discover:
diff --git a/kde/slack-desc/dolphin b/kde/slack-desc/dolphin
index 27d3b1e..99a5173 100644
--- a/kde/slack-desc/dolphin
+++ b/kde/slack-desc/dolphin
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
dolphin: dolphin (KDE file manager)
dolphin:
-dolphin: Dolphin is a lightweight file manager.
-dolphin: It has been designed with ease of use and simplicity in mind,
-dolphin: while still allowing flexibility and customisation.
+dolphin: Dolphin is a lightweight file manager. It has been designed with ease
+dolphin: of use and simplicity in mind, while still allowing flexibility and
+dolphin: customization.
dolphin:
+dolphin: Homepage: https://www.kde.org/applications/system/dolphin/
dolphin:
dolphin:
dolphin:
-dolphin: For more information, visit https://www.kde.org/applications/system/dolphin/
dolphin:
diff --git a/kde/slack-desc/dolphin-plugins b/kde/slack-desc/dolphin-plugins
index ef2c5b1..5309de8 100644
--- a/kde/slack-desc/dolphin-plugins
+++ b/kde/slack-desc/dolphin-plugins
@@ -15,5 +15,5 @@ dolphin-plugins:
dolphin-plugins:
dolphin-plugins:
dolphin-plugins:
-dolphin-plugins: For more information, visit: http://www.kde.org
+dolphin-plugins:
dolphin-plugins:
diff --git a/kde/slack-desc/dragon b/kde/slack-desc/dragon
index 115fda1..b9b2002 100644
--- a/kde/slack-desc/dragon
+++ b/kde/slack-desc/dragon
@@ -9,11 +9,11 @@
dragon: dragon (KDE multimedia player)
dragon:
dragon: Dragon Player is a multimedia player where the focus is on simplicity,
-dragon: instead of features. Dragon Player does one thing, and only one
+dragon: instead of features. Dragon Player does one thing, and only one
dragon: thing, which is playing multimedia files.
dragon:
dragon:
dragon:
dragon:
-dragon: For more information, visit: http://www.kde.org
+dragon:
dragon:
diff --git a/kde/slack-desc/drkonqi b/kde/slack-desc/drkonqi
index 7469ce6..abdec03 100644
--- a/kde/slack-desc/drkonqi
+++ b/kde/slack-desc/drkonqi
@@ -15,5 +15,5 @@ drkonqi:
drkonqi:
drkonqi:
drkonqi:
-drkonqi: Home page: http://www.kde.org/
+drkonqi:
drkonqi:
diff --git a/kde/slack-desc/elisa b/kde/slack-desc/elisa
index 0d2e502..b17d990 100644
--- a/kde/slack-desc/elisa
+++ b/kde/slack-desc/elisa
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
elisa: elisa (music player)
elisa:
-elisa: Elisa is a simple music player that should be easy to use.
-elisa: It does not require any configuration before one can use it.
+elisa: Elisa is a simple music player that should be easy to use. It does not
+elisa: require any configuration before one can use it.
elisa:
+elisa: Homepage: https://community.kde.org/Elisa
elisa:
elisa:
elisa:
elisa:
-elisa: Home page: https://community.kde.org/Elisa
elisa:
diff --git a/kde/slack-desc/eventviews b/kde/slack-desc/eventviews
index e21a2d9..d9c2a08 100644
--- a/kde/slack-desc/eventviews
+++ b/kde/slack-desc/eventviews
@@ -15,5 +15,5 @@ eventviews:
eventviews:
eventviews:
eventviews:
-eventviews: Home page: http://www.kde.org/
+eventviews:
eventviews:
diff --git a/kde/slack-desc/extra-cmake-modules b/kde/slack-desc/extra-cmake-modules
index 6fdc90c..265838b 100644
--- a/kde/slack-desc/extra-cmake-modules
+++ b/kde/slack-desc/extra-cmake-modules
@@ -6,10 +6,10 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-extra-cmake-modules: CMake extra modules (extra cmake modules for compiling KDE Frameworks
+extra-cmake-modules: extra-cmake-modules (extra KDE CMake modules)
extra-cmake-modules:
-extra-cmake-modules: This package contains additional cmake modules required for
-extra-cmake-modules: compiling KDE Frameworks 5.
+extra-cmake-modules: This package contains additional CMake modules required for compiling
+extra-cmake-modules: KDE Frameworks 5.
extra-cmake-modules:
extra-cmake-modules:
extra-cmake-modules:
diff --git a/kde/slack-desc/falkon b/kde/slack-desc/falkon
index 14cf33e..ecac825 100644
--- a/kde/slack-desc/falkon
+++ b/kde/slack-desc/falkon
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-falkon: falkon (short description here)
+falkon: falkon (KDE web browser)
falkon:
falkon: Falkon is a QtWebEngine based cross-platform web browser.
falkon:
@@ -15,5 +15,5 @@ falkon:
falkon:
falkon:
falkon:
-falkon: Home page: http://www.kde.org/
+falkon:
falkon:
diff --git a/kde/slack-desc/ffmpegthumbs b/kde/slack-desc/ffmpegthumbs
index 6ff665f..54f96f4 100644
--- a/kde/slack-desc/ffmpegthumbs
+++ b/kde/slack-desc/ffmpegthumbs
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ffmpegthumbs: ffmpegthumbs (video thumbnail generator using ffmpeg)
ffmpegthumbs:
-ffmpegthumbs: FFMpegThumbs is a video thumbnail generator for KDE file managers
-ffmpegthumbs: like Dolphin and Konqueror. It enables them to show preview
-ffmpegthumbs: images of video files using FFMpeg.
+ffmpegthumbs: FFMpegThumbs is a video thumbnail generator for KDE file managers like
+ffmpegthumbs: Dolphin and Konqueror. It enables them to show preview images of
+ffmpegthumbs: video files using FFMpeg.
+ffmpegthumbs:
ffmpegthumbs:
ffmpegthumbs:
ffmpegthumbs:
ffmpegthumbs:
-ffmpegthumbs: For more information, visit: http://www.kde.org
ffmpegthumbs:
diff --git a/kde/slack-desc/filelight b/kde/slack-desc/filelight
index f86e2f0..bef21ee 100644
--- a/kde/slack-desc/filelight
+++ b/kde/slack-desc/filelight
@@ -11,7 +11,7 @@ filelight:
filelight: Filelight allows you to quickly understand exactly where your
filelight: diskspace is being used by graphically representing your file system.
filelight:
-filelight: filelight's home page is: http://utils.kde.org/projects/filelight
+filelight: Homepage: http://utils.kde.org/projects/filelight
filelight:
filelight:
filelight:
diff --git a/kde/slack-desc/frameworkintegration b/kde/slack-desc/frameworkintegration
index da17f75..815225c 100644
--- a/kde/slack-desc/frameworkintegration
+++ b/kde/slack-desc/frameworkintegration
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-frameworkintegration: frameworkintegration (applications integration with KDE Workspaces)
+frameworkintegration: frameworkintegration (applications integration with KDE)
frameworkintegration:
frameworkintegration: Framework providing components to allow applications to integrate
frameworkintegration: with a KDE Workspace.
frameworkintegration:
+frameworkintegration: Homepage: https://community.kde.org/Frameworks
frameworkintegration:
frameworkintegration:
frameworkintegration:
frameworkintegration:
-frameworkintegration: Homepage: https://community.kde.org/Frameworks
frameworkintegration:
diff --git a/kde/slack-desc/granatier b/kde/slack-desc/granatier
index 6eb3695..646b7ee 100644
--- a/kde/slack-desc/granatier
+++ b/kde/slack-desc/granatier
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
granatier: granatier (bomberman clone for KDE)
granatier:
-granatier: Granatier is a clone of the classic Bomberman game, inspired by
-granatier: the work of the Clanbomber clone.
+granatier: Granatier is a clone of the classic Bomberman game, inspired by the
+granatier: work of the Clanbomber clone.
+granatier:
granatier:
granatier:
granatier:
granatier:
granatier:
-granatier: For more information, visit: http://www.kde.org
granatier:
diff --git a/kde/slack-desc/grantlee-editor b/kde/slack-desc/grantlee-editor
index 9ef75e7..71b375c 100644
--- a/kde/slack-desc/grantlee-editor
+++ b/kde/slack-desc/grantlee-editor
@@ -15,5 +15,5 @@ grantlee-editor:
grantlee-editor:
grantlee-editor:
grantlee-editor:
-grantlee-editor: Home page: http://www.kde.org/
+grantlee-editor:
grantlee-editor:
diff --git a/kde/slack-desc/grantleetheme b/kde/slack-desc/grantleetheme
index 0364e1f..4a9edb4 100644
--- a/kde/slack-desc/grantleetheme
+++ b/kde/slack-desc/grantleetheme
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-grantleetheme: grantleetheme (library for Grantlee theming support)
+grantleetheme: grantleetheme (Grantlee theming support)
grantleetheme:
grantleetheme: grantleetheme is a library for Grantlee theming support.
grantleetheme:
@@ -15,5 +15,5 @@ grantleetheme:
grantleetheme:
grantleetheme:
grantleetheme:
-grantleetheme: Home page: http://www.kde.org/
+grantleetheme:
grantleetheme:
diff --git a/kde/slack-desc/gwenview b/kde/slack-desc/gwenview
index bc56b12..73cc58d 100644
--- a/kde/slack-desc/gwenview
+++ b/kde/slack-desc/gwenview
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
gwenview: gwenview (image viewer for KDE)
gwenview:
-gwenview: Gwenview is a simple image viewer for KDE. It features a folder tree
+gwenview: Gwenview is a simple image viewer for KDE. It features a folder tree
gwenview: window and a file list window, providing easy navigation of your file
gwenview: hierarchy.
gwenview:
-gwenview: For more information, visit: http://www.kde.org
+gwenview:
gwenview:
gwenview:
gwenview:
diff --git a/kde/slack-desc/incidenceeditor b/kde/slack-desc/incidenceeditor
index d3929c2..67050f5 100644
--- a/kde/slack-desc/incidenceeditor
+++ b/kde/slack-desc/incidenceeditor
@@ -15,5 +15,5 @@ incidenceeditor:
incidenceeditor:
incidenceeditor:
incidenceeditor:
-incidenceeditor: Home page: http://www.kde.org/
+incidenceeditor:
incidenceeditor:
diff --git a/kde/slack-desc/juk b/kde/slack-desc/juk
index bad97bd..1830bd6 100644
--- a/kde/slack-desc/juk
+++ b/kde/slack-desc/juk
@@ -9,11 +9,11 @@
juk: juk (audio jukebox application)
juk:
juk: JuK is an audio jukebox application, supporting collections of MP3,
-juk: Ogg Vorbis, and FLAC audio files. It allows you to edit the "tags"
-juk: of your audio files, and manage your collection and playlists.
-juk: It's main focus, in fact, is on music management.
+juk: Ogg Vorbis, and FLAC audio files. It allows you to edit the tags of
+juk: your audio files and manage your collection and playlists. In fact,
+juk: its main focus is on music management.
+juk:
juk:
juk:
juk:
-juk: For more information, visit: http://www.kde.org
juk:
diff --git a/kde/slack-desc/k3b b/kde/slack-desc/k3b
index 032bbb8..c3e71fc 100644
--- a/kde/slack-desc/k3b
+++ b/kde/slack-desc/k3b
@@ -15,5 +15,5 @@ k3b:
k3b: K3b was written by Sebastian Trueg, Thomas Froescher,
k3b: Christian Kvasny, and Klaus-Dieter Krannich.
k3b:
-k3b: For more information, visit: http://www.k3b.org
+k3b: Homepage: http://www.k3b.org
k3b:
diff --git a/kde/slack-desc/kaccounts-integration b/kde/slack-desc/kaccounts-integration
index 33d7857..dc1d35f 100644
--- a/kde/slack-desc/kaccounts-integration
+++ b/kde/slack-desc/kaccounts-integration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kaccounts-integration: kaccounts-integration (web account administration)
kaccounts-integration:
-kaccounts-integration: Tools to administer web accounts for the sites and services
-kaccounts-integration: across the KDE desktop, including:
-kaccounts-integration: Google, Facebook, Owncloud, IMAP, Jabber and others.
+kaccounts-integration: Tools to administer web accounts for the sites and services across the
+kaccounts-integration: KDE desktop, including Google, Facebook, Owncloud, IMAP, Jabber, and
+kaccounts-integration: others.
+kaccounts-integration:
kaccounts-integration:
kaccounts-integration:
kaccounts-integration:
kaccounts-integration:
-kaccounts-integration: For more information, visit: http://www.kde.org
kaccounts-integration:
diff --git a/kde/slack-desc/kaccounts-providers b/kde/slack-desc/kaccounts-providers
index 3818bcf..3c09475 100644
--- a/kde/slack-desc/kaccounts-providers
+++ b/kde/slack-desc/kaccounts-providers
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kaccounts-providers: kaccounts-providers (administer web accounts)
kaccounts-providers:
-kaccounts-providers: Tools to administer web accounts for the sites and services
-kaccounts-providers: across the KDE desktop, including:
-kaccounts-providers: Google, Facebook, Owncloud, IMAP, Jabber and others.
+kaccounts-providers: Tools to administer web accounts for the sites and services across the
+kaccounts-providers: KDE desktop, including Google, Facebook, Owncloud, IMAP, Jabber, and
+kaccounts-providers: others.
+kaccounts-providers:
kaccounts-providers:
kaccounts-providers:
kaccounts-providers:
kaccounts-providers:
-kaccounts-providers: For more information, visit: http://www.kde.org
kaccounts-providers:
diff --git a/kde/slack-desc/kactivities b/kde/slack-desc/kactivities
index 2ca504a..d82cbe5 100644
--- a/kde/slack-desc/kactivities
+++ b/kde/slack-desc/kactivities
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kactivities: kactivities (API for using and interacting with Activities)
+kactivities: kactivities (API for using Activities)
kactivities:
kactivities: API for using and interacting with Activities as a consumer,
-kactivities: application adding information to them or as an activity manager.
+kactivities: application adding information to them, or as an activity manager.
+kactivities:
kactivities:
-kactivities: For more information, visit: http://www.kde.org
kactivities:
kactivities:
kactivities:
diff --git a/kde/slack-desc/kactivities-framework b/kde/slack-desc/kactivities-framework
index c3a1bbc..9f27990 100644
--- a/kde/slack-desc/kactivities-framework
+++ b/kde/slack-desc/kactivities-framework
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kactivities-framework: kactivities-framework (API for using and interacting with Activities)
+kactivities-framework: kactivities-framework (API for using Activities)
kactivities-framework:
kactivities-framework: API for using and interacting with Activities as a consumer,
-kactivities-framework: application adding information to them or as an activity manager.
+kactivities-framework: application adding information to them, or as an activity manager.
+kactivities-framework:
kactivities-framework:
-kactivities-framework: For more information, visit: http://www.kde.org
kactivities-framework:
kactivities-framework:
kactivities-framework:
diff --git a/kde/slack-desc/kactivities-stats b/kde/slack-desc/kactivities-stats
index b2e2337..70e58db 100644
--- a/kde/slack-desc/kactivities-stats
+++ b/kde/slack-desc/kactivities-stats
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kactivities-stats: kactivities-stats (component of KDE activities)
+kactivities-stats: kactivities-stats (component of KDE Activities)
+kactivities-stats:
+kactivities-stats: kactivities-stats is library for accessing the usage data collected by
+kactivities-stats: the Activities system.
kactivities-stats:
-kactivities-stats: kactivities-stats is library for accessing the usage dat
-kactivities-stats:a collected by the activities system.
kactivities-stats:
kactivities-stats:
kactivities-stats:
kactivities-stats:
kactivities-stats:
-kactivities-stats: For more information, visit: http://www.kde.org
kactivities-stats:
diff --git a/kde/slack-desc/kactivitymanagerd b/kde/slack-desc/kactivitymanagerd
index 17d1fe9..a8650de 100644
--- a/kde/slack-desc/kactivitymanagerd
+++ b/kde/slack-desc/kactivitymanagerd
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kactivitymanagerd: kactivitymanagerd (manage and track user activities)
kactivitymanagerd:
-kactivitymanagerd: System service to manage user activities
-kactivitymanagerd: and track the usage patterns.
-kactivitymanagerd: Transient package for the period between the upgrade
-kactivitymanagerd: to KDE Frameworks 5.20 and upgrade to Plasma 5.6.
-kactivitymanagerd:
+kactivitymanagerd: System service to manage user activities and track the usage patterns.
+kactivitymanagerd: Transient package for the period between the upgrade to KDE Frameworks
+kactivitymanagerd: 5.20 and upgrade to Plasma 5.6.
kactivitymanagerd:
kactivitymanagerd: For more information, visit:
kactivitymanagerd: https://projects.kde.org/projects/kde/workspace/kactivitymanagerd
kactivitymanagerd:
+kactivitymanagerd:
+kactivitymanagerd:
diff --git a/kde/slack-desc/kaddressbook b/kde/slack-desc/kaddressbook
index d07f372..e686692 100644
--- a/kde/slack-desc/kaddressbook
+++ b/kde/slack-desc/kaddressbook
@@ -15,5 +15,5 @@ kaddressbook:
kaddressbook:
kaddressbook:
kaddressbook:
-kaddressbook: Home page: http://www.kde.org/
+kaddressbook:
kaddressbook:
diff --git a/kde/slack-desc/kajongg b/kde/slack-desc/kajongg
index eb317ef..1486eb0 100644
--- a/kde/slack-desc/kajongg
+++ b/kde/slack-desc/kajongg
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kajongg: kajongg (Mah Jongg for KDE)
kajongg:
-kajongg: Kajongg is the ancient Chinese board game for 4 players.
-kajongg: Kajongg can be used in two different ways: Scoring a manual game where
-kajongg: you play as always and use Kajongg for the computation of scores and
-kajongg: for bookkeeping. Or you can use Kajongg to play against any
-kajongg: combination of other human players or computer players.
+kajongg: Kajongg is the ancient Chinese board game for 4 players. Kajongg can
+kajongg: be used in two different ways: Scoring a manual game where you play as
+kajongg: always and use Kajongg for the computation of scores and for
+kajongg: bookkeeping. Or you can use Kajongg to play against any combination
+kajongg: of other human players or computer players.
+kajongg:
kajongg:
kajongg:
-kajongg: For more information, visit: http://www.kde.org
kajongg:
diff --git a/kde/slack-desc/kalarm b/kde/slack-desc/kalarm
index e142866..c6d3c94 100644
--- a/kde/slack-desc/kalarm
+++ b/kde/slack-desc/kalarm
@@ -15,5 +15,5 @@ kalarm:
kalarm:
kalarm:
kalarm:
-kalarm: Home page: http://www.kde.org/
+kalarm:
kalarm:
diff --git a/kde/slack-desc/kalarmcal b/kde/slack-desc/kalarmcal
index cdb84aa..6a9ab91 100644
--- a/kde/slack-desc/kalarmcal
+++ b/kde/slack-desc/kalarmcal
@@ -15,5 +15,5 @@ kalarmcal:
kalarmcal:
kalarmcal:
kalarmcal:
-kalarmcal: Home page: http://www.kde.org/
+kalarmcal:
kalarmcal:
diff --git a/kde/slack-desc/kalgebra b/kde/slack-desc/kalgebra
index aefc3cc..606862e 100644
--- a/kde/slack-desc/kalgebra
+++ b/kde/slack-desc/kalgebra
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
kalgebra: kalgebra (a graph calculator)
kalgebra:
-kalgebra: KAlgebra is a MathML-based graph calculator. It was initially mathml
-kalgebra: oriented, but now it can be used by anyone with a little mathematic
+kalgebra: KAlgebra is a MathML-based graph calculator. It was initially MathML
+kalgebra: oriented, but now it can be used by anyone with a little mathematical
kalgebra: knowledge.
kalgebra:
-kalgebra: For more information, visit: http://edu.kde.org/
+kalgebra:
kalgebra:
kalgebra:
kalgebra:
diff --git a/kde/slack-desc/kalzium b/kde/slack-desc/kalzium
index b96c7bc..d757f95 100644
--- a/kde/slack-desc/kalzium
+++ b/kde/slack-desc/kalzium
@@ -10,7 +10,7 @@ kalzium: kalzium (periodic table of the elements)
kalzium:
kalzium: Kalzium shows a periodic table of the elements.
kalzium:
-kalzium: For more information, visit: http://edu.kde.org/
+kalzium:
kalzium:
kalzium:
kalzium:
diff --git a/kde/slack-desc/kamera b/kde/slack-desc/kamera
index 8d86f1d..0244544 100644
--- a/kde/slack-desc/kamera
+++ b/kde/slack-desc/kamera
@@ -5,12 +5,12 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler------------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kamera: kamera (digital camera support for KDE)
kamera:
kamera: Digital camera support for KDE.
kamera:
-kamera: For more information, visit: http://www.kde.org
+kamera:
kamera:
kamera:
kamera:
diff --git a/kde/slack-desc/kamoso b/kde/slack-desc/kamoso
index 3e787d1..6527dd0 100644
--- a/kde/slack-desc/kamoso
+++ b/kde/slack-desc/kamoso
@@ -13,7 +13,7 @@ kamoso: videos. It probably should be the best webcam recorder for Linux.
kamoso:
kamoso: Kamoso can make photos from your webcam and upload them to Facebook.
kamoso: It also allows to record videos from your webcam and upload them
-kamoso: to YouTube
+kamoso: to YouTube.
kamoso:
-kamoso: Home page: https://userbase.kde.org/Kamoso
+kamoso: Homepage: https://userbase.kde.org/Kamoso
kamoso:
diff --git a/kde/slack-desc/kanagram b/kde/slack-desc/kanagram
index 98288f5..13443f0 100644
--- a/kde/slack-desc/kanagram
+++ b/kde/slack-desc/kanagram
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kanagram: kanagram (letter game)
kanagram:
-kanagram: Kanagram is a replacement for KMessedWords. Kanagram mixes up the
-kanagram: letters of a word to create an anagram, and you have to guess what
-kanagram: the mixed up word is. Kanagram features several built-in word lists,
-kanagram: hints, and a cheat feature which reveals the original word.
-kanagram: Kanagram also has a vocabulary editor.
+kanagram: Kanagram is a replacement for KMessedWords. Kanagram mixes up the
+kanagram: letters of a word to create an anagram, and you have to guess what the
+kanagram: mixed up word is. Kanagram features several built-in word lists,
+kanagram: hints, and a cheat feature which reveals the original word. Kanagram
+kanagram: also has a vocabulary editor.
+kanagram:
kanagram:
-kanagram: For more information, visit: http://edu.kde.org/
kanagram:
kanagram:
diff --git a/kde/slack-desc/kapidox b/kde/slack-desc/kapidox
index 56ab0e7..961780b 100644
--- a/kde/slack-desc/kapidox
+++ b/kde/slack-desc/kapidox
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kapidox: kapidox (kapidox)
+kapidox: kapidox (KDE Doxygen Tools)
kapidox:
+kapidox: This framework contains scripts and data for building API
+kapidox: documentation (dox) in a standard format and style.
kapidox:
kapidox:
kapidox:
@@ -15,5 +17,3 @@ kapidox:
kapidox:
kapidox:
kapidox:
-kapidox:
-kapidox: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kapman b/kde/slack-desc/kapman
index 750a4ef..a7fc186 100644
--- a/kde/slack-desc/kapman
+++ b/kde/slack-desc/kapman
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kapman: kapman (KDE version of Pac-Man)
kapman:
-kapman: Kapman is a clone of the well known game Pac-Man.
-kapman: You must run through the maze to eat all pills without being captured
-kapman: by a ghost. By eating an energizer, Kapman gets the ability to eat
-kapman: ghosts for a few seconds. When a stage is cleared of pills and
-kapman: energizer the player is taken to the next stage with slightly
-kapman: increased game speed.
+kapman: Kapman is a clone of the well known game Pac-Man. You must run through
+kapman: the maze to eat all pills without being captured by a ghost. By eating
+kapman: an energizer, Kapman gets the ability to eat ghosts for a few seconds.
+kapman: When a stage is cleared of pills and energizers the player is taken to
+kapman: the next stage with slightly increased game speed.
+kapman:
+kapman:
kapman:
-kapman: For more information, visit: http://www.kde.org
kapman:
diff --git a/kde/slack-desc/kapptemplate b/kde/slack-desc/kapptemplate
index 092cd66..5de2077 100644
--- a/kde/slack-desc/kapptemplate
+++ b/kde/slack-desc/kapptemplate
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kapptemplate: kapptemplate (application template generator)
kapptemplate:
-kapptemplate: KAppTemplate is a shell script to create the necessary framework
-kapptemplate: to develop KDE applications.
+kapptemplate: KAppTemplate is a shell script to create the necessary framework to
+kapptemplate: develop KDE applications.
+kapptemplate:
kapptemplate:
kapptemplate:
kapptemplate:
kapptemplate:
kapptemplate:
-kapptemplate: For more information, visit: http://www.kde.org
kapptemplate:
diff --git a/kde/slack-desc/karchive b/kde/slack-desc/karchive
index 25268e4..3b98274 100644
--- a/kde/slack-desc/karchive
+++ b/kde/slack-desc/karchive
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-karchive: karchive (karchive)
+karchive: karchive (Read, create, and manipulate archives)
karchive:
+karchive: KArchive provides classes for easy reading, creation and manipulation
+karchive: of archive formats like ZIP and TAR. It also provides transparent
+karchive: compression and decompression of data, like the GZip format, via a
+karchive: subclass of QIODevice.
karchive:
karchive:
karchive:
karchive:
karchive:
-karchive:
-karchive:
-karchive:
-karchive: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kate b/kde/slack-desc/kate
index 9b19944..a1bf3ed 100644
--- a/kde/slack-desc/kate
+++ b/kde/slack-desc/kate
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kate: kate (an advanced text editor for KDE)
kate:
-kate: The Kate project develops two main products:
-kate: KatePart, the advanced editor component which is used in numerous KDE
-kate: applications requiring a text editing component, and Kate, a MDI text
-kate: editor application. In addition, we provide KWrite, a simple SDI
-kate: editor shell which allows the user to select his/her favorite editor
-kate: component.
+kate: The Kate project develops two main products: KatePart, the advanced
+kate: editor component which is used in numerous KDE applications requiring
+kate: a text editing component, and Kate, a MDI text editor application.
+kate: In addition, it provides KWrite, a simple SDI editor shell which
+kate: allows the user to select his/her favorite editor component.
kate:
kate: Homepage: http://kate-editor.org
kate:
+kate:
diff --git a/kde/slack-desc/katomic b/kde/slack-desc/katomic
index de76b51..3af6ae0 100644
--- a/kde/slack-desc/katomic
+++ b/kde/slack-desc/katomic
@@ -9,11 +9,11 @@
katomic: katomic (re-assemble molecules from compound atoms)
katomic:
katomic: Katomic is both fun and educational game built around molecular
-katomic: geometry. It employs simplistic two-dimensional looks at different
-katomic: chemical elements. You can also play an online demo version
-katomic: of this game.
+katomic: geometry. It employs simplistic two-dimensional looks at different
+katomic: chemical elements. You can also play an online demo version of this
+katomic: game.
+katomic:
katomic:
katomic:
katomic:
-katomic: For more information, visit: http://www.kde.org
katomic:
diff --git a/kde/slack-desc/kaudiocreator b/kde/slack-desc/kaudiocreator
index 3de3772..4340fc1 100644
--- a/kde/slack-desc/kaudiocreator
+++ b/kde/slack-desc/kaudiocreator
@@ -5,11 +5,11 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kaudiocreator: kaudiocreator (CD ripper and audio encoder)
kaudiocreator:
-kaudiocreator: kaudiocreater is a KDE frontend for ripping and encoding audio
-kaudiocreator: to/from optical media.
+kaudiocreator: kaudiocreater is a KDE frontend for ripping and encoding audio to/from
+kaudiocreator: optical media.
kaudiocreator:
kaudiocreator:
kaudiocreator:
diff --git a/kde/slack-desc/kauth b/kde/slack-desc/kauth
index 7b5e651..d7a5825 100644
--- a/kde/slack-desc/kauth
+++ b/kde/slack-desc/kauth
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kauth: kauth (kauth)
+kauth: kauth (Execute actions as privileged user)
kauth:
+kauth: KAuth provides a convenient, system-integrated way to offload actions
+kauth: that need to be performed as a privileged user (root, for example) to
+kauth: small (hopefully secure) helper utilities.
kauth:
kauth:
kauth:
kauth:
kauth:
kauth:
-kauth:
-kauth:
-kauth: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kbackup b/kde/slack-desc/kbackup
index eaebf28..f89e2d4 100644
--- a/kde/slack-desc/kbackup
+++ b/kde/slack-desc/kbackup
@@ -10,10 +10,10 @@ kbackup: kbackup (KDE backup program)
kbackup:
kbackup: KBackup is an application that lets you back up any folders or files
kbackup: in a tar archive to a local folder, e.g. a locally mounted device
-kbackup: like a ZIP drive, USB stick, etc. or a remote URL.
-kbackup: KBackup can run automated backups without using a graphical
-kbackup: user interface.
+kbackup: like a ZIP drive, USB stick, etc. or a remote URL. KBackup can also
+kbackup: run automated backups without using a graphical user interface.
+kbackup:
+kbackup: Homepage: https://www.kde.org/applications/utilities/kbackup/
kbackup:
kbackup:
-kbackup: Home page: https://www.kde.org/applications/utilities/kbackup/
kbackup:
diff --git a/kde/slack-desc/kblackbox b/kde/slack-desc/kblackbox
index a4525a2..3a0713d 100644
--- a/kde/slack-desc/kblackbox
+++ b/kde/slack-desc/kblackbox
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kblackbox: kblackbox (a game of hide and seek)
kblackbox:
-kblackbox: KBlackbox is a game of hide and seek played on a grid of boxes
-kblackbox: where the computer has hidden several balls.
+kblackbox: KBlackbox is a game of hide and seek played on a grid of boxes where
+kblackbox: the computer has hidden several balls.
+kblackbox:
kblackbox:
kblackbox:
kblackbox:
kblackbox:
kblackbox:
-kblackbox: For more information, visit: http://www.kde.org
kblackbox:
diff --git a/kde/slack-desc/kblocks b/kde/slack-desc/kblocks
index bdbfdfa..ed3b827 100644
--- a/kde/slack-desc/kblocks
+++ b/kde/slack-desc/kblocks
@@ -15,5 +15,5 @@ kblocks:
kblocks:
kblocks:
kblocks:
-kblocks: For more information, visit: http://www.kde.org
+kblocks:
kblocks:
diff --git a/kde/slack-desc/kblog b/kde/slack-desc/kblog
index 266d97e..b6516fe 100644
--- a/kde/slack-desc/kblog
+++ b/kde/slack-desc/kblog
@@ -9,11 +9,11 @@
kblog: kblog (blogging library for KDE)
kblog:
kblog: KBlog is a library for calling functions on Blogger 1.0, MetaWeblog,
-kblog: MovableType and GData compatible blogs.
-kblog: It calls the APIs using KXmlRpcClient and Syndication.
-kblog: It supports asynchronous sending and fetching of posts and,
-kblog: if supported on the server, multimedia files.
+kblog: MovableType and GData compatible blogs. It calls the APIs using
+kblog: KXmlRpcClient and Syndication. It supports asynchronous sending and
+kblog: fetching of posts and, if supported on the server, multimedia files.
kblog: Almost every modern blogging web application that provides an XML data
kblog: interface supports one of the APIs mentioned above.
kblog:
-kblog: Home page: http://www.kde.org/
+kblog:
+kblog:
diff --git a/kde/slack-desc/kbookmarks b/kde/slack-desc/kbookmarks
index 7f3f949..00c7c8b 100644
--- a/kde/slack-desc/kbookmarks
+++ b/kde/slack-desc/kbookmarks
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kbookmarks: kbookmarks (kbookmarks)
+kbookmarks: kbookmarks (Bookmarks management library)
kbookmarks:
+kbookmarks: KBookmarks lets you access and manipulate bookmarks stored using the
+kbookmarks: XBEL format. The most common use for bookmarks is web browsers, but
+kbookmarks: this can also be useful in any application where local files or URLs
+kbookmarks: can be saved as bookmarks.
kbookmarks:
+kbookmarks: For more information on the XBEL format, see:
+kbookmarks: http://pyxml.sourceforge.net/topics/xbel/
kbookmarks:
kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks:
-kbookmarks: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kbounce b/kde/slack-desc/kbounce
index 2a98326..a5aa9a1 100644
--- a/kde/slack-desc/kbounce
+++ b/kde/slack-desc/kbounce
@@ -10,10 +10,10 @@ kbounce: kbounce (KDE Bounce Ball Game)
kbounce:
kbounce: KBounce is a single player arcade game with the elements of puzzle.
kbounce: It is played on a field, surrounded by wall, with two or more balls
-kbounce: that move about in the field bouncing off of walls.
-kbounce: The player can build new walls, decreasing the size of active field.
+kbounce: that move about in the field bouncing off of walls. The player can
+kbounce: build new walls, decreasing the size of active field.
+kbounce:
kbounce:
kbounce:
kbounce:
-kbounce: For more information, visit: http://www.kde.org
kbounce:
diff --git a/kde/slack-desc/kbreakout b/kde/slack-desc/kbreakout
index e9b53a1..d060800 100644
--- a/kde/slack-desc/kbreakout
+++ b/kde/slack-desc/kbreakout
@@ -15,5 +15,5 @@ kbreakout:
kbreakout:
kbreakout:
kbreakout:
-kbreakout: For more information, visit: http://www.kde.org
+kbreakout:
kbreakout:
diff --git a/kde/slack-desc/kbruch b/kde/slack-desc/kbruch
index 43a2aa3..2b9bdb6 100644
--- a/kde/slack-desc/kbruch
+++ b/kde/slack-desc/kbruch
@@ -10,7 +10,7 @@ kbruch: kbruch (calculate fractions)
kbruch:
kbruch: KBruch is a small program to practice calculating with fractions.
kbruch:
-kbruch: For more information, visit: http://edu.kde.org/
+kbruch:
kbruch:
kbruch:
kbruch:
diff --git a/kde/slack-desc/kcachegrind b/kde/slack-desc/kcachegrind
index e47d7d9..9fe0153 100644
--- a/kde/slack-desc/kcachegrind
+++ b/kde/slack-desc/kcachegrind
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kcachegrind: kcachegrind (GUI to profilers such as Valgrind)
kcachegrind:
-kcachegrind: kcachegrind is a graphical browser for data produced by
-kcachegrind: profiling tools such as Valgrind.
+kcachegrind: kcachegrind is a graphical browser for data produced by profiling
+kcachegrind: tools such as Valgrind.
+kcachegrind:
kcachegrind:
kcachegrind:
kcachegrind:
kcachegrind:
kcachegrind:
-kcachegrind: For more information, visit: http://www.kde.org
kcachegrind:
diff --git a/kde/slack-desc/kcalc b/kde/slack-desc/kcalc
index f5144c5..fd72f12 100644
--- a/kde/slack-desc/kcalc
+++ b/kde/slack-desc/kcalc
@@ -11,7 +11,7 @@ kcalc:
kcalc: KCalc is a calculator which offers many more mathematical functions
kcalc: than meet the eye on a first glance.
kcalc:
-kcalc: kcalc's home page is: http://utils.kde.org/projects/kcalc
+kcalc: Homepage: http://utils.kde.org/projects/kcalc
kcalc:
kcalc:
kcalc:
diff --git a/kde/slack-desc/kcalcore b/kde/slack-desc/kcalcore
index 44c4147..7a45093 100644
--- a/kde/slack-desc/kcalcore
+++ b/kde/slack-desc/kcalcore
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kcalcore: kcalcore (KDE calendar access library)
kcalcore:
-kcalcore: This library provides access to and handling of calendar data.
-kcalcore: It supports the standard formats iCalendar and vCalendar and the
-kcalcore: group scheduling standard iTIP.
+kcalcore: This library provides access to and handling of calendar data. It
+kcalcore: supports the standard formats iCalendar and vCalendar and the group
+kcalcore: scheduling standard iTIP.
+kcalcore:
kcalcore:
kcalcore:
kcalcore:
kcalcore:
-kcalcore: Home page: http://www.kde.org/
kcalcore:
diff --git a/kde/slack-desc/kcalendarcore b/kde/slack-desc/kcalendarcore
index 12a2961..7106b56 100644
--- a/kde/slack-desc/kcalendarcore
+++ b/kde/slack-desc/kcalendarcore
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kcalendarcore: kcalendarcore (KDE calendar access library)
kcalendarcore:
-kcalendarcore: This library provides access to and handling of calendar data.
-kcalendarcore: It supports the standard formats iCalendar and vCalendar and the
-kcalendarcore: group scheduling standard iTIP.
+kcalendarcore: This library provides access to and handling of calendar data. It
+kcalendarcore: supports the standard formats iCalendar and vCalendar and the group
+kcalendarcore: scheduling standard iTIP.
+kcalendarcore:
kcalendarcore:
kcalendarcore:
kcalendarcore:
kcalendarcore:
-kcalendarcore: Home page: http://www.kde.org/
kcalendarcore:
diff --git a/kde/slack-desc/kcalutils b/kde/slack-desc/kcalutils
index fa95cc1..3ec2f34 100644
--- a/kde/slack-desc/kcalutils
+++ b/kde/slack-desc/kcalutils
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kcalutils: kcalutils (utility functions for the handling of calendar data)
+kcalutils: kcalutils (calendar data utilities)
kcalutils:
kcalutils: This library provides a set of utility functions that help
kcalutils: applications access and use calendar data via the KCalCore library.
@@ -15,5 +15,5 @@ kcalutils:
kcalutils:
kcalutils:
kcalutils:
-kcalutils: Home page: http://www.kde.org/
+kcalutils:
kcalutils:
diff --git a/kde/slack-desc/kcharselect b/kde/slack-desc/kcharselect
index 3c937dd..50a2524 100644
--- a/kde/slack-desc/kcharselect
+++ b/kde/slack-desc/kcharselect
@@ -8,10 +8,10 @@
|-----handy-ruler------------------------------------------------------|
kcharselect: kcharselect (character picker)
kcharselect:
-kcharselect: KCharSelect is a tool to select special characters from all
-kcharselect: installed fonts and copy them into the clipboard.
+kcharselect: KCharSelect is a tool to select special characters from all installed
+kcharselect: fonts and copy them into the clipboard.
kcharselect:
-kcharselect: kcharselect's home page: http://utils.kde.org/projects/kcharselect
+kcharselect: Homepage: http://utils.kde.org/projects/kcharselect
kcharselect:
kcharselect:
kcharselect:
diff --git a/kde/slack-desc/kcmutils b/kde/slack-desc/kcmutils
index 504aa27..2236849 100644
--- a/kde/slack-desc/kcmutils
+++ b/kde/slack-desc/kcmutils
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcmutils: kcmutils (kcmutils)
+kcmutils: kcmutils (KDE System Settings utilities)
kcmutils:
+kcmutils: KCMUtils provides various classes to work with KCModules. KCModules
+kcmutils: can be created with the KConfigWidgets framework.
kcmutils:
kcmutils:
kcmutils:
@@ -15,5 +17,3 @@ kcmutils:
kcmutils:
kcmutils:
kcmutils:
-kcmutils:
-kcmutils: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcodecs b/kde/slack-desc/kcodecs
index b3d461e..ea4b170 100644
--- a/kde/slack-desc/kcodecs
+++ b/kde/slack-desc/kcodecs
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcodecs: kcodecs (kcodecs)
+kcodecs: kcodecs (String encoding library)
kcodecs:
+kcodecs: KCodecs provide a collection of methods to manipulate strings using
+kcodecs: various encodings. It can automatically determine the charset of a
+kcodecs: string, translate XML entities, validate email addresses, and find
+kcodecs: encodings by name in a more tolerant way than QTextCodec (useful e.g.
+kcodecs: for data coming from the Internet).
kcodecs:
kcodecs:
kcodecs:
kcodecs:
-kcodecs:
-kcodecs:
-kcodecs:
-kcodecs:
-kcodecs: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcolorchooser b/kde/slack-desc/kcolorchooser
index 61e356d..b5219c5 100644
--- a/kde/slack-desc/kcolorchooser
+++ b/kde/slack-desc/kcolorchooser
@@ -10,7 +10,7 @@ kcolorchooser: kcolorchooser (color chooser)
kcolorchooser:
kcolorchooser: A color chooser application for KDE.
kcolorchooser:
-kcolorchooser: For more information, visit: http://www.kde.org
+kcolorchooser:
kcolorchooser:
kcolorchooser:
kcolorchooser:
diff --git a/kde/slack-desc/kcompletion b/kde/slack-desc/kcompletion
index 00b6ce2..d66ccb3 100644
--- a/kde/slack-desc/kcompletion
+++ b/kde/slack-desc/kcompletion
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcompletion: kcompletion (kcompletion)
+kcompletion: kcompletion (Powerful completion framework)
kcompletion:
+kcompletion: When typing filenames, email addresses and other text where the user
+kcompletion: often wants to select from existing data (including what they
+kcompletion: previously typed) rather than enter anything wholly original, users
+kcompletion: often find it helpful if they only need to type the first few
+kcompletion: characters, and then have the application offer them a set of choices
+kcompletion: or attempt to finish off what they were typing. This framework helps
+kcompletion: implement this in Qt-based applications.
kcompletion:
kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion:
-kcompletion: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kconfig b/kde/slack-desc/kconfig
index 7cefad3..058549d 100644
--- a/kde/slack-desc/kconfig
+++ b/kde/slack-desc/kconfig
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kconfig: kconfig (kconfig)
+kconfig: kconfig (Persistent application settings)
kconfig:
+kconfig: KConfig provides an advanced configuration system. It is made of two
+kconfig: parts: KConfigCore and KConfigGui. KConfigCore provides access to the
+kconfig: configuration files themselves. KConfigGui provides a way to hook
+kconfig: widgets to the configuration so that they are automatically
+kconfig: initialized from the configuration and automatically propagate their
+kconfig: changes to their respective configuration files.
kconfig:
kconfig:
kconfig:
-kconfig:
-kconfig:
-kconfig:
-kconfig:
-kconfig:
-kconfig: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kconfigwidgets b/kde/slack-desc/kconfigwidgets
index 647a404..683097a 100644
--- a/kde/slack-desc/kconfigwidgets
+++ b/kde/slack-desc/kconfigwidgets
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kconfigwidgets: kconfigwidgets (kconfigwidgets)
+kconfigwidgets: kconfigwidgets (Widgets for configuration dialogs)
kconfigwidgets:
+kconfigwidgets: KConfigWidgets provides easy-to-use classes to create configuration
+kconfigwidgets: dialogs, as well as a set of widgets which uses KConfig to store their
+kconfigwidgets: settings.
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
kconfigwidgets:
-kconfigwidgets:
-kconfigwidgets:
-kconfigwidgets: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcontacts b/kde/slack-desc/kcontacts
index 6dcf4fc..b04c192 100644
--- a/kde/slack-desc/kcontacts
+++ b/kde/slack-desc/kcontacts
@@ -11,9 +11,9 @@ kcontacts:
kcontacts: kcontacts contains an address book API for KDE. This can be used by
kcontacts: all KDE applications using data of this type, e.g. KAddressBook,
kcontacts: KMail, KOrganizer, KPilot etc.
-kcontacts: It is meant as replacement for libkab (in kdebase/kab).
kcontacts:
kcontacts:
kcontacts:
-kcontacts: Home page: http://www.kde.org/
+kcontacts:
+kcontacts:
kcontacts:
diff --git a/kde/slack-desc/kcoreaddons b/kde/slack-desc/kcoreaddons
index 54d736a..e21417c 100644
--- a/kde/slack-desc/kcoreaddons
+++ b/kde/slack-desc/kcoreaddons
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcoreaddons: kcoreaddons (kcoreaddons)
+kcoreaddons: kcoreaddons (QtCore addon library)
kcoreaddons:
+kcoreaddons: KCoreAddons provides classes built on top of QtCore to perform various
+kcoreaddons: tasks such as manipulating mime types, autosaving files, creating
+kcoreaddons: backup files, generating random sequences, performing text
+kcoreaddons: manipulations such as macro replacement, accessing user information
+kcoreaddons: and many more.
kcoreaddons:
kcoreaddons:
kcoreaddons:
kcoreaddons:
-kcoreaddons:
-kcoreaddons:
-kcoreaddons:
-kcoreaddons:
-kcoreaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcrash b/kde/slack-desc/kcrash
index 0d0bfb8..7324a80 100644
--- a/kde/slack-desc/kcrash
+++ b/kde/slack-desc/kcrash
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kcrash: kcrash (kcrash)
+kcrash: kcrash (Crash handler)
kcrash:
+kcrash: KCrash provides support for intercepting and handling application
+kcrash: crashes.
kcrash:
kcrash:
kcrash:
@@ -15,5 +17,3 @@ kcrash:
kcrash:
kcrash:
kcrash:
-kcrash:
-kcrash: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kcron b/kde/slack-desc/kcron
index 109ccfa..d4be744 100644
--- a/kde/slack-desc/kcron
+++ b/kde/slack-desc/kcron
@@ -15,5 +15,5 @@ kcron:
kcron:
kcron:
kcron:
-kcron: For more information, visit: http://www.kde.org
+kcron:
kcron:
diff --git a/kde/slack-desc/kdav b/kde/slack-desc/kdav
index 5e09f66..7abe02a 100644
--- a/kde/slack-desc/kdav
+++ b/kde/slack-desc/kdav
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdav: kdav (KDE DAV protocol implementation)
kdav:
-kdav: A DAV protocol implemention with KJobs.
+kdav: The DAV protocol extends HTTP with new methods that allow a DAV client
+kdav: to create, modify, and update files and directories in the server.
+kdav: KDAV provides a DAV protocol implemention with KJobs. Calendars and
+kdav: todos are supported, using either GroupDAV or CalDAV, and contacts are
+kdav: supported using GroupDAV or CardDAV.
kdav:
kdav:
kdav:
kdav:
-kdav:
-kdav:
-kdav: For more information, visit: http://pim.kde.org
-kdav:
diff --git a/kde/slack-desc/kdbusaddons b/kde/slack-desc/kdbusaddons
index 1912355..29332b5 100644
--- a/kde/slack-desc/kdbusaddons
+++ b/kde/slack-desc/kdbusaddons
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdbusaddons: kdbusaddons (kdbusaddons)
+kdbusaddons: kdbusaddons (Convenience classes for D-Bus)
kdbusaddons:
+kdbusaddons: KDBusAddons provides convenience classes on top of QtDBus, as well as
+kdbusaddons: an API to create KDED modules.
kdbusaddons:
kdbusaddons:
kdbusaddons:
@@ -15,5 +17,3 @@ kdbusaddons:
kdbusaddons:
kdbusaddons:
kdbusaddons:
-kdbusaddons:
-kdbusaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kde-cli-tools b/kde/slack-desc/kde-cli-tools
index 0c4fc04..5f29d16 100644
--- a/kde/slack-desc/kde-cli-tools
+++ b/kde/slack-desc/kde-cli-tools
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kde-cli-tools: kde-cli-tools (KDE commandline tools)
+kde-cli-tools: kde-cli-tools (KDE command-line tools)
+kde-cli-tools:
+kde-cli-tools: Tools based on KDE Frameworks 5 to better interact with the system.
+kde-cli-tools:
kde-cli-tools:
-kde-cli-tools: Tools based on KDE Frameworks 5 to better interact
-kde-cli-tools: with the system.
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
kde-cli-tools:
-kde-cli-tools: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kde-dev-scripts b/kde/slack-desc/kde-dev-scripts
index df28666..296127e 100644
--- a/kde/slack-desc/kde-dev-scripts
+++ b/kde/slack-desc/kde-dev-scripts
@@ -15,5 +15,5 @@ kde-dev-scripts:
kde-dev-scripts:
kde-dev-scripts:
kde-dev-scripts:
-kde-dev-scripts: For more information, visit: http://www.kde.org
+kde-dev-scripts:
kde-dev-scripts:
diff --git a/kde/slack-desc/kde-dev-utils b/kde/slack-desc/kde-dev-utils
index 55d3ad3..cc8f350 100644
--- a/kde/slack-desc/kde-dev-utils
+++ b/kde/slack-desc/kde-dev-utils
@@ -15,5 +15,5 @@ kde-dev-utils:
kde-dev-utils:
kde-dev-utils:
kde-dev-utils:
-kde-dev-utils: For more information, visit: http://www.kde.org
+kde-dev-utils:
kde-dev-utils:
diff --git a/kde/slack-desc/kde-gtk-config b/kde/slack-desc/kde-gtk-config
index d59bfb6..162a411 100644
--- a/kde/slack-desc/kde-gtk-config
+++ b/kde/slack-desc/kde-gtk-config
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kde-gtk-config: kde-gtk-config (configure GTK application look & feel in KDE)
+kde-gtk-config: kde-gtk-config (configure GTK appearance)
kde-gtk-config:
-kde-gtk-config: KDE systemsettings kcm to set GTK application look and feel.
+kde-gtk-config: System settings kcm to set GTK application look and feel in KDE.
kde-gtk-config:
+kde-gtk-config: Homepage: http://projects.kde.org/kde-gtk-config
kde-gtk-config:
kde-gtk-config:
kde-gtk-config:
kde-gtk-config:
kde-gtk-config:
-kde-gtk-config: For more information, visit: http://projects.kde.org/kde-gtk-config
kde-gtk-config:
diff --git a/kde/slack-desc/kde-wallpapers b/kde/slack-desc/kde-wallpapers
index e78fbfb..5c14a8a 100644
--- a/kde/slack-desc/kde-wallpapers
+++ b/kde/slack-desc/kde-wallpapers
@@ -5,7 +5,7 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler-------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kde-wallpapers: kde-wallpapers (Wallpapers for KDE)
kde-wallpapers:
kde-wallpapers: Additional wallpapers for KDE.
diff --git a/kde/slack-desc/kdeaccessibility b/kde/slack-desc/kdeaccessibility
index 91669ef..e176b38 100644
--- a/kde/slack-desc/kdeaccessibility
+++ b/kde/slack-desc/kdeaccessibility
@@ -17,4 +17,3 @@ kdeaccessibility:
kdeaccessibility:
kdeaccessibility:
kdeaccessibility:
-kdeaccessibility:
diff --git a/kde/slack-desc/kdeadmin b/kde/slack-desc/kdeadmin
index cef4307..515abd9 100644
--- a/kde/slack-desc/kdeadmin
+++ b/kde/slack-desc/kdeadmin
@@ -6,7 +6,7 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler---------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdeadmin: kdeadmin (System Administration tools)
kdeadmin:
kdeadmin: KDE system administration tools.
diff --git a/kde/slack-desc/kdebugsettings b/kde/slack-desc/kdebugsettings
index df5771f..bc4921f 100644
--- a/kde/slack-desc/kdebugsettings
+++ b/kde/slack-desc/kdebugsettings
@@ -15,5 +15,5 @@ kdebugsettings:
kdebugsettings:
kdebugsettings:
kdebugsettings:
-kdebugsettings: For more information, visit: http://www.kde.org
+kdebugsettings:
kdebugsettings:
diff --git a/kde/slack-desc/kdeclarative b/kde/slack-desc/kdeclarative
index bd82c61..09cd5cd 100644
--- a/kde/slack-desc/kdeclarative
+++ b/kde/slack-desc/kdeclarative
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdeclarative: kdeclarative (kdeclarative)
+kdeclarative: kdeclarative (Integration of QML and KDE workspaces)
kdeclarative:
+kdeclarative: KDeclarative provides integration of QML and KDE work spaces. It
+kdeclarative: comprises two parts: a library used by the C++ part of your
+kdeclarative: application to intergrate QML with KDE Frameworks specific features,
+kdeclarative: and a series of QML imports that offer bindings to some of the
+kdeclarative: frameworks.
kdeclarative:
kdeclarative:
kdeclarative:
kdeclarative:
-kdeclarative:
-kdeclarative:
-kdeclarative:
-kdeclarative:
-kdeclarative: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdeconnect-kde b/kde/slack-desc/kdeconnect-kde
index 7fe5334..1eb21b9 100644
--- a/kde/slack-desc/kdeconnect-kde
+++ b/kde/slack-desc/kdeconnect-kde
@@ -13,7 +13,7 @@ kdeconnect-kde: Prominent features are: clipboard share, notifications sync,
kdeconnect-kde: multimedia remote control over secured network connections.
kdeconnect-kde: Please note you will need to install KDE Connect on Android
kdeconnect-kde: for this app to work:
+kdeconnect-kde:
kdeconnect-kde: https://play.google.com/store/apps/details?id=org.kde.kdeconnect_tp
kdeconnect-kde:
-kdeconnect-kde: See also:
-kdeconnect-kde: https://albertvaka.wordpress.com/2013/08/05/introducing-kde-connect/
+kdeconnect-kde:
diff --git a/kde/slack-desc/kdecoration b/kde/slack-desc/kdecoration
index 499a27b..79481ca 100644
--- a/kde/slack-desc/kdecoration
+++ b/kde/slack-desc/kdecoration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdecoration: kdecoration (library to create themes for kwin)
kdecoration:
-kdecoration: This library makes it easier and more reliable to make themes
-kdecoration: for KWin, Plasma's window manager.
-kdecoration: It has impressive memory, performance and stability improvements.
+kdecoration: This library makes it easier and more reliable to make themes for
+kdecoration: KWin, Plasma's window manager. It has impressive memory, performance
+kdecoration: and stability improvements.
+kdecoration:
kdecoration:
kdecoration:
kdecoration:
kdecoration:
-kdecoration: For more information, visit: http://www.kde.org
kdecoration:
diff --git a/kde/slack-desc/kded b/kde/slack-desc/kded
index 98a2b88..4767063 100644
--- a/kde/slack-desc/kded
+++ b/kde/slack-desc/kded
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kded: kded (kded)
+kded: kded (Central daemon of KDE workspaces)
kded:
+kded: KDED stands for KDE Daemon. KDED runs in the background and performs a
+kded: number of small tasks. Some of these tasks are built in, others are
+kded: started on demand. Examples include checking for newly installed
+kded: software and checking for newly installed update files.
kded:
kded:
kded:
kded:
kded:
-kded:
-kded:
-kded:
-kded: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdeedu-data b/kde/slack-desc/kdeedu-data
index a55d9a6..b22384f 100644
--- a/kde/slack-desc/kdeedu-data
+++ b/kde/slack-desc/kdeedu-data
@@ -15,5 +15,5 @@ kdeedu-data:
kdeedu-data:
kdeedu-data:
kdeedu-data:
-kdeedu-data: For more information, visit: http://www.kde.org
+kdeedu-data:
kdeedu-data:
diff --git a/kde/slack-desc/kdegraphics-mobipocket b/kde/slack-desc/kdegraphics-mobipocket
index 2704d36..fedd14d 100644
--- a/kde/slack-desc/kdegraphics-mobipocket
+++ b/kde/slack-desc/kdegraphics-mobipocket
@@ -10,7 +10,7 @@ kdegraphics-mobipocket: kdegraphics-mobipocket (Mobipocket support for Okular)
kdegraphics-mobipocket:
kdegraphics-mobipocket: Mobipocket support for Okular.
kdegraphics-mobipocket:
-kdegraphics-mobipocket: For more information, visit: http://www.kde.org/
+kdegraphics-mobipocket:
kdegraphics-mobipocket:
kdegraphics-mobipocket:
kdegraphics-mobipocket:
diff --git a/kde/slack-desc/kdegraphics-thumbnailers b/kde/slack-desc/kdegraphics-thumbnailers
index 1f781d5..c6807f1 100644
--- a/kde/slack-desc/kdegraphics-thumbnailers
+++ b/kde/slack-desc/kdegraphics-thumbnailers
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kdegraphics-thumbnailers: kdegraphics-thumbnailers (thumbnailers for various graphics formats)
+kdegraphics-thumbnailers: kdegraphics-thumbnailers (image thumbnailers)
+kdegraphics-thumbnailers:
+kdegraphics-thumbnailers: These plugins allow KDE software to create thumbnails for several
+kdegraphics-thumbnailers: graphic file formats.
kdegraphics-thumbnailers:
-kdegraphics-thumbnailers: These plugins allow KDE software to create thumbnails for
-kdegraphics-thumbnailers: several advanced graphic file formats.
kdegraphics-thumbnailers:
-kdegraphics-thumbnailers: For more information, visit: http://www.kde.org
kdegraphics-thumbnailers:
kdegraphics-thumbnailers:
kdegraphics-thumbnailers:
diff --git a/kde/slack-desc/kdelibs4support b/kde/slack-desc/kdelibs4support
index 13c929e..684a2bc 100644
--- a/kde/slack-desc/kdelibs4support
+++ b/kde/slack-desc/kdelibs4support
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdelibs4support: kdelibs4support (KDE 4 support)
kdelibs4support:
+kdelibs4support: kdelibs4support provides legacy support for kdelibs 4 compatibility
+kdelibs4support: such as code and utilities to ease the transition from kdelibs 4 to
+kdelibs4support: KDE Frameworks 5. This includes CMake macros and C++ classes whose
+kdelibs4support: functionality has been replaced by code in CMake, Qt and other
+kdelibs4support: frameworks.
kdelibs4support:
kdelibs4support:
kdelibs4support:
kdelibs4support:
-kdelibs4support:
-kdelibs4support:
-kdelibs4support:
-kdelibs4support:
-kdelibs4support: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdenetwork-filesharing b/kde/slack-desc/kdenetwork-filesharing
index 1233eed..02cfcfe 100644
--- a/kde/slack-desc/kdenetwork-filesharing
+++ b/kde/slack-desc/kdenetwork-filesharing
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdenetwork-filesharing: kdenetwork-filesharing (share a directory with the local network)
kdenetwork-filesharing:
-kdenetwork-filesharing: Konqueror properties dialog plugin to share a directory
-kdenetwork-filesharing: with the local network.
+kdenetwork-filesharing: Konqueror properties dialog plugin to share a directory with the local
+kdenetwork-filesharing: network.
+kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
kdenetwork-filesharing:
-kdenetwork-filesharing: For more information, visit: http://www.kde.org
kdenetwork-filesharing:
diff --git a/kde/slack-desc/kdenlive b/kde/slack-desc/kdenlive
index 7d1b619..4900af6 100644
--- a/kde/slack-desc/kdenlive
+++ b/kde/slack-desc/kdenlive
@@ -10,10 +10,10 @@ kdenlive: kdenlive (non-linear video editor)
kdenlive:
kdenlive: A non-linear video editor for Linux using the MLT video framework.
kdenlive:
+kdenlive: Homepage: http://www.kdenlive.org
kdenlive:
kdenlive:
kdenlive:
kdenlive:
kdenlive:
-kdenlive: For more information, visit: http://www.kdenlive.org
kdenlive:
diff --git a/kde/slack-desc/kdepim b/kde/slack-desc/kdepim
index 7a66c17..08e3bbb 100644
--- a/kde/slack-desc/kdepim
+++ b/kde/slack-desc/kdepim
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdepim: kdepim (KDE Personal Information Management applications)
kdepim:
kdepim: The KDE-PIM project aims to bring together those who wish to help
diff --git a/kde/slack-desc/kdepim-addons b/kde/slack-desc/kdepim-addons
index ac3e2d3..28e4778 100644
--- a/kde/slack-desc/kdepim-addons
+++ b/kde/slack-desc/kdepim-addons
@@ -15,5 +15,5 @@ kdepim-addons:
kdepim-addons:
kdepim-addons:
kdepim-addons:
-kdepim-addons: Home page: http://www.kde.org/
+kdepim-addons:
kdepim-addons:
diff --git a/kde/slack-desc/kdepim-apps-libs b/kde/slack-desc/kdepim-apps-libs
index d20bb3b..28be245 100644
--- a/kde/slack-desc/kdepim-apps-libs
+++ b/kde/slack-desc/kdepim-apps-libs
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdepim-apps-libs: kdepim-apps-libs (KDE PIM mail related libraries)
kdepim-apps-libs:
-kdepim-apps-libs: kdepim-apps-libs package contains KDE PIM mail
-kdepim-apps-libs: related libraries.
+kdepim-apps-libs: The kdepim-apps-libs package contains KDE PIM mail related libraries.
+kdepim-apps-libs:
+kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
kdepim-apps-libs:
-kdepim-apps-libs: Home page: http://www.kde.org/
kdepim-apps-libs:
diff --git a/kde/slack-desc/kdepim-runtime b/kde/slack-desc/kdepim-runtime
index cb0ac6e..a3d90b2 100644
--- a/kde/slack-desc/kdepim-runtime
+++ b/kde/slack-desc/kdepim-runtime
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdepim-runtime: kdepim-runtime (KDE Personal Information Management runtime)
kdepim-runtime:
kdepim-runtime: The KDE-PIM project aims to bring together those who wish to help
diff --git a/kde/slack-desc/kdesdk b/kde/slack-desc/kdesdk
index f954a27..5a8b267 100644
--- a/kde/slack-desc/kdesdk
+++ b/kde/slack-desc/kdesdk
@@ -5,11 +5,11 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdesdk: kdesdk (KDE SDK)
kdesdk:
-kdesdk: KDE Software Development Kit. This is a collection of applications
-kdesdk: and tools used to develop on the KDE Platform. It also contains
+kdesdk: KDE Software Development Kit. This is a collection of applications
+kdesdk: and tools used to develop on the KDE Platform. It also contains
kdesdk: example code for use in learning KDE programming or starting a new
kdesdk: KDE application.
kdesdk:
diff --git a/kde/slack-desc/kdesdk-kioslaves b/kde/slack-desc/kdesdk-kioslaves
index 124fa29..2128872 100644
--- a/kde/slack-desc/kdesdk-kioslaves
+++ b/kde/slack-desc/kdesdk-kioslaves
@@ -15,5 +15,5 @@ kdesdk-kioslaves:
kdesdk-kioslaves:
kdesdk-kioslaves:
kdesdk-kioslaves:
-kdesdk-kioslaves: For more information, visit: http://www.kde.org
+kdesdk-kioslaves:
kdesdk-kioslaves:
diff --git a/kde/slack-desc/kdesdk-thumbnailers b/kde/slack-desc/kdesdk-thumbnailers
index 4ff1066..99f75f1 100644
--- a/kde/slack-desc/kdesdk-thumbnailers
+++ b/kde/slack-desc/kdesdk-thumbnailers
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdesdk-thumbnailers: kdesdk-thumbnailers (thumbnailers for KDE)
kdesdk-thumbnailers:
-kdesdk-thumbnailers: Thumbnailers for KDE, including gnu gettext po translation
-kdesdk-thumbnailers: files and gettext translation templates.
+kdesdk-thumbnailers: Thumbnailers for KDE, including gnu gettext po translation files and
+kdesdk-thumbnailers: gettext translation templates.
+kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
kdesdk-thumbnailers:
-kdesdk-thumbnailers: For more information, visit: http://www.kde.org
kdesdk-thumbnailers:
diff --git a/kde/slack-desc/kdesignerplugin b/kde/slack-desc/kdesignerplugin
index a008191..08d1f04 100644
--- a/kde/slack-desc/kdesignerplugin
+++ b/kde/slack-desc/kdesignerplugin
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdesignerplugin: kdesignerplugin (kdesignerplugin)
+kdesignerplugin: kdesignerplugin (Integrate custom widgets with Qt Designer)
kdesignerplugin:
+kdesignerplugin: This framework provides a utility (kgendesignerplugin) that can be
+kdesignerplugin: used to generate plugins for Qt Designer from ini-style description
+kdesignerplugin: files.
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
kdesignerplugin:
-kdesignerplugin:
-kdesignerplugin:
-kdesignerplugin: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdesu b/kde/slack-desc/kdesu
index 91a372c..994ee4f 100644
--- a/kde/slack-desc/kdesu
+++ b/kde/slack-desc/kdesu
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdesu: kdesu (kdesu)
+kdesu: kdesu (run shell commands as root)
kdesu:
+kdesu: KDESU provides functionality for building GUI front ends for (password
+kdesu: asking) console mode programs. For example, kdesu and kdessh use it to
+kdesu: interface with su and ssh respectively.
kdesu:
kdesu:
kdesu:
kdesu:
kdesu:
kdesu:
-kdesu:
-kdesu:
-kdesu: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdeutils b/kde/slack-desc/kdeutils
index 927ac43..91f09b9 100644
--- a/kde/slack-desc/kdeutils
+++ b/kde/slack-desc/kdeutils
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler---------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdeutils: kdeutils (KDE Utilities)
kdeutils:
kdeutils: This package includes utilities for the KDE Software Compilation.
diff --git a/kde/slack-desc/kdewebdev b/kde/slack-desc/kdewebdev
index 294ef22..66b1cc6 100644
--- a/kde/slack-desc/kdewebdev
+++ b/kde/slack-desc/kdewebdev
@@ -5,11 +5,11 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler--------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kdewebdev: kdewebdev (web development package for the KDE Platform)
kdewebdev:
-kdewebdev: The kdewebdev package contains applications which are useful for
-kdewebdev: web development.
+kdewebdev: The kdewebdev package contains applications which are useful for web
+kdewebdev: development.
kdewebdev:
kdewebdev:
kdewebdev:
diff --git a/kde/slack-desc/kdewebkit b/kde/slack-desc/kdewebkit
index 7bf1eae..d3f30f4 100644
--- a/kde/slack-desc/kdewebkit
+++ b/kde/slack-desc/kdewebkit
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdewebkit: kdewebkit (kdewebkit)
+kdewebkit: kdewebkit (WebKit rendering engine for KDE)
kdewebkit:
+kdewebkit: This library provides KDE integration of the QtWebKit library. If you
+kdewebkit: are using QtWebKit in your KDE application, you are encouraged to use
+kdewebkit: this layer instead of using the QtWebKit classes directly. In
+kdewebkit: particular, you should use KWebView in place of QWebView,
+kdewebkit: KGraphicsWebView in place of QGraphicsWebView and KWebPage in place of
+kdewebkit: QWebPage. See the documentation for more information.
kdewebkit:
kdewebkit:
kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit:
-kdewebkit: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kdf b/kde/slack-desc/kdf
index 896ade4..cb5a935 100644
--- a/kde/slack-desc/kdf
+++ b/kde/slack-desc/kdf
@@ -12,7 +12,7 @@ kdf: kdf (KDiskFree) displays the available file devices (hard drive
kdf: partitions, floppy and CD/DVD drives, etc.) along with information on
kdf: their capacity, free space, type and mount point.
kdf:
-kdf: kdf's home page is: http://utils.kde.org/projects/kdf
+kdf: Homepage: http://utils.kde.org/projects/kdf
kdf:
kdf:
kdf:
diff --git a/kde/slack-desc/kdiagram b/kde/slack-desc/kdiagram
index 7cc07d1..602b4f0 100644
--- a/kde/slack-desc/kdiagram
+++ b/kde/slack-desc/kdiagram
@@ -10,10 +10,10 @@ kdiagram: kdiagram (libraries for creating business diagrams)
kdiagram:
kdiagram: Powerful libraries (KChart, KGantt) for creating business diagrams.
kdiagram:
+kdiagram: Homepage: https://github.com/KDE/kdiagram
kdiagram:
kdiagram:
kdiagram:
kdiagram:
kdiagram:
-kdiagram: For more information, visit: https://github.com/KDE/kdiagram
kdiagram:
diff --git a/kde/slack-desc/kdialog b/kde/slack-desc/kdialog
index a15c57b..43a21c4 100644
--- a/kde/slack-desc/kdialog
+++ b/kde/slack-desc/kdialog
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kdialog: kdialog (utility for displaying dialog boxes from shell scripts)
+kdialog: kdialog (shell dialog box utility)
kdialog:
kdialog: A utility for displaying dialog boxes from shell scripts.
kdialog:
@@ -15,5 +15,5 @@ kdialog:
kdialog:
kdialog:
kdialog:
-kdialog: Home page: http://www.kde.org/
+kdialog:
kdialog:
diff --git a/kde/slack-desc/kdiamond b/kde/slack-desc/kdiamond
index 4c2c7cc..d98f5c9 100644
--- a/kde/slack-desc/kdiamond
+++ b/kde/slack-desc/kdiamond
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kdiamond: kdiamond (three-in-a-row game for KDE)
kdiamond:
-kdiamond: KDiamond is a single player puzzle game. The object of the game is
-kdiamond: to build and remove lines of three similar diamonds.
+kdiamond: KDiamond is a single player puzzle game. The object of the game is to
+kdiamond: build and remove lines of three similar diamonds.
+kdiamond:
kdiamond:
kdiamond:
kdiamond:
kdiamond:
kdiamond:
-kdiamond: For more information, visit: http://www.kde.org
kdiamond:
diff --git a/kde/slack-desc/kdnssd b/kde/slack-desc/kdnssd
index 109946e..0a87fba 100644
--- a/kde/slack-desc/kdnssd
+++ b/kde/slack-desc/kdnssd
@@ -15,5 +15,5 @@ kdnssd:
kdnssd:
kdnssd:
kdnssd:
-kdnssd: For more information, visit: http://www.kde.org
+kdnssd:
kdnssd:
diff --git a/kde/slack-desc/kdoctools b/kde/slack-desc/kdoctools
index 15dbb7a..d558b39 100644
--- a/kde/slack-desc/kdoctools
+++ b/kde/slack-desc/kdoctools
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kdoctools: kdoctools (kdoctools)
+kdoctools: kdoctools (Create documentation from DocBook)
kdoctools:
+kdoctools: KDocTools provides tools to generate documentation in various formats
+kdoctools: from DocBook files.
kdoctools:
kdoctools:
kdoctools:
@@ -15,5 +17,3 @@ kdoctools:
kdoctools:
kdoctools:
kdoctools:
-kdoctools:
-kdoctools: Homepage: http://kde.org/
diff --git a/kde/slack-desc/keditbookmarks b/kde/slack-desc/keditbookmarks
index 343b621..5f31428 100644
--- a/kde/slack-desc/keditbookmarks
+++ b/kde/slack-desc/keditbookmarks
@@ -15,5 +15,5 @@ keditbookmarks:
keditbookmarks:
keditbookmarks:
keditbookmarks:
-keditbookmarks: Home page: http://www.kde.org/
+keditbookmarks:
keditbookmarks:
diff --git a/kde/slack-desc/kemoticons b/kde/slack-desc/kemoticons
index 7f8ca76..ad2c780 100644
--- a/kde/slack-desc/kemoticons
+++ b/kde/slack-desc/kemoticons
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kemoticons: kemoticons (kemoticons)
+kemoticons: kemoticons (Convert text emoticons to graphical emoticons)
kemoticons:
+kemoticons: KEmoticons converts emoticons from text to a graphical representation
+kemoticons: with images in HTML. It supports setting different themes for
+kemoticons: emoticons coming from different providers.
kemoticons:
kemoticons:
kemoticons:
kemoticons:
kemoticons:
kemoticons:
-kemoticons:
-kemoticons:
-kemoticons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kfilemetadata5 b/kde/slack-desc/kfilemetadata5
index 7798f2f..fda33d6 100644
--- a/kde/slack-desc/kfilemetadata5
+++ b/kde/slack-desc/kfilemetadata5
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kfilemetadata5: kfilemetadata5 (a library for extracting file metadata)
kfilemetadata5:
-kfilemetadata5: kfilemetadata5 is a library for extracting file metadata.
+kfilemetadata5: KFileMetaData provides a simple library for extracting the text and
+kfilemetadata5: metadata from a number of different files. This library is typically
+kfilemetadata5: used by file indexers to retreive the metadata. This library can also
+kfilemetadata5: be used by applications to write metadata.
kfilemetadata5:
kfilemetadata5:
kfilemetadata5:
kfilemetadata5:
kfilemetadata5:
-kfilemetadata5:
-kfilemetadata5: For more information, visit: http://www.kde.org
-kfilemetadata5:
diff --git a/kde/slack-desc/kfind b/kde/slack-desc/kfind
index b2b61a1..d2106ed 100644
--- a/kde/slack-desc/kfind
+++ b/kde/slack-desc/kfind
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kfind: kfind (find files and directories in KDE)
kfind:
-kfind: Find files and directories in KDE.
+kfind: The Find Files tool is a useful method of searching for specific files
+kfind: on your computer, or for searching for files that match a pattern. An
+kfind: example of this could include searching for files of a particular type
+kfind: or with certain letters in the filename, or that contain a certain
+kfind: piece of text in their contents.
kfind:
kfind:
kfind:
kfind:
-kfind:
-kfind:
-kfind: Home page: http://www.kde.org/
-kfind:
diff --git a/kde/slack-desc/kfloppy b/kde/slack-desc/kfloppy
index 761f227..a75d375 100644
--- a/kde/slack-desc/kfloppy
+++ b/kde/slack-desc/kfloppy
@@ -11,7 +11,7 @@ kfloppy:
kfloppy: KFloppy is a utility that provides a straightforward graphical means
kfloppy: to format 3.5" and 5.25" floppy disks.
kfloppy:
-kfloppy: kfloppy's home page is: http://utils.kde.org/projects/kfloppy
+kfloppy: Homepage: http://utils.kde.org/projects/kfloppy
kfloppy:
kfloppy:
kfloppy:
diff --git a/kde/slack-desc/kfourinline b/kde/slack-desc/kfourinline
index 78b18d8..3f34a96 100644
--- a/kde/slack-desc/kfourinline
+++ b/kde/slack-desc/kfourinline
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kfourinline: kfourinline (four-in-a-row board game)
kfourinline:
-kfourinline: KFourInLine is a board game for two players based on the
-kfourinline: Connect-Four game. The players try to build up a row of
-kfourinline: four pieces using different strategies.
+kfourinline: KFourInLine is a board game for two players based on the Connect-Four
+kfourinline: game. The players try to build up a row of four pieces using different
+kfourinline: strategies.
+kfourinline:
kfourinline:
kfourinline:
kfourinline:
kfourinline:
-kfourinline: For more information, visit: http://www.kde.org
kfourinline:
diff --git a/kde/slack-desc/kgamma5 b/kde/slack-desc/kgamma5
index 054342a..8a136ea 100644
--- a/kde/slack-desc/kgamma5
+++ b/kde/slack-desc/kgamma5
@@ -10,7 +10,7 @@ kgamma5: kgamma5 (display gamma configuration)
kgamma5:
kgamma5: A KDE system settings module to configure display gamma.
kgamma5:
-kgamma5: For more information, visit: http://www.kde.org
+kgamma5:
kgamma5:
kgamma5:
kgamma5:
diff --git a/kde/slack-desc/kgeography b/kde/slack-desc/kgeography
index cb03bc5..32ecb64 100644
--- a/kde/slack-desc/kgeography
+++ b/kde/slack-desc/kgeography
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kgeography: kgeography (a geography learning tool)
kgeography:
-kgeography: KGeography is a geography learning tool.
-kgeography: Right now it has three usage modes:
-kgeography: * Browse the maps clicking in a map division to see it's name
-kgeography: * The game tells you a map division name and you have to click on it
-kgeography: * The game shows you a map division flag and you have to guess
-kgeography: its name
+kgeography: KGeography is a geography learning tool with three usage modes:
+kgeography:
+kgeography: Browse the maps clicking in a map division to see it's name.
+kgeography: The game tells you a map division name and you have to click on it.
+kgeography: The game shows you a map division flag and you have to guess its name.
+kgeography:
+kgeography: Homepage: http://kgeography.berlios.de/
kgeography:
-kgeography: For more information, visit: http://kgeography.berlios.de/
kgeography:
diff --git a/kde/slack-desc/kget b/kde/slack-desc/kget
index 3103122..c6a0366 100644
--- a/kde/slack-desc/kget
+++ b/kde/slack-desc/kget
@@ -15,5 +15,5 @@ kget:
kget:
kget:
kget:
-kget: For more information, visit: http://www.kde.org
+kget:
kget:
diff --git a/kde/slack-desc/kglobalaccel b/kde/slack-desc/kglobalaccel
index 2d84ff4..78d77e5 100644
--- a/kde/slack-desc/kglobalaccel
+++ b/kde/slack-desc/kglobalaccel
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kglobalaccel: kglobalaccel (kglobalaccel)
+kglobalaccel: kglobalaccel (Global desktop keyboard shortcuts)
kglobalaccel:
+kglobalaccel: KGlobalAccel allows you to have global accelerators that are
+kglobalaccel: independent of the focused window. Unlike regular shortcuts, the
+kglobalaccel: application's window does not need focus for them to be activated.
kglobalaccel:
kglobalaccel:
kglobalaccel:
kglobalaccel:
kglobalaccel:
kglobalaccel:
-kglobalaccel:
-kglobalaccel:
-kglobalaccel: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kgoldrunner b/kde/slack-desc/kgoldrunner
index 6b067c1..4f31499 100644
--- a/kde/slack-desc/kgoldrunner
+++ b/kde/slack-desc/kgoldrunner
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kgoldrunner: kgoldrunner (Hunt gold, dodge enemies and solve puzzles)
kgoldrunner:
-kgoldrunner: KGoldrunner is a maze-threading game with a puzzle flavor.
-kgoldrunner: It has hundreds of levels where pieces of gold must be collected,
-kgoldrunner: with enemies in hot pursuit.
+kgoldrunner: KGoldrunner is a maze-threading game with a puzzle flavor. It has
+kgoldrunner: hundreds of levels where pieces of gold must be collected, with
+kgoldrunner: enemies in hot pursuit.
+kgoldrunner:
kgoldrunner:
kgoldrunner:
kgoldrunner:
kgoldrunner:
-kgoldrunner: For more information, visit: http://www.kde.org
kgoldrunner:
diff --git a/kde/slack-desc/kgpg b/kde/slack-desc/kgpg
index 51975cd..5dd7769 100644
--- a/kde/slack-desc/kgpg
+++ b/kde/slack-desc/kgpg
@@ -10,7 +10,7 @@ kgpg: kgpg (KDE GUI for GnuPG)
kgpg:
kgpg: KGpg is a simple interface for GnuPG, a powerful encryption utility.
kgpg:
-kgpg: kgpg's home page is: http://utils.kde.org/projects/kgpg
+kgpg: Homepage: http://utils.kde.org/projects/kgpg
kgpg:
kgpg:
kgpg:
diff --git a/kde/slack-desc/kguiaddons b/kde/slack-desc/kguiaddons
index e181d67..afb4ef4 100644
--- a/kde/slack-desc/kguiaddons
+++ b/kde/slack-desc/kguiaddons
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kguiaddons: kguiaddons (kguiaddons)
+kguiaddons: kguiaddons (KDE GUI Addons)
kguiaddons:
+kguiaddons: The KDE GUI addons provide utilities for graphical user interfaces in
+kguiaddons: the areas of colors, fonts, text, images, and keyboard input.
kguiaddons:
kguiaddons:
kguiaddons:
@@ -15,5 +17,3 @@ kguiaddons:
kguiaddons:
kguiaddons:
kguiaddons:
-kguiaddons:
-kguiaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/khangman b/kde/slack-desc/khangman
index eaf9a85..430e0ea 100644
--- a/kde/slack-desc/khangman
+++ b/kde/slack-desc/khangman
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-khangman: khangman (classical hangman game)
+khangman: khangman (hangman game)
khangman:
khangman: KHangman is the classical hangman game. The child should guess a word
-khangman: letter by letter. At each miss, the picture of a hangman appears.
+khangman: letter by letter. At each miss, the picture of a hangman appears.
khangman: After 10 tries, if the word is not guessed, the game is over and
khangman: the answer is displayed.
khangman:
-khangman: For more information, visit: http://edu.kde.org/
+khangman:
khangman:
khangman:
khangman:
diff --git a/kde/slack-desc/khelpcenter b/kde/slack-desc/khelpcenter
index 8fad4a2..0d01cb9 100644
--- a/kde/slack-desc/khelpcenter
+++ b/kde/slack-desc/khelpcenter
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
khelpcenter: khelpcenter (KDE help center)
khelpcenter:
-khelpcenter: The KDE Help Center displays documentation on how to
-khelpcenter: use the KDE plasma workspaces and applications, as
-khelpcenter: well as UNIX man and info pages. It can search through
-khelpcenter: documentation using the 'htdig' package.
+khelpcenter: The KDE Help Center displays documentation on how to use the KDE
+khelpcenter: plasma workspaces and applications, as well as man and info pages.
+khelpcenter: It can search through documentation using the 'htdig' package.
+khelpcenter:
+khelpcenter:
khelpcenter:
khelpcenter:
khelpcenter:
khelpcenter:
-khelpcenter: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kholidays b/kde/slack-desc/kholidays
index 06fa51c..5db18cd 100644
--- a/kde/slack-desc/kholidays
+++ b/kde/slack-desc/kholidays
@@ -9,11 +9,11 @@
kholidays: kholidays (KDE library for regional holiday information)
kholidays:
kholidays: The KHolidays library in kdepimlibs provides details on public
-kholidays: holidays for a given country and date range.
-kholidays: A separate library and file format is required as iCalendar is not
-kholidays: capable of expressing recurrence rules for all possible holidays.
+kholidays: holidays for a given country and date range. A separate library and
+kholidays: file format is required as iCalendar is not capable of expressing
+kholidays: recurrence rules for all possible holidays.
+kholidays:
kholidays:
kholidays:
kholidays:
-kholidays: Home page: http://www.kde.org/
kholidays:
diff --git a/kde/slack-desc/khotkeys b/kde/slack-desc/khotkeys
index e523744..d737837 100644
--- a/kde/slack-desc/khotkeys
+++ b/kde/slack-desc/khotkeys
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-khotkeys: khotkeys (khotkeys)
+khotkeys: khotkeys (custom shortcuts)
+khotkeys:
+khotkeys: The Custom Shortcuts systemsettings module allows you to configure
+khotkeys: custom keyboard shortcuts and mouse gestures. You can use them to
+khotkeys: control applications, run specific commands, and more.
+khotkeys:
khotkeys:
-khotkeys: The Custom Shortcuts systemsettings module allows you to
-khotkeys: configure custom keyboard shortcuts and mouse gestures. You
-khotkeys: can use them to control applications, run specific commands,
-khotkeys: and more.
khotkeys:
khotkeys:
khotkeys:
khotkeys:
-khotkeys: Homepage: http://kde.org/
diff --git a/kde/slack-desc/khtml b/kde/slack-desc/khtml
index 493ed69..b4c4332 100644
--- a/kde/slack-desc/khtml
+++ b/kde/slack-desc/khtml
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-khtml: khtml (khtml)
+khtml: khtml (HTML rendering engine)
khtml:
+khtml: KHTML is a web rendering engine based on the KParts technology and
+khtml: using KJS for JavaScript support.
khtml:
khtml:
khtml:
@@ -15,5 +17,3 @@ khtml:
khtml:
khtml:
khtml:
-khtml:
-khtml: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ki18n b/kde/slack-desc/ki18n
index 8c2e9d3..49b80c2 100644
--- a/kde/slack-desc/ki18n
+++ b/kde/slack-desc/ki18n
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-ki18n: ki18n (ki18n)
+ki18n: ki18n (UI text internationalization)
ki18n:
+ki18n: KI18n provides functionality for internationalizing user interface
+ki18n: text in applications, based on the GNU Gettext translation system.
+ki18n: It wraps the standard Gettext functionality, so that the programmers
+ki18n: and translators can use the familiar Gettext tools and workflows.
+ki18n: KI18n also provides argument capturing, customizable markup, and
+ki18n: translation scripting.
ki18n:
ki18n:
ki18n:
-ki18n:
-ki18n:
-ki18n:
-ki18n:
-ki18n:
-ki18n: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kiconthemes b/kde/slack-desc/kiconthemes
index 69e43fd..44e4d46 100644
--- a/kde/slack-desc/kiconthemes
+++ b/kde/slack-desc/kiconthemes
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kiconthemes: kiconthemes (kiconthemes)
+kiconthemes: kiconthemes (Icon GUI utilities)
kiconthemes:
+kiconthemes: The KIconThemes library contains classes to improve the handling of
+kiconthemes: icons in applications using the KDE Frameworks.
kiconthemes:
kiconthemes:
kiconthemes:
@@ -15,5 +17,3 @@ kiconthemes:
kiconthemes:
kiconthemes:
kiconthemes:
-kiconthemes:
-kiconthemes: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kid3 b/kde/slack-desc/kid3
index 1412fbf..9a2ecc1 100644
--- a/kde/slack-desc/kid3
+++ b/kde/slack-desc/kid3
@@ -9,11 +9,11 @@
kid3: kid3 (audio tagger)
kid3:
kid3: If you want to easily tag multiple MP3, Ogg/Vorbis, FLAC, MPC,
-kid3: MP4/AAC, MP2, Opus, Speex, TrueAudio, WavPack, WMA, WAV and AIFF
-kid3: files (e.g. full albums) without typing the same information
-kid3: again and again and have control over both ID3v1 and ID3v2 tags,
-kid3: then Kid3 is the program you are looking for.
+kid3: MP4/AAC, MP2, Opus, Speex, TrueAudio, WavPack, WMA, WAV and AIFF files
+kid3: (e.g. full albums) without typing the same information again and again
+kid3: and have control over both ID3v1 and ID3v2 tags, then Kid3 is the
+kid3: program you are looking for.
kid3:
+kid3: Homepage: http://kid3.kde.org/
kid3:
-kid3: Home page: http://kid3.kde.org/
kid3:
diff --git a/kde/slack-desc/kidentitymanagement b/kde/slack-desc/kidentitymanagement
index e3f8204..f0c5412 100644
--- a/kde/slack-desc/kidentitymanagement
+++ b/kde/slack-desc/kidentitymanagement
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kidentitymanagement: kidentitymanagement (the KIdentityManagement Library)
+kidentitymanagement: kidentitymanagement (Manage PIM identity)
kidentitymanagement:
kidentitymanagement: kidentitymanagement contains the KIdentityManagement Library.
kidentitymanagement:
@@ -15,5 +15,5 @@ kidentitymanagement:
kidentitymanagement:
kidentitymanagement:
kidentitymanagement:
-kidentitymanagement: Home page: http://www.kde.org/
+kidentitymanagement:
kidentitymanagement:
diff --git a/kde/slack-desc/kidletime b/kde/slack-desc/kidletime
index dd28a29..2116f6b 100644
--- a/kde/slack-desc/kidletime
+++ b/kde/slack-desc/kidletime
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kidletime: kidletime (kidletime)
+kidletime: kidletime (report system/user idle time)
kidletime:
+kidletime: KIdleTime is a singleton reporting information on idle time. It is
+kidletime: useful not only for finding out about the current idle time of the
+kidletime: system, but also for getting notified upon idle time events, such as
+kidletime: custom timeouts or user activity.
kidletime:
kidletime:
kidletime:
kidletime:
kidletime:
-kidletime:
-kidletime:
-kidletime:
-kidletime: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kig b/kde/slack-desc/kig
index 062fa2b..6d53887 100644
--- a/kde/slack-desc/kig
+++ b/kde/slack-desc/kig
@@ -12,7 +12,7 @@ kig: Kig is an application meant to allow high school students to
kig: interactively explore mathematical concepts, much like Dr.Geo, KGeo,
kig: KSeg and Cabri.
kig:
-kig: For more information, visit: http://edu.kde.org/kig/
+kig: Homepage: http://edu.kde.org/kig/
kig:
kig:
kig:
diff --git a/kde/slack-desc/kigo b/kde/slack-desc/kigo
index 3939e01..ec17269 100644
--- a/kde/slack-desc/kigo
+++ b/kde/slack-desc/kigo
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kigo: kigo (Go board game for KDE)
kigo:
-kigo: Kigo is an open-source implementation of the popular Go game.
-kigo: Go is a strategic board game for two players. It is also known as igo
+kigo: Kigo is an open-source implementation of the popular Go game. Go is a
+kigo: strategic board game for two players. It is also known as igo
kigo: (Japanese), weiqi or wei ch'i (Chinese) or baduk (Korean). Go is noted
-kigo: for being rich in strategic complexity despite its simple rules.
-kigo: The game is played by two players who alternately place black and
-kigo: white pieces on the vacant intersections of a grid of 19x19 lines
-kigo: (9x9 or 13x13 for easier games).
+kigo: for being rich in strategic complexity despite its simple rules. The
+kigo: game is played by two players who alternately place black and white
+kigo: pieces on the vacant intersections of a grid of 19x19 lines (9x9 or
+kigo: 13x13 for easier games).
+kigo:
kigo:
-kigo: For more information, visit: http://www.kde.org
diff --git a/kde/slack-desc/kile b/kde/slack-desc/kile
index a6cd1de..e51d9f4 100644
--- a/kde/slack-desc/kile
+++ b/kde/slack-desc/kile
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kile: kile (TeX/LaTeX frontend for Plasma5)
kile:
-kile: kile is a user-friendly TeX/LaTeX editor
-kile: for the KDE desktop environment.
+kile: kile is a user-friendly TeX/LaTeX editor for the KDE desktop environment.
+kile:
+kile: Homepage: https://kile.sourceforge.io
kile:
kile:
kile:
kile:
kile:
-kile: Home page: https://kile.sourceforge.io
kile:
diff --git a/kde/slack-desc/killbots b/kde/slack-desc/killbots
index 6acee05..20c6813 100644
--- a/kde/slack-desc/killbots
+++ b/kde/slack-desc/killbots
@@ -15,5 +15,5 @@ killbots:
killbots:
killbots:
killbots:
-killbots: For more information, visit: http://www.kde.org
+killbots:
killbots:
diff --git a/kde/slack-desc/kimageformats b/kde/slack-desc/kimageformats
index d926b6c..a396e21 100644
--- a/kde/slack-desc/kimageformats
+++ b/kde/slack-desc/kimageformats
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kimageformats: kimageformats (kimageformats)
+kimageformats: kimageformats (QImage format plugins)
kimageformats:
+kimageformats: This framework provides additional image format plugins for QtGui. As
+kimageformats: such it is not required for the compilation of any other software, but
+kimageformats: may be a runtime requirement for Qt-based software to support certain
+kimageformats: image formats.
kimageformats:
kimageformats:
kimageformats:
kimageformats:
kimageformats:
-kimageformats:
-kimageformats:
-kimageformats:
-kimageformats: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kimagemapeditor b/kde/slack-desc/kimagemapeditor
index 83a2fd1..a36dee0 100644
--- a/kde/slack-desc/kimagemapeditor
+++ b/kde/slack-desc/kimagemapeditor
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kimagemapeditor: kimagemapeditor (HTML image map editor)
kimagemapeditor:
-kimagemapeditor: HTML image map editor.
+kimagemapeditor: An HTML image map editor.
+kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
kimagemapeditor:
-kimagemapeditor: Home page: http://www.kde.org/
kimagemapeditor:
diff --git a/kde/slack-desc/kimap b/kde/slack-desc/kimap
index dd28481..9348ef0 100644
--- a/kde/slack-desc/kimap
+++ b/kde/slack-desc/kimap
@@ -15,5 +15,5 @@ kimap:
kimap:
kimap:
kimap:
-kimap: Home page: http://www.kde.org/
+kimap:
kimap:
diff --git a/kde/slack-desc/kinfocenter b/kde/slack-desc/kinfocenter
index 27610d9..e3230a3 100644
--- a/kde/slack-desc/kinfocenter
+++ b/kde/slack-desc/kinfocenter
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kinfocenter: kinfocenter (provide information about your computer)
+kinfocenter: kinfocenter (info about your computer)
+kinfocenter:
+kinfocenter: KInfocenter gives you a host of information about your hardware and
+kinfocenter: its capabilities.
kinfocenter:
-kinfocenter: KInfocenter gives you a host of information about your
-kinfocenter: hardware and its capabilities.
kinfocenter:
kinfocenter:
kinfocenter:
kinfocenter:
kinfocenter:
kinfocenter:
-kinfocenter: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kinit b/kde/slack-desc/kinit
index cf11155..fa95f06 100644
--- a/kde/slack-desc/kinit
+++ b/kde/slack-desc/kinit
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kinit: kinit (kinit)
+kinit: kinit (startup helper library)
kinit:
+kinit: kdeinit is a process launcher somewhat similar to the famous init used
+kinit: for booting. It launches processes by forking and then loading a
+kinit: dynamic library which should contain a 'kdemain(...)' function. Using
+kinit: kdeinit to launch KDE applications makes starting a typical KDE
+kinit: application 2.5 times faster and reduces memory consumption.
kinit:
kinit:
kinit:
kinit:
-kinit:
-kinit:
-kinit:
-kinit:
-kinit: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kio b/kde/slack-desc/kio
index 1608c7c..a455bfd 100644
--- a/kde/slack-desc/kio
+++ b/kde/slack-desc/kio
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kio: kio (kio)
+kio: kio (network transparent file library)
kio:
+kio: This framework implements almost all the file management functions you
+kio: will ever need. In fact, the KDE file manager (Dolphin) and the KDE
+kio: file dialog also use this to provide network-enabled file management.
+kio: It supports accessing files locally as well as via HTTP and FTP out of
+kio: the box and can be extended by plugins to support other protocols as
+kio: well. There are a variety of plugins available, e.g. to support access
+kio: via SSH.
kio:
kio:
-kio:
-kio:
-kio:
-kio:
-kio:
-kio:
-kio: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kio-extras b/kde/slack-desc/kio-extras
index bc27db3..1b68693 100644
--- a/kde/slack-desc/kio-extras
+++ b/kde/slack-desc/kio-extras
@@ -8,7 +8,8 @@
|-----handy-ruler------------------------------------------------------|
kio-extras: kio-extras (Additional components for KIO)
kio-extras:
-kio-extras: Additional components to increase the functionality of KIO
+kio-extras: Additional components to increase the functionality of KIO.
+kio-extras:
kio-extras:
kio-extras:
kio-extras:
@@ -16,4 +17,3 @@ kio-extras:
kio-extras:
kio-extras:
kio-extras:
-kio-extras: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kipi-plugins b/kde/slack-desc/kipi-plugins
index 7b4f0e1..0807d60 100644
--- a/kde/slack-desc/kipi-plugins
+++ b/kde/slack-desc/kipi-plugins
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kipi-plugins: kipi-plugins (graphics and image plugins)
kipi-plugins:
+kipi-plugins: A collection of plugins extending the KDE graphics and image
+kipi-plugins: applications.
kipi-plugins:
-kipi-plugins: A collection of plugins extending the KDE graphics and
-kipi-plugins: image applications.
+kipi-plugins: Homepage: https://userbase.kde.org/KIPI
kipi-plugins:
kipi-plugins:
kipi-plugins:
kipi-plugins:
-kipi-plugins: Home page: https://userbase.kde.org/KIPI
kipi-plugins:
diff --git a/kde/slack-desc/kirigami-gallery b/kde/slack-desc/kirigami-gallery
index 33b4fbf..5bc01bc 100644
--- a/kde/slack-desc/kirigami-gallery
+++ b/kde/slack-desc/kirigami-gallery
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kirigami-gallery: kirigami-gallery (Gallery application built using Kirigami)
kirigami-gallery:
-kirigami-gallery: Kirigami-gallery is an example gallery application
-kirigami-gallery: built using Kirigami.
+kirigami-gallery: Kirigami-gallery is an example gallery application built using
+kirigami-gallery: Kirigami.
kirigami-gallery:
+kirigami-gallery: Homepage: https://www.kde.org/products/kirigami/
kirigami-gallery:
kirigami-gallery:
kirigami-gallery:
kirigami-gallery:
-kirigami-gallery: Home page: https://www.kde.org/products/kirigami/
kirigami-gallery:
diff --git a/kde/slack-desc/kirigami2 b/kde/slack-desc/kirigami2
index 5a4c4d8..26b733b 100644
--- a/kde/slack-desc/kirigami2
+++ b/kde/slack-desc/kirigami2
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kirigami2: kirigami2 (interface components for QtQuick)
kirigami2:
+kirigami2: Kirigami is a set of user interface components created to enable the
+kirigami2: creation of pleasant, efficient applications by KDE's Plasma team and
+kirigami2: the KDE Visual Design Group.
+kirigami2:
kirigami2:
-kirigami2: Kirigami is a set of user interface components created to enable
-kirigami2: the creation of pleasant, efficient applications,
-kirigami2: by KDE's Plasma team and the KDE Visual Design Group.
kirigami2:
kirigami2:
kirigami2:
-kirigami2: Home page: http://www.kde.org/
kirigami2:
diff --git a/kde/slack-desc/kiriki b/kde/slack-desc/kiriki
index cc09bbf..d9b70fa 100644
--- a/kde/slack-desc/kiriki
+++ b/kde/slack-desc/kiriki
@@ -9,11 +9,11 @@
kiriki: kiriki (yahtzee-like dice game for KDE)
kiriki:
kiriki: Kiriki is an addictive and fun dice game for KDE, designed to be
-kiriki: played by as many as six players. Participants have to collect points
+kiriki: played by as many as six players. Participants have to collect points
kiriki: by rolling five dice for up to three times per single turn.
kiriki:
kiriki:
kiriki:
kiriki:
-kiriki: For more information, visit: http://www.kde.org
+kiriki:
kiriki:
diff --git a/kde/slack-desc/kitemmodels b/kde/slack-desc/kitemmodels
index 74b7bd2..80daba3 100644
--- a/kde/slack-desc/kitemmodels
+++ b/kde/slack-desc/kitemmodels
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kitemmodels: kitemmodels (kitemmodels)
+kitemmodels: kitemmodels (Qt model-view extensions)
kitemmodels:
+kitemmodels: KItemModels is a set of item models extending the Qt model-view
+kitemmodels: framework.
kitemmodels:
kitemmodels:
kitemmodels:
@@ -15,5 +17,3 @@ kitemmodels:
kitemmodels:
kitemmodels:
kitemmodels:
-kitemmodels:
-kitemmodels: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kitemviews b/kde/slack-desc/kitemviews
index 3f2f2e3..1d6ddb5 100644
--- a/kde/slack-desc/kitemviews
+++ b/kde/slack-desc/kitemviews
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kitemviews: kitemviews (kitemviews)
+kitemviews: kitemviews (Qt item-view extensions)
kitemviews:
+kitemviews: KItemViews includes a set of views, which can be used with item
+kitemviews: models. It includes views for categorizing lists and to add search
+kitemviews: filters to flat and hierarchical lists.
kitemviews:
kitemviews:
kitemviews:
kitemviews:
kitemviews:
kitemviews:
-kitemviews:
-kitemviews:
-kitemviews: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kiten b/kde/slack-desc/kiten
index a2a60f4..7af04b3 100644
--- a/kde/slack-desc/kiten
+++ b/kde/slack-desc/kiten
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kiten: kiten (a tool to learn Japanese)
-kiten:
-kiten: Kiten is a tool to learn Japanese.
-kiten:
-kiten: For more information, visit: http://edu.kde.org/
-kiten:
+kiten: kiten (Japanese reference tool)
kiten:
+kiten: Kiten is a Japanese reference tool. Kiten works mainly as a Japanese
+kiten: -> English dictionary, but it works from English -> Japanese too. This
+kiten: means you can write in English, Hiragana, Katakana, or Kanji to search
+kiten: in the dictionaries.
kiten:
+kiten: Homepage: https://www.kde.org/applications/education/kiten
kiten:
kiten:
kiten:
diff --git a/kde/slack-desc/kitinerary b/kde/slack-desc/kitinerary
index b6c9781..e6f9556 100644
--- a/kde/slack-desc/kitinerary
+++ b/kde/slack-desc/kitinerary
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kitinerary: kitinerary (library for itinerary data model/extraction)
+kitinerary: kitinerary (library for itinerary data)
kitinerary:
kitinerary: Data model and extraction system for travel reservation information.
kitinerary:
+kitinerary: Homepage: https://api.kde.org/kdepim/kitinerary/html/index.html
kitinerary:
kitinerary:
kitinerary:
kitinerary:
kitinerary:
-kitinerary: Home page: https://community.kde.org/KDE_PIM
kitinerary:
diff --git a/kde/slack-desc/kjobwidgets b/kde/slack-desc/kjobwidgets
index b775eb1..917f069 100644
--- a/kde/slack-desc/kjobwidgets
+++ b/kde/slack-desc/kjobwidgets
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kjobwidgets: kjobwidgets (kjobwidgets)
+kjobwidgets: kjobwidgets (job progress widgets)
kjobwidgets:
+kjobwidgets: KJobWIdgets provides widgets for showing progress of asynchronous
+kjobwidgets: jobs.
kjobwidgets:
kjobwidgets:
kjobwidgets:
@@ -15,5 +17,3 @@ kjobwidgets:
kjobwidgets:
kjobwidgets:
kjobwidgets:
-kjobwidgets:
-kjobwidgets: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kjots b/kde/slack-desc/kjots
index fed98a0..f5c10e1 100644
--- a/kde/slack-desc/kjots
+++ b/kde/slack-desc/kjots
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kjots: kjots (KDE note-taking application)
kjots:
-kjots: KJots is a note-taking application that used to be part of KDE PIM
-kjots: back in KDE4 times.
-kjots: KJots organises all of your notes into separate books.
+kjots: KJots is a note-taking application that organises all of your notes
+kjots: into separate books.
+kjots:
+kjots: Homepage: https://www.kde.org/applications/utilities/kjots/
kjots:
kjots:
kjots:
kjots:
-kjots: For more information, visit: https://www.kde.org/applications/utilities/kjots/
kjots:
diff --git a/kde/slack-desc/kjs b/kde/slack-desc/kjs
index 57a424d..1c0249a 100644
--- a/kde/slack-desc/kjs
+++ b/kde/slack-desc/kjs
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kjs: kjs (kjs)
+kjs: kjs (Javascript engine)
kjs:
+kjs: The KJS library provides an ECMAScript compatible interpreter. The
+kjs: ECMA standard is based on well known scripting languages such as
+kjs: Mozilla's JavaScript and Microsoft's JScript.
kjs:
kjs:
kjs:
kjs:
kjs:
kjs:
-kjs:
-kjs:
-kjs: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kjsembed b/kde/slack-desc/kjsembed
index a8c3d7a..3344b54 100644
--- a/kde/slack-desc/kjsembed
+++ b/kde/slack-desc/kjsembed
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kjsembed: kjsembed (kjsembed)
+kjsembed: kjsembed (Binding Javascript to QObjects)
kjsembed:
+kjsembed: KSJEmbed provides a method of binding JavaScript objects to QObjects
+kjsembed: so you can script your applications.
kjsembed:
kjsembed:
kjsembed:
@@ -15,5 +17,3 @@ kjsembed:
kjsembed:
kjsembed:
kjsembed:
-kjsembed:
-kjsembed: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kjumpingcube b/kde/slack-desc/kjumpingcube
index e8646f9..3911331 100644
--- a/kde/slack-desc/kjumpingcube
+++ b/kde/slack-desc/kjumpingcube
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kjumpingcube: kjumpingcube (territory capture game)
kjumpingcube:
-kjumpingcube: KJumpingcube is a simple dice driven tactical game.
-kjumpingcube: The playing area consists of squares containing points.
-kjumpingcube: Players move by clicking on either a vacant square,
-kjumpingcube: or on one of their own squares.
+kjumpingcube: KJumpingcube is a simple dice driven tactical game. The playing area
+kjumpingcube: consists of squares containing points. Players move by clicking on
+kjumpingcube: either a vacant square, or on one of their own squares.
+kjumpingcube:
+kjumpingcube:
kjumpingcube:
kjumpingcube:
kjumpingcube:
-kjumpingcube: For more information, visit: http://www.kde.org
kjumpingcube:
diff --git a/kde/slack-desc/kldap b/kde/slack-desc/kldap
index bc98613..e03ccc5 100644
--- a/kde/slack-desc/kldap
+++ b/kde/slack-desc/kldap
@@ -15,5 +15,5 @@ kldap:
kldap:
kldap:
kldap:
-kldap: Home page: http://www.kde.org/
+kldap:
kldap:
diff --git a/kde/slack-desc/kleopatra b/kde/slack-desc/kleopatra
index 0c83801..cbd33bf 100644
--- a/kde/slack-desc/kleopatra
+++ b/kde/slack-desc/kleopatra
@@ -15,5 +15,5 @@ kleopatra:
kleopatra:
kleopatra:
kleopatra:
-kleopatra: Home page: http://www.kde.org/
+kleopatra:
kleopatra:
diff --git a/kde/slack-desc/klettres b/kde/slack-desc/klettres
index d1bb370..c098d4c 100644
--- a/kde/slack-desc/klettres
+++ b/kde/slack-desc/klettres
@@ -9,11 +9,11 @@
klettres: klettres (language learning program)
klettres:
klettres: KLettres aims to help to learn the alphabet and then to read some
-klettres: syllables in different languages.
-klettres: It is meant to help learning the very first sounds of a new language,
-klettres: for children or for adults.
+klettres: syllables in different languages. It is meant to help learning the
+klettres: very first sounds of a new language, for children or for adults.
+klettres:
+klettres: Homepage: http://edu.kde.org/klettres
klettres:
-klettres: For more information, visit: http://edu.kde.org/klettres
klettres:
klettres:
klettres:
diff --git a/kde/slack-desc/klickety b/kde/slack-desc/klickety
index e35b2a3..f58f944 100644
--- a/kde/slack-desc/klickety
+++ b/kde/slack-desc/klickety
@@ -9,11 +9,11 @@
klickety: klickety (strategy game)
klickety:
klickety: Klickety is a strategy game for KDE, an adaption of the Clickomania
-klickety: game.
-klickety: The rules are similar to those of the Same game: your goal is to clear
-klickety: the board by clicking on groups to destroy them.
+klickety: game. The rules are similar to those of the Same game: your goal is to
+klickety: clear the board by clicking on groups to destroy them.
+klickety:
+klickety:
klickety:
klickety:
klickety:
-klickety: For more information, visit: http://www.kde.org
klickety:
diff --git a/kde/slack-desc/klines b/kde/slack-desc/klines
index 193eee1..0e0b9e7 100644
--- a/kde/slack-desc/klines
+++ b/kde/slack-desc/klines
@@ -10,10 +10,10 @@ klines: klines (tactical game for KDE)
klines:
klines: KLines is a simple but highly addictive, one player game for KDE.
klines: KLines has been inspired by well known game of Color Lines, written
-klines: by Olga Demina, Igor Ivkin and Gennady Denisov back in 1992.
-klines: You can also play an online demo version of this game.
+klines: by Olga Demina, Igor Ivkin and Gennady Denisov back in 1992. You can
+klines: also play an online demo version of this game.
+klines:
klines:
klines:
klines:
-klines: For more information, visit: http://www.kde.org
klines:
diff --git a/kde/slack-desc/kmag b/kde/slack-desc/kmag
index b054802..5f85cd6 100644
--- a/kde/slack-desc/kmag
+++ b/kde/slack-desc/kmag
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
kmag: kmag (Screen magnifier)
kmag:
-kmag: Magnifies a part of your screen.
-kmag:
-kmag: For more information, visit: http://www.kde.org
-kmag:
+kmag: KMag is a small utility for Linux to magnify a part of the screen.
+kmag: KMag is very useful for people with visual disabilities and for those
+kmag: working in the fields of image analysis, web development etc.
kmag:
+kmag: Homepage: https://kde.org/applications/utilities/org.kde.kmag
kmag:
kmag:
kmag:
diff --git a/kde/slack-desc/kmahjongg b/kde/slack-desc/kmahjongg
index cd653a9..bb73c98 100644
--- a/kde/slack-desc/kmahjongg
+++ b/kde/slack-desc/kmahjongg
@@ -9,11 +9,11 @@
kmahjongg: kmahjongg (KDE port of Mahjongg game)
kmahjongg:
kmahjongg: KMahjongg is a clone of the well known tile based patience game of
-kmahjongg: the same name. In the game you have to empty a game board filled
-kmahjongg: with pieces, by pairwise removal of pieces of the same type.
+kmahjongg: the same name. In the game you have to empty a game board filled with
+kmahjongg: pieces, by pairwise removal of pieces of the same type.
+kmahjongg:
kmahjongg:
kmahjongg:
kmahjongg:
kmahjongg:
-kmahjongg: For more information, visit: http://www.kde.org
kmahjongg:
diff --git a/kde/slack-desc/kmail b/kde/slack-desc/kmail
index d4f3849..9fa9a89 100644
--- a/kde/slack-desc/kmail
+++ b/kde/slack-desc/kmail
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmail: kmail (KDE mail client)
kmail:
-kmail: KDE e-mail client.
+kmail: KMail is a state-of-the-art email client that integrates well with
+kmail: widely used email providers like GMail. It provides many tools and
+kmail: features to maximize your productivity and makes working with large
+kmail: email accounts easy and fast. KMail supports a large variety of email
+kmail: protocols - POP3, IMAP, Microsoft Exchange (EWS) and more.
+kmail:
+kmail: Homepage: https://kde.org/applications/en/internet/org.kde.kmail2
kmail:
kmail:
-kmail:
-kmail:
-kmail:
-kmail:
-kmail: Home page: http://www.kde.org/
-kmail:
diff --git a/kde/slack-desc/kmail-account-wizard b/kde/slack-desc/kmail-account-wizard
index eeacecb..d7693d4 100644
--- a/kde/slack-desc/kmail-account-wizard
+++ b/kde/slack-desc/kmail-account-wizard
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmail-account-wizard: kmail-account-wizard (KMail account wizard)
kmail-account-wizard:
-kmail-account-wizard: KMail account wizard.
+kmail-account-wizard: This is a setup wizard for KMail that will take you through the
+kmail-account-wizard: process of creating your email accounts.
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
kmail-account-wizard:
-kmail-account-wizard: Home page: http://www.kde.org/
kmail-account-wizard:
diff --git a/kde/slack-desc/kmailtransport b/kde/slack-desc/kmailtransport
index 644708e..6d5a8c4 100644
--- a/kde/slack-desc/kmailtransport
+++ b/kde/slack-desc/kmailtransport
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmailtransport: kmailtransport (mail transport service)
kmailtransport:
-kmailtransport: Mail Transport Service for KDE.
+kmailtransport: Mail Transport Service for KMail.
+kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
kmailtransport:
-kmailtransport: Home page: http://www.kde.org/
kmailtransport:
diff --git a/kde/slack-desc/kmbox b/kde/slack-desc/kmbox
index 46f26a5..cea25c1 100644
--- a/kde/slack-desc/kmbox
+++ b/kde/slack-desc/kmbox
@@ -15,5 +15,5 @@ kmbox:
kmbox:
kmbox:
kmbox:
-kmbox: Home page: http://www.kde.org/
+kmbox:
kmbox:
diff --git a/kde/slack-desc/kmediaplayer b/kde/slack-desc/kmediaplayer
index e6e4a37..3aaa39e 100644
--- a/kde/slack-desc/kmediaplayer
+++ b/kde/slack-desc/kmediaplayer
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kmediaplayer: kmediaplayer (kmediaplayer)
+kmediaplayer: kmediaplayer (Interface for media player KParts)
kmediaplayer:
+kmediaplayer: KMediaPlayer builds on the KParts framework to provide a common
+kmediaplayer: interface for KParts that can play media files.
kmediaplayer:
kmediaplayer:
kmediaplayer:
@@ -15,5 +17,3 @@ kmediaplayer:
kmediaplayer:
kmediaplayer:
kmediaplayer:
-kmediaplayer:
-kmediaplayer: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kmenuedit b/kde/slack-desc/kmenuedit
index 97df6b0..5e76543 100644
--- a/kde/slack-desc/kmenuedit
+++ b/kde/slack-desc/kmenuedit
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmenuedit: kmenuedit (XDG menu editor)
kmenuedit:
-kmenuedit: This package provides a menu editor which may be used to
-kmenuedit: edit the KDE Plasma workspaces menu or any other XDG menu.
+kmenuedit: This package provides a menu editor which may be used to edit the KDE
+kmenuedit: Plasma workspaces menu or any other XDG menu.
+kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
kmenuedit:
-kmenuedit: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kmime b/kde/slack-desc/kmime
index d1ba959..761ff0c 100644
--- a/kde/slack-desc/kmime
+++ b/kde/slack-desc/kmime
@@ -15,5 +15,5 @@ kmime:
kmime:
kmime:
kmime:
-kmime: Home page: http://www.kde.org/
+kmime:
kmime:
diff --git a/kde/slack-desc/kmines b/kde/slack-desc/kmines
index 16981d2..bb7b09a 100644
--- a/kde/slack-desc/kmines
+++ b/kde/slack-desc/kmines
@@ -9,11 +9,11 @@
kmines: kmines (minesweeper clone for KDE)
kmines:
kmines: KMines is the classic Minesweeper game. The idea is to uncover all
-kmines: the squares without blowing up any mines. When a mine is blown up,
+kmines: the squares without blowing up any mines. When a mine is blown up,
kmines: the game is over.
kmines:
kmines:
kmines:
kmines:
-kmines: For more information, visit: http://www.kde.org
+kmines:
kmines:
diff --git a/kde/slack-desc/kmix b/kde/slack-desc/kmix
index 0325cdb..fd0feed 100644
--- a/kde/slack-desc/kmix
+++ b/kde/slack-desc/kmix
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmix: kmix (sound mixer)
kmix:
-kmix: KMix is an application to allow you to change the volume of your
-kmix: sound card. Though small, it is full-featured, and it supports
-kmix: several platforms and sound drivers.
+kmix: KMix is an application to allow you to change the volume of your sound
+kmix: card. Though small, it is full-featured, and it supports several
+kmix: platforms and sound drivers.
+kmix:
kmix:
kmix:
kmix:
kmix:
-kmix: For more information, visit: http://www.kde.org
kmix:
diff --git a/kde/slack-desc/kmousetool b/kde/slack-desc/kmousetool
index 017c312..95ab30e 100644
--- a/kde/slack-desc/kmousetool
+++ b/kde/slack-desc/kmousetool
@@ -10,7 +10,7 @@ kmousetool: kmousetool (Automatic mouse clicks)
kmousetool:
kmousetool: Clicks the mouse for you, reducing hand strain.
kmousetool:
-kmousetool: For more information, visit: http://www.kde.org
+kmousetool:
kmousetool:
kmousetool:
kmousetool:
diff --git a/kde/slack-desc/kmouth b/kde/slack-desc/kmouth
index 8bdac0f..46ed334 100644
--- a/kde/slack-desc/kmouth
+++ b/kde/slack-desc/kmouth
@@ -8,9 +8,9 @@
|-----handy-ruler------------------------------------------------------|
kmouth: kmouth (Speech synthesis frontend)
kmouth:
-kmouth: The computer "speaks" the entered text for talking with people.
+kmouth: The computer speaks the entered text for talking with people.
+kmouth:
kmouth:
-kmouth: For more information, visit: http://www.kde.org
kmouth:
kmouth:
kmouth:
diff --git a/kde/slack-desc/kmplot b/kde/slack-desc/kmplot
index 91472c5..f55995b 100644
--- a/kde/slack-desc/kmplot
+++ b/kde/slack-desc/kmplot
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kmplot: kmplot (a mathematical function plotter)
kmplot:
-kmplot: KmPlot is a mathematical function plotter for the KDE-Desktop.
-kmplot: It has a built-in powerful parser. You can plot different functions
+kmplot: KmPlot is a mathematical function plotter for the KDE-Desktop. It has
+kmplot: a built-in powerful parser. You can plot different functions
kmplot: simultaneously and combine them into new functions. KmPlot supports
kmplot: functions with parameters and functions in polar coordinates.
-kmplot: Several grid modes are possible.
-kmplot: Plots may be printed with high precision in correct scale.
+kmplot: Several grid modes are possible. Plots may be printed with high
+kmplot: precision in correct scale.
+kmplot:
kmplot:
-kmplot: For more information, visit: http://edu.kde.org/
kmplot:
diff --git a/kde/slack-desc/kmymoney b/kde/slack-desc/kmymoney
index c71822a..f4cb76d 100644
--- a/kde/slack-desc/kmymoney
+++ b/kde/slack-desc/kmymoney
@@ -9,11 +9,11 @@
kmymoney: kmymoney (personal finance manager)
kmymoney:
kmymoney: KMymoney is a personal finance manager for KDE which operates
-kmymoney: similarly to MS-Money or Quicken.
+kmymoney: similarly to Microsoft Money or Quicken.
kmymoney:
+kmymoney: Home page: https://kmymoney.org/
kmymoney:
kmymoney:
kmymoney:
kmymoney:
-kmymoney: Home page: https://kmymoney.org/
kmymoney:
diff --git a/kde/slack-desc/knavalbattle b/kde/slack-desc/knavalbattle
index a6058c5..5d32bdd 100644
--- a/kde/slack-desc/knavalbattle
+++ b/kde/slack-desc/knavalbattle
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
knavalbattle: knavalbattle (KDE version of battleship game)
knavalbattle:
-knavalbattle: KNavalBattle is a battleship game with built-in game server.
-knavalbattle: Ships are placed on a board which represents the sea. Players try
-knavalbattle: to hit each others ships in turns without knowing where they are
-knavalbattle: placed. The first player to destroy all ships wins the game.
+knavalbattle: KNavalBattle is a battleship game with built-in game server. Ships are
+knavalbattle: placed on a board which represents the sea. Players try to hit each
+knavalbattle: others ships in turns without knowing where they are placed. The first
+knavalbattle: player to destroy all ships wins the game.
+knavalbattle:
knavalbattle:
knavalbattle:
knavalbattle:
-knavalbattle: For more information, visit: http://www.kde.org
knavalbattle:
diff --git a/kde/slack-desc/knetwalk b/kde/slack-desc/knetwalk
index df4b9bb..3b99622 100644
--- a/kde/slack-desc/knetwalk
+++ b/kde/slack-desc/knetwalk
@@ -15,5 +15,5 @@ knetwalk:
knetwalk:
knetwalk:
knetwalk:
-knetwalk: For more information, visit: http://www.kde.org
+knetwalk:
knetwalk:
diff --git a/kde/slack-desc/knewstuff b/kde/slack-desc/knewstuff
index 4fedf07..55f5b4d 100644
--- a/kde/slack-desc/knewstuff
+++ b/kde/slack-desc/knewstuff
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-knewstuff: knewstuff (knewstuff)
+knewstuff: knewstuff (data sharing framework)
knewstuff:
+knewstuff: The KNewStuff library implements collaborative data sharing for
+knewstuff: applications. It uses libattica to support the Open Collaboration
+knewstuff: Services specification.
knewstuff:
knewstuff:
knewstuff:
knewstuff:
knewstuff:
knewstuff:
-knewstuff:
-knewstuff:
-knewstuff: Homepage: http://kde.org/
diff --git a/kde/slack-desc/knights b/kde/slack-desc/knights
index 85ed8b6..0595278 100644
--- a/kde/slack-desc/knights
+++ b/kde/slack-desc/knights
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-knights: knights (Chess board by KDE with XBoard protocol support)
+knights: knights (Chess board with XBoard protocol support)
knights:
-knights: KNights is a chess game. As a player, your goal is to defeat
-knights: your opponent by checkmating their king.
+knights: KNights is a chess game. As a player, your goal is to defeat your
+knights: opponent by checkmating their king.
knights:
+knights: Homepage: https://www.kde.org/applications/games/knights/
knights:
knights:
knights:
knights:
-knights: Home page: https://www.kde.org/applications/games/knights/
knights:
diff --git a/kde/slack-desc/knotes b/kde/slack-desc/knotes
index 5e3b6ae..94be5d5 100644
--- a/kde/slack-desc/knotes
+++ b/kde/slack-desc/knotes
@@ -15,5 +15,5 @@ knotes:
knotes:
knotes:
knotes:
-knotes: Home page: http://www.kde.org/
+knotes:
knotes:
diff --git a/kde/slack-desc/knotifications b/kde/slack-desc/knotifications
index 410e351..351bf41 100644
--- a/kde/slack-desc/knotifications
+++ b/kde/slack-desc/knotifications
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-knotifications: knotifications (knotifications)
+knotifications: knotifications (Desktop notifications)
knotifications:
+knotifications: KNotifications is used to notify the user of an event. It covers
+knotifications: feedback and persistent events.
knotifications:
knotifications:
knotifications:
@@ -15,5 +17,3 @@ knotifications:
knotifications:
knotifications:
knotifications:
-knotifications:
-knotifications: Homepage: http://kde.org/
diff --git a/kde/slack-desc/knotifyconfig b/kde/slack-desc/knotifyconfig
index 477a3bd..dab8ee6 100644
--- a/kde/slack-desc/knotifyconfig
+++ b/kde/slack-desc/knotifyconfig
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-knotifyconfig: knotifyconfig (knotifyconfig)
+knotifyconfig: knotifyconfig (configure notifications)
knotifyconfig:
+knotifyconfig: KNotifyConfig provides a configuration dialog for desktop
+knotifyconfig: notifications which can be embedded in your application.
knotifyconfig:
knotifyconfig:
knotifyconfig:
@@ -15,5 +17,3 @@ knotifyconfig:
knotifyconfig:
knotifyconfig:
knotifyconfig:
-knotifyconfig:
-knotifyconfig: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kolf b/kde/slack-desc/kolf
index a198a8b..f4a235c 100644
--- a/kde/slack-desc/kolf
+++ b/kde/slack-desc/kolf
@@ -9,11 +9,11 @@
kolf: kolf (miniature golf game for KDE)
kolf:
kolf: Kolf is a miniature golf game. The game is played from an overhead
-kolf: view, with a short bar representing the golf club. Kolf features many
+kolf: view, with a short bar representing the golf club. Kolf features many
kolf: different types of objects, such water hazards, slopes, sand traps,
kolf: and black holes (warps), among others.
kolf:
kolf:
kolf:
-kolf: For more information, visit: http://www.kde.org
+kolf:
kolf:
diff --git a/kde/slack-desc/kollision b/kde/slack-desc/kollision
index e0b4a2a..9fa3779 100644
--- a/kde/slack-desc/kollision
+++ b/kde/slack-desc/kollision
@@ -15,5 +15,5 @@ kollision:
kollision:
kollision:
kollision:
-kollision: For more information, visit: http://www.kde.org
+kollision:
kollision:
diff --git a/kde/slack-desc/kolourpaint b/kde/slack-desc/kolourpaint
index 210c649..a692534 100644
--- a/kde/slack-desc/kolourpaint
+++ b/kde/slack-desc/kolourpaint
@@ -16,4 +16,4 @@ kolourpaint: * Image Manipulation - editing screenshots and photos, and
kolourpaint: applying effects
kolourpaint: * Icon Editing - drawing clipart and logos with transparency.
kolourpaint:
-kolourpaint: For more information, visit: http://www.kde.org
+kolourpaint:
diff --git a/kde/slack-desc/kompare b/kde/slack-desc/kompare
index aaa9b3e..6785e92 100644
--- a/kde/slack-desc/kompare
+++ b/kde/slack-desc/kompare
@@ -15,5 +15,5 @@ kompare:
kompare:
kompare:
kompare:
-kompare: For more information, visit: http://www.kde.org
+kompare:
kompare:
diff --git a/kde/slack-desc/konqueror b/kde/slack-desc/konqueror
index 5bb23b3..528e03b 100644
--- a/kde/slack-desc/konqueror
+++ b/kde/slack-desc/konqueror
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-konqueror: konqueror (KDE filemanager and webbrowser)
+konqueror: konqueror (web browser and file manager)
konqueror:
-konqueror: KDE filemanager & webbrowser.
+konqueror: Konqueror is a web browser and file manager that provides web access
+konqueror: and file-viewer functionality for file systems (such as local files,
+konqueror: files on a remote server, and files in a disk image).
konqueror:
+konqueror: Homepage: https://kde.org/applications/internet/org.kde.konqueror
konqueror:
konqueror:
konqueror:
konqueror:
-konqueror:
-konqueror: Home page: http://www.kde.org/
-konqueror:
diff --git a/kde/slack-desc/konquest b/kde/slack-desc/konquest
index e26e474..aa07298 100644
--- a/kde/slack-desc/konquest
+++ b/kde/slack-desc/konquest
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
konquest: konquest (KDE version of Gnu-Lactic Konquest)
konquest:
-konquest: This the KDE version of Gnu-Lactic Konquest, a multi-player
-konquest: strategy game. The goal of the game is to expand your
-konquest: interstellar empire across the galaxy.
+konquest: This the KDE version of Gnu-Lactic Konquest, a multi-player strategy
+konquest: game. The goal of the game is to expand your interstellar empire
+konquest: across the galaxy.
+konquest:
konquest:
konquest:
konquest:
konquest:
-konquest: For more information, visit: http://www.kde.org
konquest:
diff --git a/kde/slack-desc/konsole b/kde/slack-desc/konsole
index 31cfa2c..eca81ed 100644
--- a/kde/slack-desc/konsole
+++ b/kde/slack-desc/konsole
@@ -5,12 +5,12 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
konsole: konsole (KDE's terminal emulator)
konsole:
-konsole: Konsole is KDE's terminal emulator.
+konsole: Konsole is a powerful and customizable terminal emulator.
konsole:
-konsole: Homepage: http://kde.org
+konsole: Homepage: https://konsole.kde.org
konsole:
konsole:
konsole:
diff --git a/kde/slack-desc/kontact b/kde/slack-desc/kontact
index 491345a..06699bc 100644
--- a/kde/slack-desc/kontact
+++ b/kde/slack-desc/kontact
@@ -15,5 +15,5 @@ kontact:
kontact:
kontact:
kontact:
-kontact: Home page: http://www.kde.org/
+kontact:
kontact:
diff --git a/kde/slack-desc/kontactinterface b/kde/slack-desc/kontactinterface
index 427f9f1..ce6c0fe 100644
--- a/kde/slack-desc/kontactinterface
+++ b/kde/slack-desc/kontactinterface
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kontactinterface: kontactinterface (kontact plugin interface library)
kontactinterface:
-kontactinterface: kontactinterface is a library for embedding KParts
-kontactinterface: in a Kontact component.
+kontactinterface: kontactinterface is a library for embedding KParts in a Kontact
+kontactinterface: component.
+kontactinterface:
kontactinterface:
kontactinterface:
kontactinterface:
kontactinterface:
kontactinterface:
-kontactinterface: Home page: http://www.kde.org/
kontactinterface:
diff --git a/kde/slack-desc/kopete b/kde/slack-desc/kopete
index cc7b440..442398b 100644
--- a/kde/slack-desc/kopete
+++ b/kde/slack-desc/kopete
@@ -13,7 +13,7 @@ kopete: use interface between all of their instant messaging systems, but at
kopete: the same time also providing developers with the ease of writing
kopete: plugins to support a new protocol.
kopete:
+kopete: Homepage: http://userbase.kde.org/Kopete
kopete:
kopete:
-kopete: For more information, visit: http://userbase.kde.org/Kopete
kopete:
diff --git a/kde/slack-desc/korganizer b/kde/slack-desc/korganizer
index f270504..2e3733e 100644
--- a/kde/slack-desc/korganizer
+++ b/kde/slack-desc/korganizer
@@ -15,5 +15,5 @@ korganizer:
korganizer:
korganizer:
korganizer:
-korganizer: Home page: http://www.kde.org/
+korganizer:
korganizer:
diff --git a/kde/slack-desc/kpackage b/kde/slack-desc/kpackage
index da3540c..f5ba851 100644
--- a/kde/slack-desc/kpackage
+++ b/kde/slack-desc/kpackage
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kpackage: kpackage (KDE application package manager)
kpackage:
-kpackage: KPackage is a KDE 5 Framework that lets applications manage
-kpackage: user installable packages of non-binary assets.
+kpackage: KPackage is a KDE 5 Framework that lets applications manage user
+kpackage: installable packages of non-binary assets.
+kpackage:
kpackage:
kpackage:
kpackage:
kpackage:
kpackage:
-kpackage: For more information, visit: http://www.kde.org
kpackage:
diff --git a/kde/slack-desc/kparts b/kde/slack-desc/kparts
index 9236154..aa3a28c 100644
--- a/kde/slack-desc/kparts
+++ b/kde/slack-desc/kparts
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kparts: kparts (kparts)
+kparts: kparts (UI framework)
kparts:
+kparts: The KParts library implements the framework for KDE parts, which are
+kparts: elaborate widgets with a user-interface defined in terms of actions
+kparts: (menu items, toolbar icons).
kparts:
kparts:
kparts:
kparts:
kparts:
kparts:
-kparts:
-kparts:
-kparts: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kpat b/kde/slack-desc/kpat
index 08a8439..0d072f3 100644
--- a/kde/slack-desc/kpat
+++ b/kde/slack-desc/kpat
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kpat: kpat (patience card game for KDE)
kpat:
-kpat: KPat (aka KPatience) is a relaxing card sorting game. To win the game
+kpat: KPat (aka KPatience) is a relaxing card sorting game. To win the game
kpat: a player has to arrange a single deck of cards in certain order
kpat: amongst each other.
kpat:
kpat:
kpat:
kpat:
-kpat: For more information, visit: http://www.kde.org
+kpat:
kpat:
diff --git a/kde/slack-desc/kpeople b/kde/slack-desc/kpeople
index eae7067..f4475e7 100644
--- a/kde/slack-desc/kpeople
+++ b/kde/slack-desc/kpeople
@@ -10,10 +10,10 @@ kpeople: kpeople (library providing access to your contacts)
kpeople:
kpeople: KPeople Provides access to all contacts and aggregates them by person.
kpeople: KPeople offers unified access to our contacts from different sources,
-kpeople: grouping them by person while still exposing all the data.
-kpeople: The sources are plugin-based, allowing to easily extend the contacts
-kpeople: collection.
+kpeople: grouping them by person while still exposing all the data. The sources
+kpeople: are plugin-based, allowing to easily extend the contacts collection.
+kpeople:
+kpeople:
kpeople:
kpeople:
-kpeople: For more information, visit: http://www.kpepim.org
kpeople:
diff --git a/kde/slack-desc/kpeoplevcard b/kde/slack-desc/kpeoplevcard
index 2732461..6345754 100644
--- a/kde/slack-desc/kpeoplevcard
+++ b/kde/slack-desc/kpeoplevcard
@@ -15,5 +15,5 @@ kpeoplevcard:
kpeoplevcard:
kpeoplevcard:
kpeoplevcard:
-kpeoplevcard: Home page: http://www.kde.org/
+kpeoplevcard:
kpeoplevcard:
diff --git a/kde/slack-desc/kpimtextedit b/kde/slack-desc/kpimtextedit
index 191317f..dbca188 100644
--- a/kde/slack-desc/kpimtextedit
+++ b/kde/slack-desc/kpimtextedit
@@ -10,10 +10,10 @@ kpimtextedit: kpimtextedit (textedit with PIM-specific features)
kpimtextedit:
kpimtextedit: KPIMTextedit is a library that provides an enchanced text edit class,
kpimtextedit: see TextEdit. This text is highlighted with a EMailQuoteHighlighter.
-kpimtextedit: It also provides so-called rich text builders, that can convert
-kpimtextedit: the formatted text in the text edit to all kinds of markup,
-kpimtextedit: like HTML or BBCODE.
+kpimtextedit: It also provides so-called rich text builders, that can convert the
+kpimtextedit: formatted text in the text edit to all kinds of markup, like HTML or
+kpimtextedit: BBCODE.
+kpimtextedit:
kpimtextedit:
kpimtextedit:
-kpimtextedit: Home page: http://www.kde.org/
kpimtextedit:
diff --git a/kde/slack-desc/kpkpass b/kde/slack-desc/kpkpass
index 7de8e94..42ccece 100644
--- a/kde/slack-desc/kpkpass
+++ b/kde/slack-desc/kpkpass
@@ -15,5 +15,5 @@ kpkpass:
kpkpass:
kpkpass:
kpkpass:
-kpkpass: Home page: https://community.kde.org/KDE_PIM
+kpkpass:
kpkpass:
diff --git a/kde/slack-desc/kplotting b/kde/slack-desc/kplotting
index de8f578..fa040bc 100644
--- a/kde/slack-desc/kplotting
+++ b/kde/slack-desc/kplotting
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kplotting: kplotting (kplotting)
+kplotting: kplotting (Data plotting)
kplotting:
+kplotting: KPlotWidget is a QWidget-derived class that provides a virtual base
+kplotting: class for easy data-plotting. The idea behind KPlotWidget is that you
+kplotting: only have to specify information in data units; i.e., the natural
+kplotting: units of the data being plotted. KPlotWidget automatically converts
+kplotting: everything to screen pixel units. KPlotWidget draws X and Y axes with
+kplotting: tick marks and tick labels, and automatically determines how many tick
+kplotting: marks to use and where they should be, based on the data limits
+kplotting: specified for the plot.
kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting:
-kplotting: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kpmcore b/kde/slack-desc/kpmcore
index 44306d8..06e33b3 100644
--- a/kde/slack-desc/kpmcore
+++ b/kde/slack-desc/kpmcore
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler------------------------------------------------|
-kpmcore: kpmcore (KDE partitionmanager core libraries)
+ |-----handy-ruler------------------------------------------------------|
+kpmcore: kpmcore (KDE partitionmanager libraries)
kpmcore:
-kpmcore: kpmcore is a library for managing partitions. It contains
-kpmcore: common code for KDE Partition Manager and other projects.
+kpmcore: kpmcore is a library for managing partitions. It contains common code
+kpmcore: for KDE Partition Manager and other projects.
kpmcore:
+kpmcore: See also:
+kpmcore: https://www.kde.org/applications/system/kdepartitionmanager
kpmcore:
kpmcore:
kpmcore:
-kpmcore: See also:
-kpmcore: https://www.kde.org/applications/system/kdepartitionmanager
kpmcore:
diff --git a/kde/slack-desc/kpty b/kde/slack-desc/kpty
index 47f9460..b8277fa 100644
--- a/kde/slack-desc/kpty
+++ b/kde/slack-desc/kpty
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kpty: kpty (kpty)
+kpty: kpty (pseudo terminal library)
kpty:
+kpty: The KPty library provides primitives to interface with pseudo terminal
+kpty: devices as well as a KProcess derived class for running child
+kpty: processes and communicating with them using a pty.
kpty:
kpty:
kpty:
kpty:
kpty:
kpty:
-kpty:
-kpty:
-kpty: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kqtquickcharts b/kde/slack-desc/kqtquickcharts
index d1ea9ea..f2d3ebe 100644
--- a/kde/slack-desc/kqtquickcharts
+++ b/kde/slack-desc/kqtquickcharts
@@ -6,8 +6,10 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kqtquickcharts: kqtquickcharts (plugin to render interactive graphs)
+kqtquickcharts: kqtquickcharts (chart rendering plugin)
kqtquickcharts:
+kqtquickcharts: kqtquickcharts is a QtQuick plugin to render beautiful and interactive
+kqtquickcharts: charts.
kqtquickcharts:
kqtquickcharts:
kqtquickcharts:
@@ -15,5 +17,3 @@ kqtquickcharts:
kqtquickcharts:
kqtquickcharts:
kqtquickcharts:
-kqtquickcharts: For more information, visit: http://www.kde.org
-kqtquickcharts:
diff --git a/kde/slack-desc/kquickcharts b/kde/slack-desc/kquickcharts
index 0c4e6f8..ed910c0 100644
--- a/kde/slack-desc/kquickcharts
+++ b/kde/slack-desc/kquickcharts
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kquickcharts: kquickcharts (QtQuick module providing high-performance charts)
+kquickcharts: kquickcharts (QtQuick chart module)
kquickcharts:
kquickcharts: The Quick Charts module provides a set of charts that can be used
kquickcharts: from QtQuick applications. They are intended to be used for both
-kquickcharts: simple display of data as well as continuous display of
-kquickcharts: high-volume data (often referred to as plotters).
-kquickcharts: The charts use a system called distance fields for their accelerated
-kquickcharts: rendering, which provides ways of using the GPU for rendering
-kquickcharts: 2D shapes without loss of quality.
+kquickcharts: simple display of data as well as continuous display of high-volume
+kquickcharts: data (often referred to as plotters). The charts use a system called
+kquickcharts: distance fields for their accelerated rendering, which provides ways
+kquickcharts: of using the GPU for rendering 2D shapes without loss of quality.
kquickcharts:
kquickcharts: See: https://api.kde.org/frameworks/kquickcharts/html/index.html
+kquickcharts:
diff --git a/kde/slack-desc/krdc b/kde/slack-desc/krdc
index 3daef06..82768f8 100644
--- a/kde/slack-desc/krdc
+++ b/kde/slack-desc/krdc
@@ -12,8 +12,8 @@ krdc: KRDC is a client application that allows you to view or even control
krdc: the desktop session on another machine that is running a compatible
krdc: server. VNC and RDP is supported.
krdc:
+krdc: Homepage: https://www.kde.org/applications/internet/krdc/
krdc:
krdc:
krdc:
-krdc: More information at: http://www.kde.org/applications/internet/krdc/
krdc:
diff --git a/kde/slack-desc/krename b/kde/slack-desc/krename
index 71fdb64..65323e3 100644
--- a/kde/slack-desc/krename
+++ b/kde/slack-desc/krename
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-krename: krename (powerful batch file rename tool)
+krename: krename (batch file rename tool)
krename:
-krename: KRename is a powerful batch renamer for KDE. It allows you to
-krename: easily rename hundreds or even more files in one go.
-krename: The filenames can be created by parts of the original filename,
-krename: numbering the files or accessing hundreds of informations about
-krename: the file, like creation date or Exif informations of an image.
+krename: KRename is a powerful batch renamer for KDE. It allows you to easily
+krename: rename hundreds or even more files in one go. The filenames can be
+krename: created by parts of the original filename, numbering the files or
+krename: accessing information about the file, like creation date or Exif
+krename: information from an image.
krename:
+krename: Homepage: http://www.krename.net/
krename:
-krename: Home page: http://www.krename.net/
krename:
diff --git a/kde/slack-desc/kreversi b/kde/slack-desc/kreversi
index fb6c5d3..e021ec7 100644
--- a/kde/slack-desc/kreversi
+++ b/kde/slack-desc/kreversi
@@ -9,11 +9,11 @@
kreversi: kreversi (reversi board game for KDE)
kreversi:
kreversi: KReversi is a simple one player strategy game played against the
-kreversi: computer. If a player's piece is captured by an opposing player,
-kreversi: that piece is turned over to reveal the color of that player.
-kreversi: A winner is declared when one player has more pieces of his own color
-kreversi: on the board and there are no more possible moves.
+kreversi: computer. If a player's piece is captured by an opposing player, that
+kreversi: piece is turned over to reveal the color of that player. A winner is
+kreversi: declared when one player has more pieces of his own color on the board
+kreversi: and there are no more possible moves.
+kreversi:
kreversi:
kreversi:
-kreversi: For more information, visit: http://www.kde.org
kreversi:
diff --git a/kde/slack-desc/krfb b/kde/slack-desc/krfb
index e073614..1e15edc 100644
--- a/kde/slack-desc/krfb
+++ b/kde/slack-desc/krfb
@@ -12,8 +12,8 @@ krfb: Krfb Desktop Sharing is a server application that allows you to share
krfb: your current session with a user on another machine, who can use a
krfb: VNC client to view or even control the desktop.
krfb:
+krfb: Homepage: https://www.kde.org/applications/system/krfb/
krfb:
krfb:
krfb:
-krfb: More information at: http://www.kde.org/applications/system/krfb/
krfb:
diff --git a/kde/slack-desc/krita b/kde/slack-desc/krita
index 6d7b41e..b287e03 100644
--- a/kde/slack-desc/krita
+++ b/kde/slack-desc/krita
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
krita: krita (painting program)
krita:
-krita: Krita is a professional FREE and open source painting program.
-krita: It is made by artists that want to see affordable art tools
-krita: for everyone.
+krita: Krita is a professional free and open source painting program. It is
+krita: made by artists that want to see affordable art tools for everyone.
+krita:
+krita: Homepage: http://www.krita.org/
krita:
krita:
krita:
krita:
-krita: Home page: http://www.krita.org/
krita:
diff --git a/kde/slack-desc/kross b/kde/slack-desc/kross
index b161b3b..b8325cf 100644
--- a/kde/slack-desc/kross
+++ b/kde/slack-desc/kross
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kross: kross (kross)
+kross: kross (script embedding)
kross:
+kross: Kross is a scripting bridge to embed scripting functionality into an
+kross: application. It supports QtScript as a scripting interpreter backend.
+kross: Kross is able to optional dynamic load modules which provide
+kross: additional functionality for scripts.
kross:
kross:
kross:
kross:
kross:
-kross:
-kross:
-kross:
-kross: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kross-interpreters b/kde/slack-desc/kross-interpreters
index 27a15fc..04274c2 100644
--- a/kde/slack-desc/kross-interpreters
+++ b/kde/slack-desc/kross-interpreters
@@ -10,7 +10,7 @@ kross-interpreters: kross-interpreters (Kross interpreters)
kross-interpreters:
kross-interpreters: Set of interpreter plugins for the Kross archtecture in KDE.
kross-interpreters:
-kross-interpreters: See also: http://developer.kde.org/language-bindings/
+kross-interpreters:
kross-interpreters:
kross-interpreters:
kross-interpreters:
diff --git a/kde/slack-desc/kruler b/kde/slack-desc/kruler
index 1383667..de6f857 100644
--- a/kde/slack-desc/kruler
+++ b/kde/slack-desc/kruler
@@ -10,7 +10,7 @@ kruler: kruler (a screen ruler for KDE)
kruler:
kruler: A screen ruler and color measurement tool for KDE.
kruler:
-kruler: For more information, visit: http://www.kde.org
+kruler:
kruler:
kruler:
kruler:
diff --git a/kde/slack-desc/krunner b/kde/slack-desc/krunner
index 3688637..e6a5c46 100644
--- a/kde/slack-desc/krunner
+++ b/kde/slack-desc/krunner
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
krunner: krunner (KDE plasma launcher)
krunner:
-krunner: KRunner is the launcher built into the Plasma desktop. While
-krunner: its basic function is to launch programs from a sort of
-krunner: mini-command-line, its functionality can be extended by
-krunner: runners to assist the user to accomplish a lot of tasks.
+krunner: KRunner is the launcher built into the Plasma desktop. While its basic
+krunner: function is to launch programs from a sort of mini-command-line, its
+krunner: functionality can be extended by runners to assist the user to
+krunner: accomplish a lot of tasks.
+krunner:
krunner:
krunner:
krunner:
krunner:
-krunner: Homepage: http://kde.org/
diff --git a/kde/slack-desc/krusader b/kde/slack-desc/krusader
index 9221c43..a3fb4e8 100644
--- a/kde/slack-desc/krusader
+++ b/kde/slack-desc/krusader
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-krusader: krusader (twin panel file management for KDE)
+krusader: krusader (twin panel file manager)
krusader:
-krusader: Krusader is an advanced twin panel (commander style) file manager
-krusader: for KDE and other desktops in the *nix world, similar to Midnight
-krusader: or Total Commander.
-krusader: It provides all the file management features you could possibly want.
+krusader: Krusader is an advanced twin panel (commander style) file manager for
+krusader: KDE and other desktops, similar to Midnight Commander or Total
+krusader: Commander.
+krusader:
+krusader: Homepage: http://krusader.org
krusader:
krusader:
krusader:
-krusader: For more information, visit: http://krusader.org
krusader:
diff --git a/kde/slack-desc/kscreen2 b/kde/slack-desc/kscreen2
index 6b8a606..2250496 100644
--- a/kde/slack-desc/kscreen2
+++ b/kde/slack-desc/kscreen2
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kscreen2: kscreen (KDE screen management)
+kscreen2: kscreen2 (KDE screen management)
kscreen2:
kscreen2: KScreen is the new screen management software for KDE Plasma
-kscreen2: Workspaces which tries to be as magic and automatic as possible
-kscreen2: for users with basic needs and easy to configure for those
-kscreen2: who want special setups.
-kscreen2:
+kscreen2: Workspaces which tries to be as magic and automatic as possible for
+kscreen2: users with basic needs and easy to configure for those who want
+kscreen2: special setups.
kscreen2:
kscreen2: For more information, visit:
kscreen2: http://community.kde.org/Solid/Projects/ScreenManagement
kscreen2:
+kscreen2:
diff --git a/kde/slack-desc/kscreenlocker b/kde/slack-desc/kscreenlocker
index f424643..e8c7866 100644
--- a/kde/slack-desc/kscreenlocker
+++ b/kde/slack-desc/kscreenlocker
@@ -10,10 +10,10 @@ kscreenlocker: kscreenlocker (secure lock screen architecture)
kscreenlocker:
kscreenlocker: Library and components for secure lock screen architecture.
kscreenlocker:
+kscreenlocker: Homepage: https://projects.kde.org/kscreenlocker
kscreenlocker:
kscreenlocker:
kscreenlocker:
kscreenlocker:
kscreenlocker:
-kscreenlocker: For more information, visit: https://projects.kde.org/kscreenlocker
kscreenlocker:
diff --git a/kde/slack-desc/kservice b/kde/slack-desc/kservice
index 8f66361..b7f7191 100644
--- a/kde/slack-desc/kservice
+++ b/kde/slack-desc/kservice
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kservice: kservice (kservice)
+kservice: kservice (desktop services plugin framework)
kservice:
+kservice: KService provides a plugin framework for handling desktop services.
+kservice: Services can be applications or libraries. They can be bound to MIME
+kservice: types or handled by application specific code.
kservice:
kservice:
kservice:
kservice:
kservice:
kservice:
-kservice:
-kservice:
-kservice: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kshisen b/kde/slack-desc/kshisen
index 1af7d35..dc43d05 100644
--- a/kde/slack-desc/kshisen
+++ b/kde/slack-desc/kshisen
@@ -9,11 +9,11 @@
kshisen: kshisen (Shisen-Sho Mahjongg-like tile game)
kshisen:
kshisen: KShisen is a solitaire-like game played using the standard set of
-kshisen: Mahjong tiles. Unlike Mahjong however, KShisen has only one layer
+kshisen: Mahjong tiles. Unlike Mahjong however, KShisen has only one layer
kshisen: of scrambled tiles.
kshisen:
kshisen:
kshisen:
kshisen:
-kshisen: For more information, visit: http://www.kde.org
+kshisen:
kshisen:
diff --git a/kde/slack-desc/ksirk b/kde/slack-desc/ksirk
index 1a0826d..57a17e1 100644
--- a/kde/slack-desc/ksirk
+++ b/kde/slack-desc/ksirk
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-ksirk: ksirk (KDE port of the board game risk)
+ksirk: ksirk (conquer the world board game)
ksirk:
-ksirk: Ksirk is a KDE port of the board game risk.
+ksirk: KsirK is a computerized version of the well known strategic board game
+ksirk: R***. The goal of the game is simply to conquer the world by attacking
+ksirk: your neighbors with your armies.
ksirk:
ksirk:
ksirk:
ksirk:
ksirk:
ksirk:
-ksirk: For more information, visit: http://www.kde.org
-ksirk:
diff --git a/kde/slack-desc/ksmtp b/kde/slack-desc/ksmtp
index c8ab4de..2ad42fa 100644
--- a/kde/slack-desc/ksmtp
+++ b/kde/slack-desc/ksmtp
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-ksmtp: ksmtp (library to send mail through smtp)
+ksmtp: ksmtp (SMTP library)
+ksmtp:
+ksmtp: ksmtp is a job-based library to send email through an SMTP server.
ksmtp:
-ksmtp: ksmtp is a job-based library to send email through an SMTP server,
ksmtp:
ksmtp:
ksmtp:
ksmtp:
ksmtp:
ksmtp:
-ksmtp: Home page: http://www.kde.org/
ksmtp:
diff --git a/kde/slack-desc/ksnakeduel b/kde/slack-desc/ksnakeduel
index 731a772..553a72c 100644
--- a/kde/slack-desc/ksnakeduel
+++ b/kde/slack-desc/ksnakeduel
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-ksnakeduel: ksnakeduel (simple snake duel game for KDE)
+ksnakeduel: ksnakeduel (simple snake duel game)
+ksnakeduel:
+ksnakeduel: KSnakeDuel is a simple snake duel game for KDE. You can play
+ksnakeduel: KSnakeDuel against the computer or a friend. The aim of the game is to
+ksnakeduel: live longer than your opponent. To do that, avoid running into a wall,
+ksnakeduel: your own tail, or that of your opponent.
ksnakeduel:
-ksnakeduel: KSnakeDuel is a simple snake duel game for KDE. You can play
-ksnakeduel: KSnakeDuel against the computer or a friend. The aim of the game is
-ksnakeduel: to live longer than your opponent. To do that, avoid running into
-ksnakeduel: a wall, your own tail and that of your opponent.
ksnakeduel:
ksnakeduel:
ksnakeduel:
-ksnakeduel: For more information, visit: http://www.kde.org
ksnakeduel:
diff --git a/kde/slack-desc/kspaceduel b/kde/slack-desc/kspaceduel
index 8a4435f..7651e26 100644
--- a/kde/slack-desc/kspaceduel
+++ b/kde/slack-desc/kspaceduel
@@ -9,11 +9,11 @@
kspaceduel: kspaceduel (space arcade game)
kspaceduel:
kspaceduel: In KSpaceduel each of two possible players controls a satellite
-kspaceduel: spaceship orbiting the sun. As the game progresses players have to
-kspaceduel: eliminate opponent's spacecraft.
+kspaceduel: spaceship orbiting the sun. As the game progresses players have to
+kspaceduel: eliminate the opponent's spacecraft.
+kspaceduel:
kspaceduel:
kspaceduel:
kspaceduel:
kspaceduel:
-kspaceduel: For more information, visit: http://www.kde.org
kspaceduel:
diff --git a/kde/slack-desc/ksquares b/kde/slack-desc/ksquares
index ed147ff..b3b632f 100644
--- a/kde/slack-desc/ksquares
+++ b/kde/slack-desc/ksquares
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksquares: ksquares (connect the dots to create squares)
ksquares:
-ksquares: KSquares is a fun and exciting game for desktop environment.
-ksquares: The game is modeled after the well known pen and paper based
-ksquares: game of Dots and Boxes.
+ksquares: KSquares is a fun and exciting game for the desktop environment. The
+ksquares: game is modeled after the well known pen and paper based game of Dots
+ksquares: and Boxes.
+ksquares:
ksquares:
ksquares:
ksquares:
ksquares:
-ksquares: For more information, visit: http://www.kde.org
ksquares:
diff --git a/kde/slack-desc/ksshaskpass b/kde/slack-desc/ksshaskpass
index 3c98517..142a5d4 100644
--- a/kde/slack-desc/ksshaskpass
+++ b/kde/slack-desc/ksshaskpass
@@ -15,5 +15,5 @@ ksshaskpass:
ksshaskpass:
ksshaskpass:
ksshaskpass:
-ksshaskpass: For more information, visit: http://www.kde.org
+ksshaskpass:
ksshaskpass:
diff --git a/kde/slack-desc/kstars b/kde/slack-desc/kstars
index 1e0062c..ad680b2 100644
--- a/kde/slack-desc/kstars
+++ b/kde/slack-desc/kstars
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kstars: kstars (a desktop planetarium)
kstars:
-kstars: KStars is a desktop planetarium.
-kstars:
-kstars: For more information, visit: http://edu.kde.org/
-kstars:
-kstars:
-kstars:
-kstars:
-kstars:
+kstars: KStars is free, open source, cross-platform Astronomy Software.
+kstars: It provides an accurate graphical simulation of the night sky, from
+kstars: any location on Earth, at any date and time. The display includes up
+kstars: to 100 million stars, 13,000 deep-sky objects, all 8 planets, the Sun
+kstars: and Moon, and thousands of comets, asteroids, supernovae, and
+kstars: satellites.
+kstars:
+kstars: Homepage: https://edu.kde.org/kstars
kstars:
diff --git a/kde/slack-desc/ksudoku b/kde/slack-desc/ksudoku
index 530f9d7..ded40ae 100644
--- a/kde/slack-desc/ksudoku
+++ b/kde/slack-desc/ksudoku
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksudoku: ksudoku (sudoku game)
ksudoku:
-ksudoku: KSudoku is a logic-based symbol placement puzzle.
-ksudoku: The player has to fill a grid so that each column, row as well as
-ksudoku: each square block on the game field contains only one instance of
-ksudoku: each symbol.
+ksudoku: KSudoku is a logic-based symbol placement puzzle. The player has to
+ksudoku: fill a grid so that each column, row as well as each square block on
+ksudoku: the game field contains only one instance of each symbol.
+ksudoku:
+ksudoku:
ksudoku:
ksudoku:
ksudoku:
-ksudoku: For more information, visit: http://www.kde.org
ksudoku:
diff --git a/kde/slack-desc/ksysguard b/kde/slack-desc/ksysguard
index ee90a10..438dac1 100644
--- a/kde/slack-desc/ksysguard
+++ b/kde/slack-desc/ksysguard
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksysguard: ksysguard (process monitor and system statistics)
ksysguard:
-ksysguard: System Guard allows you to monitor various statistics about
-ksysguard: your system. In addition to monitoring the local system,
-ksysguard: it can connect to remote systems running the System Guard
-ksysguard: Daemon, which is in the 'ksysguardd' package.
+ksysguard: System Guard allows you to monitor various statistics about your
+ksysguard: system. In addition to monitoring the local system, it can connect to
+ksysguard: remote systems running the System Guard Daemon, which is in the
+ksysguard: ksysguardd package.
+ksysguard:
ksysguard:
ksysguard:
ksysguard:
ksysguard:
-ksysguard: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ksystemlog b/kde/slack-desc/ksystemlog
index 60ba7d5..2e5a549 100644
--- a/kde/slack-desc/ksystemlog
+++ b/kde/slack-desc/ksystemlog
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ksystemlog: ksystemlog (system log viewer)
ksystemlog:
-ksystemlog: KSystemLog is a system log viewer tool. This program is developed
-ksystemlog: for beginner users, who don't know how to find information about
-ksystemlog: their Linux system, and don't know where log files are.
-ksystemlog: It is also of course designed for advanced users, who quickly want
-ksystemlog: to understand problems of their machine with a more powerful and
-ksystemlog: graphical tool than 'tail -f' and 'less' commands ;-)
+ksystemlog: KSystemLog is a system log viewer tool. This program is developed for
+ksystemlog: beginner users, who don't know how to find information about their
+ksystemlog: Linux system, and don't know where log files are. It is also of course
+ksystemlog: designed for advanced users, who quickly want to understand problems
+ksystemlog: of their machine with a more powerful and graphical tool than
+ksystemlog: 'tail -f' and 'less' commands ;-)
ksystemlog:
-ksystemlog: Visit: http://www.kde.org/applications/system/ksystemlog/
+ksystemlog: Homepage: https://www.kde.org/applications/system/ksystemlog/
ksystemlog:
diff --git a/kde/slack-desc/kteatime b/kde/slack-desc/kteatime
index ee4433f..5c56caf 100644
--- a/kde/slack-desc/kteatime
+++ b/kde/slack-desc/kteatime
@@ -9,11 +9,11 @@
kteatime: kteatime (tea cooker)
kteatime:
kteatime: KTeaTime is a handy timer for steeping tea. No longer will you have
-kteatime: to guess at how long it takes for your tea to be ready.
-kteatime: Simply select the type of tea you have, and it will alert you when
-kteatime: the tea is ready to drink.
+kteatime: to guess at how long it takes for your tea to be ready. Simply select
+kteatime: the type of tea you have, and it will alert you when the tea is ready
+kteatime: to drink.
kteatime:
+kteatime: Homepage: https://www.kde.org/applications/games/kteatime/
kteatime:
kteatime:
-kteatime: More information at http://www.kde.org/applications/games/kteatime/
kteatime:
diff --git a/kde/slack-desc/ktexteditor b/kde/slack-desc/ktexteditor
index cfd6c13..7ec86e5 100644
--- a/kde/slack-desc/ktexteditor
+++ b/kde/slack-desc/ktexteditor
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-ktexteditor: ktexteditor (ktexteditor)
+ktexteditor: ktexteditor (text editor component)
ktexteditor:
+ktexteditor: KTextEditor provides a powerful text editor component that you can
+ktexteditor: embed in your application, either as a KPart or using the
+ktexteditor: KF5::TextEditor library. The text editor component contains many
+ktexteditor: useful features, from syntax highlighting and automatic indentation to
+ktexteditor: advanced scripting support, making it suitable for everything from a
+ktexteditor: simple embedded text-file editor to an advanced IDE.
ktexteditor:
ktexteditor:
ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor:
-ktexteditor: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ktextwidgets b/kde/slack-desc/ktextwidgets
index 0b549e8..d0d5556 100644
--- a/kde/slack-desc/ktextwidgets
+++ b/kde/slack-desc/ktextwidgets
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-ktextwidgets: ktextwidgets (ktextwidgets)
+ktextwidgets: ktextwidgets (text editing widgets)
ktextwidgets:
+ktextwidgets: KTextWidgets provides widgets for displaying and editing text. It
+ktextwidgets: supports rich text as well as plain text.
ktextwidgets:
ktextwidgets:
ktextwidgets:
@@ -15,5 +17,3 @@ ktextwidgets:
ktextwidgets:
ktextwidgets:
ktextwidgets:
-ktextwidgets:
-ktextwidgets: Homepage: http://kde.org/
diff --git a/kde/slack-desc/ktimer b/kde/slack-desc/ktimer
index 45b787c..f3134f3 100644
--- a/kde/slack-desc/ktimer
+++ b/kde/slack-desc/ktimer
@@ -10,7 +10,7 @@ ktimer: ktimer (program scheduler)
ktimer:
ktimer: KTimer is a little tool to execute programs after some time.
ktimer:
-ktimer: ktimer's home page is: http://utils.kde.org/projects/ktimer
+ktimer: Homepage: http://utils.kde.org/projects/ktimer
ktimer:
ktimer:
ktimer:
diff --git a/kde/slack-desc/ktimetracker b/kde/slack-desc/ktimetracker
index 9d5927c..ee8ca88 100644
--- a/kde/slack-desc/ktimetracker
+++ b/kde/slack-desc/ktimetracker
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktimetracker: ktimetracker (personal time tracker)
ktimetracker:
-ktimetracker: KTimeTracker is a personal time tracker for busy people
-ktimetracker: implemented as a Qt5/KF5-based desktop application.
+ktimetracker: KTimeTracker is a personal time tracker for busy people implemented as
+ktimetracker: a Qt5/KF5-based desktop application.
+ktimetracker:
ktimetracker:
ktimetracker:
ktimetracker:
ktimetracker:
ktimetracker:
-ktimetracker: Home page: http://www.kde.org/
ktimetracker:
diff --git a/kde/slack-desc/ktnef b/kde/slack-desc/ktnef
index 078b32d..88cf660 100644
--- a/kde/slack-desc/ktnef
+++ b/kde/slack-desc/ktnef
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktnef: ktnef (API for the handling of TNEF data)
ktnef:
-ktnef: The ktnef library contains an API for the handling of TNEF data.
-ktnef: The API permits access to the actual attachments, the message
-ktnef: properties (TNEF/MAPI), and allows one to view/extract message
-ktnef: formatted text in Rich Text Format format.
+ktnef: The ktnef library contains an API for the handling of TNEF data. The
+ktnef: API permits access to the actual attachments, the message properties
+ktnef: (TNEF/MAPI), and allows one to view/extract message formatted text in
+ktnef: Rich Text Format format.
+ktnef:
ktnef:
ktnef:
ktnef:
-ktnef: Home page: http://www.kde.org/
ktnef:
diff --git a/kde/slack-desc/ktorrent b/kde/slack-desc/ktorrent
index afb3a20..c2ab4f8 100644
--- a/kde/slack-desc/ktorrent
+++ b/kde/slack-desc/ktorrent
@@ -11,9 +11,9 @@ ktorrent:
ktorrent: KTorrent is a BitTorrent program with many features:
ktorrent: Download torrent files (of course :-), upload and download speed
ktorrent: capping, Internet searching, UDP trackers, port forwarding with UPnP,
-ktorrent: IP blocking, importing of partially or fully downloaded files,
-ktorrent: support for distributed hash tables, protocol encryption,
-ktorrent: bandwidth scheduling, and much more.
-ktorrent:
-ktorrent: KTorrent's developers are Joris Guisson and Ivan Vasic.
+ktorrent: IP blocking, importing of partially or fully downloaded files, support
+ktorrent: for distributed hash tables, protocol encryption, bandwidth
+ktorrent: scheduling, and much more. KTorrent's developers are Joris Guisson and
+ktorrent: Ivan Vasic.
ktorrent:
+ktorrent: Homepage: https://kde.org/applications/en/internet/org.kde.ktorrent
diff --git a/kde/slack-desc/ktouch b/kde/slack-desc/ktouch
index 74fdba1..d73b129 100644
--- a/kde/slack-desc/ktouch
+++ b/kde/slack-desc/ktouch
@@ -8,11 +8,11 @@
|-----handy-ruler------------------------------------------------------|
ktouch: ktouch (touch typing tutor)
ktouch:
-ktouch: A KDE program that helps you to learn and practice touch typing.
-ktouch:
-ktouch: For more information, visit: http://edu.kde.org/
-ktouch:
+ktouch: KTouch is a typewriter trainer for learning to touch type. It provides
+ktouch: you with text to train on and adjusts to different levels depending on
+ktouch: how good you are.
ktouch:
+ktouch: Homepage: https://kde.org/applications/en/education/org.kde.ktouch
ktouch:
ktouch:
ktouch:
diff --git a/kde/slack-desc/ktp-accounts-kcm b/kde/slack-desc/ktp-accounts-kcm
index d610ed8..2266d67 100644
--- a/kde/slack-desc/ktp-accounts-kcm
+++ b/kde/slack-desc/ktp-accounts-kcm
@@ -14,6 +14,6 @@ ktp-accounts-kcm:
ktp-accounts-kcm:
ktp-accounts-kcm:
ktp-accounts-kcm:
-ktp-accounts-kcm: See also:
-ktp-accounts-kcm: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-accounts-kcm:
+ktp-accounts-kcm:
ktp-accounts-kcm:
diff --git a/kde/slack-desc/ktp-approver b/kde/slack-desc/ktp-approver
index 2f59952..954300a 100644
--- a/kde/slack-desc/ktp-approver
+++ b/kde/slack-desc/ktp-approver
@@ -14,6 +14,6 @@ ktp-approver:
ktp-approver:
ktp-approver:
ktp-approver:
-ktp-approver: See also:
-ktp-approver: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-approver:
+ktp-approver:
ktp-approver:
diff --git a/kde/slack-desc/ktp-auth-handler b/kde/slack-desc/ktp-auth-handler
index 5b0319b..e6d000a 100644
--- a/kde/slack-desc/ktp-auth-handler
+++ b/kde/slack-desc/ktp-auth-handler
@@ -14,6 +14,6 @@ ktp-auth-handler:
ktp-auth-handler:
ktp-auth-handler:
ktp-auth-handler:
-ktp-auth-handler: See also:
-ktp-auth-handler: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-auth-handler:
+ktp-auth-handler:
ktp-auth-handler:
diff --git a/kde/slack-desc/ktp-call-ui b/kde/slack-desc/ktp-call-ui
index 993b4ba..e23371f 100644
--- a/kde/slack-desc/ktp-call-ui
+++ b/kde/slack-desc/ktp-call-ui
@@ -14,6 +14,6 @@ ktp-call-ui:
ktp-call-ui:
ktp-call-ui:
ktp-call-ui:
-ktp-call-ui: See also:
-ktp-call-ui: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-call-ui:
+ktp-call-ui:
ktp-call-ui:
diff --git a/kde/slack-desc/ktp-common-internals b/kde/slack-desc/ktp-common-internals
index 504acb8..5cf8506 100644
--- a/kde/slack-desc/ktp-common-internals
+++ b/kde/slack-desc/ktp-common-internals
@@ -14,6 +14,6 @@ ktp-common-internals:
ktp-common-internals:
ktp-common-internals:
ktp-common-internals:
-ktp-common-internals: See also:
-ktp-common-internals: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-common-internals:
+ktp-common-internals:
ktp-common-internals:
diff --git a/kde/slack-desc/ktp-contact-list b/kde/slack-desc/ktp-contact-list
index cf793ad..fde3ec1 100644
--- a/kde/slack-desc/ktp-contact-list
+++ b/kde/slack-desc/ktp-contact-list
@@ -14,6 +14,6 @@ ktp-contact-list:
ktp-contact-list:
ktp-contact-list:
ktp-contact-list:
-ktp-contact-list: See also:
-ktp-contact-list: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-contact-list:
+ktp-contact-list:
ktp-contact-list:
diff --git a/kde/slack-desc/ktp-contact-runner b/kde/slack-desc/ktp-contact-runner
index db98f64..0d54611 100644
--- a/kde/slack-desc/ktp-contact-runner
+++ b/kde/slack-desc/ktp-contact-runner
@@ -14,6 +14,6 @@ ktp-contact-runner:
ktp-contact-runner:
ktp-contact-runner:
ktp-contact-runner:
-ktp-contact-runner: See also:
-ktp-contact-runner: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-contact-runner:
+ktp-contact-runner:
ktp-contact-runner:
diff --git a/kde/slack-desc/ktp-desktop-applets b/kde/slack-desc/ktp-desktop-applets
index 0a815b5..58839f1 100644
--- a/kde/slack-desc/ktp-desktop-applets
+++ b/kde/slack-desc/ktp-desktop-applets
@@ -9,11 +9,11 @@
ktp-desktop-applets: ktp-desktop-applets (KDE Telepathy desktop applets)
ktp-desktop-applets:
ktp-desktop-applets: KDE Telepathy desktop applets, including:
-ktp-desktop-applets: * contacts
-ktp-desktop-applets: * presence
+ktp-desktop-applets: * contacts
+ktp-desktop-applets: * presence
+ktp-desktop-applets:
+ktp-desktop-applets:
ktp-desktop-applets:
ktp-desktop-applets:
ktp-desktop-applets:
-ktp-desktop-applets: See also:
-ktp-desktop-applets: https://community.kde.org/Real-Time_Communication_and_Collaboration
ktp-desktop-applets:
diff --git a/kde/slack-desc/ktp-filetransfer-handler b/kde/slack-desc/ktp-filetransfer-handler
index 2476f67..902487d 100644
--- a/kde/slack-desc/ktp-filetransfer-handler
+++ b/kde/slack-desc/ktp-filetransfer-handler
@@ -9,11 +9,11 @@
ktp-filetransfer-handler: ktp-filetransfer-handler (Telepathy file transfer handler)
ktp-filetransfer-handler:
ktp-filetransfer-handler: Telepathy-KDE file transfer handler. It basically does two thigs:
-ktp-filetransfer-handler: - Send files to your contact
-ktp-filetransfer-handler: - Receive files from your contact
+ktp-filetransfer-handler: Send files to your contact
+ktp-filetransfer-handler: Receive files from your contact
+ktp-filetransfer-handler:
+ktp-filetransfer-handler:
ktp-filetransfer-handler:
ktp-filetransfer-handler:
ktp-filetransfer-handler:
-ktp-filetransfer-handler: See also:
-ktp-filetransfer-handler: https://community.kde.org/Real-Time_Communication_and_Collaboration
ktp-filetransfer-handler:
diff --git a/kde/slack-desc/ktp-kded-module b/kde/slack-desc/ktp-kded-module
index fbfdb24..20f3c55 100644
--- a/kde/slack-desc/ktp-kded-module
+++ b/kde/slack-desc/ktp-kded-module
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktp-kded-module: ktp-kded-module (KDE integration for telepathy)
ktp-kded-module:
-ktp-kded-module: This module sits in KDED and takes care of various bits of
-ktp-kded-module: system integration like setting user to auto-away or handling
-ktp-kded-module: connection errors.
+ktp-kded-module: This module sits in KDED and takes care of various bits of system
+ktp-kded-module: integration like setting user to auto-away or handling connection
+ktp-kded-module: errors.
+ktp-kded-module:
ktp-kded-module:
ktp-kded-module:
ktp-kded-module:
ktp-kded-module:
-ktp-kded-module: More at: https://userbase.kde.org/Telepathy
ktp-kded-module:
diff --git a/kde/slack-desc/ktp-send-file b/kde/slack-desc/ktp-send-file
index 87170a5..f104dcd 100644
--- a/kde/slack-desc/ktp-send-file
+++ b/kde/slack-desc/ktp-send-file
@@ -14,6 +14,6 @@ ktp-send-file:
ktp-send-file:
ktp-send-file:
ktp-send-file:
-ktp-send-file: See also:
-ktp-send-file: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-send-file:
+ktp-send-file:
ktp-send-file:
diff --git a/kde/slack-desc/ktp-text-ui b/kde/slack-desc/ktp-text-ui
index 2617541..6e47229 100644
--- a/kde/slack-desc/ktp-text-ui
+++ b/kde/slack-desc/ktp-text-ui
@@ -14,6 +14,6 @@ ktp-text-ui:
ktp-text-ui:
ktp-text-ui:
ktp-text-ui:
-ktp-text-ui: See also:
-ktp-text-ui: https://community.kde.org/Real-Time_Communication_and_Collaboration
+ktp-text-ui:
+ktp-text-ui:
ktp-text-ui:
diff --git a/kde/slack-desc/ktuberling b/kde/slack-desc/ktuberling
index b6386d6..46a6137 100644
--- a/kde/slack-desc/ktuberling
+++ b/kde/slack-desc/ktuberling
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
ktuberling: ktuberling (picture game for children)
ktuberling:
-ktuberling: KTuberling a simple constructor game suitable for children and
-ktuberling: adults alike. The idea of the game is based around a once popular
-ktuberling: doll making concept.
+ktuberling: KTuberling a simple constructor game suitable for children and adults
+ktuberling: alike. The idea of the game is based around a once popular doll making
+ktuberling: concept.
+ktuberling:
ktuberling:
ktuberling:
ktuberling:
ktuberling:
-ktuberling: For more information, visit: http://www.kde.org
ktuberling:
diff --git a/kde/slack-desc/kturtle b/kde/slack-desc/kturtle
index 2fc0d35..a4bead7 100644
--- a/kde/slack-desc/kturtle
+++ b/kde/slack-desc/kturtle
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kturtle: kturtle (Logo programming environment)
-kturtle:
-kturtle: KTurtle is an educational Logo programming environment.
-kturtle:
-kturtle: For more information, visit: http://edu.kde.org/
-kturtle:
-kturtle:
-kturtle:
-kturtle:
+kturtle: kturtle (Logo-like programming environment)
kturtle:
+kturtle: KTurtle is an educational programming environment for learning how to
+kturtle: program. It provides all programming tools from its user interface.
+kturtle: The programming language used is TurtleScript, which is loosely based
+kturtle: on Logo. All commands and messages are translated into the user's
+kturtle: language. KTurtle features an intuitive syntax highlighting, simple
+kturtle: error messages, integrated canvas to make drawings, an integrated
+kturtle: help, slow-motion and step execution.
kturtle:
+kturtle: Homepage: https://kde.org/applications/en/education/org.kde.kturtle
diff --git a/kde/slack-desc/kubrick b/kde/slack-desc/kubrick
index 15bf1df..ed529a7 100644
--- a/kde/slack-desc/kubrick
+++ b/kde/slack-desc/kubrick
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kubrick: kubrick (3-D game based on Rubik's Cube)
kubrick:
-kubrick: Kubrick is a game based on the Rubik's Cube puzzle. The cube sizes
+kubrick: Kubrick is a game based on the Rubik's Cube puzzle. The cube sizes
kubrick: range from 2x2x2 up to 6x6x6, or you can play with irregular "bricks"
-kubrick: such as 5x3x2 or "mats" such as 6x4x1 or 2x2x1.
-kubrick: The game has a selection of puzzles at several levels of difficulty,
-kubrick: as well as demos of pretty patterns and solution moves, or you can
-kubrick: make up your own puzzles.
+kubrick: such as 5x3x2 or "mats" such as 6x4x1 or 2x2x1. The game has a
+kubrick: selection of puzzles at several levels of difficulty, as well as demos
+kubrick: of pretty patterns and solution moves, or you can make up your own
+kubrick: puzzles.
+kubrick:
kubrick:
-kubrick: For more information, visit: http://www.kde.org
kubrick:
diff --git a/kde/slack-desc/kunitconversion b/kde/slack-desc/kunitconversion
index 62ca100..f621c20 100644
--- a/kde/slack-desc/kunitconversion
+++ b/kde/slack-desc/kunitconversion
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kunitconversion: kunitconversion (kunitconversion)
+kunitconversion: kunitconversion (convert physical units)
kunitconversion:
+kunitconversion: KUnitConversion provides functions to convert values in different
+kunitconversion: physical units. It supports converting different prefixes (e.g. kilo,
+kunitconversion: mega, giga) as well as converting between different unit systems (e.g.
+kunitconversion: liters, gallons).
kunitconversion:
kunitconversion:
kunitconversion:
kunitconversion:
kunitconversion:
-kunitconversion:
-kunitconversion:
-kunitconversion:
-kunitconversion: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kuser b/kde/slack-desc/kuser
index c0ac97d..90d56b7 100644
--- a/kde/slack-desc/kuser
+++ b/kde/slack-desc/kuser
@@ -15,5 +15,5 @@ kuser:
kuser:
kuser:
kuser:
-kuser: For more information, visit: http://www.kde.org
+kuser:
kuser:
diff --git a/kde/slack-desc/kwallet b/kde/slack-desc/kwallet
index 64fbcf4..550ce06 100644
--- a/kde/slack-desc/kwallet
+++ b/kde/slack-desc/kwallet
@@ -10,8 +10,8 @@ kwallet: kwallet (KDE wallet manager)
kwallet:
kwallet: KDE Wallet Manager is a tool to manage your passwords under KDE.
kwallet:
-kwallet: kwallet's home page is:
-kwallet: https://projects.kde.org/projects/kde/kdeutils
+kwallet: Homepage: https://projects.kde.org/projects/kde/kdeutils
+kwallet:
kwallet:
kwallet:
kwallet:
diff --git a/kde/slack-desc/kwallet-pam b/kde/slack-desc/kwallet-pam
index dce404f..7f23d5a 100644
--- a/kde/slack-desc/kwallet-pam
+++ b/kde/slack-desc/kwallet-pam
@@ -15,5 +15,5 @@ kwallet-pam:
kwallet-pam:
kwallet-pam:
kwallet-pam:
-kwallet-pam: See https://www.kde.org/workspaces/plasmadesktop/
+kwallet-pam:
kwallet-pam:
diff --git a/kde/slack-desc/kwalletmanager b/kde/slack-desc/kwalletmanager
index 82d055d..634c7af 100644
--- a/kde/slack-desc/kwalletmanager
+++ b/kde/slack-desc/kwalletmanager
@@ -10,8 +10,8 @@ kwalletmanager: kwalletmanager (KDE wallet manager)
kwalletmanager:
kwalletmanager: KDE Wallet Manager is a tool to manage your passwords under KDE.
kwalletmanager:
-kwalletmanager: kwalletmanager's home page is:
-kwalletmanager: https://projects.kde.org/projects/kde/kdeutils
+kwalletmanager: Homepage: https://projects.kde.org/projects/kde/kdeutils
+kwalletmanager:
kwalletmanager:
kwalletmanager:
kwalletmanager:
diff --git a/kde/slack-desc/kwave b/kde/slack-desc/kwave
index 9ee24de..50adf14 100644
--- a/kde/slack-desc/kwave
+++ b/kde/slack-desc/kwave
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwave: kwave (A sound editor for KDE)
kwave:
-kwave: Kwave is a sound editor built on the KDE Frameworks 5.
-kwave: With Kwave you can record, play back, import and edit many sorts of
-kwave: audio files including multi channel files.
-kwave: Kwave includes some plugins to transform audio files in several ways
-kwave: and presents a graphical view with zoom- and scroll capability.
+kwave: Kwave is a sound editor built on the KDE Frameworks 5. With Kwave you
+kwave: can record, play back, import and edit many sorts of audio files
+kwave: including multi channel files. Kwave includes some plugins to
+kwave: transform audio files in several ways and presents a graphical view
+kwave: with zoom and scroll capability.
kwave:
+kwave: Homepage: http://kwave.sourceforge.net
kwave:
-kwave: For more information, visit: http://kwave.sourceforge.net
kwave:
diff --git a/kde/slack-desc/kwayland b/kde/slack-desc/kwayland
index 57b19f5..99bd3bf 100644
--- a/kde/slack-desc/kwayland
+++ b/kde/slack-desc/kwayland
@@ -15,5 +15,5 @@ kwayland:
kwayland:
kwayland:
kwayland:
-kwayland: For more information, visit: http://www.kde.org
+kwayland:
kwayland:
diff --git a/kde/slack-desc/kwayland-integration b/kde/slack-desc/kwayland-integration
index 1959d26..adc0442 100644
--- a/kde/slack-desc/kwayland-integration
+++ b/kde/slack-desc/kwayland-integration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwayland-integration: kwayland-integration (wayland integration plugins for KDE Frameworks)
kwayland-integration:
-kwayland-integration: Kwayland-integration provides integration plugins for various
-kwayland-integration: KDE Frameworks for Wayland.
+kwayland-integration: Kwayland-integration provides integration plugins for various KDE
+kwayland-integration: Frameworks for Wayland.
+kwayland-integration:
kwayland-integration:
kwayland-integration:
kwayland-integration:
kwayland-integration:
kwayland-integration:
-kwayland-integration: For more information, visit: http://www.kde.org
kwayland-integration:
diff --git a/kde/slack-desc/kwayland-server b/kde/slack-desc/kwayland-server
index ca3ee96..41a4890 100644
--- a/kde/slack-desc/kwayland-server
+++ b/kde/slack-desc/kwayland-server
@@ -15,5 +15,5 @@ kwayland-server:
kwayland-server:
kwayland-server:
kwayland-server:
-kwayland-server: Home page: https://kde.org/plasma-desktop
+kwayland-server:
kwayland-server:
diff --git a/kde/slack-desc/kwebkitpart b/kde/slack-desc/kwebkitpart
index 3938c9d..df0c266 100644
--- a/kde/slack-desc/kwebkitpart
+++ b/kde/slack-desc/kwebkitpart
@@ -5,13 +5,13 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
kwebkitpart: kwebkitpart (WebKit browser component)
kwebkitpart:
kwebkitpart: KWebKitPart is a web browser component for KDE based on (Qt)WebKit.
kwebkitpart: You can use it for example for browsing the web in Konqueror.
kwebkitpart:
-kwebkitpart: Homepage: http://kde-apps.org/content/show.php?content=127960
+kwebkitpart: Homepage: https://github.com/KDE/kwebkitpart
kwebkitpart:
kwebkitpart:
kwebkitpart:
diff --git a/kde/slack-desc/kwidgetsaddons b/kde/slack-desc/kwidgetsaddons
index fbc3c55..b8610d1 100644
--- a/kde/slack-desc/kwidgetsaddons
+++ b/kde/slack-desc/kwidgetsaddons
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kwidgetsaddons: kwidgetsaddons (kwidgetsaddons)
+kwidgetsaddons: kwidgetsaddons (desktop widgets)
kwidgetsaddons:
+kwidgetsaddons: This repository contains add-on widgets and classes for applications
+kwidgetsaddons: that use the Qt Widgets module. Provided are action classes that can
+kwidgetsaddons: be added to toolbars or menus, a wide range of widgets for selecting
+kwidgetsaddons: characters, fonts, colors, actions, dates and times, or MIME types,
+kwidgetsaddons: as well as platform-aware dialogs for configuration pages, message
+kwidgetsaddons: boxes, and password requests.
kwidgetsaddons:
kwidgetsaddons:
kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons:
-kwidgetsaddons: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kwin b/kde/slack-desc/kwin
index 2b5eecc..17123cc 100644
--- a/kde/slack-desc/kwin
+++ b/kde/slack-desc/kwin
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwin: kwin (KDE window manager)
kwin:
-kwin: KWin is a window manager for the X Window System. It is an
-kwin: integral part, and the default window manager of the Plasma
-kwin: Workspaces, but it can also be used on its own or with other
-kwin: desktop environments.
+kwin: KWin is a window manager for the X Window System. It is an integral
+kwin: part, and the default window manager of the Plasma Workspaces, but it
+kwin: can also be used on its own or with other desktop environments.
+kwin:
+kwin:
kwin:
kwin:
kwin:
kwin:
-kwin: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kwindowsystem b/kde/slack-desc/kwindowsystem
index d42a074..5c19bea 100644
--- a/kde/slack-desc/kwindowsystem
+++ b/kde/slack-desc/kwindowsystem
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kwindowsystem: kwindowsystem (kwindowsystem)
+kwindowsystem: kwindowsystem (windowing system access)
kwindowsystem:
+kwindowsystem: KWindowSystem provides information about the windowing system and
+kwindowsystem: allows interaction with the windowing system. It provides a high level
+kwindowsystem: API which is windowing system independent and has platform specific
+kwindowsystem: implementations. This API is inspired by X11 and thus not all
+kwindowsystem: functionality is available on all windowing systems.
kwindowsystem:
kwindowsystem:
kwindowsystem:
kwindowsystem:
-kwindowsystem:
-kwindowsystem:
-kwindowsystem:
-kwindowsystem:
-kwindowsystem: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kwordquiz b/kde/slack-desc/kwordquiz
index 629395f..5a115aa 100644
--- a/kde/slack-desc/kwordquiz
+++ b/kde/slack-desc/kwordquiz
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-kwordquiz: kwordquiz (a general purpose flash card program)
+kwordquiz: kwordquiz (flash card program)
+kwordquiz:
+kwordquiz: KWordQuiz is a general purpose flash card program. It can be used for
+kwordquiz: vocabulary learning and many other subjects.
kwordquiz:
-kwordquiz: KWordQuiz is a general purpose flash card program.
-kwordquiz: It can be used for vocabulary learning and many other subjects.
kwordquiz:
-kwordquiz: For more information, visit: http://edu.kde.org/
kwordquiz:
kwordquiz:
kwordquiz:
diff --git a/kde/slack-desc/kwrited b/kde/slack-desc/kwrited
index 121f1cb..20b6ec2 100644
--- a/kde/slack-desc/kwrited
+++ b/kde/slack-desc/kwrited
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
kwrited: kwrited (write daemon)
kwrited:
-kwrited: Watch for messages from local users sent with write(1)
-kwrited: or wall(1).
+kwrited: Watch for messages from local users sent with write(1) or wall(1).
+kwrited:
+kwrited:
kwrited:
kwrited:
kwrited:
kwrited:
kwrited:
kwrited:
-kwrited: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kxmlgui b/kde/slack-desc/kxmlgui
index 8607982..1ffc611 100644
--- a/kde/slack-desc/kxmlgui
+++ b/kde/slack-desc/kxmlgui
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-kxmlgui: kxmlgui (kxmlgui)
+kxmlgui: kxmlgui (menu and toolbar framework)
kxmlgui:
+kxmlgui: KXMLGUI provides a framework for managing menu and toolbar actions in
+kxmlgui: an abstract way. The actions are configured through an XML description
+kxmlgui: and hooks in the application code. The framework supports merging of
+kxmlgui: multiple description for example for integrating actions from plugins.
kxmlgui:
kxmlgui:
kxmlgui:
kxmlgui:
kxmlgui:
-kxmlgui:
-kxmlgui:
-kxmlgui:
-kxmlgui: Homepage: http://kde.org/
diff --git a/kde/slack-desc/kxmlrpcclient b/kde/slack-desc/kxmlrpcclient
index dbcb137..0ffae41 100644
--- a/kde/slack-desc/kxmlrpcclient
+++ b/kde/slack-desc/kxmlrpcclient
@@ -15,5 +15,5 @@ kxmlrpcclient:
kxmlrpcclient:
kxmlrpcclient:
kxmlrpcclient:
-kxmlrpcclient: For more information, visit: http://www.kde.org
+kxmlrpcclient:
kxmlrpcclient:
diff --git a/kde/slack-desc/labplot b/kde/slack-desc/labplot
index 26daeab..2fd2adb 100644
--- a/kde/slack-desc/labplot
+++ b/kde/slack-desc/labplot
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-labplot: labplot (nteractive graphing and analysis of scientific data)
+labplot: labplot (plot scientific data)
labplot:
-labplot: LabPlot is a KDE-application for interactive graphing and analysis
-labplot: of scientific data.
-labplot: LabPlot provides an easy way to create, manage and edit plots
-labplot: and to perform data analysis.
+labplot: LabPlot is a KDE application for interactive graphing and analysis of
+labplot: scientific data. LabPlot provides an easy way to create, manage and
+labplot: edit plots and to perform data analysis.
+labplot:
+labplot: Homepage: http://labplot.kde.org/
labplot:
labplot:
labplot:
-labplot: Home page: http://labplot.kde.org/
labplot:
diff --git a/kde/slack-desc/latte-dock b/kde/slack-desc/latte-dock
index 0872788..99d6d12 100644
--- a/kde/slack-desc/latte-dock
+++ b/kde/slack-desc/latte-dock
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
latte-dock: latte-dock (alternative dock for Plasma5)
latte-dock:
-latte-dock: Latte is a dock based on plasma frameworks providing an elegant
-latte-dock: and intuitive experience for your tasks and plasmoids.
-latte-dock: It animates its contents by using parabolic zoom effect and
-latte-dock: tries to be there only when it is needed.
-latte-dock: "Art in Coffee"
+latte-dock: Latte is a dock based on Plasma Frameworks providing an elegant and
+latte-dock: intuitive experience for your tasks and plasmoids. It animates its
+latte-dock: contents by using parabolic zoom effect and tries to be there only
+latte-dock: when it is needed. "Art in Coffee"
+latte-dock:
+latte-dock: Homepage: https://github.com/KDE/latte-dock
latte-dock:
latte-dock:
-latte-dock: Home page: https://github.com/KDE/latte-dock
latte-dock:
diff --git a/kde/slack-desc/libgravatar b/kde/slack-desc/libgravatar
index dbe14f9..c806332 100644
--- a/kde/slack-desc/libgravatar
+++ b/kde/slack-desc/libgravatar
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libgravatar: libgravatar (KDE PIM library providing Gravatar support)
+libgravatar: libgravatar (Gravatar support library)
libgravatar:
libgravatar: libgravatar is a KDE PIM library providing Gravatar support.
libgravatar:
@@ -15,5 +15,5 @@ libgravatar:
libgravatar:
libgravatar:
libgravatar:
-libgravatar: Home page: http://www.kde.org/
+libgravatar:
libgravatar:
diff --git a/kde/slack-desc/libkcddb b/kde/slack-desc/libkcddb
index 40f2950..2b2abc3 100644
--- a/kde/slack-desc/libkcddb
+++ b/kde/slack-desc/libkcddb
@@ -15,5 +15,5 @@ libkcddb:
libkcddb:
libkcddb:
libkcddb:
-libkcddb: For more information, visit: http://www.kde.org
+libkcddb:
libkcddb:
diff --git a/kde/slack-desc/libkcompactdisc b/kde/slack-desc/libkcompactdisc
index 67ce9c9..32565e4 100644
--- a/kde/slack-desc/libkcompactdisc
+++ b/kde/slack-desc/libkcompactdisc
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkcompactdisc: libkcompactdisc (KDE library for playing & ripping CDs)
+libkcompactdisc: libkcompactdisc (CD playing/ripping library)
+libkcompactdisc:
+libkcompactdisc: A KDE library for playing and ripping CDs.
libkcompactdisc:
-libkcompactdisc: A KDE library for playing & ripping CDs.
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
libkcompactdisc:
-libkcompactdisc: For more information, visit: http://www.kde.org
libkcompactdisc:
diff --git a/kde/slack-desc/libkdcraw b/kde/slack-desc/libkdcraw
index 4cf8dee..98de517 100644
--- a/kde/slack-desc/libkdcraw
+++ b/kde/slack-desc/libkdcraw
@@ -8,10 +8,10 @@
|-----handy-ruler------------------------------------------------------|
libkdcraw: libkdcraw (library wrapper around dcraw)
libkdcraw:
-libkdcraw: Libkdcraw is a C++ interface around the dcraw binary program, used
-libkdcraw: to decode RAW picture files.
+libkdcraw: Libkdcraw is a C++ interface around the dcraw binary program, used to
+libkdcraw: decode RAW picture files.
+libkdcraw:
libkdcraw:
-libkdcraw: For more information, visit: http://www.kipi-plugins.org/
libkdcraw:
libkdcraw:
libkdcraw:
diff --git a/kde/slack-desc/libkdegames b/kde/slack-desc/libkdegames
index d383885..5081771 100644
--- a/kde/slack-desc/libkdegames
+++ b/kde/slack-desc/libkdegames
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkdegames: libkdegames (common code and data for many KDE games)
+libkdegames: libkdegames (KDE game library)
libkdegames:
libkdegames: Libkdegames contains common code and data for many KDE games.
libkdegames:
@@ -15,5 +15,5 @@ libkdegames:
libkdegames:
libkdegames:
libkdegames:
-libkdegames: For more information, visit: http://www.kde.org
+libkdegames:
libkdegames:
diff --git a/kde/slack-desc/libkdepim b/kde/slack-desc/libkdepim
index ad7eaf8..c7deb47 100644
--- a/kde/slack-desc/libkdepim
+++ b/kde/slack-desc/libkdepim
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkdepim: libkdepim (libraries for KDE PIM applications)
+libkdepim: libkdepim (KDE PIM libraries)
libkdepim:
libkdepim: The package contains libraries for KDE PIM applications.
libkdepim:
@@ -15,5 +15,5 @@ libkdepim:
libkdepim:
libkdepim:
libkdepim:
-libkdepim: Home page: http://www.kde.org/
+libkdepim:
libkdepim:
diff --git a/kde/slack-desc/libkeduvocdocument b/kde/slack-desc/libkeduvocdocument
index 7269da2..bdfdd85 100644
--- a/kde/slack-desc/libkeduvocdocument
+++ b/kde/slack-desc/libkeduvocdocument
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkeduvocdocument: libkeduvocdocument (library to read and write KVTML files)
+libkeduvocdocument: libkeduvocdocument (KVTML library)
+libkeduvocdocument:
+libkeduvocdocument: A library (formerly part of kdeedu) for reading from/writing to the
+libkeduvocdocument: KVTML format (and others too).
+libkeduvocdocument:
libkeduvocdocument:
-libkeduvocdocument: A library (formerly part of kdeedu) for reading from/writing to
-libkeduvocdocument: the KVTML format (and others too).
-libkeduvocdocument: Currently used by: kanagram, khangman, parley, kwordquiz.
libkeduvocdocument:
libkeduvocdocument:
libkeduvocdocument:
libkeduvocdocument:
-libkeduvocdocument: For more information, visit: http://www.kde.org
libkeduvocdocument:
diff --git a/kde/slack-desc/libkexiv2 b/kde/slack-desc/libkexiv2
index 7a20619..106fc2e 100644
--- a/kde/slack-desc/libkexiv2
+++ b/kde/slack-desc/libkexiv2
@@ -6,12 +6,12 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkexiv2: libkexiv2 (wrapper library for exiv2 library)
+libkexiv2: libkexiv2 (wrapper library for exiv2)
libkexiv2:
libkexiv2: Libkexiv2 is a KDE wrapper around the Exiv2 library to manipulate
-libkexiv2: pictures' metadata.
+libkexiv2: image metadata.
+libkexiv2:
libkexiv2:
-libkexiv2: For more information, visit: http://www.kipi-plugins.org/
libkexiv2:
libkexiv2:
libkexiv2:
diff --git a/kde/slack-desc/libkgapi b/kde/slack-desc/libkgapi
index 1ad6f96..7d0f76c 100644
--- a/kde/slack-desc/libkgapi
+++ b/kde/slack-desc/libkgapi
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkgapi: libkgapi (library for interacting with Google service API)
+libkgapi: libkgapi (Google service API library)
+libkgapi:
+libkgapi: A KDE-based library for accessing various Google services via their
+libkgapi: public API.
libkgapi:
-libkgapi: A KDE-based library for accessing various Google services
-libkgapi: via their public API.
libkgapi:
libkgapi:
libkgapi:
libkgapi:
libkgapi:
-libkgapi: For more information, visit: http://www.kde.org
libkgapi:
diff --git a/kde/slack-desc/libkgeomap b/kde/slack-desc/libkgeomap
index 2480a7f..47b48fc 100644
--- a/kde/slack-desc/libkgeomap
+++ b/kde/slack-desc/libkgeomap
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkgeomap: libkgeomap (library for world map components)
+libkgeomap: libkgeomap (world map library)
libkgeomap:
-libkgeomap: A wrapper around world map components like marble, openstreetmap
-libkgeomap: and googlemap, for browsing and arranging photos on a map.
+libkgeomap: Libkgeomap is a wrapper around world map components as Marble,
+libkgeomap: OpenstreetMap and GoogleMap, for browsing and arranging photos on a
+libkgeomap: map.
libkgeomap:
+libkgeomap: Homepage: https://github.com/KDE/libkgeomap
libkgeomap:
libkgeomap:
libkgeomap:
libkgeomap:
-libkgeomap: For more information, visit: http://www.digikam.org
-libkgeomap:
diff --git a/kde/slack-desc/libkipi b/kde/slack-desc/libkipi
index c1098f9..c883824 100644
--- a/kde/slack-desc/libkipi
+++ b/kde/slack-desc/libkipi
@@ -6,13 +6,13 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkipi: libKipi (KDE Image Plugin Interface)
+libkipi: libkipi (KDE Image Plugin Interface)
libkipi:
libkipi: This package provides a generic KDE Image Plug-in Interface used by
-libkipi: some KDE image applications.
-libkipi: Plug-ins for this interface are in the kipi-plugins package.
+libkipi: some KDE image applications. Plug-ins for this interface are in the
+libkipi: kipi-plugins package.
libkipi:
-libkipi: For more info, visit: http://www.kipi-plugins.org/
+libkipi: Homepage: https://github.com/KDE/libkipi
libkipi:
libkipi:
libkipi:
diff --git a/kde/slack-desc/libkleo b/kde/slack-desc/libkleo
index 3b0dc39..657216f 100644
--- a/kde/slack-desc/libkleo
+++ b/kde/slack-desc/libkleo
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkleo: libkleo (KDE PIM cryptographic library)
+libkleo: libkleo (KDE key manager library)
libkleo:
-libkleo: libkleo is a KDE PIM cryptographic library.
+libkleo: This is libkleo, a library used by KDE PIM applications to handle
+libkleo: cryptographic key and certificate management.
libkleo:
libkleo:
libkleo:
libkleo:
libkleo:
libkleo:
-libkleo: Home page: http://www.kde.org/
libkleo:
diff --git a/kde/slack-desc/libkmahjongg b/kde/slack-desc/libkmahjongg
index 8851a3c..ac33822 100644
--- a/kde/slack-desc/libkmahjongg
+++ b/kde/slack-desc/libkmahjongg
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkmahjongg: libkmahjongg (library for rendering of Mahjongg tilesets)
+libkmahjongg: libkmahjongg (Mahjongg tilesets library)
+libkmahjongg:
+libkmahjongg: libkmahjongg is a library used by several KDE games for loading and
+libkmahjongg: rendering of Mahjongg tilesets.
libkmahjongg:
-libkmahjongg: libkmahjongg is a library used by several KDE games for loading
-libkmahjongg: and rendering of Mahjongg tilesets.
libkmahjongg:
libkmahjongg:
libkmahjongg:
libkmahjongg:
libkmahjongg:
-libkmahjongg: For more information, visit: http://www.kde.org
libkmahjongg:
diff --git a/kde/slack-desc/libkomparediff2 b/kde/slack-desc/libkomparediff2
index 6faddf7..4bb3e87 100644
--- a/kde/slack-desc/libkomparediff2
+++ b/kde/slack-desc/libkomparediff2
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkomparediff2: libkomparediff2 (library to compare files and strings)
+libkomparediff2: libkomparediff2 (file comparison library)
+libkomparediff2:
+libkomparediff2: libkomparediff2 is a shared library to compare files and strings using
+libkomparediff2: kdelibs and GNU diff, used in Kompare and KDevelop.
+libkomparediff2:
libkomparediff2:
-libkomparediff2: libkomparediff2 is a shared library to compare files
-libkomparediff2: and strings using kdelibs and GNU diff, used in Kompare
-libkomparediff2: and KDevelop.
libkomparediff2:
libkomparediff2:
libkomparediff2:
libkomparediff2:
-libkomparediff2: For more information, visit: http://www.kde.org
libkomparediff2:
diff --git a/kde/slack-desc/libksane b/kde/slack-desc/libksane
index 2146c3c..4399db5 100644
--- a/kde/slack-desc/libksane
+++ b/kde/slack-desc/libksane
@@ -6,11 +6,11 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libksane: libksane (KDE scan support interface)
+libksane: libksane (KDE scanner library)
libksane:
libksane: Libksane is a library to add scan support to KDE applications.
libksane:
-libksane: For more information, visit: http://www.kde.org
+libksane:
libksane:
libksane:
libksane:
diff --git a/kde/slack-desc/libkscreen2 b/kde/slack-desc/libkscreen2
index 4882728..1d59b7a 100644
--- a/kde/slack-desc/libkscreen2
+++ b/kde/slack-desc/libkscreen2
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libkscreen2: libkscreen2 (KDE screen management library)
+libkscreen2: libkscreen2 (screen management library)
+libkscreen2:
+libkscreen2: LibKScreen2 is a library that provides access to current configuration
+libkscreen2: of connected displays and ways to change the configuration.
+libkscreen2:
+libkscreen2:
libkscreen2:
-libkscreen2: LibKScreen2 is a library that provides access to current
-libkscreen2: configuration of connected displays and ways to change
-libkscreen2: the configuration.
libkscreen2:
libkscreen2:
libkscreen2:
-libkscreen2: For more information, visit:
-libkscreen2: http://community.kde.org/Solid/Projects/ScreenManagement
libkscreen2:
diff --git a/kde/slack-desc/libksieve b/kde/slack-desc/libksieve
index 440ab06..c1fbbe5 100644
--- a/kde/slack-desc/libksieve
+++ b/kde/slack-desc/libksieve
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-libksieve: libksieve (KDE PIM library for managing sieve mailfilters)
+libksieve: libksieve (sieve mailfilter library)
libksieve:
libksieve: libksieve is a KDE PIM library for managing sieve mailfilters.
libksieve:
@@ -15,5 +15,5 @@ libksieve:
libksieve:
libksieve:
libksieve:
-libksieve: Home page: http://www.kde.org/
+libksieve:
libksieve:
diff --git a/kde/slack-desc/libksysguard b/kde/slack-desc/libksysguard
index 1d65883..b34700d 100644
--- a/kde/slack-desc/libksysguard
+++ b/kde/slack-desc/libksysguard
@@ -6,8 +6,10 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-libksysguard: libksysguard (libksysguard)
+libksysguard: libksysguard (system information library)
libksysguard:
+libksysguard: Library to retrieve information on the current status of your computer
+libksysguard: hardware.
libksysguard:
libksysguard:
libksysguard:
@@ -15,5 +17,3 @@ libksysguard:
libksysguard:
libksysguard:
libksysguard:
-libksysguard:
-libksysguard: Homepage: http://kde.org/
diff --git a/kde/slack-desc/libktorrent b/kde/slack-desc/libktorrent
index 5bc41f8..401a21b 100644
--- a/kde/slack-desc/libktorrent
+++ b/kde/slack-desc/libktorrent
@@ -5,15 +5,15 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler------------------------------------------------------|
-libktorrent: libktorrent (Protocol library for the KDE BitTorrent program)
+ |-----handy-ruler------------------------------------------------------|
+libktorrent: libktorrent (KDE BitTorrent library)
libktorrent:
libktorrent: Libktorrent is the BitTorrent protocol library for ktorrent, which
-libktorrent: contains all the torrent downloading code. Although it is closely
-libktorrent: to ktorrent, the goal is to make libktorrent an independent
+libktorrent: contains all the torrent downloading code. Although it is closely
+libktorrent: related to ktorrent, the goal is to make libktorrent an independent
libktorrent: library which can be used by other applications.
libktorrent:
-libktorrent: Homepage: http://ktorrent.org
+libktorrent: Homepage: https://kde.org/applications/en/internet/org.kde.ktorrent
libktorrent:
libktorrent:
libktorrent:
diff --git a/kde/slack-desc/lokalize b/kde/slack-desc/lokalize
index dc143f7..43f8bf5 100644
--- a/kde/slack-desc/lokalize
+++ b/kde/slack-desc/lokalize
@@ -15,5 +15,5 @@ lokalize: merging (synchronization) capability. It is primarily targeted for
lokalize: software translation and also integrates external conversion tools
lokalize: for freelance office document translation.
lokalize:
-lokalize: Home: http://www.kde.org/applications/development/lokalize/
+lokalize: Homepage: https://www.kde.org/applications/development/lokalize/
lokalize:
diff --git a/kde/slack-desc/lskat b/kde/slack-desc/lskat
index cccb871..93005eb 100644
--- a/kde/slack-desc/lskat
+++ b/kde/slack-desc/lskat
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-lskat: lskat (Lieutenant Skat card game for KDE)
+lskat: lskat (Lieutenant Skat card game)
lskat:
lskat: Lieutenant Skat (from German "Offiziersskat") is a fun and engaging
lskat: card game for two players, where the second player is either live
@@ -15,5 +15,5 @@ lskat:
lskat:
lskat:
lskat:
-lskat: For more information, visit: http://www.kde.org
+lskat:
lskat:
diff --git a/kde/slack-desc/mailcommon b/kde/slack-desc/mailcommon
index 4442708..ea23e59 100644
--- a/kde/slack-desc/mailcommon
+++ b/kde/slack-desc/mailcommon
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-mailcommon: mailcommon (KDE PIM library support for mail applications)
+mailcommon: mailcommon (mail application library)
mailcommon:
mailcommon: KDE PIM library providing support for mail applications.
mailcommon:
@@ -15,5 +15,5 @@ mailcommon:
mailcommon:
mailcommon:
mailcommon:
-mailcommon: Home page: http://www.kde.org/
+mailcommon:
mailcommon:
diff --git a/kde/slack-desc/mailimporter b/kde/slack-desc/mailimporter
index f8a248a..20a129c 100644
--- a/kde/slack-desc/mailimporter
+++ b/kde/slack-desc/mailimporter
@@ -15,5 +15,5 @@ mailimporter:
mailimporter:
mailimporter:
mailimporter:
-mailimporter: Home page: http://www.kde.org/
+mailimporter:
mailimporter:
diff --git a/kde/slack-desc/marble b/kde/slack-desc/marble
index 06e3e8e..d018d65 100644
--- a/kde/slack-desc/marble
+++ b/kde/slack-desc/marble
@@ -8,13 +8,12 @@
|-----handy-ruler------------------------------------------------------|
marble: marble (virtual globe)
marble:
-marble: Marble is a virtual globe with advanced routing capabilities. You can
+marble: Marble is a virtual globe with advanced routing capabilities. You can
marble: download maps from a variety of themes and explore the surroundings.
-marble: Record your trip and share it with your friends.
-marble: Features: online and offline routing, GPS tracking and recording,
-marble: themable maps (OpenStreetMap, Satellite Map and more), support for
-marble: different projections (globe, flat map, ...) and other planets,
-marble: download of maps and route data for offline usage.
+marble: Record your trip and share it with your friends. Features online and
+marble: offline routing, GPS tracking and recording, themable maps
+marble: (OpenStreetMap, Satellite Map and more), support for different
+marble: projections (globe, flat map, ...) and other planets, and download of
+marble: maps and route data for offline usage.
+marble:
marble:
-marble: For more information, visit: http://edu.kde.org/
-
diff --git a/kde/slack-desc/mbox-importer b/kde/slack-desc/mbox-importer
index 96e34f8..e16a125 100644
--- a/kde/slack-desc/mbox-importer
+++ b/kde/slack-desc/mbox-importer
@@ -15,5 +15,5 @@ mbox-importer:
mbox-importer:
mbox-importer:
mbox-importer:
-mbox-importer: Home page: http://www.kde.org/
+mbox-importer:
mbox-importer:
diff --git a/kde/slack-desc/messagelib b/kde/slack-desc/messagelib
index 36f958a..623a691 100644
--- a/kde/slack-desc/messagelib
+++ b/kde/slack-desc/messagelib
@@ -15,5 +15,5 @@ messagelib:
messagelib:
messagelib:
messagelib:
-messagelib: Home page: http://www.kde.org/
+messagelib:
messagelib:
diff --git a/kde/slack-desc/milou b/kde/slack-desc/milou
index 0d4dc65..4e52896 100644
--- a/kde/slack-desc/milou
+++ b/kde/slack-desc/milou
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
milou: milou (Plasma search applet)
milou:
-milou: A Plasma applet that can search files, emails, contacts,
-milou: events and more data indexed by KDE Desktop Search.
+milou: A Plasma applet that can search files, emails, contacts, events and
+milou: more data indexed by KDE Desktop Search.
+milou:
milou:
milou:
milou:
milou:
milou:
milou:
-milou: Homepage: http://kde.org/
diff --git a/kde/slack-desc/minuet b/kde/slack-desc/minuet
index 45eeaee..fb97760 100644
--- a/kde/slack-desc/minuet
+++ b/kde/slack-desc/minuet
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
minuet: minuet (software for music education)
minuet:
-minuet: Minuet: the KDE software for music education, such as ear training,
+minuet: Minuet is the KDE software for music education, such as ear training,
minuet: first-sight reading, solfa, scales, rhythm, harmony, and
-minuet: improvisation.
-minuet: Minuet makes extensive use of MIDI capabilities.
+minuet: improvisation. Minuet makes extensive use of MIDI capabilities.
+minuet:
+minuet:
minuet:
minuet:
minuet:
-minuet: For more information, visit: http://www.kde.org
minuet:
diff --git a/kde/slack-desc/modemmanager-qt b/kde/slack-desc/modemmanager-qt
index d515c01..ce9a1f6 100644
--- a/kde/slack-desc/modemmanager-qt
+++ b/kde/slack-desc/modemmanager-qt
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
modemmanager-qt: modemmanager-qt (ModemManager Qt5 bindings)
modemmanager-qt:
-modemmanager-qt: modemmanager-qt is a Tier 1 KDE Frameworks module
-modemmanager-qt: wrapping ModemManager DBus API.
+modemmanager-qt: modemmanager-qt is a Tier 1 KDE Frameworks module wrapping the
+modemmanager-qt: ModemManager DBus API.
+modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
modemmanager-qt:
-modemmanager-qt: For more information, visit: http://www.kde.org
modemmanager-qt:
diff --git a/kde/slack-desc/networkmanager-qt b/kde/slack-desc/networkmanager-qt
index 45c6ba5..5c0ce54 100644
--- a/kde/slack-desc/networkmanager-qt
+++ b/kde/slack-desc/networkmanager-qt
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-networkmanager-qt: libnm-qt (NetworkManager Qt bindings)
+networkmanager-qt: networkmanager-qt (NetworkManager Qt bindings)
networkmanager-qt:
networkmanager-qt: This package contains Qt bindings for NetworkManager.
networkmanager-qt:
@@ -15,5 +15,5 @@ networkmanager-qt:
networkmanager-qt:
networkmanager-qt:
networkmanager-qt:
-networkmanager-qt: For more information, visit: http://www.kde.org
+networkmanager-qt:
networkmanager-qt:
diff --git a/kde/slack-desc/okteta b/kde/slack-desc/okteta
index acc83d2..23c1c6b 100644
--- a/kde/slack-desc/okteta
+++ b/kde/slack-desc/okteta
@@ -15,5 +15,5 @@ okteta:
okteta:
okteta:
okteta:
-okteta: For more information, visit: http://www.kde.org
+okteta:
okteta:
diff --git a/kde/slack-desc/okular b/kde/slack-desc/okular
index 333d94f..9bf4c4b 100644
--- a/kde/slack-desc/okular
+++ b/kde/slack-desc/okular
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
okular: okular (a document viewer)
okular:
-okular: Okular is a document viewer for KDE.
-okular:
-okular: For more information, visit: http://www.kde.org
-okular:
-okular:
+okular: Okular is the unified document viewer for KDE. Okular combines
+okular: excellent functionalities with the versatility of supporting different
+okular: kinds of documents, like PDF, Postscript, DjVu, CHM, XPS, ePub, and
+okular: others.
okular:
+okular: Homepage: https://okular.kde.org
okular:
okular:
okular:
diff --git a/kde/slack-desc/oxygen b/kde/slack-desc/oxygen
index 3e090ef..8b323f3 100644
--- a/kde/slack-desc/oxygen
+++ b/kde/slack-desc/oxygen
@@ -8,7 +8,8 @@
|-----handy-ruler------------------------------------------------------|
oxygen: oxygen (KDE window manager theme)
oxygen:
-oxygen: KDE window manager theme.
+oxygen: Oxygen KDE window manager theme.
+oxygen:
oxygen:
oxygen:
oxygen:
@@ -16,4 +17,3 @@ oxygen:
oxygen:
oxygen:
oxygen:
-oxygen: Homepage: http://kde.org/
diff --git a/kde/slack-desc/oxygen-fonts b/kde/slack-desc/oxygen-fonts
index aae2124..1aae695 100644
--- a/kde/slack-desc/oxygen-fonts
+++ b/kde/slack-desc/oxygen-fonts
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
oxygen-fonts: oxygen-fonts (KDE desktop fonts)
oxygen-fonts:
-oxygen-fonts: Desktop/GUI font family for integrated use with the
-oxygen-fonts: KDE desktop.
+oxygen-fonts: Desktop/GUI font family for integrated use with the KDE desktop.
+oxygen-fonts:
+oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
oxygen-fonts:
-oxygen-fonts: Homepage: http://kde.org/
diff --git a/kde/slack-desc/oxygen-gtk2 b/kde/slack-desc/oxygen-gtk2
index 9398d8d..3e7d4f5 100644
--- a/kde/slack-desc/oxygen-gtk2
+++ b/kde/slack-desc/oxygen-gtk2
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
oxygen-gtk2: oxygen-gtk2 (Oxygen GTK+ engine)
oxygen-gtk2:
-oxygen-gtk2: Oxygen-Gtk2 is a port of the KDE widget theme Oxygen, to GTK+.
-oxygen-gtk2: It's primary goal is to ensure visual consistency between GTK+ and
-oxygen-gtk2: qt-based applications running under kde. A secondary objective is
-oxygen-gtk2: to also have a stand-alone nice looking GTK+ theme that would behave
-oxygen-gtk2: well on other Desktop Environments.
-oxygen-gtk2: Unlike other attempts made to port the kde oxygen theme to GTK+, this
-oxygen-gtk2: attempt does not depend on Qt.
+oxygen-gtk2: Oxygen-Gtk2 is a port of the KDE widget theme Oxygen, to GTK+. Its
+oxygen-gtk2: primary goal is to ensure visual consistency between GTK+ and qt-based
+oxygen-gtk2: applications running under KDE. A secondary objective is to also have
+oxygen-gtk2: a stand-alone nice looking GTK+ theme that would behave well on other
+oxygen-gtk2: desktop environments. Unlike other attempts made to port the KDE
+oxygen-gtk2: oxygen theme to GTK+, this attempt does not depend on Qt.
oxygen-gtk2:
oxygen-gtk2: See: http://projects.kde.org/projects/playground/artwork/oxygen-gtk
+oxygen-gtk2:
diff --git a/kde/slack-desc/oxygen-icons5 b/kde/slack-desc/oxygen-icons5
index fab6fec..bbb2f1d 100644
--- a/kde/slack-desc/oxygen-icons5
+++ b/kde/slack-desc/oxygen-icons5
@@ -6,11 +6,11 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-oxygen-icons5: oxygen-icons5 (Oxygen theme for the KDE Plasma Desktop)
+oxygen-icons5: oxygen-icons5 (Oxygen theme for KDE)
oxygen-icons5:
oxygen-icons5: Oxygen provides a complete and modern icon theme for KDE.
oxygen-icons5:
-oxygen-icons5: Visit the Oxygen project online: http://www.oxygen-icons5.org
+oxygen-icons5:
oxygen-icons5:
oxygen-icons5:
oxygen-icons5:
diff --git a/kde/slack-desc/palapeli b/kde/slack-desc/palapeli
index f0d2e85..99cc7ba 100644
--- a/kde/slack-desc/palapeli
+++ b/kde/slack-desc/palapeli
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
palapeli: palapeli (jigsaw puzzle game)
palapeli:
-palapeli: Palapeli is a single-player jigsaw puzzle game.
-palapeli: Unlike other games in that genre, you are not limited to aligning
-palapeli: pieces on imaginary grids. The pieces are freely moveable.
-palapeli: Also, Palapeli features real persistency, i.e. everything you do
-palapeli: is saved on your disk immediately.
+palapeli: Palapeli is a single-player jigsaw puzzle game. Unlike other games in
+palapeli: that genre, you are not limited to aligning pieces on imaginary grids.
+palapeli: The pieces are freely moveable. Also, Palapeli features real
+palapeli: persistency, i.e. everything you do is saved immediately.
+palapeli:
+palapeli:
palapeli:
palapeli:
-palapeli: For more information, visit: http://www.kde.org
palapeli:
diff --git a/kde/slack-desc/parley b/kde/slack-desc/parley
index c4c08e9..765c0a7 100644
--- a/kde/slack-desc/parley
+++ b/kde/slack-desc/parley
@@ -10,7 +10,7 @@ parley: parley (vocabulary trainer)
parley:
parley: Parley is a vocabulary trainer for KDE.
parley:
-parley: For more information, visit: http://edu.kde.org/
+parley:
parley:
parley:
parley:
diff --git a/kde/slack-desc/partitionmanager b/kde/slack-desc/partitionmanager
index 37dbe49..846bfe4 100644
--- a/kde/slack-desc/partitionmanager
+++ b/kde/slack-desc/partitionmanager
@@ -5,12 +5,12 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler------------------------------------------------|
-partitionmanager: partitionmanager (Graphical partition manager for KDE)
+ |-----handy-ruler------------------------------------------------------|
+partitionmanager: partitionmanager (Graphical partition manager)
+partitionmanager:
+partitionmanager: Easily manage disks, partitions and filesystems on your KDE desktop.
+partitionmanager: Create, resize, move, copy, back up, restore or delete partitions.
partitionmanager:
-partitionmanager: Easily manage disks, partitions and filesystems on your KDE
-partitionmanager: desktop. Create, resize, move, copy, back up, restore or
-partitionmanager: delete partitions.
partitionmanager:
partitionmanager:
partitionmanager:
diff --git a/kde/slack-desc/picmi b/kde/slack-desc/picmi
index bc23ac6..4d01048 100644
--- a/kde/slack-desc/picmi
+++ b/kde/slack-desc/picmi
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
picmi: picmi (logic puzzle game)
picmi:
-picmi: Picmi is a single player logic-based puzzle game.
-picmi: The goal is to color cells according to numbers given at the side
-picmi: of the board in order to uncover a hidden pattern or picture.
+picmi: Picmi is a single player logic-based puzzle game. The goal is to color
+picmi: cells according to numbers given at the side of the board in order to
+picmi: uncover a hidden pattern or picture.
+picmi:
picmi:
picmi:
picmi:
picmi:
-picmi: For more information, visit: http://www.kde.org
picmi:
diff --git a/kde/slack-desc/pim-data-exporter b/kde/slack-desc/pim-data-exporter
index 6094dde..e4d4135 100644
--- a/kde/slack-desc/pim-data-exporter
+++ b/kde/slack-desc/pim-data-exporter
@@ -6,7 +6,7 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-pim-data-exporter: pim-data-exporter (import and export KDE PIM settings)
+pim-data-exporter: pim-data-exporter (export KDE PIM settings)
pim-data-exporter:
pim-data-exporter: Import and export KDE PIM settings.
pim-data-exporter:
@@ -15,5 +15,5 @@ pim-data-exporter:
pim-data-exporter:
pim-data-exporter:
pim-data-exporter:
-pim-data-exporter: Home page: http://www.kde.org/
+pim-data-exporter:
pim-data-exporter:
diff --git a/kde/slack-desc/pim-sieve-editor b/kde/slack-desc/pim-sieve-editor
index ea1e912..423ba8f 100644
--- a/kde/slack-desc/pim-sieve-editor
+++ b/kde/slack-desc/pim-sieve-editor
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-pim-sieve-editor: pim-sieve-editor (mail sieve editor)
+pim-sieve-editor: pim-sieve-editor (Sieve script editor)
pim-sieve-editor:
-pim-sieve-editor: Mail sieve editor.
+pim-sieve-editor: pim-sieve-editor is an editor for Sieve scripts used for email
+pim-sieve-editor: filtering on a mail server.
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
pim-sieve-editor:
-pim-sieve-editor: Home page: http://www.kde.org/
pim-sieve-editor:
diff --git a/kde/slack-desc/pimcommon b/kde/slack-desc/pimcommon
index 3279604..699738a 100644
--- a/kde/slack-desc/pimcommon
+++ b/kde/slack-desc/pimcommon
@@ -15,5 +15,5 @@ pimcommon:
pimcommon:
pimcommon:
pimcommon:
-pimcommon: Home page: http://www.kde.org/
+pimcommon:
pimcommon:
diff --git a/kde/slack-desc/plasma-browser-integration b/kde/slack-desc/plasma-browser-integration
index 97d3468..2097608 100644
--- a/kde/slack-desc/plasma-browser-integration
+++ b/kde/slack-desc/plasma-browser-integration
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-browser-integration: plasma-browser-integration (integrate browsers into the Plasma desktop)
+plasma-browser-integration: plasma-browser-integration (integrate browsers into Plasma)
+plasma-browser-integration:
+plasma-browser-integration: The plasma-browser-integration package contains components necessary
+plasma-browser-integration: to integrate browsers into the Plasma Desktop
plasma-browser-integration:
-plasma-browser-integration: The plasma-browser-integration package contains
-plasma-browser-integration: omponents necessary to integrate browsers into the Plasma Desktop
plasma-browser-integration:
plasma-browser-integration:
plasma-browser-integration:
plasma-browser-integration:
plasma-browser-integration:
-plasma-browser-integration: Home page: https://www.kde.org/plasma-desktop
plasma-browser-integration:
diff --git a/kde/slack-desc/plasma-desktop b/kde/slack-desc/plasma-desktop
index c978f4b..ea48427 100644
--- a/kde/slack-desc/plasma-desktop
+++ b/kde/slack-desc/plasma-desktop
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
plasma-desktop: plasma-desktop (KDE Plasma Desktop)
plasma-desktop:
-plasma-desktop: Provides the environment for running and managing
-plasma-desktop: applications and integrating interaction of
-plasma-desktop: applications. It is designed as generic environment
-plasma-desktop: for all kinds of desktop applications, not only
-plasma-desktop: applications built on the KDE Platform. It integrates
-plasma-desktop: best with applications following the standards used
-plasma-desktop: by the KDE Platform.
+plasma-desktop: Provides the environment for running and managing applications and
+plasma-desktop: integrating interaction of applications. It is designed as a generic
+plasma-desktop: environment for all kinds of desktop applications, not only
+plasma-desktop: applications built on the KDE Platform. It integrates best with
+plasma-desktop: applications following the standards used by the KDE Platform.
+plasma-desktop:
+plasma-desktop:
+plasma-desktop:
plasma-desktop:
-plasma-desktop: Homepage: http://kde.org/
diff --git a/kde/slack-desc/plasma-framework b/kde/slack-desc/plasma-framework
index 8eab3dc..25f0612 100644
--- a/kde/slack-desc/plasma-framework
+++ b/kde/slack-desc/plasma-framework
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-plasma-framework: plasma-framework (Plasma libraries and runtime components)
+plasma-framework: plasma-framework (Plasma libraries and components)
+plasma-framework:
+plasma-framework: This package contains Plasma libraries and runtime components such as
+plasma-framework: QML support for Plasma.
plasma-framework:
-plasma-framework: This package contains Plasma libraries and runtime
-plasma-framework: components such as QML support for Plasma.
plasma-framework:
plasma-framework:
plasma-framework:
plasma-framework:
plasma-framework:
plasma-framework:
-plasma-framework: Homepage: http://kde.org/
diff --git a/kde/slack-desc/plasma-integration b/kde/slack-desc/plasma-integration
index ff92725..0a075a6 100644
--- a/kde/slack-desc/plasma-integration
+++ b/kde/slack-desc/plasma-integration
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
plasma-integration: plasma-integration (Plasma theme integration plugins)
plasma-integration:
-plasma-integration: Qt Platform Theme integration plugins for the Plasma workspaces
+plasma-integration: Plasma Integration is a set of plugins responsible for better
+plasma-integration: integration of Qt applications when running on a KDE Plasma workspace.
+plasma-integration:
plasma-integration:
plasma-integration:
plasma-integration:
plasma-integration:
plasma-integration:
-plasma-integration: For more information, visit:
-plasma-integration: https://projects.kde.org/plasma-integration
plasma-integration:
diff --git a/kde/slack-desc/plasma-pa b/kde/slack-desc/plasma-pa
index 9ad039c..21bcb68 100644
--- a/kde/slack-desc/plasma-pa
+++ b/kde/slack-desc/plasma-pa
@@ -6,7 +6,7 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-pa: plasma-pa (KDE audio volume manager using PA)
+plasma-pa: plasma-pa (Plasma PA volume applet)
plasma-pa:
plasma-pa: Plasma applet for audio volume management using PulseAudio.
plasma-pa:
@@ -15,5 +15,5 @@ plasma-pa:
plasma-pa:
plasma-pa:
plasma-pa:
-plasma-pa: For more information, visit: https://projects.kde.org/plasma-pa
+plasma-pa:
plasma-pa:
diff --git a/kde/slack-desc/plasma-sdk b/kde/slack-desc/plasma-sdk
index 5da3248..21d29bd 100644
--- a/kde/slack-desc/plasma-sdk
+++ b/kde/slack-desc/plasma-sdk
@@ -15,5 +15,5 @@ plasma-sdk:
plasma-sdk:
plasma-sdk:
plasma-sdk:
-plasma-sdk: For more information, visit: http://www.kde.org
+plasma-sdk:
plasma-sdk:
diff --git a/kde/slack-desc/plasma-vault b/kde/slack-desc/plasma-vault
index 32a8ac5..8747156 100644
--- a/kde/slack-desc/plasma-vault
+++ b/kde/slack-desc/plasma-vault
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-vault: plasma-vault (create encrypted vaults in plasma5 desktop)
+plasma-vault: plasma-vault (create encrypted vaults)
plasma-vault:
-plasma-vault: Plasma applet and services for creating encrypted vaults.
-plasma-vault: Plasma Vault offers strong encryption features presented in
-plasma-vault: a user-friendly way. Lock and encrypt documents and hide them
-plasma-vault: when the user is logged in.
+plasma-vault: Plasma applet and services for creating encrypted vaults. Plasma Vault
+plasma-vault: offers strong encryption features presented in a user-friendly way.
+plasma-vault: Lock and encrypt documents and hide them when the user is logged in.
plasma-vault: These 'vaults' can be decrypted and opened easily.
plasma-vault:
plasma-vault:
-plasma-vault: Home page: http://www.kde.org/
+plasma-vault:
+plasma-vault:
plasma-vault:
diff --git a/kde/slack-desc/plasma-wayland-protocols b/kde/slack-desc/plasma-wayland-protocols
index 6d568bc..8c597c4 100644
--- a/kde/slack-desc/plasma-wayland-protocols
+++ b/kde/slack-desc/plasma-wayland-protocols
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-plasma-wayland-protocols: plasma-wayland-protocols (plasma specific protocols for wayland)
+plasma-wayland-protocols: plasma-wayland-protocols (Plasma protocols for Wayland)
plasma-wayland-protocols:
-plasma-wayland-protocols: Plasma specific protocols for Wayland.
+plasma-wayland-protocols: This project contains xml files of non-standard Wayland protocols used
+plasma-wayland-protocols: by Plasma.
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
plasma-wayland-protocols:
-plasma-wayland-protocols: Home page: https://kde.org/plasma-desktop
plasma-wayland-protocols:
diff --git a/kde/slack-desc/plasma-workspace b/kde/slack-desc/plasma-workspace
index 7003c84..512a2b8 100644
--- a/kde/slack-desc/plasma-workspace
+++ b/kde/slack-desc/plasma-workspace
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
plasma-workspace: plasma-workspace (KDE Plasma Workspace)
plasma-workspace:
+plasma-workspace: The Plasma Workspace provides support for KDE Plasma Widgets,
+plasma-workspace: integrated search, hardware management, and a high degree of
+plasma-workspace: customizability.
plasma-workspace:
plasma-workspace:
plasma-workspace:
plasma-workspace:
plasma-workspace:
plasma-workspace:
-plasma-workspace:
-plasma-workspace:
-plasma-workspace: Homepage: http://kde.org/
diff --git a/kde/slack-desc/plasma-workspace-wallpapers b/kde/slack-desc/plasma-workspace-wallpapers
index 113df69..6dc16da 100644
--- a/kde/slack-desc/plasma-workspace-wallpapers
+++ b/kde/slack-desc/plasma-workspace-wallpapers
@@ -5,10 +5,10 @@
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
- |-----handy-ruler-------------------------------------------------|
-plasma-workspace-wallpapers: plasma-workspace-wallpapers (Wallpapers for KDE Plasma Workspace)
+ |-----handy-ruler------------------------------------------------------|
+plasma-workspace-wallpapers: plasma-workspace-wallpapers (Wallpapers for Plasma)
plasma-workspace-wallpapers:
-plasma-workspace-wallpapers: Additional wallpapers for KDE.
+plasma-workspace-wallpapers: Additional wallpapers for the KDE Plasma Workspace.
plasma-workspace-wallpapers:
plasma-workspace-wallpapers:
plasma-workspace-wallpapers:
diff --git a/kde/slack-desc/plasma5-nm b/kde/slack-desc/plasma5-nm
index 1c2dab3..8d638eb 100644
--- a/kde/slack-desc/plasma5-nm
+++ b/kde/slack-desc/plasma5-nm
@@ -9,11 +9,11 @@
plasma5-nm: plasma5-nm (KDE networkmanagement applet)
plasma5-nm:
plasma5-nm: This package contains the KDE networkmanagement applet for Plasma 5.
-plasma5-nm: This applet is written in QML and replacing the old widget based
-plasma5-nm: networkmanagement applet.
plasma5-nm:
plasma5-nm:
plasma5-nm:
plasma5-nm:
-plasma5-nm: For more information, visit: http://www.kde.org
+plasma5-nm:
+plasma5-nm:
+plasma5-nm:
plasma5-nm:
diff --git a/kde/slack-desc/polkit-kde-framework b/kde/slack-desc/polkit-kde-framework
index 9d62204..5846763 100644
--- a/kde/slack-desc/polkit-kde-framework
+++ b/kde/slack-desc/polkit-kde-framework
@@ -5,15 +5,15 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
polkit-kde-framework: polkit-kde-framework (KDE polkit authenticator)
polkit-kde-framework:
polkit-kde-framework: This daemon provides a polkit authenticator UI for KDE.
polkit-kde-framework:
+polkit-kde-framework: See also:
+polkit-kde-framework: https://projects.kde.org/projects/kde/workspace/polkit-kde-agent-1
polkit-kde-framework:
polkit-kde-framework:
polkit-kde-framework:
polkit-kde-framework:
-polkit-kde-framework: See also:
-polkit-kde-framework: https://projects.kde.org/projects/kde/workspace/polkit-kde-agent-1
polkit-kde-framework:
diff --git a/kde/slack-desc/polkit-kde-kcmodules-framework b/kde/slack-desc/polkit-kde-kcmodules-framework
index 91a3207..cf66c65 100644
--- a/kde/slack-desc/polkit-kde-kcmodules-framework
+++ b/kde/slack-desc/polkit-kde-kcmodules-framework
@@ -5,7 +5,7 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
polkit-kde-kcmodules-framework: polkit-kde-kcmodules-framework (KDE polkit kcmodules)
polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework: This package contains the kcm_polkit modules for KDE.
@@ -16,3 +16,4 @@ polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework:
polkit-kde-kcmodules-framework:
+polkit-kde-kcmodules-framework:
diff --git a/kde/slack-desc/powerdevil b/kde/slack-desc/powerdevil
index 23dd81d..87d9937 100644
--- a/kde/slack-desc/powerdevil
+++ b/kde/slack-desc/powerdevil
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
powerdevil: powerdevil (power management tool)
powerdevil:
-powerdevil: PowerDevil is a KDE utility for Laptop Powermanagement.
+powerdevil: PowerDevil is a is a configuration tool for Power Management in
+powerdevil: Plasma. Through this module, you can define your computer's behavior
+powerdevil: in various situations, allowing you to save as much energy as
+powerdevil: possible.
powerdevil:
powerdevil:
powerdevil:
powerdevil:
powerdevil:
-powerdevil:
-powerdevil:
-powerdevil: Homepage: http://kde.org/
diff --git a/kde/slack-desc/poxml b/kde/slack-desc/poxml
index f01885d..222570b 100644
--- a/kde/slack-desc/poxml
+++ b/kde/slack-desc/poxml
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-poxml: poxml (translate DocBook XML files using gettext po files)
+poxml: poxml (translate DocBook XML files)
poxml:
poxml: This is a collection of tools that facilitate translating DocBook XML
-poxml: files using Gettext message files (PO files).
-poxml: Also included are several command-line utilities for manipulating
-poxml: DocBook XML files, PO files and PO template files.
+poxml: files using Gettext message files (PO files). Also included are
+poxml: several command-line utilities for manipulating DocBook XML files, PO
+poxml: files and PO template files.
+poxml:
poxml:
poxml:
poxml:
-poxml: For more information, visit: http://www.kde.org
poxml:
diff --git a/kde/slack-desc/print-manager b/kde/slack-desc/print-manager
index 623c0bc..4e25da1 100644
--- a/kde/slack-desc/print-manager
+++ b/kde/slack-desc/print-manager
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-print-manager: print-manager (tool for managing print jobs and printers)
+print-manager: print-manager (manage print jobs and printers)
print-manager:
-print-manager: Print Manager (formerly printer-applet) is a system tray utility
-print-manager: that shows current print jobs, printer warnings, and errors.
+print-manager: Print Manager is a system tray utility that shows current print jobs,
+print-manager: printer warnings, and errors.
+print-manager:
+print-manager: Homepage: https://projects.kde.org/projects/kde/kdeutils/print-manager
print-manager:
print-manager:
print-manager:
print-manager:
-print-manager: Homepage:
-print-manager: https://projects.kde.org/projects/kde/kdeutils/print-manager
print-manager:
diff --git a/kde/slack-desc/prison b/kde/slack-desc/prison
index aa99009..101b27f 100644
--- a/kde/slack-desc/prison
+++ b/kde/slack-desc/prison
@@ -5,13 +5,13 @@
# make exactly 11 lines for the formatting to be correct. It's also
# customary to leave one space after the ':'.
- |-----handy-ruler-----------------------------------------------------|
+ |-----handy-ruler------------------------------------------------------|
prison: prison (Qt based Barcode API)
prison:
-prison: Prison is a barcode API currently offering a Qt API to produce
-prison: QRCode barcodes and DotMatrix barcodes.
+prison: Prison is a barcode API currently offering a Qt API to produce QRCode
+prison: barcodes and DotMatrix barcodes.
prison:
-prison: git clone git://anongit.kde.org/prison
+prison: Homepage: http://anongit.kde.org/prison
prison:
prison:
prison:
diff --git a/kde/slack-desc/pulseaudio-qt b/kde/slack-desc/pulseaudio-qt
index 499cdae..bc6608b 100644
--- a/kde/slack-desc/pulseaudio-qt
+++ b/kde/slack-desc/pulseaudio-qt
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-pulseaudio-qt: pulseaudio-qt (PulseAudio Qt Bindings)
+pulseaudio-qt: pulseaudio-qt (PulseAudio Qt bindings)
pulseaudio-qt:
-pulseaudio-qt: PulseaudioQt allows programs using the Qt library to control
-pulseaudio-qt: volume and react to changes on systems which use PulseAudio.
+pulseaudio-qt: PulseaudioQt allows programs using the Qt library to control volume
+pulseaudio-qt: and react to changes on systems which use PulseAudio.
pulseaudio-qt:
+pulseaudio-qt: Homepage: https://cgit.kde.org/pulseaudio-qt.git/
pulseaudio-qt:
pulseaudio-qt:
pulseaudio-qt:
pulseaudio-qt:
-pulseaudio-qt: pulseaudio-qt home: https://cgit.kde.org/pulseaudio-qt.git/
pulseaudio-qt:
diff --git a/kde/slack-desc/purpose b/kde/slack-desc/purpose
index 880883a..b2f0d70 100644
--- a/kde/slack-desc/purpose
+++ b/kde/slack-desc/purpose
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-purpose: purpose (offers available actions for a specific purpose)
+purpose: purpose (offers actions for a specific purpose)
+purpose:
+purpose: This framework offers the possibility to create integrate services and
+purpose: actions on any application without having to implement them
+purpose: specifically. Purpose will offer them mechanisms to list the different
+purpose: alternatives to execute given the requested action type and will
+purpose: facilitate components so that all the plugins can receive all the
+purpose: information they need.
+purpose:
purpose:
-purpose: This framework offers the possibility to create integrate services
-purpose: and actions on any application without having to implement them
-purpose: specifically.
-purpose: Purpose will offer them mechanisms to list the different alternatives
-purpose: to execute given the requested action type and will facilitate
-purpose: components so that all the plugins can receive all the information
-purpose: they need.
purpose:
-purpose: Home page: http://www.kde.org/
diff --git a/kde/slack-desc/qqc2-desktop-style b/kde/slack-desc/qqc2-desktop-style
index f128b48..0d27525 100644
--- a/kde/slack-desc/qqc2-desktop-style
+++ b/kde/slack-desc/qqc2-desktop-style
@@ -6,14 +6,14 @@
# customary to leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-qqc2-desktop-style: qqc2-desktop-style (desktop integration for qt quick controls 2)
+qqc2-desktop-style: qqc2-desktop-style (desktop integration for Qt Quick Controls 2)
+qqc2-desktop-style:
+qqc2-desktop-style: QQC2-Desktop-Style is a style for Qt Quick Controls 2 (QQC2) which
+qqc2-desktop-style: uses QStyle to paint the controls in order to give them a native look
+qqc2-desktop-style: and feel.
+qqc2-desktop-style:
+qqc2-desktop-style: Homepage: https://api.kde.org/frameworks/qqc2-desktop-style/html/
qqc2-desktop-style:
-qqc2-desktop-style: This is a style for QtQuick Controls 2 which is using QStyle to paint
-qqc2-desktop-style: controls in order to give them a native look & feel on the desktop.
-qqc2-desktop-style: It will be used when te environment variable
-qqc2-desktop-style: QT_QUICK_CONTROLS_STYLE=org.kde.desktop is exported,
-qqc2-desktop-style: or directly in C++ code.
qqc2-desktop-style:
qqc2-desktop-style:
-qqc2-desktop-style: Home page: https://api.kde.org/frameworks/qqc2-desktop-style/html/
qqc2-desktop-style:
diff --git a/kde/slack-desc/rocs b/kde/slack-desc/rocs
index 8ba31c9..954525d 100644
--- a/kde/slack-desc/rocs
+++ b/kde/slack-desc/rocs
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
rocs: rocs (graph theory IDE)
rocs:
-rocs: Rocs is a Graph Theory IDE for professors and students.
-rocs:
-rocs: For more information, visit: http://edu.kde.org/
-rocs:
-rocs:
-rocs:
+rocs: Rocs is a Graph Theory IDE for everybody interested in designing and
+rocs: analyzing graph algorithms (e.g., lecturers, students, researchers).
+rocs: For all these users, Rocs provides an easy to use visual data
+rocs: structure editor and a powerful scripting engine to execute
+rocs: algorithms. Algorithms are specified in JavaScript.
rocs:
+rocs: Homepage: https://www.kde.org/applications/education/rocs
rocs:
rocs:
diff --git a/kde/slack-desc/sddm-kcm b/kde/slack-desc/sddm-kcm
index 53c6907..deb646c 100644
--- a/kde/slack-desc/sddm-kcm
+++ b/kde/slack-desc/sddm-kcm
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-sddm-kcm: sddm-kcm (configure sddm in kde)
+sddm-kcm: sddm-kcm (configure SDDM in kde)
sddm-kcm:
-sddm-kcm: KCM module for SDDM.
-sddm-kcm: This module allows for configuring SDDM for KDE System Settings.
+sddm-kcm: KCM module for SDDM. This module allows for configuring SDDM in the
+sddm-kcm: KDE System Settings.
sddm-kcm:
+sddm-kcm: Homepage: https://github.com/sddm/sddm-kcm
sddm-kcm:
sddm-kcm:
sddm-kcm:
sddm-kcm:
-sddm-kcm: For more information, visit: https://github.com/sddm/sddm-kcm
sddm-kcm:
diff --git a/kde/slack-desc/sddm-qt5 b/kde/slack-desc/sddm-qt5
index 3de2a15..89e461a 100644
--- a/kde/slack-desc/sddm-qt5
+++ b/kde/slack-desc/sddm-qt5
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
sddm-qt5: sddm-qt5 (QML based X11 display manager)
sddm-qt5:
-sddm-qt5: SDDM is a modern display manager for X11 aiming to be fast, simple
-sddm-qt5: and beatiful. It uses modern technologies like QtQuick, which in turn
+sddm-qt5: SDDM is a modern display manager for X11 aiming to be fast, simple and
+sddm-qt5: beautiful. It uses modern technologies like QtQuick, which in turn
sddm-qt5: gives the designer the ability to create smooth, animated user
-sddm-qt5: interfaces. SDDM is extremely themeable.
-sddm-qt5: There are a few sample themes distributed with SDDM. They can be used
-sddm-qt5: as a starting point for new themes.
+sddm-qt5: interfaces. SDDM is extremely themeable. There are a few sample themes
+sddm-qt5: distributed with SDDM. They can be used as a starting point for new
+sddm-qt5: themes.
sddm-qt5:
-sddm-qt5: See https://github.com/sddm/
+sddm-qt5: Homepage: https://github.com/sddm/
sddm-qt5:
diff --git a/kde/slack-desc/signon-kwallet-extension b/kde/slack-desc/signon-kwallet-extension
index 7956369..a2d071b 100644
--- a/kde/slack-desc/signon-kwallet-extension
+++ b/kde/slack-desc/signon-kwallet-extension
@@ -6,14 +6,14 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-signon-kwallet-extension: signon-kwallet-extension (KWallet signon extension)
+signon-kwallet-extension: signon-kwallet-extension (KWallet SignOn extension)
+signon-kwallet-extension:
+signon-kwallet-extension: KWallet integration for the SignOn framework.
signon-kwallet-extension:
-signon-kwallet-extension: KWallet signon extension.
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
signon-kwallet-extension:
-signon-kwallet-extension: For more information, visit: http://www.kde.org/
signon-kwallet-extension:
diff --git a/kde/slack-desc/skanlite b/kde/slack-desc/skanlite
index b4e994d..b3048d7 100644
--- a/kde/slack-desc/skanlite
+++ b/kde/slack-desc/skanlite
@@ -6,9 +6,9 @@
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
-skanlite: skanlite (a scanning program)
+skanlite: skanlite (scanning program)
skanlite:
-skanlite: Skanlite is a light-weight scanning application based on libksane.
+skanlite: Skanlite is a lightweight scanning application based on libksane.
skanlite:
skanlite:
skanlite:
diff --git a/kde/slack-desc/solid b/kde/slack-desc/solid
index 7b64d7d..6224dc2 100644
--- a/kde/slack-desc/solid
+++ b/kde/slack-desc/solid
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-solid: solid (solid)
+solid: solid (Desktop hardware abstraction)
solid:
+solid: Solid is a device integration framework. It provides a way of querying
+solid: and interacting with hardware independently of the underlying
+solid: operating system. It provides hardware discovery, power management,
+solid: and network management features.
solid:
+solid: Homepage: https://api.kde.org/frameworks/solid/html/
solid:
solid:
solid:
-solid:
-solid:
-solid:
-solid:
-solid: Homepage: http://kde.org/
diff --git a/kde/slack-desc/sonnet b/kde/slack-desc/sonnet
index 3c7db52..16c9405 100644
--- a/kde/slack-desc/sonnet
+++ b/kde/slack-desc/sonnet
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-sonnet: sonnet (sonnet)
+sonnet: sonnet (Multi-language spell checker)
sonnet:
+sonnet: Sonnet is a plugin-based spell checking library for Qt-based
+sonnet: applications. It supports several different plugins, including HSpell,
+sonnet: Enchant, ASpell and HUNSPELL. It also supports automated language
+sonnet: detection, based on a combination of different algorithms.
sonnet:
sonnet:
sonnet:
sonnet:
sonnet:
-sonnet:
-sonnet:
-sonnet:
-sonnet: Homepage: http://kde.org/
diff --git a/kde/slack-desc/spectacle b/kde/slack-desc/spectacle
index bb7532b..bbc99f0 100644
--- a/kde/slack-desc/spectacle
+++ b/kde/slack-desc/spectacle
@@ -8,9 +8,9 @@
|-----handy-ruler------------------------------------------------------|
spectacle: spectacle (screen capture program)
spectacle:
-spectacle: A screenshot utility for KDE.
+spectacle: Spectacle is screenshot taking utility for the KDE desktop. Spectacle
+spectacle: can also be used in non-KDE X11 desktop environments.
spectacle:
-spectacle: For more information, visit: http://www.kde.org
spectacle:
spectacle:
spectacle:
diff --git a/kde/slack-desc/step b/kde/slack-desc/step
index 6b3c8bf..1ae9f99 100644
--- a/kde/slack-desc/step
+++ b/kde/slack-desc/step
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
step: step (interactive physics simulator)
step:
-step: Step is an interactive physical simulator.
-step: It works like this: you place some bodies on the scene, add some
-step: forces such as gravity or springs, then click "Simulate" and Step
-step: shows you how your scene will evolve according to the laws of physics.
-step: With Step you can not only learn but feel how physics works !
+step: Step is an interactive physical simulator. It works like this: you
+step: place some bodies on the scene, add some forces such as gravity or
+step: springs, then click "Simulate" and Step shows you how your scene will
+step: evolve according to the laws of physics. With Step you can not only
+step: learn but feel how physics works!
+step:
step:
-step: For more information, visit: http://edu.kde.org/
step:
step:
diff --git a/kde/slack-desc/svgpart b/kde/slack-desc/svgpart
index dbee48b..ef95b6c 100644
--- a/kde/slack-desc/svgpart
+++ b/kde/slack-desc/svgpart
@@ -10,7 +10,7 @@ svgpart: svgpart (SVG plugin for KDE)
svgpart:
svgpart: KPart for viewing SVG files in KDE.
svgpart:
-svgpart: For more information, visit: http://www.kde.org
+svgpart:
svgpart:
svgpart:
svgpart:
diff --git a/kde/slack-desc/sweeper b/kde/slack-desc/sweeper
index b0ae9f3..ecf38e2 100644
--- a/kde/slack-desc/sweeper
+++ b/kde/slack-desc/sweeper
@@ -10,7 +10,7 @@ sweeper: sweeper (remove traces of your activities)
sweeper:
sweeper: Sweeper helps to clean unwanted traces the user leaves on the system.
sweeper:
-sweeper: Home page: https://projects.kde.org/projects/kde/kdeutils/sweeper
+sweeper: Homepage: https://projects.kde.org/projects/kde/kdeutils/sweeper
sweeper:
sweeper:
sweeper:
diff --git a/kde/slack-desc/syndication b/kde/slack-desc/syndication
index 2156c72..7360bdf 100644
--- a/kde/slack-desc/syndication
+++ b/kde/slack-desc/syndication
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
syndication: syndication (RSS/Atom parser library)
syndication:
-syndication: syndication contains a RSS/Atom parser library.
+syndication: Syndication is a RSS/Atom parser library supporting RSS (0.9/1.0,
+syndication: 0.91..2.0) and Atom (0.3 and 1.0) feeds. Syndication offers a unified,
+syndication: format-agnostic view on the parsed feed, so that the using application
+syndication: does not need to distinguish between feed formats.
syndication:
syndication:
syndication:
syndication:
syndication:
-syndication:
-syndication: Home page: http://www.kde.org/
-syndication:
diff --git a/kde/slack-desc/syntax-highlighting b/kde/slack-desc/syntax-highlighting
index c821b5f..ff92343 100644
--- a/kde/slack-desc/syntax-highlighting
+++ b/kde/slack-desc/syntax-highlighting
@@ -15,5 +15,5 @@ syntax-highlighting:
syntax-highlighting:
syntax-highlighting:
syntax-highlighting:
-syntax-highlighting: See http://kde.org
+syntax-highlighting:
syntax-highlighting:
diff --git a/kde/slack-desc/systemsettings b/kde/slack-desc/systemsettings
index 4ee9c5d..1d9f89f 100644
--- a/kde/slack-desc/systemsettings
+++ b/kde/slack-desc/systemsettings
@@ -16,4 +16,4 @@ systemsettings:
systemsettings:
systemsettings:
systemsettings:
-systemsettings: Homepage: http://kde.org/
+systemsettings:
diff --git a/kde/slack-desc/threadweaver b/kde/slack-desc/threadweaver
index 0bdd4d8..c9b9bc0 100644
--- a/kde/slack-desc/threadweaver
+++ b/kde/slack-desc/threadweaver
@@ -6,14 +6,14 @@
# customary to leave one space after the ':' except on otherwise blank lines.
|-----handy-ruler------------------------------------------------------|
-threadweaver: threadweaver (threadweaver)
+threadweaver: threadweaver (threaded programming helper)
threadweaver:
+threadweaver: ThreadWeaver is a helper for multithreaded programming. It uses a job-
+threadweaver: based interface to queue tasks and execute them in an efficient way.
+threadweaver: You simply divide the workload into jobs, state the dependencies
+threadweaver: between the jobs and ThreadWeaver will work out the most efficient way
+threadweaver: of dividing the work between threads within a set of resource limits.
threadweaver:
threadweaver:
threadweaver:
threadweaver:
-threadweaver:
-threadweaver:
-threadweaver:
-threadweaver:
-threadweaver: Homepage: http://kde.org/
diff --git a/kde/slack-desc/umbrello b/kde/slack-desc/umbrello
index bf23672..a5fa2e1 100644
--- a/kde/slack-desc/umbrello
+++ b/kde/slack-desc/umbrello
@@ -15,5 +15,5 @@ umbrello:
umbrello:
umbrello:
umbrello:
-umbrello: For more information, visit: http://www.kde.org
+umbrello:
umbrello:
diff --git a/kde/slack-desc/user-manager b/kde/slack-desc/user-manager
index b84f0ad..4c8cf3b 100644
--- a/kde/slack-desc/user-manager
+++ b/kde/slack-desc/user-manager
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
user-manager: user-manager (manage the users of your system)
user-manager:
-user-manager: USer-manager is a system settings module to manage the users
-user-manager: of your system.
+user-manager: User-manager is a system settings module to manage the users of your
+user-manager: system.
+user-manager:
user-manager:
user-manager:
user-manager:
user-manager:
user-manager:
-user-manager: See also: https://cgit.kde.org/user-manager.git
user-manager:
diff --git a/kde/slack-desc/wacomtablet b/kde/slack-desc/wacomtablet
index c54cf87..a383543 100644
--- a/kde/slack-desc/wacomtablet
+++ b/kde/slack-desc/wacomtablet
@@ -8,12 +8,12 @@
|-----handy-ruler------------------------------------------------------|
wacomtablet: wacomtablet (kcm for Wacom tablets)
wacomtablet:
-wacomtablet: This module implements a GUI for the Wacom Linux Drivers
-wacomtablet: and extends it with profile support to handle different
-wacomtablet: button / pen layouts per profile.
+wacomtablet: This module implements a GUI for the Wacom Linux Drivers and extends
+wacomtablet: it with profile support to handle different button / pen layouts per
+wacomtablet: profile.
wacomtablet:
+wacomtablet: Homepage: https://github.com/KDE/wacomtablet
wacomtablet:
wacomtablet:
wacomtablet:
-wacomtablet: Home page: https://github.com/KDE/wacomtablet
wacomtablet:
diff --git a/kde/slack-desc/xdg-desktop-portal-kde b/kde/slack-desc/xdg-desktop-portal-kde
index 35b443b..e436c5e 100644
--- a/kde/slack-desc/xdg-desktop-portal-kde
+++ b/kde/slack-desc/xdg-desktop-portal-kde
@@ -15,5 +15,5 @@ xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
-xdg-desktop-portal-kde: Home page: http://www.kde.org/
+xdg-desktop-portal-kde:
xdg-desktop-portal-kde:
diff --git a/kde/slack-desc/yakuake b/kde/slack-desc/yakuake
index ce21172..66cd817 100644
--- a/kde/slack-desc/yakuake
+++ b/kde/slack-desc/yakuake
@@ -9,11 +9,11 @@
yakuake: yakuake (drop-down terminal)
yakuake:
yakuake: Yakuake is a drop-down terminal emulator based on KDE Konsole.
-yakuake: Features:
-yakuake: + Smoothly rolls down from the top of your screen
-yakuake: + Tabbed, skinnable interface
-yakuake: + Configurable dimensions and animation speed
-yakuake: + Sophisticated D-Bus interface
yakuake:
-yakuake: Home page: http://www.kde.org/
+yakuake: Some of the features of Yakuake include:
+yakuake: Smoothly rolls down from the top of your screen
+yakuake: Tabbed, skinnable interface
+yakuake: Configurable dimensions and animation speed
+yakuake: Sophisticated D-Bus interface
+yakuake:
yakuake:
diff --git a/kde/slack-desc/zeroconf-ioslave b/kde/slack-desc/zeroconf-ioslave
index a406d55..b823aea 100644
--- a/kde/slack-desc/zeroconf-ioslave
+++ b/kde/slack-desc/zeroconf-ioslave
@@ -15,5 +15,5 @@ zeroconf-ioslave:
zeroconf-ioslave:
zeroconf-ioslave:
zeroconf-ioslave:
-zeroconf-ioslave: For more information, visit: http://www.kde.org
+zeroconf-ioslave:
zeroconf-ioslave:
diff --git a/kde/src/applications-extra/fetch-krita.sh b/kde/src/applications-extra/fetch-krita.sh
new file mode 100755
index 0000000..0072059
--- /dev/null
+++ b/kde/src/applications-extra/fetch-krita.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Copyright 2019, 2020 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+PKGNAM=krita
+
+# Pull a stable branch + patches
+BRANCH=${1:-master}
+
+# Clear download area:
+rm -rf ${PKGNAM}
+
+# Clone repository:
+git clone https://github.com/KDE/${PKGNAM}
+
+# checkout $BRANCH:
+( cd ${PKGNAM}
+ git checkout $BRANCH || exit 1
+)
+
+HEADISAT="$( cd ${PKGNAM} && git log -1 --format=%h )"
+DATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%Y%m%d )"
+LONGDATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%c )"
+# Cleanup. We're not packing up the whole git repo.
+( cd ${PKGNAM} && find . -type d -name ".git*" -exec rm -rf {} \; 2> /dev/null )
+mv ${PKGNAM} ${PKGNAM}-${DATE}_${HEADISAT}
+tar cf ${PKGNAM}-${DATE}_${HEADISAT}.tar ${PKGNAM}-${DATE}_${HEADISAT}
+plzip -9 -f ${PKGNAM}-${DATE}_${HEADISAT}.tar
+rm -rf ${PKGNAM}-${DATE}_${HEADISAT}
+touch -d "$LONGDATE" ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz
+echo
+echo "${PKGNAM} branch $BRANCH with HEAD at $HEADISAT packaged as ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz"
+echo
diff --git a/kde/src/plasma-extra/fetch-wacomtablet.sh b/kde/src/plasma-extra/fetch-wacomtablet.sh
new file mode 100755
index 0000000..f75dbc5
--- /dev/null
+++ b/kde/src/plasma-extra/fetch-wacomtablet.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+# Copyright 2019, 2020 Patrick J. Volkerding, Sebeka, Minnesota, USA
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+PKGNAM=wacomtablet
+
+# Pull a stable branch + patches
+BRANCH=${1:-master}
+
+# Clear download area:
+rm -rf ${PKGNAM}
+
+# Clone repository:
+git clone https://github.com/KDE/${PKGNAM}
+
+# checkout $BRANCH:
+( cd ${PKGNAM}
+ git checkout $BRANCH || exit 1
+)
+
+HEADISAT="$( cd ${PKGNAM} && git log -1 --format=%h )"
+DATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%Y%m%d )"
+LONGDATE="$( cd ${PKGNAM} && git log -1 --format=%cd --date=format:%c )"
+# Cleanup. We're not packing up the whole git repo.
+( cd ${PKGNAM} && find . -type d -name ".git*" -exec rm -rf {} \; 2> /dev/null )
+mv ${PKGNAM} ${PKGNAM}-${DATE}_${HEADISAT}
+tar cf ${PKGNAM}-${DATE}_${HEADISAT}.tar ${PKGNAM}-${DATE}_${HEADISAT}
+plzip -9 -f ${PKGNAM}-${DATE}_${HEADISAT}.tar
+rm -rf ${PKGNAM}-${DATE}_${HEADISAT}
+touch -d "$LONGDATE" ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz
+echo
+echo "${PKGNAM} branch $BRANCH with HEAD at $HEADISAT packaged as ${PKGNAM}-${DATE}_${HEADISAT}.tar.lz"
+echo